Skip to content

Risk: MCP agent can produce authoritative sign-offs without per-action human authority (H5) #76

Description

@CST-100

Type: Risk (register-style tracking issue) · Origin: security audit finding H5 (full audit report + design note kept as local working notes; this issue is self-contained)

Risk statement

Agent-driven MCP can produce authoritative human records — quality sign-offs (disposition, risk acceptance/review), requirement baselines, and part-lifecycle activation — without genuine per-action human authority. Today a "signature" is a plain attribution field the agent supplies (user_id), so the agent can attribute or perform an authoritative action in place of a human. The record is not bound to its content and is not non-repudiable.

Category

Security · data/audit integrity · compliance (the affected records are the AS9100/ISO-style "a human decided this" artifacts).

Impact

A forged or agent-performed sign-off silently undermines the audit trail that dispositions, baselines, and activations exist to provide. High consequence for any regulated or customer-facing quality claim.

Likelihood

Low in the trusted-LAN posture — the MCP transport is stdio-only and anyone who can run it already has DB access — but the integrity property ("only a human can sign") is violated by design, independent of an attacker.

Current controls / mitigation in progress (PR #75)

  • Partial H5 already shipped: sign_disposition requires an active human; attach_to_step path-confined.
  • Level 1 (this PR): the agent is blocked from pure-judgment sign-offs (sign_disposition, accept_risk, set_risk_disposition, stamp_risk_review, baseline_batch, reaffirm_requirement) — draft/prepare only; a human commits in OPAL. Identity is no longer agent-chosen.
  • Part activation (activate_part, bulk_activate_parts): gated behind a default-off, admin-enabled per-project opt-in; blocker checks still enforced; attributed as agent-performed and audit-logged (activation is a mechanical blockers-only gate, not pure human judgment).

Residual risk (why this stays open)

  • No per-action human consent or non-repudiation yet: the activation opt-in is a blanket standing authorization; nothing binds a human to a specific record.
  • Gray-area tools unresolved: complete_step (emits immutable genealogy/output), bind_issue_hold.
  • Signatures are still attribution FKs, not content-bound cryptographic signatures.

Treatment plan (deferred design — the "thought problem")

  • Level 2 as the norm: agent proposes → a human approves in the OPAL web UI under their own login (per-action consent). Target end-state.
  • Level 3 (regulated clients): WebAuthn assertion over a canonical record hash → non-repudiable, tamper-evident e-signature. OPAL already stores per-user passkeys.
  • Decide the strategy for which actions an agent may ever be granted authority over, and under what standing/granted authorization.

The ladder (why per-action human authority needs an out-of-band gesture)

Any signature the agent can produce on its own, it can forge — so binding a real human to a specific sign-off requires an action through a channel the agent does not control. Keys don't remove the human gesture; they make it cryptographic.

Level Mechanism Agent can forge? Proves human saw this record?
0 (today) agent passes user_id yes no
1 (this PR) authoritative tools refuse for the agent; draft/prepare only no n/a — human commits in OPAL
2 (target norm) agent creates a pending record; a human approves it in the web UI under their own login no yes
3 (regulated) human signs a hash of the record with a private key (OPAL already stores per-user passkeys); server verifies no yes, + non-repudiable + tamper-evident

Open questions

  • Smallest set of actions an agent may ever be authorized to commit, and what authorizes it.
  • Does complete_step count as an immutable change or routine attribution? (It emits genealogy/output.)
  • Level 2 mechanics: pending-approval queue, notification, expiry, how the agent observes completion.
  • Level 3: canonical record hashing; storing/verifying the WebAuthn assertion; passkey-absent behavior.

Owner

TBD

References

  • src/opal/mcp/server.py_require_human_user
  • PR Security hardening for v1.4.0 #75 (Level 1 mitigation)
  • Security audit finding H5 (report kept as a local working note)

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

    riskTracked risk (register-style): impact, controls, residual, treatment

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions