ELF loader hardening and numeric-domain soundness fixes. 7 commits since v0.2.4.
- Fix signed division by a negative singleton so non-singleton dividend intervals retain the correct sign-flipped bounds.
- Treat stack numeric-byte queries outside the stack window as fail-closed, and keep weak type stores outside that window from corrupting tracked numeric byte state.
- Reject map key/value access widths that do not fit the verifier's supported range before constructing access-bound constraints.
- Avoid undefined behavior in finite-domain left shifts by zero while preserving the existing masked-shift invariant.
- Read relocation records from validated raw bytes instead of typed ELFIO accessors, preserving explicit bounds and entry-size checks.
- Reject ELF files whose section header table is out of range, has undersized entries, or uses an invalid extended section count.
- Document that writable helper output arguments must be initialized before helper calls.
Soundness fixes for pointer arithmetic and context writes. 3 commits since v0.2.3.
- Reject writes through a
T_CTXpointer whose byte range may overlap a data/data_end/meta pointer slot. Such a store was modeled as a silent no-op, so a program could overwritectx->data, reload it as a packet pointer, and dereference an attacker-controlled address while the verifier reported PASS. Scalar context-field writes (e.g.__sk_bufffields) are still allowed. Atomic RMW operations on context now assert awriteaccess, closing the same hole on the atomic path. - Havoc offsets on
add/subwhen the destination register carries a non-singleton typeset (or a{number, pointer}union). The offset update was silently skipped whilesvalue/uvalueadvanced, leaving offset variables stale and letting subsequent bounds checks accept out-of-bounds accesses. - Forget the destination register of a 32-bit (ALU32)
add/subwhose result is not provably a number. The zero-extended result holds only the low half of a pointer address; it must be neither followable as a pointer nor leakable as a scalar.
Soundness fixes, helper/kfunc validation, sleepable program support, and a broad internal restructuring that removes thread-local globals and untangles runtime semantics from presentation. 39 commits since v0.2.2.
- Fix heap-buffer-overflow from non-instruction-aligned FUNC symbols (#1106).
- Add 8 missing
reallocate_packetflags on packet-modifying helpers (clone_redirect,l3_csum_replace,l4_csum_replace,lwt_push_encap,lwt_seg6_action,lwt_seg6_store_bytes,msg_pull_data,store_hdr_opt); without the flag, stale packet pointers could be reused after the call (#1125). - Tighten
ValidMapKeyValuepacket bound; inline bounds checks (#1100). - Restore callee-saved registers via rename to preserve zone edges across subprogram returns.
- Fix
EbpfDomain::to_set()returning top instead of bottom for unreachable states. - Fix
get_map_inner_map_fdcomparing map type instead ofinner_map_fd. - Fix failure-slice filter losing
total_stack_size(#1094).
- Add sleepable program support and
might_sleephelper gating (#1136). - Enforce map-function compatibility checks (#1127).
- Enforce
get_local_storageflags argument must be zero (#1129). - Mark inner map template descriptors in
EbpfMapDescriptor(#1069).
- Add
--versionflag (#1108). - Classify errors as bugs vs runtime input errors (#1104).
- Split
PlatformSpecfromProgramEnvironment(#1096). - Remove
thread_local_optionsandthread_local_program_info; pass options explicitly and makeProgramself-contained (#1091, #1092). - Pass explicit
AnalysisContext; treatVariableRegistryas a global service (#1088). - Thread stack-cell registry through
AnalysisContext(#1116), then move it intoArrayDomain. - Thread
CallBtf::modulethrough kfunc resolution (#1114). - Untangle test-helper string parsing from the production verifier API (#1115).
- Rename
ElfProgramInfo::invalidtoreject_load(#1043). - Refactor printing API alongside the failure-slice fix (#1094).
- Split runtime semantics from presentation/orchestration (#1101).
- Make
Callcomposition explicit; centralize region semantics (#1097). - Decompose
Program::from_sequenceinto named preparation passes (#1081). - Share helper/kfunc arg resolution; compact kfunc prototype table (#1102).
- Extract
Extrapolatorto own the fixpoint iteration policy. - Use COW
shared_ptrfor per-domain cell registry. - Make
svaluea T_NUM-specific kind variable. - Drive
setup_entryinit_r1from program metadata; decouple fromfrom_constraints. - Extract
compute_slice_from_labelfromcompute_failure_slices(#1061). - C++23: use
std::unreachable()instead ofassert(false)(#1075).
- Document Ubuntu and compiler version requirements in README (#630).
- CMake: list library and test sources explicitly (#144).
- Coverage: exclude
src/testfrom lcov report (#344). - Bump
softprops/action-gh-releasefrom 2 to 3.
- Fix spurious widening precision loss in
EbpfDomainthat rejected concretely-safe programs using numeric counters stored on the stack across loops (#1071). Regression from #916.
Bug fixes, API enhancements, and infrastructure updates. 14 commits since v0.2.0.
- Make stack size and call depth runtime parameters via
--stack-sizeand--max-call-stack-framesCLI options (#1070). - Add map name in
EbpfMapDescriptorand make map-related functions public inEbpfDomain(#1066). Note: inner map template names may be misleading; see #1069.
- Fix stack numeric size lost through imprecise pointer stores (#1068).
- Fix
rewrite_extern_constant_loadcrash on values exceeding int32 range (#1054). - Fix heap-buffer-overflow in legacy maps section parsing.
- Only use result from
get_helper_prototypewhen valid.
- Fix
load_elfto support non-file istream paths and add regression tests (#1048). - Add
.ksymskfunc relocation support.
- Upgrade to C++23.
- Bump Catch2 from v3.13.0 to v3.14.0.
- Bump external/bpf_conformance, external/libbtf.
Major expansion of type system, platform modeling, and safety guarantees. 34 commits since v0.1.3.
- Add T_SOCKET, T_BTF_ID, T_ALLOC_MEM, T_FUNC type encodings with propagation through helpers and return values (#1020).
- Callback target validation for T_FUNC (#1022).
- Allocation size tracking for T_ALLOC_MEM (ringbuf_reserve bounds) (#1022).
- Expand Linux platform tables: 200+ helpers with full ABI type classes, unaliased from 6 generic groups to per-helper signatures (#1021).
- Add table-driven kfunc (CALL src=2) resolution and validation (#1023).
- Model additional helper ABI classes and harden call semantics (#1024).
- Support LDDW pseudo-addr lowering and tail-call parity checks (#1019).
- Fix context descriptors for tracing, struct_ops, lsm, lirc_mode2, syscall, and netfilter program types; update all context struct sizes against kernel 6.14 uapi headers (#959).
- Fix two soundness bugs: stale shared_region_size after ambiguous map lookup (OOB read) and stale caller-saved registers after subprogram return (use-after-free) (#1028).
- Fix 8 missing reallocate_packet flags on packet-modifying helpers.
- Reject null pointer dereference with non-zero access size.
- Fix soundness bugs in 32-bit signed/unsigned comparison handling (#1038).
- Fix assertion crash in Assume when operands have different types (#1012).
- Fix widening termination by removing constraint re-addition in zone domain (#960).
- Propagate alloc_mem_size through helpers and decompose kfunc flags.
-
4× faster verification on large programs through splitdbm graph internals modernization and zone domain optimizations (#1017).
- Add failure slicing:
--failure-sliceprints a minimal causal trace from the first verification error back to its root cause. - Human-friendly CLI output:
PASS: section/function/FAIL: section/functionwith first error and hint line, replacing the old CSV format. - Add
-q/--quietflag (exit code only, no stdout).
- Overhaul ELF loader and bump ebpf-samples (#1026).
- Handle invalid BTF map metadata gracefully (#1034).
- Add MSVC debug assert handler (#1018).
- Simplify test framework: drop per-test diagnostic strings, reclassify genuinely-unsafe programs as rejections, document VerifyIssueKind enum centrally.
- Rename main executable from
bin/checktobin/prevail. - Remove dead code:
--domainoption (linux,statspaths),linux_verifier,memsizehelpers,collect_stats, stale benchmark scripts. - Move CLI entry point from
src/main/check.cpptosrc/main.cpp. - Bump external/libbtf, external/bpf_conformance, actions/checkout.
Previous release. See git log for details.