The zamburak-core crate provides the information-flow control (IFC) substrate
used by the governance engine. It is decoupled from interpreter internals and
can be used independently for any system that needs label propagation over a
directed acyclic graph (DAG) of dependencies.
Value identity
ValueId is a stable, opaque identifier for runtime values. It wraps a u64
and is the primary key for the dependency graph.
Labels
Three label dimensions track security properties of runtime values:
- Integrity (
IntegrityLabel): three-level latticeUntrusted < Trusted < Verified. Join (meet) returns the minimum—a derived value's integrity cannot exceed its weakest input. - Confidentiality (
DataLabels): additive set of classification tags (Pii,AuthSecret,PrivateEmailBody,PaymentInstrument,InternalPolicyNote). Join is set union—data flowing into a derived value accumulates all source classifications. - Authority (
AuthoritySet): narrowing set ofAuthorityCapabilityvalues. Join is set intersection—a derived value can only exercise capabilities that all its sources possess.
Dependency graph
DependencyGraph stores ValueNode entries keyed by ValueId. Each node
records integrity, confidentiality, and authority labels plus a list of parent
ValueId edges (direct dependencies). The graph enforces budgets:
max_values: maximum number of value nodes,max_parents_per_value: maximum parent edges per node,max_closure_steps: maximum breadth-first search (BFS) steps during transitive summary computation.
Budget overflow is fail-closed: the graph marks itself as truncated and
compute_summary returns DependencySummary::unknown_top() (conservative
worst-case labels).
Transitive dependency summary
compute_summary(&graph, &id, &budgets) performs a bounded breadth-first
search (BFS) walk through parent edges, joining all reachable node labels into a
DependencySummary. The summary captures integrity (greatest lower bound),
confidentiality (union), authority (intersection), origin count, and a
truncation flag.
Propagation modes
Normal: join operand summaries only (direct data dependencies).Strict: join operand summaries plus the active control-context summary.
Strict mode ensures that policy evaluation accounts for implicit information flows through control dependence (e.g. branching on untrusted data before making an effectful call).
Control context
ExecutionContextSummary tracks the program-counter integrity and
confidentiality labels accumulated from control-flow conditions. In strict mode,
as_summary() converts this into a DependencySummary that is joined into
every effectful call's dependency summary.