Skip to content

security(admission): reject pip caller-selected verbose log write paths #270

Description

@seonghobae

Verified security gap

Refs #128 / canonical Agent Artifact Admission PR #129. Protected/default main remains f8260f1e03836039ff9463dd99fa982e4e270c4b. Canonical #129 is exact 71451ce3a70d4b64b380dd0566c03c0a37465d65, produced by ordinary integration of the completed repair for this issue through #431. No force update, destructive rebase, self/model approval, gate weakening or routine bypass was used.

Wardnet's pip admission rejects alternate install roots, trust roots, indirect artifact sources and installation-report output authority, but direct-pip General Options can place pip's verbose-log family before command selection. Exact upstream pypa/pip@2b28a816d043826f2ba10ff1d22ec3d94d2ed7c5 defines --log, --log-file, and --local-log as path options. Caller-selected verbose-log output is filesystem write authority independent of the approved package artifact.

The verified parser-phase defect was narrower than the initial attached-after-command example: the existing dedicated log classifier could recognize the family after install, but the direct-pip global-option normalizer did not consume parser-valid pre-command forms. The request therefore failed closed generically while losing causal alternate_install_root evidence, and a separate log path could masquerade as artifact evidence.

This remains Wardnet pre-execution argv-admission responsibility only. Wardnet must not open, canonicalize or sandbox the path. quarantine-sandbox-runtime remains canonical owner of effective filesystem/mount/workspace isolation; EgressWeave remains outbound transport owner; AppGuardrail remains static package/security analysis owner.

Hosted hostile RED — established

Test-only #431 exact ea5e4994d7bee013178c04c7b9d6bfb0a0d3f9f6 kept production source byte-identical to its then-current #129 parent and exercised parser-valid pre-command pip / pip3 General Options, including attached and separate log-value forms, with a reviewed direct install as the positive control.

Fuzz 35031897252 completed SUCCESS. CI 35031897218, rust job 104592062846, passed checkout/toolchain/format and reached the semantic assertion. For pre-command --log=/tmp/wardnet-pip.log, Wardnet observed [ForbiddenCommand, ArtifactNotApproved] instead of causal alternate_install_root evidence without manufactured artifact evidence. This was the required hostile semantic RED, not runner/bootstrap/format noise.

Minimum causal repair — exact GREEN and normally integrated

Repair exact eedaa3fb46e89ce740c28269654235ba99c51912 reused the existing reviewed pip log-option spelling predicate in the direct-pip General Options normalization seam. Attached values remain option grammar; separately supplied log paths are attached only in the internal normalized policy copy so they cannot be interpreted as package operands. Exact submitted argv/hash remains the audit identity.

The repair did not add a second pip parser, broaden accepted option spellings, authorize or inspect the requested path, execute pip, duplicate quarantine-sandbox-runtime policy, copy foreign-owner logic, add mutable sibling dependencies, or change the supported-install command boundary.

On that unchanged repair head, CI 35046405436 and Fuzz 35046405418 completed SUCCESS. Fresh review generated no actionable finding. #431 was then normally merged into canonical #129 as merge commit 71451ce3a70d4b64b380dd0566c03c0a37465d65.

That parent movement invalidated predecessor #129 gate conclusions. On exact-current #129, CI 35069871595, Fuzz 35069871570, Security Scan 35069871562, and SAST Semgrep 35069871667 are terminal SUCCESS; CodeQL PR 35069871577 remains QUEUED at the latest fresh read. The active serialized admission child is issue #432 / Draft #433 exact 35de5dc66992c72c3d634969d72ac0de403be1a2. Its test-only predecessor established repository-native semantic RED for parser-valid pip/pip3 pre-command --cache-dir; its minimum semantic repair plus formatter-owned correction now await exact-head CI 35133704088 and Fuzz 35133704131, both currently QUEUED.

Completion gate

Keep this issue open because the effective repair is not yet on protected main. Close only after #129 or a verified complete successor preserving this exact implementation/test/fixture/contract/evidence delta reaches protected main. Predecessor checks do not transfer; no force update, destructive rebase, self/model approval, routine bypass, gate weakening, source copy, cross-service SQL, mutable foreign dependency or dispatch-only churn.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpriority: highHigh-priority or P1 work

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions