Back to Intelligence

CVE-2026-73032: Unauthenticated RCE in PapersGPT for Zotero — Detection and Remediation Guide

SA
Security Arsenal Team
August 12, 2026
10 min read

NVD has published CVE-2026-73032, a CVSS 9.6 (Critical) vulnerability affecting PapersGPT for Zotero version 0.6.1 — a popular plugin that pipes academic PDFs through large language models for summarization and analysis. Despite the NVD pathway listing referencing "chrome," this is not a Google Chrome browser vulnerability. The "chrome" here is Zotero's chrome-privileged JavaScript context — the same elevated execution environment the application itself runs in. Code that lands there can read and write arbitrary files, spawn processes, and access the entire Zotero database, including stored credentials and synced libraries.

This matters well beyond the academic niche. Zotero is deployed across universities, law firms, pharmaceutical research teams, think tanks, and corporate R&D — environments that hold exactly the kind of pre-publication research, litigation strategy, and IP that nation-state and criminal actors target. The attack vector is modern and nasty: prompt injection embedded in a PDF causes the LLM to return malicious JavaScript, which PapersGPT passes unsanitized into window.eval() in views.ts. No authentication. No user interaction beyond processing a document. A single weaponized PDF uploaded to a shared research library is enough.

If your organization has researchers running Zotero with PapersGPT, treat this as an urgent remediation item — and hunt for signs of prior exploitation, because the prerequisite conditions (ingesting untrusted PDFs) are the plugin's normal operating mode.

Technical Analysis

Affected Products

  • Product: PapersGPT for Zotero (plugin)
  • Affected version: 0.6.1 (and likely earlier — assume all versions prior to the vendor fix are vulnerable)
  • Host application: Zotero (all supported platforms — Windows, macOS, Linux)
  • CVE: CVE-2026-73032 — CVSS 9.6 Critical, network-exploitable, no authentication required

Root Cause

The vulnerable code path lives in the plugin's views.ts. When PapersGPT receives a response from its configured LLM endpoint, it passes returned content directly into window.eval() without sanitization. Because the plugin executes inside Zotero's chrome-privileged context — not a sandboxed web context — evaluated JavaScript inherits full application privileges:

  • Arbitrary file read/write on the host filesystem
  • Process execution (spawning shells, downloaders, payload droppers)
  • Full access to the Zotero data directory: library database, notes, attachments, synced account tokens

Attack Chain

There are three documented delivery paths, all converging on the same sink:

  1. Prompt injection via PDF. The attacker embeds adversarial instructions in a PDF's text layer (white-on-white text, hidden annotations, metadata, or injected content streams). When a victim processes the PDF with PapersGPT, the LLM follows the injected instructions and returns attacker-controlled JavaScript, which window.eval() executes.
  2. MITM interception of the LLM API request. If the plugin talks to an LLM endpoint over an interceptable channel (misconfigured TLS, HTTP fallback, hostile network), an attacker modifies the API response in transit to include the payload.
  3. Malicious custom LLM endpoint. PapersGPT supports user-configured endpoints. An attacker who convinces a user (or a compromised config) to point the plugin at a hostile endpoint gets direct control of everything that reaches eval().

The defender-relevant takeaway: the LLM response is a trust boundary that was never validated. Any untrusted content flowing through that boundary — and by design, PDF content flows through it — can reach code execution.

Exploitation Status

At the time of writing, CVE-2026-73032 is freshly published on NVD with no confirmed CISA KEV listing. However, the vulnerability class (unsanitized LLM output reaching eval()) is trivially weaponizable once disclosed, and prompt-injection payloads for LLM-integrated tooling circulate quickly after public disclosure. Do not wait for KEV confirmation — the exploitation cost is near zero and the vulnerable population (researchers ingesting untrusted PDFs) is predictable. Treat this as pre-exploitation window and close it.

Detection & Response

The highest-fidelity detection signal for exploitation of CVE-2026-73032 is Zotero spawning child processes. Zotero is a reference manager — it does not legitimately launch shells, script interpreters, or downloaders in normal operation. A zotero.exe (or zotero on Linux/macOS) process tree containing cmd.exe, powershell.exe, bash, curl, or wget is a strong indicator of post-exploitation activity. Secondary signals include unexpected outbound connections from the Zotero process to non-LLM infrastructure and unexpected writes to persistence locations.

Sigma Rules

YAML
---
title: Zotero Process Spawning Shell or Script Interpreter
description: Detects Zotero (potentially via PapersGPT CVE-2026-73032 exploitation) spawning command shells, script interpreters, or download utilities. Zotero should never launch these in normal operation.
references:
  - https://nvd.nist.gov/vuln/detail/CVE-2026-73032
  - https://attack.mitre.org/techniques/T1059/
author: Security Arsenal
date: 2026/05/12
status: experimental
id: 8f2c1a47-3b9e-4d51-a6c2-9e7d5f180234
tags:
  - attack.execution
  - attack.t1059
logsource:
  category: process_creation
  product: windows
detection:
  selection_parent:
    ParentImage|endswith:
      - '\zotero.exe'
  selection_child:
    Image|endswith:
      - '\cmd.exe'
      - '\powershell.exe'
      - '\pwsh.exe'
      - '\wscript.exe'
      - '\cscript.exe'
      - '\mshta.exe'
      - '\rundll32.exe'
      - '\curl.exe'
      - '\certutil.exe'
      - '\bitsadmin.exe'
  condition: selection_parent and selection_child
falsepositives:
  - Extremely rare; Zotero plugin developers debugging locally
level: high
---
title: Zotero Process Outbound Connection to Non-Standard Endpoint
description: Detects Zotero making network connections to uncommon ports or raw IP destinations, consistent with CVE-2026-73032 post-exploitation C2 or a malicious custom LLM endpoint.
references:
  - https://nvd.nist.gov/vuln/detail/CVE-2026-73032
  - https://attack.mitre.org/techniques/T1071/
author: Security Arsenal
date: 2026/05/12
status: experimental
id: 2b7d9f13-6a4c-4e08-b1d5-3c8a0f692417
tags:
  - attack.command_and_control
  - attack.t1071.001
logsource:
  category: network_connection
  product: windows
detection:
  selection:
    Image|endswith:
      - '\zotero.exe'
  filter_sync:
    DestinationHostname|endswith:
      - '.zotero.org'
      - 'zotero.org'
  filter_llm_common:
    DestinationHostname|endswith:
      - 'openai.com'
      - 'anthropic.com'
      - 'googleapis.com'
  condition: selection and not 1 of filter_*
falsepositives:
  - Self-hosted or custom LLM endpoints legitimately configured in PapersGPT (baseline these explicitly)
  - Third-party Zotero sync servers (WebDAV)
level: medium
---
title: Zotero Writing to Persistence or Startup Locations
description: Detects the Zotero process writing executables or scripts to startup folders, temp directories with subsequent execution patterns, or other persistence-oriented locations, consistent with CVE-2026-73032 post-exploitation.
references:
  - https://nvd.nist.gov/vuln/detail/CVE-2026-73032
  - https://attack.mitre.org/techniques/T1060/
author: Security Arsenal
date: 2026/05/12
status: experimental
id: 5e1a8c36-7f2b-49d4-9c31-b4e6d2a50871
tags:
  - attack.persistence
  - attack.t1060
logsource:
  category: file_event
  product: windows
detection:
  selection_image:
    Image|endswith:
      - '\zotero.exe'
  selection_target:
    TargetFilename|contains:
      - '\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\'
      - '\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\'
  condition: selection_image and selection_target
falsepositives:
  - None expected; Zotero installers run as setup binaries, not the main process
level: high

KQL Hunt — Microsoft Sentinel / Defender

Hunt for any Zotero-spawned child process across the last 30 days. On fleets where Zotero is rare, this is close to zero-noise. The second query pivots to network behavior for environments ingesting Sysmon or firewall telemetry via CommonSecurityLog.

KQL — Microsoft Sentinel / Defender
// Hunt 1: Zotero spawning suspicious child processes (post-exploitation of CVE-2026-73032)
DeviceProcessEvents
| where TimeGenerated > ago(30d)
| where InitiatingProcessFileName =~ "zotero.exe"
| where FileName in~ ("cmd.exe","powershell.exe","pwsh.exe","wscript.exe","cscript.exe","mshta.exe","rundll32.exe","curl.exe","certutil.exe","bitsadmin.exe")
| project TimeGenerated, DeviceName, AccountName, InitiatingProcessCommandLine, FileName, ProcessCommandLine, SHA256
| order by TimeGenerated desc;

// Hunt 2: Zotero outbound connections to non-standard destinations (custom LLM endpoint / C2)
DeviceNetworkEvents
| where TimeGenerated > ago(30d)
| where InitiatingProcessFileName =~ "zotero.exe"
| where RemoteUrl !has_any ("zotero.org", "openai.com", "anthropic.com", "googleapis.com")
| summarize ConnectionCount = count(), Destinations = make_set(RemoteUrl), Ports = make_set(RemotePort) by DeviceName, InitiatingProcessCommandLine
| order by ConnectionCount desc;

Velociraptor VQL Hunt

Use this artifact across your fleet to identify live Zotero process trees with suspicious children — the fastest way to triage whether exploitation has already occurred before you complete patching.

VQL — Velociraptor
-- Hunt for Zotero processes with suspicious child processes (CVE-2026-73032 post-exploitation)
-- Flags zotero.exe parents of shells, script engines, or download utilities
LET parents = SELECT Pid, Name, CommandLine, Username, CreateTime
  FROM pslist()
  WHERE Name =~ '(?i)zotero'

SELECT child.Pid AS ChildPid,
       child.Name AS ChildName,
       child.CommandLine AS ChildCommandLine,
       child.Ppid AS ParentPid,
       parent.Name AS ParentName,
       parent.Username AS Username,
       child.CreateTime AS ChildStartTime
FROM pslist() AS child
JOIN parents AS parent ON child.Ppid = parent.Pid
WHERE child.Name =~ '(?i)(cmd|powershell|pwsh|wscript|cscript|mshta|rundll32|curl|wget|bash|sh)'

Remediation / Verification Script

Use this PowerShell script to identify Zotero installations with PapersGPT present, flag the vulnerable version, and check for suspicious recent child-process artifacts in the Zotero profile. Run it fleet-wide via your RMM or Intune.

PowerShell
# CVE-2026-73032 - PapersGPT for Zotero detection and verification script
# Run as administrator or deploy via RMM/Intune across endpoints

$zoteroPaths = @(
    "$env:ProgramFiles\Zotero",
    "${env:ProgramFiles(x86)}\Zotero",
    "$env:LOCALAPPDATA\Zotero"
)

$zoteroFound = $false
foreach ($path in $zoteroPaths) {
    if (Test-Path (Join-Path $path 'zotero.exe')) {
        $zoteroFound = $true
        Write-Output "[+] Zotero found at: $path"
    }
}
if (-not $zoteroFound) { Write-Output "[-] Zotero not installed in standard locations"; }

# Enumerate Zotero profiles and look for the PapersGPT extension
$profileRoot = "$env:APPDATA\Zotero\Zotero\Profiles"
if (Test-Path $profileRoot) {
    Get-ChildItem $profileRoot -Directory | ForEach-Object {
        $extDir = Join-Path $_.FullName 'extensions'
        if (Test-Path $extDir) {
            Get-ChildItem $extDir -ErrorAction SilentlyContinue | Where-Object {
                $_.Name -match '(?i)papersgpt'
            } | ForEach-Object {
                Write-Output "[!] VULNERABLE COMPONENT: PapersGPT extension found: $($_.FullName)"
                Write-Output "    ACTION REQUIRED: Update to patched version or remove immediately."
            }
        }
        # Also check extensions.json for install records
        $extJson = Join-Path $_.FullName 'extensions.json'
        if (Test-Path $extJson) {
            $content = Get-Content $extJson -Raw
            if ($content -match '(?i)papersgpt') {
                Write-Output "[!] PapersGPT referenced in extensions.json for profile $($_.Name)"
            }
        }
    }
}

# Flag suspicious recently-modified scripts/executables in Zotero profile dirs (dropped payloads)
if (Test-Path $profileRoot) {
    Get-ChildItem $profileRoot -Recurse -Include *.exe,*.bat,*.ps1,*.vbs,*.js -ErrorAction SilentlyContinue |
        Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-30) } |
        ForEach-Object { Write-Output "[!] Suspicious recent script/binary in profile: $($_.FullName) (modified $($_.LastWriteTime))" }
}

Write-Output "[*] Verification complete. Pair results with EDR process-tree telemetry for zotero.exe."

For macOS/Linux research workstations, the equivalent Bash check:

Bash / Shell
# CVE-2026-73032 - Locate PapersGPT extension on macOS/Linux Zotero profiles
for dir in "$HOME/Zotero" "$HOME/.zotero" "$HOME/Library/Application Support/Zotero"; do
  if [ -d "$dir" ]; then
    echo "[+] Zotero data dir: $dir"
    grep -ril "papersgpt" "$dir" --include="extensions.json" 2>/dev/null && \
      echo "[!] PapersGPT detected - update or remove immediately"
    find "$dir" -name "*papersgpt*" 2>/dev/null
  fi
done

# Flag recent child processes of zotero (requires auditd on Linux)
command -v ausearch >/dev/null && \
  ausearch -ts recent -k exec 2>/dev/null | grep -i zotero | head -20

Remediation

  1. Identify exposure immediately. Inventory every workstation running Zotero with PapersGPT 0.6.1 or earlier. Prioritize research, legal, and R&D teams — the plugin's user base concentrates there. The script above automates this at scale.
  2. Update or remove. Upgrade PapersGPT to the patched release as soon as the vendor publishes it — monitor the NVD entry for CVE-2026-73032 and the PapersGPT project repository for the fixed version. Until a patch is confirmed installed, remove or disable the plugin. There is no safe configuration of a version that pipes LLM output into eval().
  3. Audit LLM endpoint configuration. If the plugin is retained post-patch, enumerate every configured custom LLM endpoint. Restrict configurations to sanctioned, TLS-enforced endpoints. Block unauthenticated or plaintext API routes at the egress proxy.
  4. Constrain the blast radius. Run Zotero as a standard (non-admin) user. Apply application control (WDAC/AppLocker on Windows) to block zotero.exe from spawning shells and script interpreters — this is a durable control that neutralizes this entire bug class, not just this CVE.
  5. Treat untrusted PDFs as hostile. Until patching is complete, instruct users not to process externally sourced PDFs through any LLM-integrated Zotero workflow. Prompt-injection payloads survive in shared libraries, email attachments, and preprint servers.
  6. Hunt before you close the ticket. Run the Sigma/KQL/VQL content above over at least the last 30 days of telemetry. Any Zotero-spawned shell is a DFIR trigger, not a help-desk ticket — assume credentials and library data in scope of that host are exposed and respond accordingly.

This vulnerability is a preview of where 2026 attacker tradecraft is heading: LLM-integrated tooling creates code-execution sinks that traditional secure-SDLC never modeled. Every plugin or agent that passes model output to an interpreter is a trust-boundary violation waiting for a CVE number. Inventory yours now.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.