djvulibre تم إصدار الإصدار 3.5.29 اليوم. إنه يعمل على إصلاح CVE-2025-53367 (GHSL-2025-055) ، وكتابة خارجية (OOB) في MMRDecoder::scanruns طريقة. يمكن استغلال الضعف للحصول على تنفيذ رمز على نظام سطح المكتب Linux عندما يحاول المستخدم فتح مستند مصنوع.

DJVU هو تنسيق ملف مستند يمكن استخدامه لأغراض مماثلة لـ PDF. يدعمها برهن و أوراق، مشاهدي المستندات الافتراضية على العديد من توزيعات Linux. في الواقع ، حتى عندما يتم إعطاء ملف DJVU اسم ملف مع امتداد .pdf ، ستكتشف Evince/Papers تلقائيًا أنه مستند DJVU وتشغيل djvulibre لفك تشفيره.

وجد أنطونيو هذا الضعف أثناء البحث في قارئ وثيقة Evince. وجد الخطأ مع الضباب.

طور Kev دليلًا على استغلال المفهوم للضعف ، كما تم تجريبه في هذا الفيديو.

https://www.youtube.com/watch؟v=32KRohyhyvm

يعمل POC على Ubuntu 25.04 (x86_64) مع تمكين جميع حماية الأمان القياسية. لشرح ما يحدث في الفيديو:

  1. ينقر Kev على وثيقة DJVU ضارة في ~/Downloads دليل.
  2. تم تسمية الملف poc.pdf، لكنها في الواقع في شكل djvu.
  3. عارض المستند الافتراضي (/usr/bin/papers) يقوم بتحميل المستند ، ويكتشف أنه بتنسيق DJVU ، ويستخدم djvulibre لفك تشفيره.
  4. يستغل الملف ثغرة تكتب OOB ويؤدي إلى مكالمة إلى system("google-chrome https://www.youtube.com/…").
  5. يظهر ريك أستلي.

على الرغم من أن POC قادر على الالتفاف ASLR، لا يمكن الاعتماد عليها إلى حد ما: ستعمل 10 مرات متتالية ثم تتوقف فجأة عن العمل لعدة دقائق. ولكن هذا ليس سوى إصدار أولي ، ونعتقد أنه من الممكن إنشاء استغلال أكثر موثوقية.

قد تتساءل: لماذا Astley ، وليس آلة حاسبة؟ هذا بسبب /usr/bin/papers يدير تحت apparmor حساب تعريفي. يمنعك الملف الشخصي من بدء عملية تعسفية ولكنه يجعل استثناءً لـ Google-Chrome. لذلك كان من الأسهل تشغيل مقطع فيديو على YouTube من Pop A Calc. لكن ملف تعريف Apparmor ليس مقيدًا بشكل خاص. على سبيل المثال ، يتيح لك كتابة ملفات تعسفية إلى الدليل الرئيسي للمستخدم ، باستثناء واحد واضح حقًا ~/.bashrc. لذلك لن يمنع مهاجم محدد من الحصول على تنفيذ رمز.

ال MMRDecoder::scanruns تتأثر الطريقة بضعف OOB-Write ، لأنه لا يتحقق من أن xr يبقى المؤشر داخل حدود المخزن المؤقت المخصص.

أثناء عملية فك التشفير ، تتم كتابة البيانات المشفرة طولها في مخزن المؤقتة: lineruns و prevruns:

//libdjvu/MMRDecoder.h
class DJVUAPI MMRDecoder : public GPEnabled
{
...
public:

  unsigned short *lineruns;
...
  unsigned short *prevruns;
...
}

المتغيرات المسمى pr و xr أشر إلى المواقع الحالية في تلك المخازن المؤقتة.

scanruns لا تحقق من أن هذه المؤشرات تبقى ضمن حدود المخازن المؤقتة المخصصة.

//libdjvu/MMRDecoder.cpp
const unsigned short *
MMRDecoder::scanruns(const unsigned short **endptr)
{
...
  // Swap run buffers
  unsigned short *pr = lineruns;
  unsigned short *xr = prevruns;
  prevruns = pr;
  lineruns = xr;
...
  for(a0=0,rle=0,b1=*pr++;a0 < width;)
    {
     ...
            *xr = rle; xr++; rle = 0;
     ...
            *xr = rle; xr++; rle = 0;
 ...
          *xr = inc+rle-a0;
          xr++;
}

هذا يمكن أن يؤدي إلى كتابة ما وراء الذاكرة المخصصة ، مما يؤدي إلى حالة فساد الكومة. قراءة خارج الحدود مع pr من الممكن أيضًا لنفس السبب.

سنقوم بنشر الكود المصدري لإثباتنا على استغلال المفاهيم في غضون أسبوعين في مستودع مختبر GitHub Security.

نود أن نشكر Léon Bottou و Bill Riemers على الاستجابة بسرعة بشكل لا يصدق وإطلاق إصلاح أقل من يومين من الاتصال بهم لأول مرة!

كتبه

كيفن باكهاوس

أنا باحث أمني في فريق Github Security Lab. أحاول المساعدة في جعل البرامج المفتوحة المصدر أكثر أمانًا من خلال البحث عن نقاط الضعف والعمل مع المشرفين لإصلاحها.

أنطونيو موراليس

Source link


اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *