Skip to content

security: bound archive member enumeration before materialization - #70

Draft
seonghobae wants to merge 1 commit into
security/bound-sbom-archive-inputfrom
security/bound-archive-member-enumeration
Draft

security: bound archive member enumeration before materialization#70
seonghobae wants to merge 1 commit into
security/bound-sbom-archive-inputfrom
security/bound-archive-member-enumeration

Conversation

@seonghobae

@seonghobae seonghobae commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Test-first parser-resource hardening

Progresses #69 as a bounded draft stack on PR #68.

Exact tree binding

Confirmed gap

The current direct generator enforces the 256 MiB compressed-byte ceiling before and during parser reads, but the archive-member limit is evaluated after parser materialization:

  • zipfile.ZipFile(stream) builds the full central-directory ZipInfo table before infolist() reaches _check_archive_names(...);
  • tarfile.getmembers() constructs the complete member list before _check_archive_names(...).

A bounded compressed input can therefore still amplify into excessive object allocation or gzip/tar processing before the repository's intended 10,000-member rejection.

Exact RED evidence

The current test-only commit adds exactly one new test module and no production, documentation, workflow, dependency, credential, permission, release, publication, signing, attestation, tag, ref, or network change.

CI run 31104663109 is valid RED evidence on exact head fb4ccefae3899c617bf969a3c93be3924177b23c:

  • wheel and source-distribution package acceptance: success;
  • Ruff: success in every Python lane;
  • Python 3.10–3.13: each failed only in the two new focused regressions;
  • Python 3.13 result: 2 failed, 763 passed;
  • overmember wheel reached the monkeypatched ZipFile constructor before the member bound;
  • overmember gzip tar reached the monkeypatched TarFile.getmembers() before the member bound.

The intended GREEN implementation must satisfy issue #69 test-first, add finite ZIP central-directory and streamed tar/gzip expansion controls, preserve all existing trust boundaries, and complete exact-head CI/security/review gates.

Remaining gates

Keep this PR draft and intentionally RED. Do not merge, mark ready, enable auto-merge, release, publish, rebase, retarget, force-update, or infer success from queued checks. After GREEN it still requires Python 3.10–3.13, complete tests, Ruff, compileall, public-docstring checks, 100% production statement/branch coverage, package acceptance, applicable SAST/Security Scan, completed exact-head automated review, independent non-author approval, branch protection, and every repository policy gate.

@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: de3e27e3-8e97-4d62-a515-cc9b16402864

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Comment @coderabbitai help to get the list of available commands.

Copy link
Copy Markdown
Contributor Author

@opencode-agent Implement the bounded GREEN repair on exact current RED head fb4ccefae3899c617bf969a3c93be3924177b23c of branch security/bound-archive-member-enumeration.

The immutable RED commit is valid. Local execution against the exact current generator failed only the two new focused regressions: the overmember wheel reached zipfile.ZipFile(...) before the repository member bound, and the overmember gzip tar reached TarFile.getmembers() before that bound. CI run 31104663109 must remain authoritative when complete.

Modify only:

  • scripts/ci/generate_release_sbom.py
  • tests/test_release_sbom_member_enumeration_bound.py
  • docs/sbom-release-evidence.md
  • CHANGELOG.md

Required bounded implementation:

  1. Preserve the exact 256 MiB compressed-artifact descriptor boundary, no-follow/path device+inode binding, live read/seek checks, remaining-byte-plus-one-tripwire read cap, digest bracketing, standalone API, and every existing archive-name, duplicate, link/device, metadata, dependency-lock, deterministic-output, and stable-error contract.
  2. Before constructing zipfile.ZipFile, scan the accepted descriptor's canonical single-disk ZIP central directory with finite reads and no ZipInfo table allocation. Count actual central-directory records, stop at MAX_ARCHIVE_MEMBERS + 1, require record boundaries/count/size/offset to agree with the EOCD, and reject malformed/truncated/inconsistent input. Fail closed on ZIP64 or multi-disk structures that are unnecessary under this exact 256 MiB/10,000-member release contract. Rewind the same accepted descriptor before the existing ZIP parser. Do not reopen the pathname or use unbounded reads.
  3. Before tarfile semantic parsing, perform a streaming gzip/tar header preflight over the same accepted descriptor. Retain no complete member table; stop at the first physical header over MAX_ARCHIVE_MEMBERS; enforce a finite aggregate expanded tar budget of exactly 512 * 1024 * 1024 bytes and an exact per-PAX/GNU extension-header payload limit of 1 * 1024 * 1024 bytes; reject malformed/truncated headers, sparse files, links, devices, FIFOs, and unsupported special forms through stable non-leaking errors. Rewind afterward.
  4. Replace tarfile.open(..., mode="r:gz") plus getmembers() with sequential r|gz parsing (or an equivalently proven bounded stream design). Keep at most the bounded seen-name set and the single root PKG-INFO payload; stop at the first over-limit member and never call getmembers().
  5. Keep the current two RED tests unchanged. Add only focused tests needed to prove: exact new constants; valid canonical wheel/sdist compatibility; lying/inconsistent ZIP counts; ZIP64/multi-disk refusal; truncated central records; actual count above the declared count; tar aggregate expansion refusal before payload skipping; oversized PAX/GNU extension refusal before tarfile allocation; no getmembers() call; stable errors; and every new statement/branch at 100% coverage. Prefer compact synthetic fixtures instead of large memory allocations.
  6. Update docs/sbom-release-evidence.md with beginner-readable operator guidance distinguishing compressed-byte, pre-materialization member-count, aggregate expanded-tar, extension-header, metadata, and residual mutable-storage boundaries. State that canonical release wheels/sdists are accepted while unnecessary ZIP64/multi-disk/sparse/special archive forms fail closed. Do not claim parser immutability, provenance, signing, attestation, publication, or a SLSA level.
  7. Add one concise [Unreleased] Security entry. Do not bump the version.
  8. Add or retain APA 7 primary references for MITRE CWE-409, MITRE CWE-770, and Python 3.13 zipfile/tarfile documentation using the repository's existing reference style.

Run the two focused RED tests first, then all new boundary tests, the full Python 3.10–3.13 suite, Ruff, compileall, public-docstring checks, 100% production statement and branch coverage, product-guard self-test, wheel/sdist package acceptance, and applicable SAST/Security Scan on the resulting exact head. Keep the PR draft. Stop without writing if the head differs from fb4ccefae3899c617bf969a3c93be3924177b23c. Do not modify .github, workflows, dependencies, credentials, permissions, protected refs, review-agent identities, release behavior, signing, attestation, publication, tag, ref, network behavior, or any path outside the four-file allowlist. Do not rebase, retarget, merge, mark ready, enable auto-merge, release, or publish.

Copy link
Copy Markdown
Contributor Author

@opencode-agent The earlier implementation request remains authoritative. To avoid any ambiguity and connector-size truncation, apply the exact verified four-file patch below on exact current RED head fb4ccefae3899c617bf969a3c93be3924177b23c.

Patch contract:

  • gzip bytes SHA-256: 75ae2009763226b18e157b1d1a1de9be3eeeadec8da759b8692b01dc7d254dcb
  • decoded patch SHA-256: 61aef2b19e071c7135070a80c33d3f19af7bad91f99463445ab0fe1a47556e0a
  • decoded patch size: 57024 bytes
  • paths: exactly CHANGELOG.md, docs/sbom-release-evidence.md, scripts/ci/generate_release_sbom.py, and tests/test_release_sbom_member_enumeration_bound.py
  • candidate Git blob IDs after application:
    • scripts/ci/generate_release_sbom.py: 350bb3475896079a1d102eb672a4c9747758cb5b
    • tests/test_release_sbom_member_enumeration_bound.py: 5838402277f96ae4f60ff75f08081ba329b78a30
    • docs/sbom-release-evidence.md: fc5e8c68fc8fed13268f8cf4e5a84442884ef73d
    • CHANGELOG.md: 7400789eaf8c19b82364d6668c626c7f9394c9c8

Procedure: copy the base64 payload without whitespace to a root-only temporary file outside the repository, decode base64, verify the gzip SHA-256, decompress, verify decoded size and SHA-256, run git apply --check, apply it, verify the four resulting Git blob IDs and that no other path changed, then run the required focused and complete verification. Commit only the four resulting paths. Do not commit the payload or any temporary file. Stop without writing if HEAD differs from the exact RED SHA or any digest/blob/path assertion fails.

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

Copy link
Copy Markdown
Contributor Author

@opencode-agent Apply and verify the exact patch payload in comment #issuecomment-5205775526 now, but only if branch HEAD is still fb4ccefae3899c617bf969a3c93be3924177b23c. The payload/digest/blob/path contract in that comment supersedes free-form implementation. Commit exactly the four verified files, keep the PR draft, and stop without writing on any mismatch. Do not merge, rebase, retarget, release, publish, or modify any other path.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant