Paperclip AI Agent Platform — CVE-2026-41679
Executive Summary
Paperclip is a self-hosted, open-source control plane for teams of AI agents. In its default configuration it allows anyone to self-register an account, and a newly registered user can self-approve their own CLI authorization challenge to mint a persistent board-level API credential without any independent approver. That board-level credential is enough to reach the company-import route — which, unlike direct company creation, was never restricted to instance administrators. An attacker imports a company bundle defining an agent whose adapter type is process (Paperclip's built-in command executor), wakes the agent, and Paperclip spawns the attacker's chosen command with the OS privileges of the Paperclip server process. The whole chain is six unauthenticated API calls end to end, Rapid7 shipped a public Metasploit module for it in June 2026, and CISA's SSVC enrichment marks it automatable with total technical impact.
Two related flaws disclosed in the same Oasis Security report reach the identical outcome (attacker-controlled agent configuration reaching the host execution adapter) through different trust failures: a DNS-rebinding attack against Paperclip's local_trusted developer mode (GHSA-x8hx-rhr2-9rf7, CVSS 9.6, drive-by RCE against a developer's own machine via a malicious webpage — no credentials required), and a set of API routes that omitted authentication or company-scoping checks entirely (GHSA-xfqj-r5qw-8g4j, CVSS 8.3, information disclosure and reconnaissance). All three share one root cause Oasis calls out explicitly: "agent configuration must be treated as executable input." Paperclip fixed all three in v2026.416.0 (server manifest 0.3.1).
The attack chain up through "agent woken" lives entirely in Paperclip's own application and audit logs — self-registration, self-approval, and company import are not Falcon-visible events. Everything from the moment the process adapter calls spawn() onward — the attacker's command executing as a child of the Paperclip server process, and whatever it does next — is fully visible to Falcon EDR and is where this pack's detection coverage concentrates.
authenticated mode with default open registration — this is a CVSS 10.0, six-call, fully automated, unauthenticated chain with a public Metasploit module. If you cannot patch immediately, disable open self-registration (PAPERCLIP_AUTH_DISABLE_SIGN_UP) and pull the instance behind a VPN/allowlist today; that alone breaks step 1 of the chain.
Source Review & Web Hunter Notes
Six sources fetched and saved verbatim to Paperclip-CVE-2026-41679-Hunt-sources/. No embedded instructions directed at an AI agent were found in any fetched page; all content was treated as data, not directions. One note on internal consistency: The Hacker News's own review found Paperclip uses two version labels for the same tagged release — the GitHub security-release tag is v2026.416.0 while the in-tag server/CLI manifests report 0.3.1 — which is why sources reference both. The GHSA-x8hx-rhr2-9rf7 (DNS-rebinding) advisory still lists no formal patched-version field even though the fix is present in the same tagged source; treat v2026.416.0/0.3.1 as the safe upgrade target for all three findings.
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| 1 | Oasis Security — Breaking the Paperclip | Discoverer/discloser; names all 3 flaws, the shared "config-is-code" root cause, and the exact authorization mismatch (direct company creation requires instance-admin; import does not) | yes |
| 1 | GitHub Security Advisory GHSA-68qg-g8mg-6pr7 | Code-level technical advisory for CVE-2026-41679: exact source locations (server/src/config.ts, server/src/services/company-portability.ts, server/src/routes/agents.ts), confirms spawn() is called with zero sandboxing, confirms fix | yes |
| 1 | The Hacker News | Independent verification, version-labeling discrepancy note, notes absence from CISA KEV as of 2026-08-05, confirms no corroborated ITW exploitation | yes |
| 2 | SecurityWeek | Corroborates chain and impact scope (app data, source repos, local credentials, agent secrets, reachable internal services); frames as part of a broader AI-agent-as-identity trend | partial |
| 2 | Rapid7 Metasploit Weekly Wrap-Up | Confirms public Metasploit module linux/http/paperclipai_unauth_rce_cve_2026_41679, six-API-call automated chain, shipped June 2026 — two months before this week's writeup wave | yes |
| 2 | CVE Feed (NVD/CISA-ADP aggregation) | CISA-ADP SSVC: exploitation=poc, automatable=yes, technicalImpact=total; affected version range < 2026.416.0 for both paperclipai and @paperclipai/server npm packages; confirms Node.js/React architecture | yes |
Not fully corroborated / used with caution: the exact default network port Paperclip listens on is not stated consistently across sources reviewed — CQL queries in this pack deliberately do not hard-code a port and instead surface all external connections/listeners for the analyst to scope to their own deployment's configured port.
Hunt Brief & Attack Chain
Hunt hypotheses
- Process-adapter abuse (high confidence). If CVE-2026-41679 has been exploited, the Paperclip server process (a Node.js process) will have spawned an unexpected shell or interpreter as a direct child — the process adapter calls
spawn()with zero sandboxing on the attacker-supplied command. - Reverse-shell delivery (high confidence). The simplest payload for a six-call automated chain is a reverse shell; command lines spawned from the Paperclip process tree containing shell-redirect-to-network or interpreter-socket patterns are high-signal.
- Post-RCE discovery and credential access (high confidence). The disclosed proof-of-concept itself runs
idandwhoamias its verification step — expect discovery commands as the first post-exploitation action, followed by credential-file reads if the operator pivots. - Persistence via the compromised service account (medium-high confidence). An attacker with arbitrary command execution as the Paperclip server's OS user will typically establish a foothold beyond the single RCE — registry Run-key/Asep entries (Windows) or cron/systemd/SSH-key changes (Linux, only partially Falcon-visible via command line).
- Outbound C2/exfil (medium confidence, needs tuning). A spawned child process reaching out to a non-private destination shortly after being spawned by the Paperclip process tree is consistent with C2 callback or exfiltration, but Paperclip's own legitimate LLM-API/package-registry traffic will need to be excluded.
- Internet exposure as a leading indicator (low confidence, exposure signal only). Any Paperclip instance accepting inbound connections from the public internet on its authenticated-mode listener is, by definition, in the vulnerable population before considering registration settings — useful for prioritization, not for confirming compromise.
Attack chain
| Step | Action | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 | Attacker self-registers an account (open signup, no email verification) | Paperclip application/audit log only | Native audit hunt — see §7 |
| 2 | Attacker creates & self-approves a CLI authorization challenge, minting a board-level API credential with no independent approver | Paperclip application/audit log only | Native audit hunt — see §7 |
| 3 | Attacker uses the board-level token against the company-IMPORT route (missing instance-admin check that direct company creation correctly enforces) | Paperclip application/audit log only | Native audit hunt — see §7 |
| 4 | Attacker imports a .paperclip.yaml bundle defining a new company + an agent configured with the process adapter and a command | Falcon file-write telemetry — partial (archive-upload path only; inline-JSON API path used by the disclosed six-call chain writes no file Falcon natively tracks) | Q8 (partial) — gap noted in §15 |
| 5 | Attacker "wakes" the imported agent; the wakeup handler only checks company access, which passes because the attacker owns the company they just imported | Paperclip application/audit log only | Native audit hunt — see §7 |
| 6 | Paperclip's process adapter calls spawn() with the attacker's command, executing with the OS privileges of the Paperclip server process — full RCE | Falcon ProcessRollup2 — full coverage | Q1, Q2, Q3, Q4 |
| 7 | Post-exploitation: discovery, credential access, persistence, lateral movement, C2/exfil, using the OS privileges obtained in step 6 | Falcon Process/Registry/Network — full to partial coverage depending on behavior | Q3, Q4, Q5, Q6, Q7 |
Consolidated IOC Table
This CVE is an authorization-logic bug in an open-source application, not a payload family — there are no published file hashes or C2 domains/IPs to ship as atomic detect/block indicators. The table below lists the identifiers actually published (CVE/advisory IDs, affected package versions, the vulnerable configuration default, and the public exploit tooling), all of which trace to the saved source snapshots — see §10 for the import-ready quick-copy blocks and §15/exec-summary for the honest coverage-gap statement.
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| cve | CVE-2026-41679 | high | detect | Primary RCE flaw — import authorization bypass, CVSS 10.0 | 2027-02-11 |
| advisory | GHSA-68qg-g8mg-6pr7 | high | detect | Code-level technical advisory for CVE-2026-41679 | 2027-02-11 |
| advisory | GHSA-x8hx-rhr2-9rf7 | high | hunt | DNS-rebinding drive-by RCE against local_trusted mode, CVSS 9.6 | 2026-11-11 |
| advisory | GHSA-xfqj-r5qw-8g4j | high | hunt | Missing authz on several API routes, CVSS 8.3, info disclosure/recon | 2026-11-11 |
| software | paperclipai / @paperclipai/server (npm) < v2026.416.0 | high | detect | Vulnerable version range — inventory and patch target | 2027-02-11 |
| config-weakness | PAPERCLIP_AUTH_DISABLE_SIGN_UP defaulting to false | high | hunt | Open self-registration is the enabling condition for step 1 of the chain — audit this setting regardless of patch status | 2026-11-11 |
| tooling | Metasploit module linux/http/paperclipai_unauth_rce_cve_2026_41679 | high | enrich | Public, automated six-API-call exploit chain, published June 2026 | 2026-09-11 |
| behavioral-artifact | .paperclip.yaml agent bundle configured with a process adapter | medium | hunt | Legitimate feature abused as executable config — not malicious by itself, context-dependent | 2026-11-11 |
Affected Surface & Telemetry Matrix
| Surface | Required Telemetry | Priority | Gap Risk |
|---|---|---|---|
| Paperclip application layer (registration, CLI auth, import, wake) | Paperclip's own application/audit log — not Falcon | critical | high — no Falcon visibility at all into steps 1–3 and 5 of the chain |
| Host OS running the Paperclip server process (self-hosted, typically Linux/Node.js, often containerized) | Falcon ProcessRollup2, RegGenericValueUpdate/AsepValueUpdate | critical | low — full coverage once the process adapter executes (step 6 onward) |
| Network exposure (internet-accessible authenticated-mode deployments) | Falcon NetworkConnectIP4, NetworkReceiveAcceptIP4 + perimeter/firewall/reverse-proxy logs | high | medium — Falcon only sees connections on sensor-monitored hosts, not internet-wide exposure; high false-positive rate on inbound-connection volume alone |
Developer workstation (local_trusted mode, DNS-rebinding path — GHSA-x8hx-rhr2-9rf7) | Same endpoint process/network telemetry as the server path, once code executes | high | high — the browser/DNS delivery mechanism itself is invisible to EDR; only the resulting process execution is covered, identically to the server-side chain |
ATT&CK Mapping
| Tactic | Technique | Technique Name | Observed / Expected Behavior |
|---|---|---|---|
| Initial Access | T1190 | Exploit Public-Facing Application | Unauthenticated attacker exploits the import-authorization gap on a network-accessible Paperclip instance |
| Initial Access / Persistence | T1078 | Valid Accounts | Self-registered account is escalated to a durable board-level credential via self-approval of its own CLI authorization challenge |
| Execution | T1059 | Command and Scripting Interpreter | Process adapter's spawn() call executes the attacker's command as a Paperclip server child process |
| Command and Control | T1071.001 / T1105 | Application Layer Protocol (Web) / Ingress Tool Transfer | Reverse shell or staged tooling download from the compromised host |
| Discovery | T1082, T1033, T1057, T1018 | System Info / Owner Discovery, Process Discovery, Remote System Discovery | whoami, id, uname, network/host enumeration — matches the disclosed PoC's own verification step |
| Credential Access | T1552.001 | Unsecured Credentials: Credentials In Files | Reads of cloud/SSH/env credential files reachable by the Paperclip service account |
| Persistence | T1547.001, T1543, T1053 | Registry Run Keys, Create/Modify System Process, Scheduled Task/Job | Autostart or service persistence established from the compromised process tree |
| Exfiltration | T1041 | Exfiltration Over C2 Channel | Outbound transfer of application data, source repos, or credentials reachable from the host |
Native Audit-Log Hunts
The API-level attack chain — self-registration, self-approval, import, wake — is not visible to Falcon. It lives entirely in Paperclip's own application/audit log (and, for the DNS-rebinding path, in browser/DNS telemetry Falcon also does not natively collect). These checks require pulling Paperclip's own logs; they are the highest-signal detections for this specific chain and should run alongside the CQL queries in §8, not instead of them.
- Self-approval velocity. Query Paperclip's audit log for accounts where the same actor identity both created and approved a CLI authorization challenge, especially within minutes of account registration. In legitimate operation a CLI challenge is approved by a different, already-trusted user.
- Import target-mode by role. Flag any
company-importevent withtarget.mode = new_companyinitiated by an actor whose role is board-level rather than instance-administrator — this is the exact authorization mismatch CVE-2026-41679 exploited, and it is a clean, low-noise signal once the app-log field is available. - Wake-immediately-after-import. Flag agent "wake" events occurring within seconds to low minutes of the company import that created the agent, particularly when the agent's adapter type is
process. Legitimate operator workflows rarely wake a freshly imported agent instantly. - Registration configuration audit. Confirm the deployment's
PAPERCLIP_AUTH_DISABLE_SIGN_UPsetting. If it is unset orfalse, open self-registration is active — treat as a standing finding regardless of patch level, since open registration is the enabling condition for step 1 even after the import-route fix closes the RCE path. - Deployment-mode audit. Confirm the instance is not running
local_trustedmode anywhere reachable by more than a single trusted developer on a single machine. If it must run inlocal_trusted, confirm the version is v2026.416.0+ so the private-hostname/DNS-rebinding guard is active. - Version/patch-status check. Query the instance's own health/version endpoint (or CLI/manifest version) and confirm it reports v2026.416.0 or server-manifest 0.3.1 or later. See the audit commands in §10 and §13.
CrowdStrike LogScale CQL Hunt Queries
Looks for: a shell or scripting interpreter spawned directly by the Paperclip server process — the exact shape of the process adapter's unsandboxed spawn() call. FP: legitimate agents configured with a process adapter that intentionally shell out to signed internal automation will also match; requires baselining before promotion to a blocking IOA.
// HUNT: Process-Adapter Child Process Execution (Paperclip RCE Step) // MITRE: T1059, T1190 // CONF: high FP: medium COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: legitimate agents configured with a process adapter that intentionally shell out to signed internal automation // TUNING: exclude known-good agent automation by SHA256HashData or a signed internal wrapper FileName; baseline the process adapter's expected command set for 7-14 days before promoting to a blocking IOA // LOOKBACK: 14d #event_simpleName=/^ProcessRollup2$/ | ParentBaseFileName=/^(node|paperclip|paperclip-server|npm|npx|pm2|docker-entrypoint\.sh)(\.exe)?$/i | FileName=/^(bash|sh|dash|zsh|cmd|powershell|pwsh|python3?|perl|ruby|nc|ncat|socat)(\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc)
Looks for: the highest-signal reverse-shell command-line idioms (/dev/tcp redirection, nc -e, interpreter socket one-liners, hidden-window PowerShell) anywhere below the Paperclip process in the tree. FP: internal red-team/pentest activity against the same host; otherwise rare.
// HUNT: Reverse Shell Command Patterns in Paperclip Process Tree // MITRE: T1059, T1071.001, T1105 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: internal red-team/pentest activity against the same host; otherwise rare // LOOKBACK: 14d #event_simpleName=/^ProcessRollup2$/ | GrandparentBaseFileName=/^(node|paperclip|paperclip-server|npm|npx|pm2|docker-entrypoint\.sh)(\.exe)?$/i | CommandLine=/(\/dev\/tcp\/|nc\s+-e|ncat\s+.*-e|bash\s+-i\s+>&|python[3]?\s+-c\s+.*socket|powershell\s+-nop.*-w\s+hidden|Invoke-WebRequest.*IEX)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, GrandparentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc)
Looks for: basic host/network discovery commands spawned from the Paperclip process tree — this matches the disclosed proof-of-concept's own verification step (id / whoami). FP: monitoring/observability agents and health-check scripts that legitimately run whoami/uname/hostname on a schedule.
// HUNT: Discovery / Recon Commands via Process Adapter // MITRE: T1082, T1033, T1057, T1018 // CONF: high FP: medium COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: monitoring/observability agents and health-check scripts that legitimately run whoami/uname/hostname on a schedule // TUNING: exclude the ParentBaseFileName of your known monitoring/APM agent, or exclude CommandLine matches carrying your health-check script's known argument signature // LOOKBACK: 14d #event_simpleName=/^ProcessRollup2$/ | ParentBaseFileName=/^(node|paperclip|paperclip-server|npm|npx|pm2|docker-entrypoint\.sh)(\.exe)?$/i | CommandLine=/\b(whoami|id\s|uname\s+-a|hostname|ip\s+a(ddr)?|ifconfig|netstat\s+-|ss\s+-tuln|cat\s+\/etc\/passwd|systeminfo|net\s+user|wmic)\b/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc)
Looks for: command lines referencing cloud/SSH/env/secret files reachable by the Paperclip service account — the natural next step after the RCE step, per Oasis's stated impact scope (application data, credentials, agent secrets, reachable internal services). FP: legitimate deployment/config-management tooling reading the same files as part of normal CI/CD.
// HUNT: Credential-Access File Reads via Process Adapter // MITRE: T1552.001, T1555 // CONF: medium FP: medium COST: low // REQUIRES: ProcessRollup2 // FALSE POSITIVES: legitimate deployment/config-management tooling reading the same credential files as part of normal CI/CD // TUNING: exclude your known CI/CD runner's ParentBaseFileName and service-account UserName; scope to interactive shells (bash/sh/cmd/powershell) rather than known automation binaries // LOOKBACK: 14d #event_simpleName=/^ProcessRollup2$/ | ParentBaseFileName=/^(node|paperclip|paperclip-server|npm|npx|pm2|docker-entrypoint\.sh)(\.exe)?$/i | CommandLine=/(\.aws\/credentials|\.ssh\/id_rsa|\.env\b|\.npmrc|kubeconfig|\.docker\/config\.json|secrets\.ya?ml|vault\s+read|gcloud\s+auth)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, CommandLine]) | sort(@timestamp, order=desc)
Looks for: autostart registry persistence (Run/RunOnce keys) written by a process in the Paperclip tree — the Windows-host persistence angle after an initial RCE. FP: legitimate software installers running under the same service account in shared/dev environments; low volume in practice.
// HUNT: Registry Run-Key / Autostart Persistence from Paperclip Process Tree // MITRE: T1547.001, T1543 // CONF: high FP: low COST: low // REQUIRES: RegGenericValueUpdate, AsepValueUpdate // FALSE POSITIVES: legitimate software installers running under the same service account in shared/dev environments // LOOKBACK: 14d #event_simpleName=/^(RegGenericValueUpdate|AsepValueUpdate)$/ | ContextBaseFileName=/^(node|paperclip|paperclip-server|npm|npx|pm2|bash|sh|powershell|cmd)(\.exe)?$/i | RegObjectName=*Run* | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, RegObjectName, RegValueName, RegStringValue]) | sort(@timestamp, order=desc)
Looks for: outbound connections to non-private destinations from a process whose parent is the Paperclip server, correlating NetworkConnectIP4 back to ProcessRollup2 via the process ID join. FP: Paperclip's own legitimate outbound calls to configured LLM/model-provider APIs, npm/package registries, and its own update/telemetry endpoints.
// HUNT: Outbound Network Connection from a Process-Adapter Child (C2/Exfil) // MITRE: T1071, T1041, T1105 // CONF: medium FP: medium COST: medium // REQUIRES: NetworkConnectIP4, ProcessRollup2 // FALSE POSITIVES: Paperclip's own legitimate outbound calls to configured LLM/model-provider APIs, package registries, and update/telemetry endpoints // TUNING: allowlist your approved model-provider and package-registry IP/domain ranges before promoting; scope to first-seen destination per host rather than every connection // LOOKBACK: 7d #event_simpleName = NetworkConnectIP4 | !cidr(RemoteAddressIP4, subnet="10.0.0.0/8") | !cidr(RemoteAddressIP4, subnet="172.16.0.0/12") | !cidr(RemoteAddressIP4, subnet="192.168.0.0/16") | !cidr(RemoteAddressIP4, subnet="127.0.0.0/8") | rename(field=ContextProcessId_decimal, as=TargetProcessId_decimal) | join(query={#event_simpleName = ProcessRollup2 | ParentBaseFileName=/^(node|paperclip|paperclip-server|npm|npx|pm2|docker-entrypoint\.sh)(\.exe)?$/i}, field=TargetProcessId_decimal) | table([@timestamp, ComputerName, ParentBaseFileName, FileName, CommandLine, RemoteAddressIP4, RemotePort]) | sort(@timestamp, order=desc)
Looks for: external (non-RFC1918) source addresses connecting inbound to the Paperclip process — an exposure/prioritization signal, not a compromise signal by itself. FP: every legitimately internet-exposed instance sees external client connections as normal operation.
// HUNT: Unexpected Inbound Connections to an Internet-Exposed Paperclip Listener // MITRE: T1190 // CONF: low FP: high COST: medium // REQUIRES: NetworkReceiveAcceptIP4 // FALSE POSITIVES: every legitimately internet-exposed instance sees external client connections; this is an exposure/recon signal, not a compromise signal by itself // TUNING: baseline expected client ranges (reverse proxy, VPN egress, known SaaS integrations) and alert only on rare/first-seen source IPs or a spike in distinct sources per hour; pair with the version/patch-status audit in the Validation Gates section rather than running this standalone // LOOKBACK: 7d #event_simpleName = NetworkReceiveAcceptIP4 | ContextBaseFileName=/^(node|paperclip|paperclip-server|npm|npx|pm2|docker-entrypoint\.sh)(\.exe)?$/i | !cidr(RemoteAddressIP4, subnet="10.0.0.0/8") | !cidr(RemoteAddressIP4, subnet="172.16.0.0/12") | !cidr(RemoteAddressIP4, subnet="192.168.0.0/16") | groupBy([aid, ComputerName, LocalPort, RemoteAddressIP4], function=count(as=Hits), limit=500) | sort(Hits, order=desc)
Looks for: archive files written by the Paperclip process — the closest native Falcon signal to a company-bundle import that persists to disk. FP: legitimate company-bundle exports/imports performed by authorized administrators; also see the coverage-gap note below.
// HUNT: Archive/Bundle Write Consistent with a Company-Import Upload // MITRE: T1059 // CONF: low FP: medium COST: low // REQUIRES: ZipFileWritten // FALSE POSITIVES: legitimate company-bundle exports/imports performed by authorized administrators as part of normal Paperclip operations. Falcon has no native event for a plain-text .paperclip.yaml write on its own (see Coverage Map, s15) so this only catches the archive-upload import path, not the inline-JSON API path used by the disclosed six-call chain // TUNING: correlate against Paperclip's own import audit log for the same time window before treating a hit as suspicious; exclude known admin accounts' routine export/import maintenance windows // LOOKBACK: 14d #event_simpleName = ZipFileWritten | ContextBaseFileName=/^(node|paperclip|paperclip-server|npm|npx|pm2|docker-entrypoint\.sh)(\.exe)?$/i | table([@timestamp, aid, ComputerName, UserName, ContextBaseFileName, TargetFileName, FileName]) | sort(@timestamp, order=desc)
CrowdStrike Custom IOA Recommendations
Promote to a Custom IOA only after the baseline period in §11. Recommended promotion order:
| Candidate | Pattern Basis | Exclusions Needed | Deployment Path |
|---|---|---|---|
| Q1 — Process-adapter child process | ParentBaseFileName in Node/Paperclip set AND FileName in shell/interpreter set | Known agent automation scripts by hash/path; run in detect-only 7-14 days first | Falcon → Custom IOA rules → Process → detect-only, then escalate to prevent after tuning |
| Q2 — Reverse shell command patterns | CommandLine regex on high-signal reverse-shell idioms below the Paperclip process | Authorized red-team source hosts, if any | Falcon → Custom IOA rules → Process → prevent-capable given low observed FP |
| Q5 — Registry Run-key persistence from the tree | Asep/Registry event with ContextBaseFileName in Node/Paperclip/shell set AND key path containing Run | Known installer service accounts | Falcon → Custom IOA rules → Registry → detect-only initially |
Q3, Q4, Q6, Q7, Q8 remain hunt/investigate-only given their FP profile (medium-high) and, for Q7/Q8, their role as exposure/context signals rather than confirmed-compromise signals.
Machine-Readable IOC Appendix
No file hashes, C2 domains, or C2 IPs have been published for this CVE — it is an authorization-logic bug in application code, not a payload family. The blocks below ship the identifiers that are published (CVE/advisory IDs, affected package/version range, the vulnerable config default, and public exploit tooling), plus behavioral signatures and a patch/config audit checklist, in place of a conventional hash/domain blocklist.
type,value,action,severity,expiration,description,tags cve,CVE-2026-41679,enrich,critical,2027-02-11,Paperclip import authorization bypass RCE,vuln:paperclip advisory,GHSA-68qg-g8mg-6pr7,enrich,critical,2027-02-11,GitHub technical advisory for CVE-2026-41679,vuln:paperclip advisory,GHSA-x8hx-rhr2-9rf7,enrich,high,2026-11-11,DNS-rebinding drive-by RCE against local_trusted mode,vuln:paperclip advisory,GHSA-xfqj-r5qw-8g4j,enrich,medium,2026-11-11,Missing authorization on several API routes,vuln:paperclip package,@paperclipai/server,enrich,critical,2027-02-11,npm package - vulnerable below v2026.416.0,vuln:paperclip package,paperclipai,enrich,critical,2027-02-11,npm package - vulnerable below v2026.416.0,vuln:paperclip config-key,PAPERCLIP_AUTH_DISABLE_SIGN_UP,enrich,high,2026-11-11,defaults false - open self-registration enabling condition,vuln:paperclip exploit-module,linux/http/paperclipai_unauth_rce_cve_2026_41679,pivot,high,2026-09-11,public Rapid7 Metasploit module - six-call automated chain,vuln:paperclip
# Behavioral signal, not an atomic indicator -- pair with Q1-Q8 in section 8 Parent process: node | paperclip | paperclip-server | npm | npx | pm2 | docker-entrypoint.sh Unexpected child: bash | sh | dash | zsh | cmd.exe | powershell.exe | pwsh | python | perl | ruby | nc | ncat | socat Reverse-shell cmd: /dev/tcp/ redirection, "nc -e", interpreter socket one-liners, hidden-window PowerShell Discovery cmd: whoami, id, uname -a, hostname, ip a, ifconfig, netstat, cat /etc/passwd Persistence: Registry Run/RunOnce key write from the same process tree Network: outbound connection to a non-private address opened by a Paperclip-tree child process
CVE-2026-41679 (CVSS 10.0 - unauthenticated RCE, primary) GHSA-68qg-g8mg-6pr7 (CVE-2026-41679 technical advisory) GHSA-x8hx-rhr2-9rf7 (CVSS 9.6 - DNS rebinding, local_trusted mode) GHSA-xfqj-r5qw-8g4j (CVSS 8.3 - missing route authorization) linux/http/paperclipai_unauth_rce_cve_2026_41679 (public Rapid7 Metasploit module)
# 1. Confirm patched version (target: v2026.416.0 / server manifest 0.3.1, or later) curl -sk https://REPLACE_WITH_HOST/api/health | grep -i version # 2. Confirm open self-registration is disabled (or explicitly accepted risk) # Check the deployment's environment for: PAPERCLIP_AUTH_DISABLE_SIGN_UP=true # 3. Confirm deployment mode is not local_trusted on any shared/networked host # (local_trusted should be single-developer, single-machine only) # 4. Confirm the instance is not directly internet-reachable without a # VPN / SSO / IP-allowlist in front of it
Detection Validation Gates
| Gate | Requirement | Status Check |
|---|---|---|
| Telemetry ready | Confirm ProcessRollup2, NetworkConnectIP4/NetworkReceiveAcceptIP4, and RegGenericValueUpdate/AsepValueUpdate are actively collecting on every host running Paperclip | Run * | groupBy(#event_simpleName) scoped to the Paperclip host(s) and confirm all three event families appear |
| Benign baseline | Run Q1, Q3, Q6 for 7-14 days in investigate-only mode before promoting any query to an IOA | Review hit volume and confirm expected agent/monitoring FP sources are captured in the TUNING exclusions |
| Positive test | On a non-production Paperclip instance, configure a benign test agent with a process adapter running an innocuous command (e.g. echo test) and wake it under authorized testing conditions — confirm Q1 fires. Do not recreate the actual exploit chain against a production or internet-reachable instance. | Confirm the query card returns the test event with correct ParentBaseFileName/FileName/CommandLine |
| Promotion | Q1, Q2, Q5 → Custom IOA after tuning (see §9); Q3, Q4, Q6, Q7, Q8 remain hunt/investigate-only | Track FP rate per query post-tuning; re-baseline if FP rate exceeds target after any Paperclip upgrade or agent-fleet change |
Hardening — Tiered & Deployable
- Patch to Paperclip v2026.416.0 or later (server manifest 0.3.1+). MITRE M1051 — Update Software. Verify: §10 audit checklist item 1. No formal CIS/vendor benchmark exists for Paperclip specifically — this control rests on the vendor's own security release, which is the strongest available authority for this product. ⚠ best-practice, no formal benchmark.
- Disable open self-registration if you cannot patch same-day: set
PAPERCLIP_AUTH_DISABLE_SIGN_UP=true(or require email verification + admin approval). MITRE M1036 — Account Use Policies. Verify: §10 audit checklist item 2. This alone breaks step 1 of the six-call chain even pre-patch. - Remove direct internet exposure of Paperclip's API/UI — front it with a reverse proxy requiring VPN, SSO, or IP allowlisting; do not expose it raw to 0.0.0.0/the internet. MITRE M1030 — Network Segmentation. Verify: external port scan against the host, or firewall-rule review.
- Disable or upgrade any
local_trusted-mode instance reachable by more than a single trusted developer on a single machine (DNS-rebinding path, GHSA-x8hx-rhr2-9rf7). MITRE M1042 — Disable or Remove Feature or Program. Verify: §10 audit checklist item 3.
- Run the Paperclip service as a dedicated, non-root, least-privilege OS account with no access to other services' credentials or secrets. MITRE M1026 — Privileged Account Management. Cite: CIS Docker Benchmark §4.1 "Ensure a user for the container has been created" / CIS Distribution Independent Linux Benchmark, service-account section. Verify:
ps -o user= -p $(pgrep -f paperclip)should not returnroot. - Sandbox the process adapter's
spawn()capability — run Paperclip in a container with dropped capabilities, a seccomp profile, a read-only root filesystem, and no default outbound egress. MITRE M1048 — Application Isolation and Sandboxing. Cite: CIS Docker Benchmark §5 (container runtime restrictions). Verify:docker inspect <container> --format '{{.HostConfig.CapDrop}} {{.HostConfig.ReadonlyRootfs}}'. - Enable egress filtering/allowlisting from the Paperclip host so a compromised process adapter cannot freely reach arbitrary external IPs. MITRE M1037 — Filter Network Traffic. Verify: attempt an outbound connection to a non-allowlisted IP from the host and confirm it is blocked; cross-check against Q6.
- Treat agent configuration as code — mandatory review/approval workflow for any
.paperclip.yamlor company-bundle import, and a policy requiring instance-administrator review before any process-adapter agent goes live, independent of what the application enforces. MITRE M1047 — Audit. ⚠ best-practice, governance control, no formal benchmark. - Move static credentials out of files reachable by the Paperclip service account and into a secrets manager (Vault, cloud KMS) with short-lived, scoped tokens, reducing the blast radius of any future RCE in this or any other self-hosted agent platform. MITRE M1041 — Encrypt Sensitive Information.
- Establish AI-agent identity governance — inventory every agent and its access paths, log agent-to-resource actions with end-to-end attribution back to the originating user and the import event that created the agent. This is Oasis Security's own stated recommendation and directly closes the "logs show only the final credential" gap they describe. ⚠ best-practice, no formal benchmark; emerging area.
Deployable Playbooks
Playbook A — Verify patch status and disable open self-registration
Prerequisites: shell access to the host running Paperclip; ability to restart the Paperclip service.
Reboot required: no (service restart only).
Rollback: revert the environment variable change and restart the service; this re-enables open self-registration and returns to prior behavior — only roll back if you have an alternative registration control in place.
# 1. Check current version against the fixed release curl -sk https://REPLACE_WITH_HOST/api/health | grep -i version # Expect: v2026.416.0 / server manifest 0.3.1, or later # 2. If you cannot patch immediately, disable open self-registration in the # Paperclip environment configuration (.env, docker-compose.yml, or the # orchestrator's secret/config store): PAPERCLIP_AUTH_DISABLE_SIGN_UP=true # 3. Restart the Paperclip service to apply docker compose restart paperclip-server # or: systemctl restart paperclip-server
Playbook B — Remove direct internet exposure (reverse proxy + firewall)
Prerequisites: nginx (or equivalent reverse proxy) already provisioned in front of the host; firewall management access (ufw/iptables/security group).
Reboot required: no.
Rollback: remove the added firewall DROP/allowlist rule and the proxy auth block to restore prior (direct) access — only do this in a controlled maintenance window, since it restores the exposed condition.
# nginx: require a client certificate or upstream SSO auth in front of Paperclip
location / {
# Require your SSO/OAuth2 proxy or mTLS client cert here before proxying
auth_request /oauth2/auth;
proxy_pass http://127.0.0.1:REPLACE_WITH_PAPERCLIP_PORT;
}
# Host firewall: only allow the reverse proxy / VPN subnet to reach the
# Paperclip port directly; deny everything else
ufw deny REPLACE_WITH_PAPERCLIP_PORT/tcp
ufw allow from REPLACE_WITH_TRUSTED_SUBNET to any port REPLACE_WITH_PAPERCLIP_PORT proto tcp
Playbook C — Sandbox the service (systemd hardening, if not containerized)
Prerequisites: Paperclip runs as a systemd service unit; systemd 245+.
Reboot required: no (daemon-reload + service restart).
Rollback: remove the added directives from the unit override file and run systemctl daemon-reload && systemctl restart paperclip-server to restore prior (unsandboxed) behavior.
# /etc/systemd/system/paperclip-server.service.d/hardening.conf [Service] NoNewPrivileges=true ProtectSystem=strict ProtectHome=true PrivateTmp=true ReadWritePaths=/var/lib/paperclip CapabilityBoundingSet= User=paperclip-svc Group=paperclip-svc # Apply: sudo systemctl daemon-reload sudo systemctl restart paperclip-server
Playbook D — Container security options (if running via Docker)
Prerequisites: Docker/Compose-managed deployment; ability to recreate the container.
Reboot required: no (container recreate only — expect a brief service interruption during recreate).
Rollback: remove the added security_opt/cap_drop/read_only lines from the compose file and re-run docker compose up -d to restore the prior container configuration.
# docker-compose.yml
services:
paperclip-server:
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
tmpfs:
- /tmp
user: "REPLACE_WITH_NON_ROOT_UID:REPLACE_WITH_NON_ROOT_GID"
# Apply:
docker compose up -d --force-recreate paperclip-server
Containment Runbook
| Phase | Actions | Owner | Evidence to Capture |
|---|---|---|---|
| Isolate | Network-isolate the affected host (Falcon Network Containment or firewall block); do not power off — preserve process memory for triage; pull Paperclip's own audit log for the affected instance immediately, before any restart clears it | IR lead | Falcon process tree for the RCE event (Q1/Q2 hit), Paperclip audit log export covering registration/CLI-approval/import/wake events |
| Eradicate | Identify and revoke the attacker-created account and its board-level API credential in Paperclip; delete the imported malicious company/agent; patch to v2026.416.0+ before returning to service; rotate any credentials reachable by the Paperclip service account (Q4 hits define scope) | Platform owner + IR | List of revoked credentials/accounts, patched version confirmation, Q4/Q5 hit list defining what was potentially accessed or persisted |
| Recover | Restore from a known-good backup if persistence (Q5) or data exfiltration (Q6) is confirmed; re-enable network exposure only behind the Playbook B reverse-proxy/VPN control; re-baseline Q1/Q3/Q6 for 7-14 days post-recovery before re-promoting any IOA | Platform owner | Post-recovery baseline results, confirmation Playbooks A-D are all applied, updated agent inventory |
Detection Coverage Map
| Attack-Chain Step | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| 1. Self-registration | Open signup, no email verification | — | — | GAP — Paperclip app log only |
| 2. Self-approval of CLI credential | Same actor requests & approves own challenge | — | — | GAP — Paperclip app log only |
| 3. Company import (missing authz) | Board-level token used against instance-admin-only operation | — | — | GAP — Paperclip app log only |
| 4. Malicious .paperclip.yaml delivered | Agent bundle with process adapter imported | Q8 | — | PARTIAL — archive-upload path only, not inline-JSON API path |
| 5. Agent wake | Attacker triggers the imported agent | — | — | GAP — Paperclip app log only |
| 6. Process adapter RCE | spawn() executes attacker command as server process | Q1, Q2 | Q1, Q2 candidates | GOOD |
| 7a. Discovery | whoami/id/uname/network enum | Q3 | — | GOOD |
| 7b. Credential access | Reads of cloud/SSH/env credential files | Q4 | — | PARTIAL — generic pattern match, tune to environment |
| 7c. Persistence (Windows) | Registry Run/RunOnce key write | Q5 | Q5 candidate | GOOD |
| 7c. Persistence (Linux) | cron/systemd/SSH-key changes | — | — | GAP — no dedicated CQL; partially caught by Q1's broad shell-spawn match |
| 7d. C2 / exfiltration | Outbound connection from a spawned child | Q6 | — | PARTIAL — requires tuning against legitimate LLM/registry egress |
| Exposure prioritization | Internet-reachable authenticated-mode instance | Q7 | — | PARTIAL — exposure signal only, high FP by design |
| DNS-rebinding path (GHSA-x8hx-rhr2-9rf7) | Malicious webpage drives local_trusted instance to RCE | Q1, Q2 (post-execution only) | — | GAP — browser/DNS delivery invisible to EDR; only resulting process execution is covered, same as step 6 |
See §11 for the validation-gate sequence (telemetry readiness → benign baseline → positive test → promotion) that must be completed before any query above moves from hunt/investigate to a live Custom IOA.
Hunt Summary Ticket
TITLE: Hunt for Paperclip CVE-2026-41679 exploitation (import-authorization bypass RCE)
SEVERITY: CRITICAL (CVSS 10.0) -- public Metasploit module, no confirmed ITW as of 2026-08-05
SCOPE: Any host running a self-hosted Paperclip instance (paperclipai / @paperclipai/server
npm packages, any version below v2026.416.0 / server manifest 0.3.1), especially
network-accessible deployments in authenticated mode with default open registration
HYPOTHESIS: If exploited, the Paperclip server process (Node.js) will show an unexpected shell
or interpreter as a direct or grandchild process, potentially followed by discovery,
credential-access, persistence, or outbound C2/exfil behavior from that same tree
QUERIES: Q1-Q8 (section 8) -- Q1/Q2/Q5 are Custom IOA candidates after tuning; Q3/Q4/Q6/Q7/Q8
remain hunt/investigate-only
DO FIRST: 1. Confirm Paperclip version on every self-hosted instance (audit checklist, s10/s13)
2. Confirm PAPERCLIP_AUTH_DISABLE_SIGN_UP setting and network exposure (s7, s12)
3. Run Q1 and Q3 across all Paperclip hosts for the last 14 days
4. Pull Paperclip's own audit log for self-approval and board-level import events (s7)
FINDINGS: [populate during investigation]
GAPS: Steps 1-3 and 5 of the attack chain (self-registration, self-approval, import,
wake) are not Falcon-visible -- requires Paperclip's own application/audit log.
Linux cron/systemd persistence has no dedicated CQL. DNS-rebinding delivery
(GHSA-x8hx-rhr2-9rf7) is invisible to EDR at the browser/DNS layer.
ACTIONS: Patch to v2026.416.0+; disable open self-registration if unpatched; remove direct
internet exposure; see Hardening (s12) and Playbooks (s13) for deployable controls
OWNER: REPLACE_WITH_OWNER
VERSION: v0.1 -- 2026-08-11
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| 1 | Oasis Security — Breaking the Paperclip: When Agent Configuration Becomes a Vulnerability | Primary discoverer/discloser; all 3 flaws, root-cause framing, mitigation guidance | 2026-08-11 |
| 1 | GitHub Security Advisory GHSA-68qg-g8mg-6pr7 | Code-level technical detail for CVE-2026-41679; confirmed fix locations | 2026-08-11 |
| 1 | The Hacker News — Paperclip AI Flaws Let Attackers Run Host Commands via Malicious Agent Imports | Independent verification, version-labeling discrepancy, ITW status | 2026-08-11 |
| 2 | SecurityWeek — Critical Paperclip Flaw Allowed Admin Access, Code Execution | Corroboration, broader AI-agent-identity framing | 2026-08-11 |
| 2 | Rapid7 — Weekly Metasploit Update (2026-06-19) | Public Metasploit module confirmation, six-call chain detail | 2026-08-11 |
| 2 | CVE Feed — CVE-2026-41679 aggregation (NVD/CISA-ADP) | SSVC scoring, affected version ranges, package names | 2026-08-11 |
Verbatim fetched text of all 6 sources saved to Paperclip-CVE-2026-41679-Hunt-sources/. No embedded AI-directed instructions were found in any source; all fetched content was treated as data, not directions, per standing policy.