
يوثّق سلسلة RCE من نوع use-after-free في VectorFreed librsvg (CVE-2026-96889) مع PoC لمولّد SVG وإرشادات المعالجة لـ librsvg وNext.js وSatori.
تقدم هذه الوثيقة "VectorFreed"، وهي سلسلة ثغرات تبدأ بثغرة استخدام بعد التحرير (use-after-free) اكتشفتها أنا (@rafabd1) في librsvg (CVE-2026-96889). في بناء Node.js/Sharp/libvips، أدت هذه الثغرة إلى تنفيذ أوامر. وتغطي الوثيقة الثغرة، والمسارات المؤكدة في التطبيقات حتى الآن، والإصلاحات المتاحة حالياً.
يمكن لملف SVG أن يتضمن ملف SVG آخر عبر XInclude. في المسار المصاب، يبدأ librsvg في تحليل مستند مُضمَّن بينما لا يزال libxml2 يوسّع كياناً (entity) في المستند الخارجي. إذا أعلن ملف SVG المُضمَّن عن كيان يحمل الاسم نفسه، يستبدل librsvg الكيان الأول ويحرره. لكن libxml2 لا يزال يحتفظ بمؤشر إليه.
عندما ينتهي تحليل المستند المُضمَّن، يواصل libxml2 العمل بذلك المؤشر القديم. وقد تكون الذاكرة مملوكة لشيء آخر بحلول ذلك الوقت، لذا يمكن أن تؤدي الكتابات اللاحقة إلى إفسادها. الانهيار هو أحد النتائج. وفي حالات أخرى، أدى هذا أيضاً إلى تنفيذ أوامر.
يحتاج المهاجم إلى ترميز SVG مُصمَّم بعناية للوصول إلى librsvg. يمكن أن يحدث ذلك عندما يقبل تطبيق ما ملف SVG، لكنه يمكن أن يحدث أيضاً عندما يبني التطبيق ملف SVG من مدخلات المستخدم. مجرد استخدام librsvg في مكان ما ضمن شجرة التبعيات لا يثبت وجود مسار قابل للاستغلال؛ يجب أن يصل المُدخل إلى بناء مصاب عند عرض الصورة.
مسار Next.js الذي اختبرناه كان يقبل نصاً بدلاً من رفع ملف SVG. وقد وضع ذلك النص داخل SVG مضمّن للنسخة الخاصة بـ Node.js من ImageResponse. سمحت ثغرة تهريب منفصلة في Satori للنص بتغيير ترميز SVG المُولَّد. ثم مرّر Sharp/libvips ذلك الـ SVG إلى librsvg. وقد تتبعت Vercel مسار Next.js تحت CVE-2026-94545. نسخة Edge من ImageResponse غير متأثرة بهذا المسار. إليك إعادة إنتاج قصيرة لـ Next.js.
وصل مسار ثانٍ في Next.js إلى ثغرة librsvg نفسها عبر واجهة برمجة تطبيقات تحسين الصور (Image Optimization API). عندما قبلت الواجهة مصدر صورة يتحكم به المهاجم، كان بإمكان صورة مُصمَّمة تجاوز رفض الإطار لملفات SVG ثم التعامل معها لاحقاً كـ SVG بواسطة Sharp/libvips. وقد كشف هذا عن إفساد الذاكرة في المنبع لطلبات غير مصادَق عليها على Linux القائم على glibc دون استخدام Satori أو ImageResponse.
نشرت Vercel هذا المسار تحت GHSA-2464-fhr4-w9xw، ضمن CVE-2026-96889 في المنبع. يصنّف الإشعار الثغرة كحرجة بدرجة CVSS تبلغ 9.5.
لدى Ghost مسار مختلف. كان بإمكان مستخدم من الموظفين، بما في ذلك مساهم (Contributor)، إنشاء بطاقة إشارة مرجعية (bookmark card) لموقع يتحكم به. ثم كان معالجة صورة البطاقة قد ينفّذ أوامر على خادم Ghost. نشرت Ghost هذا تحت CVE-2026-105642.
خلال هذا البحث، حددت مسارات إدخال مصابة في منتجات متعددة في المصب وأكدت تنفيذ أوامر في العديد منها، بما في ذلك كلا مساري Next.js وحالة Ghost أعلاه. تختلف طريقة وصول ذلك المُدخل إلى librsvg من منتج لآخر. لهذا السبب يمكن أن تظهر ثغرة محلل صور في المنبع في أماكن لا تبدو ذات صلة للوهلة الأولى؛ وحالة libheif الأخيرة مثال آخر. وهذا لا يعني أن كل منتج يستخدم librsvg قابل للاستغلال عن بُعد.
ImageResponse): الإصدارات من 16.2.0 إلى 16.3.5 متأثرة عندما يضع التطبيق قيمًا يتحكم بها المهاجم في محتوى SVG أو سماته أو أنماطه. قم بالترقية إلى 16.3.6.>= 10.0.0 <= 15.5.27 و> 16.0.0 <= 16.4.0 كإصدارات متأثرة. قم بالترقية إلى 15.5.28 أو 16.4.1. يحتوي Sharp 0.35.5 أو أحدث على الإصلاح الأصلي.إذا كنت تستخدم الملفات الثنائية المُجمّعة مسبقًا من Sharp، فتحقق من حزمة @img/sharp-libvips-* التي ثبّتها تطبيقك. فهي تضمّن libvips وتبعياته، بما في ذلك librsvg. قد يؤدي تحديث نسخة النظام من librsvg إلى ترك تطبيقك يستخدم النسخة القديمة.
يتضمن إثبات مفهوم UAF مولّد SVG لعدة مسارات إدخال، ويمكن استخدامه للتحقق من use-after-free في بداية السلسلة.
يُعدّ إثبات مفهوم RCE لـ Next.js ImageResponse من EQSTLab مثالًا عمليًا على تلك السلسلة لإصدار Node.js/Sharp المثبّت لديه. فهو يولّد الحمولة ويرسلها تلقائيًا. أصبح الاستغلال العملي متاحًا للعموم الآن، لذا حدّث التبعيات المتأثرة أو خفّف مسار الإدخال في أقرب وقت ممكن.
[!WARNING] لا يوجد إثبات مفهوم RCE شامل لهذه السلسلة. يستهدف مثال EQSTLab الإصدار المثبّت لديه؛ وقد تحتاج الأهداف الأخرى إلى حمولات مختلفة. إثباتات المفهوم التي تعتمد على SVG
<foreignObject>لتنفيذ الأوامر لا تُظهر السلسلة الموصوفة هنا.
للتحقق الأولي على أهداف أخرى، يُعدّ إثبات مفهوم UAF أكثر عملية. سأنشر أيضًا التقرير التقني في الأسابيع القادمة، مع الخطوات من UAF إلى تنفيذ الأوامر وتحليل لاحق يغطي هذا الشهر الماضي من البحث في السلسلة.