Repository navigation
security(osv): preserve direct-tarball provenance instead of npm false positives #1096
Description
Exact downstream defect
The organization-required Security Scan produces false-positive OSV failures when a pnpm lock entry uses an official direct tarball that intentionally carries a package version newer than the last vulnerable npm registry release.
Current central owner: protected .github main@c47afc2dc68488292c1db7c9d6f82dcd5360f181, .github/workflows/security-scan.yml.
Concrete downstream reproduction: ContextualWisdomLab/inkspan#318 predecessor exact head 9f1c8b732e9b91f152cfff2e9277b758c0959c4a, Security Scan run 32013961603, OSV job/check 95339355813, debug artifact 9282795069 (osv-scan-debug). The Inkspan lock pins SheetJS from the official immutable CDN tarball https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz.
The captured new-results.json classifies that lock entry as:
{"name":"xlsx","version":"0.20.3","ecosystem":"npm"}and reports both GHSA-4r6h-8v6p-xvw6 / CVE-2023-30533 and GHSA-5pgg-2g8v-p4x9 / CVE-2024-22363. The same evidence embeds database_specific.last_known_affected_version_range values < 0.19.3 and < 0.20.2 respectively. Therefore 0.20.3 is outside both affected ranges, but the npm advisory records expose an open-ended SEMVER range because the fixed SheetJS releases are not npm-registry releases. Treating the direct CDN tarball as ordinary npm ecosystem evidence makes a patched package look permanently vulnerable.
This is a central scanner/provenance classification defect, not an Inkspan product vulnerability. An Inkspan-local advisory ignore would hide the causal control-plane defect and is not acceptable.
First causal boundary
The central workflow delegates direct manifest/lock evidence to OSV Scanner with --no-resolve and then treats the resulting npm-ecosystem finding as authoritative without retaining/validating the pnpm resolution origin. For direct immutable tarballs, package name/version alone is insufficient provenance for npm advisory semantics.
Required test-first repair
- Add a RED central contract fixture containing a pnpm lock entry for exact official SheetJS CDN tarball
xlsx-0.20.3.tgz; prove the current gate incorrectly fails it against the two GHSA records above. - Add a vulnerable control fixture (for example an npm-registry
xlsx@0.18.5) that must continue to fail. - Preserve package-source provenance when interpreting OSV results. A finding may be suppressed/normalized only when an exact immutable non-registry source can be proven, its package/version identity is exact, and authoritative advisory metadata proves that exact source version is outside the affected range. Unknown, mutable, malformed, redirected, or unverifiable source identity must fail closed.
- Do not add blanket GHSA ignores, package-name ignores, severity downgrades,
continue-on-error, or a genericxlsxexception. - Keep the existing base/head diff semantics, exact PR head checkout, hard fail-on-new-vulnerability behavior, Trivy/dependency-review independence, immutable action pins, and least-privilege permissions.
- Add an explicit malformed-source fixture and an npm
xlsx@0.18.5fixture to prove source confusion cannot manufacture green evidence. - Run focused contract tests plus the complete central security/quality suite, then canary on an exact current Inkspan fix(review): put contract-reliable reasoning models first, flagships last #318 head that still pins the same official
0.20.3CDN tarball.
GREEN acceptance
- direct official CDN
xlsx@0.20.3is not classified as a vulnerable npm release merely because its lock entry has the same package name; - npm-registry vulnerable
xlsx@0.18.5still hard-fails; - unknown/unverifiable direct sources fail closed or remain findings;
- the resulting OSV evidence records package source/provenance sufficiently to audit why a finding was retained or excluded;
- Inkspan reruns Security Scan on the then-current exact PR head and obtains fresh evidence; predecessor success is not transferred.
Inkspan-side revalidation criterion
After the central repair reaches protected .github main, rerun the required Security Scan for the unchanged then-current ContextualWisdomLab/inkspan#318 head and require the OSV job to inspect the official xlsx-0.20.3 tarball without those two false-positive npm-ecosystem findings. All other required Inkspan checks remain independently required.
Activity
seonghobae commentedon Aug 17, 2026
Fresh Inkspan consumer evidence for the existing central-owner repair path (updated in place; this snapshot supersedes predecessor consumer and owner-PR metadata):
ContextualWisdomLab/inkspan#318, exact unchanged headfce8fe72ebf4d438c17a7c889dd37c92118c6204, Draft/mergeable against protectedinkspan/main@3b38ead2d00f44eb578d0689087b9293b3dabe1e;32144783586and SAST32144783644are terminal success; required Security Scan32144783558remains terminal failure at exact OSV job95735816267after both base/head scans, specifically atReport PR-introduced OSV findings;9328396543, digestsha256:594d8a8551017a78c98a33b6574bfbb9ce945f8b202988788ab96b224c3cfd3d, remains bound to that run/head; Trivy95735816261, Scorecard95735816309, and dependency-review wrapper95735816431succeeded;.github/main@6479989bbff475404cc2cccc468d5fb1d6c632e5;.github#1158(fix/osv): preserve immutable direct-source provenance) at exact headf285fd790ba12161ad6385a46d9e3e60371103b4, base6479989bbff475404cc2cccc468d5fb1d6c632e5. Do not create a competing writer;32378887519, OSV-Scanner PR32378888535, SBOM32378887599, Secret32378887719, SAST32378887415, Scorecard32378887778, Security32378887899, CodeQL32378887551, and Python Security32378887965;5360429583; its current direct reaction set is empty. This is non-passing review evidence, but the request is already present, so do not duplicate it.RCA is now source-repaired on the existing owner branch rather than merely diagnosed: the reusable Security Scan previously discarded direct-tarball URL/integrity provenance before OSV verdict interpretation, allowing npm-registry advisory ranges to be attributed to the official immutable SheetJS CE 0.20.3 tarball. #1158 preserves immutable direct-source provenance, retains genuine affected releases and malformed/unknown/conflicting metadata fail-closed, and does not suppress advisory IDs or severities.
Owner-path GREEN before consumer replay: unchanged exact #1158 head must satisfy every live protected central workflow/review gate and integrate to protected
.github/main; predecessor or status-only evidence does not transfer. Consumer GREEN after that protected integration: rerun required Security Scan on the then-unchanged #318 head. OSV must stop attributing the two npm-registry advisories to the proven officialxlsx@0.20.3artifact while genuine affected dependencies and unrelated advisories remain fail-closed. Do not rerun #318 before protected owner integration, and do not add an Inkspan-local ignore, dependency rename, severity downgrade, or gate bypass.seonghobae commentedon Aug 18, 2026
Fresh downstream revalidation on the existing owner path, without any Inkspan advisory suppression or dependency rewrite:
ContextualWisdomLab/inkspan#318fce8fe72ebf4d438c17a7c889dd37c92118c62043b38ead2d00f44eb578d0689087b9293b3dabe1e.github/main@bbedc1a51ec1a2421f129955c629b3cd0507a4ecrepo:ContextualWisdomLab/.github is:pr is:open 1096: no active implementation PR; security(osv): preserve direct-tarball provenance instead of npm false positives #1096 remains the existing owner path32144783586: success32144783644: success32144783558: failure95735816267(osv-scan): base scan success, head scan success, required output success, thenReport PR-introduced OSV findingsfails; SARIF upload and debug-artifact upload succeed95735816261: success; Scorecard95735816309: success; dependency-review95735816431: support check success, action step skippedosv-scan-debugartifact9328396543, digestsha256:594d8a8551017a78c98a33b6574bfbb9ce945f8b202988788ab96b224c3cfd3d, explicitly bound by GitHub to headfce8fe72ebf4d438c17a7c889dd37c92118c6204and run32144783558.The first causal boundary remains central provenance classification: the official immutable SheetJS CDN resolution is reduced to npm ecosystem name/version evidence before OSV findings are interpreted. Protected central movement through
bbedc1a...does not itself satisfy #1096 because no source/test repair for this contract is present on protected main and no active owner PR exists.Keep the owner repair test-first and fail-closed: official immutable SheetJS CDN
xlsx@0.20.3as the false-positive RED fixture, npm-registryxlsx@0.18.5as the vulnerable positive control, and malformed/mutable/unverifiable direct source as fail-closed controls. Do not add package/GHSA ignores,continue-on-error, severity downgrades, or an Inkspan-local exception.GREEN acceptance remains a fresh required Security Scan on the then-unchanged #318 head after the central repair reaches protected
.github/main; OSV must stop attributing those two npm-registry advisories to the proven directxlsx@0.20.3artifact while genuine affected dependencies and unrelated advisories remain fail-closed.seonghobae commentedon Aug 18, 2026
Fresh owner-boundary verification against the current protected central source supersedes every older owner-baseline SHA in this issue without changing the Inkspan consumer or adding a local workaround.
.github/main@9e9f59f3ac1e96a960c021b131d768c238f4c21a;.github/workflows/security-scan.yml(blobc3b8fa5dbbb21a684209683a3d4b6d29c8e0d536) still feeds base/head--no-resolveOSV JSON directly togoogle/osv-scanner-action/osv-reporter-actionwith--fail-on-vuln=true; it prints the OSVsource.path/namebut does not preserve or validate pnpm direct-tarball origin before npm-ecosystem advisory interpretation;ContextualWisdomLab/inkspan#318@fce8fe72ebf4d438c17a7c889dd37c92118c6204againstinkspan/main@3b38ead2d00f44eb578d0689087b9293b3dabe1e; the PR is still Draft and mechanically mergeable;32144783586and SAST32144783644remain success; Security Scan32144783558remains failure at OSV job95735816267, first hard failureReport PR-introduced OSV findings, with debug artifact9328396543/sha256:594d8a8551017a78c98a33b6574bfbb9ce945f8b202988788ab96b224c3cfd3d;https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz; no advisory ignore, package rename, severity downgrade,continue-on-error, or Inkspan-local suppression has been introduced.The falsifiable RCA therefore still lands at the central provenance-classification boundary on current protected source: direct pnpm artifact provenance is discarded before the reporter compares the resulting npm package/version advisory records. Movement of central main through
9e9f59f...(including the unrelated trusted-uv repair from #1136) does not satisfy #1096's RED/GREEN acceptance.Keep the owner repair test-first and fail-closed: official immutable CDN
xlsx@0.20.3as the false-positive RED fixture; npm-registryxlsx@0.18.5as the vulnerable positive control; malformed/mutable/unverifiable source as negative controls. Only authenticated immutable direct-source provenance plus authoritative affected-range evidence may normalize a finding. Do not add blanket GHSA/package ignores,continue-on-error, severity downgrades, or an Inkspan-local exception.GREEN consumer criterion remains a genuinely fresh Security Scan on the then-unchanged exact #318 head after the central repair reaches protected
.github/main; OSV must cease attributing the two npm-registry advisories to the proven officialxlsx@0.20.3direct artifact while genuine applicable findings remain fail-closed. Any later #318 head movement invalidates this canary and requires exact evidence refresh.seonghobae commentedon Aug 19, 2026
Fresh exact-boundary refresh for the existing Inkspan consumer canary; no competing source writer created.
.github/main@bbedc1a51ec1a2421f129955c629b3cd0507a4ec(protected);1096still returns no implementation PR;ContextualWisdomLab/inkspan#318@fce8fe72ebf4d438c17a7c889dd37c92118c6204, Draft/mergeable against protected Inkspanmain@3b38ead2d00f44eb578d0689087b9293b3dabe1e;32144783586and SAST32144783644remain success, while required Security Scan32144783558remains failure at OSV job95735816267after successful base/head scans, with the hard failure atReport PR-introduced OSV findingsand debug artifact9328396543/sha256:594d8a8551017a78c98a33b6574bfbb9ce945f8b202988788ab96b224c3cfd3d;The protected central movement through
bbedc1a5...does not contain/evidence #1096's required provenance-aware RED→GREEN repair, so rerunning #318 now would only replay the same false-positive classification and is not a causal action. The owner acceptance remains: official immutable CDNxlsx@0.20.3negative fixture; npm-registryxlsx@0.18.5vulnerable positive control; malformed/unverifiable direct sources fail closed; provenance/audit evidence retained; then a fresh required Security Scan on the unchanged then-current #318 head. Please keep this issue as the sole central writer until that implementation exists.seonghobae commentedon Aug 30, 2026
Fresh live owner-path snapshot superseding earlier comments that reported no implementation PR:
f5d1cf48c0946b44ef6eb0131e665a53476b9d0a;1ff8268255b061461d9d49b4cab4febf9a8e7bfa; fix(osv): preserve immutable direct-source provenance #1158 is diverged 82 ahead / 2 behind with merge base1d8e872487838e16a003e96e76df9300c388e258;groupsbehavior against pinned upstream OSV Scanner v2.3.8 commit408fcd6f8707999a29e7ba45e15809764cf24f67. Required OpenCode correctly fails without an exact-head formal verdict, required Noema incorrectly returns GitHub-success after skipping for that missing verdict, and required Strix was cancelled without an authoritative report.The #1158 body now carries these exact identities and terminal results. Do not create a competing writer or rerun Inkspan #318 yet. Acceptance remains normal protected-main integration followed by a fresh unchanged exact-head Inkspan Security Scan proving official immutable
xlsx@0.20.3no longer receives the already-remediated npm advisories while affected and unverifiable controls remain fail-closed.seonghobae commentedon Aug 30, 2026
Fresh canonical owner snapshot (2026-08-31 KST): #1158 is now synchronized with protected
main@1ff8268255b061461d9d49b4cab4febf9a8e7bfaat exact head6e8d1a805e68a4a0a435486ce7e4c0c53edc0480via a normal two-parent merge commit (no force update).Fresh exact-tree verification:
93 passed, 54 subtests1,955 passed, 1 skipped, 75 subtests292/292statements and100/100branches; compileall cleanThis is source/quality evidence only. #1158 still has no qualifying formal approval and no fresh authoritative required Strix/OpenCode verdict on this exact head, so it remains unmerged. Issue #1096 must remain open until protected-main integration and a fresh then-current Inkspan #318 Security Scan prove the direct-tarball contradiction is gone without weakening genuine findings.