Executive brief
Paperclip is a server component that processes business approval workflows such as hiring and budget decisions. The approval endpoints accept a user-supplied identifier for who made the decision and record it directly in the audit trail without verifying the person actually made it. An authenticated board member can forge approval decisions to appear as if another board member (such as the CEO) approved them, compromising governance audit integrity and potentially enabling unauthorized budget or hiring approvals.
Technical details
This is an authorization bypass / account spoofing vulnerability in the approval-resolution endpoints (POST /approvals/:id/approve, /reject, /request-revision). The vulnerability stems from the server accepting a client-supplied `decidedByUserId` field in the request body and writing it verbatim into the authoritative `approvals.decidedByUserId` column without validating it against the authenticated actor's identity. The authorization check (`assertBoard`) only verifies that the caller is a board user with access to the approval's company—it never ties the supplied `decidedByUserId` to `req.actor.userId`. For hire_agent approvals with a monthly budget, the forged user ID is also written to the `budget_policies` row as `createdByUserId`/`updatedByUserId`. The attack requires authentication (board-level access) but no additional preconditions; any board member of a company can spoof decisions for approvals in that company. The fix (v2026.416.0) validates that the authenticated actor ID matches the supplied `decidedByUserId`.
Affected products
- Paperclip server <= 2026.410.0-canary.1
Timeline
- 2026-04-16: disclosed
- 2026-04-16: patched: v2026.416.0