
# إعادة إنتاج مصغّرة لاستنزاف الذاكرة OOM في Spring AI ParagraphManager بسبب الحلقة الذاتية بين الأشقاء (إصلاح غير مكتمل لـ CVE-2026-47851)
استنساخ مصغّر لحلقة لا نهائية / نفاد ذاكرة (OOM) في
org.springframework.ai.reader.pdf.config.ParagraphManagerمنorg.springframework.ai:spring-ai-pdf-document-reader.تم الإبلاغ عنه كاستشارة أمنية خاصة على GitHub إلى
spring-projects/security-advisories. ليس إفصاحًا عامًا. تتم مشاركة هذا المستودع فقط لأغراض الإفصاح المسؤول والتحقق.
ParagraphManager.generateParagraphs يكرر عبر أشقاء المخطط التفصيلي (outline) باستخدام
getNextSibling() دون أي كشف للدورات أو حد أقصى للتكرار. ملف PDF الذي يصرّح عنصر مخططه التفصيلي بمؤشر /Next خاص به (حلقة ذاتية بين الأشقاء) يتسبب في
عدم إنهاء الحلقة أبدًا؛ كل تكرار يضيف جديدًا إلى قائمة الخاصة بالعنصر الأب، مما يستنزف ذاكرة JVM مع خطأ .
ParagraphchildrenOutOfMemoryErrorالفحص المضاف في إصلاح CVE-2026-47851 (حد العمق + مجموعة الزيارات) يغطي فقط
دورات firstChild، وليس الحلقات الذاتية بين الأشقاء: العمق لا يتجاوز أبدًا
المستوى 1، ومجموعة الزيارات تسجل firstChild فقط لذا لا يدخل الشقيق إليها أبدًا.
لذلك يتكرر هذا الاختلاف على أحدث إصدار (2.0.1) أيضًا.
| العنصر | القيمة |
|---|---|
| المكوّن المتأثر | org.springframework.ai:spring-ai-pdf-document-reader |
| الإصدارات المتأثرة | < 2.0.2 (جميع الإصدارات المعروفة؛ الإصدارات 1.x و2.0.0 لا تحتوي حتى على إصلاح CVE-2026-47851) |
| الفئة المعرضة للخطر | org.springframework.ai.reader.pdf.config.ParagraphManager |
| المحفّز | new ParagraphPdfDocumentReader(resource) مع ملف PDF خبيث |
| التأثير | OutOfMemoryError، إنهاء العملية — رفض الخدمة (DoS) |
| الخطورة | 7.5 عالية — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H |
| ذات صلة | CVE-2026-47851 (إصلاح غير مكتمل) |
pom.xml — بناء Maven، يعتمد على spring-ai-pdf-document-reader:2.0.1
src/main/java/ReleaseVerify.java — كود مستخدم حقيقي (استدعاء API رسمي)
poc/selfloop.pdf — ملف PDF خبيث بحجم 396 بايت (حلقة ذاتية بين الأشقاء)
poc/normal.pdf — ملف PDF ضابط بحجم 384 بايت (مطابق تمامًا باستثناء عدم وجود مرجع ذاتي /Next)
يختلف ملفا PDF بمقدار 12 بايتًا بالضبط — selfloop.pdf يحتوي على
/Next 5 0 R إضافي واحد في عنصر المخطط التفصيلي، يشير العنصر إلى نفسه كشقيق تالٍ له.
mvn -q package
ينتج target/springai-release-verify-1.0.0.jar (jar كامل، يتضمن
PDFBox 3.0.7).
# ملف PDF خبيث — نفاد ذاكرة (OOM) خلال ثوانٍ
java -Xmx96m -cp target/springai-release-verify-1.0.0.jar ReleaseVerify para poc/selfloop.pdf
# ملف PDF ضابط — يكتمل بشكل طبيعي في أقل من 100 مللي ثانية
java -Xmx96m -cp target/springai-release-verify-1.0.0.jar ReleaseVerify para poc/normal.pdf
يحدث نفاد الذاكرة (OOM) داخل مُنشئ ParagraphPdfDocumentReader (الذي
يستدعي new ParagraphManager(document))؛ لا يتم الوصول إلى get() أبدًا.
هذا المستودع موجود فقط لدعم التحقق من الاستشارة
المبلّغ عنها بشكل خاص. ملفات PDF غير ضارة بـ PDFBox وأي
محلل PDF متوافق آخر؛ فهي تثير خطأً منطقيًا في اجتياز ParagraphManager
في Spring AI فقط. لا تستخدمها ضد أنظمة لا تملكها.