This release includes 2 breaking changes for platform teams planning a safe upgrade.
✓ No known CVEs patched in this version
Topics
+9 more
Affected surfaces
Summary
AI summarykLayoutVersion bumped to 2 and policy format upgraded to v6.
Full changelog
Highlights
v0.4.0 lands the complete 3-phase roadmap to elevate AegisBPF to gold-standard eBPF runtime security, plus the Phase 0 production-audit fixes, the multi-tenant cgroup-scoped policy groundwork, the operator status-conditions upgrade, and an honesty pass on the competitive performance story.
Phase 1 — Kernel Enforcement Perimeter
- OverlayFS copy-up propagation — new LSM
inode_copy_uphook detects when denied lower-layer inodes are promoted to the overlay upper layer (containers, overlay-on-overlay). The userspaceOverlayCopyUpPropagatorre-stats the original path, discovers the new inode, and propagates deny flags intodeny_inode_map, closing the classic OverlayFS inode-disassociation bypass. Mappings are persisted todeny_dbfor restart resilience. - Full socket lifecycle enforcement —
socket_connect,socket_bind, port-orientedsocket_listen, accepted-peersocket_accept, outboundsocket_sendmsg, and inboundsocket_recvmsg.recvmsgblocks data reception from denied sources even when the connection was established before the deny rule was loaded.kLayoutVersionbumped to 2 (NetBlockStats grew from 48→56 bytes). - Phase 0 safety fixes — network hooks now fail-open on parse errors (matching file hooks), hardcoded kernel constants replaced with CO-RE enum reads, exec-identity verification is container-compatible via
EXEC_IDENTITY_FLAG_ALLOW_OVERLAYFS/SKIP_VERITY,attach_prog()deduplicated, and an atomicpolicy_generationcommit marker prevents hooks from enforcing half-written rulesets.
Phase 2 — Telemetry & Cryptographic Integrity
- Deep process lineage — BPF walks
task_struct->real_parentup to 8 ancestors (bounded#pragma unrollloop satisfies the verifier). Ancestor PIDs are included in exec events for forensic correlation.dead_processesLRU map retains metadata about recently-exited processes for post-mortem inspection. - UID-to-username identity resolution — forensic block events now include thread-safe
getpwuid_r/getgrgid_rresolvedusername/groupnamefields, accelerating SOC triage. - IMA-backed exec trust (kernel 6.1+) — new
handle_bprm_ima_checkLSM program callsbpf_ima_file_hash()and looks the SHA-256 up in thetrusted_exec_hashmap (16,384 entries). Autoload gated onKernelFeatures.bpf_ima_helpers; opt-in viaEXEC_IDENTITY_FLAG_USE_IMA_HASH. Provides cryptographic FIM without requiring fs-verity setup.
Phase 3 — DevSecOps Orchestration
- Validating admission webhook — operator-side webhook (
--enable-webhook) rejects malformedAegisPolicy/AegisClusterPolicyspecs before they reach the daemon. Ships with aValidatingWebhookConfigurationmanifest andServicedefinition. - Merged policy reconciler — watches all
AegisPolicyandAegisClusterPolicyCRDs and produces a single mergedaegis-merged-policyConfigMap for the DaemonSet. Uses most-restrictive-wins semantics: any policy inenforceforces the merged mode toenforce. - Selector-based filtering —
PolicySelector.matchNamespacesandmatchLabelsfilter which policies apply, enabling gradual rollouts. - Structured policy status conditions —
AegisPolicyStatusnow exposes a standard[]metav1.Conditionslice with the canonical typesReady,PolicyValid,EnforceCapable, andDegraded, plus stable reason constants (PolicyApplied,TranslationFailed,ConfigMapWriteFailed,BPFLSMUnavailable, …). Dashboards and CI can now match on condition types instead of parsing the legacyPhase/Messagestrings (which are kept for back-compat). New printer columnsReadyandEnforceCapableshow onkubectl get ap/kubectl get acp.EnforceCapableis deliberately reported asUnknown(notFalse) until per-node posture is observed — surfacing uncertainty rather than guessing.
Multi-tenant cgroup-scoped policy
deny_cgroup_inode/deny_cgroup_ipv4/deny_cgroup_portBPF maps allow per-workload deny rules — the same binary or endpoint can be allowed for one cgroup and denied for another.- New CLI commands, v6 policy format, and capability-report surface for these maps.
deadman fail-staticmode preserves enforcement under agent downtime.
Enhanced rule engine
- Rich condition types:
CommExact,CommPrefix,PathGlob,PathPrefix,PortEquals,AncestorComm,CgroupPathwith AND composition. globmatching viafnmatch(3)withFNM_PATHNAME.- MITRE ATT&CK technique tagging propagated in match output.
RuleActionenum:Alert,Block,Kill.- Backward-compatible with legacy
match_comm/match_pathformat. - 16 new unit tests covering conditions, composition, MITRE tags, JSON loading, lifecycle, and struct-layout assertions.
Honesty pass on the competitive performance story
docs/PERFORMANCE_COMPARISON.mdrewritten. Removed all estimated peer-tool µs/MB tables (they were copied from third-party blog posts and were never measured on the same hardware as AegisBPF). Replaced with a verifiable-vs-architectural split, realbuild/aegisbpf_benchdeny-map-lookup numbers (flat 4.2 ns from 100 → 10 000 entries, evidence for the O(1) policy-evaluation claim), and an explicit "What is not claimed" section covering the things the repo cannot prove.scripts/compare_runtime_security.sh(new). Head-to-head comparison driver that runs the sameperf_open_bench.shworkload under each agent (none,aegisbpf,falco,tetragon,tracee,kubearmor) in isolation, refuses to start if a peer agent is already alive, skips missing agents cleanly, and emits a singleresults.mdwithdelta vs none.docs/COMPETITIVE_BENCH_METHODOLOGY.md(new). Specifies reproducibility constraints, theopen_closeworkload definition, per-agent baseline configurations, how to interpret the result table, and a "hall of shame" of forbidden moves (cross-run/cross-host number copying, hand-added rows, quoting upstream blog numbers, tuning one agent but not the others).SECURITY.mddrift fix. Refreshed the supported-versions table, removed two stale Known Limitations the codebase has since fixed (no live policy reload — superseded by atomic shadow-map swap; coverage limited to connect/bind — superseded by six socket hooks), and added two real ones (no third-party security review, no head-to-head performance evidence on identical hardware).
Breaking Changes
kLayoutVersion= 2 —NetBlockStatsgrew from 48 to 56 bytes to accommodaterecvmsg_blocks. Userspace and BPF must agree; deploy the new daemon and BPF object together.- Policy format v6 — new
[deny_cgroup_*]sections for cgroup-scoped rules (optional; v5 policies remain valid). - Capability contract 1.6.0 —
capabilities.jsonnow includesbpf_ima_helpers,overlay_copy_up_propagation,cgroup_scoped_deny,policy_generation, anddeadman_fail_staticfields. - Operator CRD schema additions —
AegisPolicyStatusgains theconditionsarray (additive, no removals). Existing controllers that readphase/messagecontinue to work; new automation should preferconditions[?(@.type=="Ready")].status.
New BPF Maps
| Map | Purpose |
|-----|---------|
| trusted_exec_hash | SHA-256 hashes of trusted binaries for IMA hash verification |
| deny_cgroup_inode | Per-cgroup file inode deny rules |
| deny_cgroup_ipv4 | Per-cgroup IPv4 destination deny rules |
| deny_cgroup_port | Per-cgroup port deny rules with protocol/direction filtering |
| dead_processes | LRU cache of recently-exited processes for post-mortem forensics |
| policy_generation | Atomic policy commit marker preventing half-written ruleset enforcement |
All maps are documented in docs/BPF_MAP_SCHEMA.md.
CI & Quality
- All 39 CI checks green on the underlying PR commit: build (x86_64/ARM64), test, lint, clang-tidy, cppcheck, sanitizers (asan/tsan/ubsan), coverage, kernel-bpf-test, veristat, BPF compiler matrix (clang-15/16/17/18), release-readiness, semgrep, CodeQL, gitleaks, SBOM, smoke/parser/fuzz suites, and every contract/posture gate.
- Schema contract: 37 BPF maps documented in
docs/BPF_MAP_SCHEMA.md(all in sync withbpf/aegis_common.h). bpf_map_schema_contract,guarantees-contract,capability-contract,helm-posture-contract,k8s-rollout-contract,label-contract,ops-observability-contract, andrequired-checks-contractall pass.- Operator:
go build ./...,go vet ./...,go test ./... -count=1, andgofmt -l .all clean after the conditions work, with 5 new unit tests pinning the condition-helper contract.
Upgrade Notes
- Audit mode first. Run
aegisbpf run --auditfor at least one week before enabling enforcement on the new hook surface (recvmsg,inode_copy_up, IMA). - Kernel 6.1+ for IMA hash.
EXEC_IDENTITY_FLAG_USE_IMA_HASHis a no-op on older kernels;bpf_ima_helpersincapabilities.jsonadvertises availability. - Cgroup-scoped rules are additive. Global
deny_*maps still apply; cgroup-scoped maps narrow or extend per workload. - Layout version mismatch is fatal. The daemon refuses to start if the BPF object and userspace disagree on
kLayoutVersion. - Validating webhook is opt-in. Start the operator with
--enable-webhookand applymanifests/validating-webhook.yamlbefore enabling. - Operator condition consumers. If you have alerting that scrapes
.status.phase, it still works. New alerts should prefer.status.conditions[?(@.type=="Ready")].status == "True"and.status.conditions[?(@.type=="EnforceCapable")].status—EnforceCapable=Unknownis the expected initial state until per-node posture observation lands. - No competitive perf claims without the script. Any "AegisBPF is N× faster than $tool" statement must be backed by a
results.mdproduced byscripts/compare_runtime_security.shon the same host in the same run. Seedocs/COMPETITIVE_BENCH_METHODOLOGY.md.
Docs
README.md— refreshed Features list, architecture diagrams, Claim Taxonomy, Data Flow Diagram, and metrics tabledocs/BPF_MAP_SCHEMA.md— new "Cgroup-Scoped Deny Rules" section +trusted_exec_hashentrydocs/PERFORMANCE_COMPARISON.md— honesty pass; estimated peer-tool numbers removed, replaced with verifiable architecture/hook coverage and realaegisbpf_benchnumbersdocs/COMPETITIVE_BENCH_METHODOLOGY.md(new) — head-to-head comparison rulesdocs/CHANGELOG.md— full commit historySECURITY.md— version table refreshed, stale Known Limitations replaced with current ones
🤖 Release notes prepared with Claude Code
Breaking Changes
- `kLayoutVersion` = 2 — `NetBlockStats` grew from 48 to 56 bytes; daemon and BPF object must agree on the new layout.
- Policy format v6 introduces `[deny_cgroup_*]` sections for cgroup‑scoped rules (optional but required for multi‑tenant scenarios).
Weekly OSS security release digest.
The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.
No spam, unsubscribe anytime.
Share this release
About ErenAri/Aegis-BPF
All releases →Related context
Related tools
Beta — feedback welcome: [email protected]