Repository navigation
v0.186.2
·
54 commits
to main
since this release
- Haskell in the exploit proof fabric (GA capability, new language).
proof doctornow listshaskellandproof generatebuilds reproducers for Haskell findings. Reproducers run in GHC's interpreter (ghc -e), so there is no build step. Command injection and path-traversal writes are proven; server-side request forgery is refused because no HTTP client ships with GHC; SQL, argument injection and deserialization are refused by name. Onlybaseand the packages that ship with GHC are allowed (read from the installed GHC); a handler that needs a web framework is refused with the package named. Template Haskell, quasi-quotes, CPP, the foreign function interface and plugin options are refused as load-time code execution. 45 of 45 fixture reproductions across 15 classes, 0 false confirmations. Limits: exercised under local confinement on macOS with GHC 9.14.1 only; the container image is wired but was not run against a real engine, and Linux was not exercised. fix --apply --require-proofnow holds for Haskell and Nix fixes. Their fixer returned before the proof gate, so the flag was silently ignored. The gate is shared now; the patch is previewed, proven, then written, and aborted if the written patch differs from the proven one.- Correction to 0.186.0: default scan output did change. 0.186.0 said a default scan's output was unchanged. It was not. Findings from flow-pair and structural detectors now carry
line(taken from the sink, then the source) where they had none; on the fixtures used by the new gate, 33 of 84 findings gained a line, and one command-injection finding is now reported by the structural detector under the title "Command Injection (User-Controlled Input)". The stable finding id does not use the line. New detectors (redirect target, reflected input, send-file root, init scope, listen bind address) and general precision rules for open redirect, reflected input, blocking I/O, file serving, logging by name and Nix option types changed what some projects report. Line pragmas now match findings that had no line. - New gate: default-scan drift (
bench/default-scan-drift). A default scan over eight committed fixtures is compared to a committed baseline; any added, removed or changed finding failsnpm testand prints the difference. Re-baselining is explicit and belongs with a changelog entry naming the rule. - Independent precision measurement (
bench/dag/independent). On projects the rule work never touched (koa, hapi, nest samples and strapi server packages; five Nix configuration collections), a seeded random sample of 60 flagged sites per language was labeled from source by one LLM reader. Precision of the whole default scan: JavaScript and TypeScript 7 of 60, 11.7% (95% interval 5.8% to 22.2%); Nix 4 of 59 decided sites, 6.8% (2.7% to 16.2%). This is the whole scan, not the narrower classes the 0.186.0 precision work targeted, so it does not contradict those figures; it shows they do not describe a typical project. The sample is for measurement only. - Speed gate now matches the hosted runner. The time-to-first-finding budget on the hosted runner is the median of ten passing release runs (11.1 s) with a 1.35x limit (15.0 s), and a new
ttffjob runs it on every pull request, so a slowdown like 0.186.0's is found before a tag. - Unmet targets are stated. The capability registry, README and graph-precision page list the targets 0.186.x missed: incremental analysis 2.5x and 2.4x on the synthetic projects against 3x, 75 of 982 sink sites still on the full path, 3 of 8 on the multi-service fixture, the z3 backend not used by a default scan.
- S7 test failures explained. They ran the built bundle while it crashed at start-up on a statically imported optional package (the
z3-solverimport fixed in 0.186.0's follow-up). A new test fails if the bundle imports any optional package statically. - The
v0.186.0tag was removed. That release was never published to npm.