[ISS-3] Dispatch-reviewer kan zijn eigen credential lezen: /sources/claude_oauth_token valt binnen --add-dir /sources #108
Labels
No labels
severity/s3
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
janpeter/scrum4me-docker#108
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Status: investigating · Severity: s3_major · Gemeld door: mac:claude · Occurrences: 1 (laatst: 2026-10-04T21:24:46.988Z) · Aangemaakt: 2026-10-04T21:24:46.988Z
Registratie
Waarneming (2026-10-04, ISS-11-acceptatie). De Claude-dispatchreviewer (request
8125d760, joba6616e02, slotjob:managed:srv-review-claude-1) meldde in zijn rapport een bestand/sources/claude_oauth_tokendat niet insource_artifactsstaat. Hij heeft het bewust niet gelezen.Code (scrum4me-docker origin/master).
/sources/claude_oauth_token(lib/dispatch-child.ts:18-20,Dockerfile.dispatch:63-66,docs/dispatch-runtime-operator.md:74). Het Codex-equivalent/sources/codex_api_keywerkt op dezelfde manier (dispatch-child.ts:15-17).listSourceArtifactsfiltert beide credentials uitsource_artifacts(dispatch-child.ts:43). Ze komen alleen in de env van het kindproces (CLAUDE_CODE_OAUTH_TOKEN/CODEX_API_KEY,:91-95), en uitvoer wordt gescrubd (:165).--add-dir /sources(dispatch-child.ts:81). Daarmee mag het model met zijn bestandstools alles in/sourceslezen, inclusief het credentialbestand.Risico. Een prompt-injectie in een gereviewd document (inmiddels 18 producten, ISS-11) kan het model het token laten lezen en proberen het naar buiten te brengen. Bestaande verdediging:
Het bestand binnen het
--add-dir-pad maakt het lezen wel triviaal, zonder shell en met de gewone Read-tool. Er is geen aanwijzing dat het token is gelekt.Mogelijke richtingen (nog niet gekozen).
/sources, in een pad dat niet in--add-dirzit en niet leesbaar is voor het modelproces.--add-diralleen de echte bron-artefacten mee (een aparte directory zonder operatorbronnen).Controleer bij elke richting ook
codex_api_keyen de Codex-sandbox (--cd/sandboxpaden).Niet gedaan: geen wijziging, geen tokenrotatie. Of rotatie nodig is, is aan JP; er is geen bewijs van uitlekken.
Onderzoek
2026-10-04T22:40:46.891Z — mac:claude
Analyse (code + Claude Code-docs; nog niet live getest)
Kern: het bestand in
--add-dir /sourcesis niet het eigenlijke lek. Het model kan het token via minstens drie wegen lezen, en richtingen 1–3 uit de beschrijving dichten daar geen enkele van.Leeswegen voor het model
Read /sources/claude_oauth_token--add-dir(lib/dispatch-child.ts:81). Ook zonder add-dir: volgens de docs (permission-modes, "first read outside the working directories") worden reads buiten de werkmappen in-p-runs gewoon uitgevoerd, tenzijpermissions.blockReadsOutsideWorkingDirectoriesaan staat.Bash: cat /sources/claude_oauth_tokenBashstaat in--allowedTools. Launcher en model draaien als dezelfde uid 10001, en het bestand moet leesbaar zijn voor 10001.Bash: env//proc/<pid>/environCLAUDE_CODE_OAUTH_TOKENstaat in de env van claude (dispatch-child.ts:95). Subprocessen erven die, omdatCLAUDE_CODE_SUBPROCESS_ENV_SCRUBniet gezet is.Waarom richtingen 1–3 niet werken
/sourcesis een readonly bind-mount (lib/dispatch-runtime.ts:68); dezelfde uid, met--cap-drop ALLenno-new-privileges. Chmod, unlink en uid-wissel kunnen dus geen van alle./sourcesmounten: Read in-p-modus enBash catlezen ook daarbuiten.Het echte exfiltratiepad
Egress is beperkt tot
api.anthropic.com, dus rechtstreeks naar buiten sturen kan niet. Er blijft één weg over: het rapport zelf (result/transcript).redactChildTextscrubt alleen de exacte waarde en bekende tokenvormen. Gecodeerde varianten (base64, omgekeerd, in stukjes) komen erlangs. Wie een gereviewd document schrijft en het reviewrapport kan lezen, kan het token zo binnenhalen.Voor Codex staat dit al als geaccepteerd restrisico in
docs/dispatch-runtime-operator.md:57("scrubbing is the only barrier"). Het Claude-deel zegt alleen "same rules" en neemt het restrisico niet expliciet over, terwijl eensetup-tokenaan het abonnement hangt en lang geldig is.Richtingen die wél iets doen
ANTHROPIC_BASE_URLgaat naar een lokale endpoint op de egress-bridge of -proxy, die de auth toevoegt. Dit lost Claude en Codex allebei op. Het is het meeste werk: de proxy doet nu alleen CONNECT en moet een HTTP-endpoint met eigen TLS naar de provider krijgen.CLAUDE_CODE_SUBPROCESS_ENV_SCRUB=1inbuildClaudeEnv: Bash ziet het token dan niet meer in de env. Op Linux hoort de scrub ook een aparte PID-namespace te geven; of die start ondercap-drop ALLmoet blijken.Read(//sources/claude_oauth_token)enRead(//sources/codex_api_key)via settings of--disallowedTools. Deny gaat voor allow, ook via symlinks.Bash. Read/Glob/Grep volstaan voor een review. Dit sluitcatenenvin één keer af.catdoet op het bestand. Dat dicht alleen A.Advies: B nu voor review-slots, A als vervolg.
Nog te verifiëren (proef in
model-claude-probe)Readbuiten de add-dir echt in-pmet--allowedTools Read?CLAUDE_CODE_SUBPROCESS_ENV_SCRUBonder--cap-drop ALL/no-new-privileges, of faalt Bash dan?Oplossing
Nog geen oplossing.