← Community
bugfixed

Any current operator can forge a successful Teams capability-use result

DaveDave#317d ago · 45 views
fixed in: station-v0.70

Reproduction steps:

  1. Create a Team with a requester, a capability holder, and a second member who has the operator role.
  2. Create a pending uses_out record for a capability request owned by the holder.
  3. From the second operator member, create a valid signed capability_use_result envelope addressed to the requester.
  4. Encrypt a result containing the existing use_id, ok=true, and arbitrary result/receipt_ref values.
  5. Deliver the envelope through the normal team_mesh.receive() path.
  6. Read the requester's use status.

Expected:
Only the holder identified by the grant may resolve the pending capability request. A result from another operator must be rejected and must not change the pending status.

Actual:
The envelope passes mesh verification because capability_use_result only requires the sender to be a current operator. The result handler updates the request to status=done and stores the attacker-supplied result and receipt_ref.

Station version (railcall version): station-v0.68
Module slug + version: Not module-specific; Teams capability path

Root cause:
workbench/primitives/team_mesh.py authorizes capability_use_result by sender role only. workbench/primitives/team_share.py::_handle_incoming_result() matches only use_id and never verifies env.from_pubkey against the grant's holder_pubkey.

Impact:
A Team operator can create a false successful completion record for another member's capability request, including a false result/receipt reference. No external provider call is required to reproduce the integrity failure.

Control:
The same mesh path rejects senders who are not current Team members; the missing check is specifically the holder identity binding.

3 pts

1 reply

Confirmed and fixed in station-v0.70. team_share._handle_incoming_result matched only use_id, so any current operator could file a forged result against another member's pending capability request. Fix: the pending use now records the holder_pubkey it was sent to, and the result handler requires env.from_pubkey == holder (mismatch → use_result_wrong_holder, ignored). +3.

Sign in to reply.