Skip to content

Security arc: audit_log is an un-fenced text channel from a fenced actor into the orchestrator #266

Description

@jonybur

Why

The heap fence exists so untrusted page content never reaches the orchestrator unfenced. The audit log routes around it: an injected actor writes attacker prose into it, and the orchestrator later ingests those bytes verbatim.

What

  • Every successful fetch is audited with the full attacker-chosen path: {origin, path: u.pathname, method} (peerd-egress/fetch/web-fetch.js:205), no narrowing, no length cap (the log caps entry count only).
  • inspect({kind:'audit_log'}) returns entries as raw JSON.stringify (peerd-runtime/tools/defs/inspect.js:184-199) - no wrapUntrusted, therefore no disarmText (prompt-wrap.js is the only CDR call site).
  • inspect is on the main agent surface.

How

Verified by reading: inspect.js contains no wrapUntrusted call. This is the same laundering that origin-lock-report.js and redactActorError exist to close, so the fix likely mirrors them (fence the facet, or narrow what the path audit records).


Found by an adversarial multi-agent review of the merged #255 arc: each claim was checked by a separate agent instructed to refute it, and the code references below were re-verified by hand. Empirical status is stated per issue - most are verified by reading, not by a working exploit.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    Status
    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions