Repository navigation
OSV allowlist: scope each allowed lock to its reviewed advisories, bound to the lock's sha256 and reachability evidence - #441
Merged
seathatflowsinourveins merged 2 commits intoSep 28, 2026
Conversation
…und to the lock's sha256 and reachability evidence A path in IGNORE_ALLOWED_LOCKS used to exempt its lock from every repo-wide ignore. Each entry now names the advisories reviewed for that lock, the sha256 of the reviewed bytes and the evidence path. The test fails on any other affected pin and on any change to an allowed lock. The nltk ignore reason names the affected APIs and says no patched release exists as of 2026-09-27; the fixes are merged on develop (nltk #3757, #3759, #3813). Its expiry plan is to relock onto the first fixed release. Sources: osv-scanner v2.6.0 internal/config/config.go (ignores match by id and expiry only), the OSV record GHSA-8mgp-746c-j5xp (modified 2026-09-02, last_affected 3.10.3) and nltk v3.10.3 pathsec.py. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…s, expiry, fixtures) Repairs the five findings of the read-only GPT-6 cross-family review of #441. - Requirements files are read per pip's requirements-file format: backslash continuations are joined before comments are stripped (a continued line holding a comment fails closed, since osv-scalibr strips it first), names compare after PEP 503 normalization, and -r/--requirement and -c/--constraint includes are followed recursively, relative to the including file, with cycle protection. An include that names no file, a line that is not a documented option or a name-led requirement (-e, a path, a URL), and a tracked version that is not a plain release (v prefix, pre/post/dev/local release, range such as >=70, URL) fail closed. - An allowed lock is exempt only for its own lines and must be self-contained; an include line in one fails the test. - An ignore counts as active only while ignoreUntil is after today's UTC date: osv-scanner 2.6.0 applies it while ignoreUntil.After(time.Now()), and its TOML decoder reads a bare date as local midnight. - Fixtures for every review probe, plus CRLF-vs-LF digest bytes, a second allowed lock that alone drifts, a missing allowed lock and a vulnerable uv.lock. - The nltk reason no longer calls PerceptronTagger.load_from_json unaffected; the decision doc states the guard's actual coverage and the 2026-12-24 deadline action. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
seathatflowsinourveins
force-pushed
the
claude/osv-allowlist-scoped-digests-20260927
branch
from
September 28, 2026 00:45
ae6ddfa to
f62c626
Compare
seathatflowsinourveins
deleted the
claude/osv-allowlist-scoped-digests-20260927
branch
September 28, 2026 01:06
seathatflowsinourveins
pushed a commit
that referenced
this pull request
Sep 28, 2026
…0.3 for GHSA-8mgp-746c-j5xp only, bound to its sha256 and reachability receipt The #441 allowlist mapping replaces this branch's earlier set entry, whose comment the review found stale (the #336 condition, 'PerceptronTagger save/load', no evidence path). The setuptools advisory is not exempted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
seathatflowsinourveins
pushed a commit
that referenced
this pull request
Sep 28, 2026
…GHSA-8mgp-746c-j5xp only, bound to its sha256 and reachability receipt The #441 allowlist mapping replaces this branch's earlier set entry, whose comment the review found inaccurate and under-evidenced (the #336 condition, 'PerceptronTagger save/load', a wheel-only grep, no evidence path). The setuptools advisory is not exempted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This was referenced Sep 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Scope
IGNORE_ALLOWED_LOCKSexempted its lock from every repo-wide ignore, and a later change to the lock kept the exemption.nltk==3.10.3andsetuptools==80.10.2reported both pins, and reported[]once its path was added.37739d32f62c6263(two commits: the change, then the review repair)lane:foundation.github/osv-scanner.tomlandtests/test_osv_lockfile_coverage.pybelong to the foundation's GitHub-automation closure..github/osv-scanner.tomltests/test_osv_lockfile_coverage.pydocs/decisions/2026-09-22-github-automation-closure.md(the Ignores bullet only)manifests/evidence.json(re-registration per the hot-file protocol)Changes
IGNORE_ALLOWED_LOCKSis a mapping: path →{advisories, sha256, evidence}.a8dce0af…equals thelock_sha256that its receipt (blueprints/us-equities/engine-trials/spy-one-zero-20260926/repository-checks.json) recorded.affected_pins(entries, ignore_ids, allowed)exempts an allowed lock only from the advisories its entry lists.digest_drift(allowed)reports any allowed lock whose bytes changed since its review..gitattributes* text=auto eol=lfkeeps the digest the same on every host.Six new tests. Every allowed lock:
IGNORE_SCOPESentry and an active ignore.Two mutant tests cover a lock allowed for nltk only (it still reports
setuptools 80.10.2) and a one-byte change to an allowed lock (caught).The nltk ignore's reason now names:
TransitionParser,AveragedPerceptron.save/load,PerceptronTagger.save_to_jsonand the module functionnltk.classify.maxent.save_maxent_params;pathsecenforcement on by default;ignoreUntiland the setuptools ignore are unchanged.The decision record's Ignores bullet records the scoped, digest-bound rule (2026-09-27), the alternatives, the overturn condition and the evidence path.
SOTA sources
e840a6e8):internal/config/config.goL26-29, L38-50 and L104-112: ignores match by id and expiry only, never by path.docs/configuration.mdL23: one--configreplaces every per-directory config.GHSA-8mgp-746c-j5xp: modified 2026-09-02,last_affected3.10.3, no fixed version (read again 2026-09-27 by the coordinator).v3.10.3nltk/pathsec.pyL28:ENFORCE = True.nltk/classify/maxent.pyL1583:save_maxent_paramsis a module function.develop. Coordinator read viagh api, 2026-09-27.Evidence-class table
nltk==3.10.3andsetuptools==80.10.2: both pins reported while not allowed,[]once its path was added (in-process only)FAILED (errors=5), 1 passed (2AttributeError, 2NameError, 1TypeError)python3 -m unittest tests.test_osv_lockfile_coverage tests.test_blind_checkout tests.test_workflow_security_coverage:Ran 77 tests … OKafter the repair and the rebase onto37739d32(57 before this PR; the module has 30 tests, 16 existing and 14 new)git pushscripts/validate.pypassed after re-registration perdocs/lanes.md. Each push went through #438's gate, the last onf62c6263, and returned OKReview round (one GPT-6 cross-family review, one repair)
A read-only review by
gpt-6-astraat effort max returned DEFECTS: 2 major and 3 minor findings, each probed in memory. A Claude Opus 5.5 builder fixed all five in one repair round.==v80.10.2,==83.0.0rc1^\d+(\.\d+)*$) fails closed. The builder also foundsetuptools>=70(OSV reports it) and a comment on a continued line (pip drops the next line but OSV reads it); both now fail closed. No PEP 440 code was written by hand, becausepackagingis in neither CI nor the host's python3-rincludes were skipped, and an allowed lock's digest did not cover included bytes-r/--requirement/-c/--constraintincludes are followed recursively with a cycle guard, as osv-scalibr's extractor does. An include that does not resolve fails closed. An allowed lock must be self-contained. No current inventory lock uses includesperceptron.pyL395-399 authorizes a caller-chosen directoryignoreUntil > today (UTC), matching osv-scanner 2.6.0 (internal/config/config.goL149-157,ignoreUntil.After(time.Now())) and BurntSushi/toml v1.6.0 reading a bare date as local midnight. The decision records the deadline action if no fixed nltk ships before 2026-12-24read_text()digests, first lock only, a missing lock skipped,uv.lockskipped)uv.lockae6ddfac's code, or catches its named mutation where the old code was already correct (finding 5).Residual risks
test_every_allowed_lock_matches_its_reviewed_digestuntil its reachability is re-reviewed and the new sha256 is recorded. This is intended; the test message says what to do.setuptools==83or==83.0is reported as affected (integer tuples without zero-padding), and-eand abbreviated options are refused. A bare archive name such asnltk-3.10.3-py3-none-any.whlis not flagged, but OSV does not see nltk there either.Status
wf_9dae7d7b-e15, with an independent verifier. The coordinator reviewed the diff, checked the network facts, committed, re-registered and pushed.🤖 Generated with Claude Code