Skip to content

Commit 9f1433b

Browse files
hyperpolymathclaude
andcommitted
docs: record assail precision fixes (CHANGELOG + STATE.a2ml)
Human-readable CHANGELOG [Unreleased] "Fixed" entry and machine-readable STATE.a2ml [session-2026-06-24] block documenting the null-check-aware UncheckedAllocation + word-boundary eval / shell --eval detector fixes (PR #134). Verified results recorded (proven 1->0, paint-type 36->35). Refs #32. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent d7e7b6c commit 9f1433b

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

.machine_readable/6a2/STATE.a2ml

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
[metadata]
66
project = "panic-attack"
77
version = "2.5.5"
8-
last-updated = "2026-06-02"
8+
last-updated = "2026-06-24"
99
status = "active"
1010

1111
[project-context]
@@ -89,6 +89,16 @@ test-count = "897 passing (cargo test --release; 4 ignored; 901 runnable per --l
8989
truthfulness-fix = "tests/ WeakPoint constructions sed-updated for test_context field (was silently broken on main post-#102)"
9090
blocker = "none"
9191

92+
[session-2026-06-24]
93+
description = "assail detector precision fixes (false-positive reduction) — PR #134"
94+
unchecked-alloc = "UncheckedAllocation (C) now NULL-check aware: per-line scan, skips malloc whose result is guarded (if (p==NULL)/if(!p)/nullptr) within a 7-line window, attaches line number (enables inline // panic-attack: accepted markers). Genuinely-unchecked malloc still fires. New helper c_alloc_result_is_null_checked() in analyzer.rs."
95+
dyn-code-exec = "DynamicCodeExecution (JS/Python) word-boundary aware: \\beval\\s*\\( (and \\b(?:eval|exec)\\s*\\( for Python) so FFI symbols like proven_calculator_eval( are not flagged; genuine eval( still fires."
96+
command-injection = "CommandInjection (Shell) no longer matches --eval/-eval CLI flag: eval builtin matched only in statement position via (?m)(?:^|[\\s;&|(])eval[ \\t]."
97+
conservative = "All three are precision-only (no new false negatives): a site is treated benign only on a clear signal. 4 new tests in tests/analyzer_tests.rs; full analyzer suite 17/17 green; zero warnings."
98+
verified = "End-to-end re-scan: proven 1->0 active Critical/High (stubs.c clears, the genuine fix now registers); paint-type 36->35 (gossamer --eval benchmark FP clears; vendored unsafe FFI + irreducible believe_me axiom correctly remain)."
99+
origin = "Surfaced triaging proven#68 / paint-type#86; refs panic-attack#32."
100+
blocker = "none"
101+
92102
[next-priorities]
93103
hexad-patch-bridge = "Migrate Patch Bridge mitigation registry from JSON to hexad persistence (ROADMAP v2.2.0 / v2.4.0)"
94104
multi-lockfile = "Extend Patch Bridge beyond Cargo.lock to package-lock.json, mix.lock, etc. (ROADMAP v2.4.0)"

CHANGELOG.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,32 @@
44

55
## [Unreleased]
66

7+
### Fixed — assail detector precision (false-positive reduction, 2026-06-24)
8+
9+
Three `assail` analyzer fixes, all conservative (no new false negatives), found
10+
while triaging hyperpolymath/proven#68 and JoshuaJewell/paint-type#86:
11+
12+
- **UncheckedAllocation (C) is now NULL-check aware.** The detector previously
13+
flagged *every* `malloc(...)` and emitted a line-less, file-level finding. It
14+
now scans per line, skips a malloc whose result is NULL-checked within a short
15+
window (`if (p == NULL)`, `if (!p)`, `nullptr`), and attaches a line number —
16+
which also lets an inline `// panic-attack: accepted` marker suppress a
17+
reviewed site (marker suppression is line-gated). A genuinely-unchecked malloc
18+
still fires. This is why a real null-check fix (proven `stubs.c`) previously
19+
failed to clear.
20+
- **DynamicCodeExecution (JS/Python) is word-boundary aware.** `contains("eval(")`
21+
matched FFI symbol names like `proven_calculator_eval(`. Now `\beval\s*\(`
22+
(and `\b(?:eval|exec)\s*\(` for Python); a genuine `eval(` still fires.
23+
- **CommandInjection (Shell) no longer matches the `--eval` CLI flag.**
24+
`contains("eval ")` matched `--eval`/`-eval`. Now the eval builtin is matched
25+
only in statement position (`(?m)(?:^|[\s;&|(])eval[ \t]`).
26+
27+
Verified end-to-end: proven 1→0 active Critical/High (`stubs.c` clears),
28+
paint-type 36→35 (gossamer `--eval` benchmark FP clears; genuinely-unsafe
29+
vendored FFI + the irreducible `believe_me` axiom correctly remain). 4 new
30+
tests in `tests/analyzer_tests.rs`; full analyzer suite green; zero warnings.
31+
PR #134. Refs #32.
32+
733
### Added — attestation unforgeability proof (Idris2, PROOF-PROGRAMME §3.2)
834

935
- **`src/abi/AttestationUnforgeability.idr`**: Idris2 proof that the

0 commit comments

Comments
 (0)