قد تبدو عملية تحسين صورة داخل تطبيق ويب مهمة جانبية لا تستحق الكثير من القلق. وقد يبدو اختيار نظام تشغيل الخادم قرارًا تشغيليًا منفصلًا تمامًا عن أمن التطبيق.

لكن في تحديث أمني واحد لـ Next.js، اجتمع المساران في نقطتين مختلفتين تقودان إلى النتيجة نفسها: تنفيذ أوامر عن بُعد دون مصادقة.

في 25 أغسطس 2026 أصدرت Vercel تحديثات أمنية لمعالجة ثغرتين حرجتين في Next.js. الأولى مرتبطة بمعالجة صور AVIF وتعتمد على خلل عميق داخل مكتبة libheif، بينما الثانية تستهدف تطبيقات مستضافة على أنظمة ملفات Windows عبر مشكلة Path Traversal.

المشكلة هنا ليست مجرد وجود ثغرتين جديدتين في إطار عمل واسع الانتشار. الأهم هو أن كل واحدة منهما توضّح كيف يمكن لطبقة تبدو بعيدة عن منطق الأعمال، مثل مكتبة معالجة صور أو اختلاف سلوك مسارات الملفات بين أنظمة التشغيل، أن تتحول إلى نقطة دخول مباشرة إلى الخادم.


#ما الذي حدث؟

أصدرت Vercel نسختين مصححتين من Next.js:

text
Next.js 15.5.24
Next.js 16.3.3

وتعالج هذه الإصدارات ثغرتين حرجتين تسمحان في ظروف محددة بالوصول إلى Remote Code Execution - RCE دون الحاجة إلى حساب مستخدم أو جلسة مصادقة مسبقة.

الثغرةالنوعالشدةالبيئة المتأثرةالنتيجة المحتملة
CVE-2026-75604Windows Path TraversalCVSS 9.0خوادم Windows بتكوينات محددةUnauthenticated RCE
GHSA-2xp9-vwfh-vxw4AVIF / Heap Buffer OverflowCVSS v4 9.5التطبيقات التي تفعل AVIF OptimizationUnauthenticated RCE

تؤثر ثغرة Windows على الإصدارات:

text
Next.js >= 13.4 and < 15.5.24
Next.js >= 16.0 and < 16.3.3

أما ثغرة AVIF فتغطي نطاقًا أقدم بكثير:

text
Next.js >= 10.0.0 and < 15.5.24
Next.js 16.x < 16.3.3

#الثغرة الأولى: عندما يصبح Windows جزءًا من سطح الهجوم

الثغرة المسجلة بالمعرف:

text
CVE-2026-75604

حصلت على تقييم:

text
CVSS 9.0

وتؤثر على تطبيقات Next.js التي تعمل على خادم يستخدم نظام ملفات Windows، مع استخدام كل من:

text
Pages Router
App Router

وبدون:

text
Cache Components

وفق الإفصاح الأمني، يمكن لهذا المزيج أن يؤدي إلى Remote Code Execution دون مصادقة.

اللافت أن نفس التطبيق عند تشغيله على:

text
Linux
macOS

لا يتأثر بهذه الثغرة تحديدًا.

وهنا تظهر نقطة أمنية مهمة جدًا: قابلية الاستغلال ليست دائمًا خاصية في الكود وحده.

أحيانًا يكون الكود نفسه موجودًا في جميع البيئات، لكن الاختلاف في طريقة تعامل نظام التشغيل مع المسارات والفواصل وأسماء الملفات يجعل السلوك الأمني مختلفًا جذريًا.

في Windows، معالجة المسارات تعتمد على خصائص قد تختلف عن أنظمة Unix-like، مثل:

text
\
/
Drive Letters
Path Normalization
UNC Paths

وعندما لا يتم تطبيع المسار والتحقق منه بالشكل الصحيح، يمكن أن تتحول مشكلة Path Traversal من مجرد قراءة ملف غير مصرح به إلى تأثير أعمق يصل في بعض السيناريوهات إلى تنفيذ كود.

Vercel لم تنشر تفاصيل آلية الاستغلال الكاملة، وهو أمر مفهوم في ثغرة بهذه الحساسية، لكنها أكدت عدم وجود حل التفافي معروف للتطبيقات المتأثرة المستضافة على Windows.

أي أن المعالجة الأساسية هنا ليست تغيير إعداد صغير، بل الانتقال إلى نسخة مصححة.


#لماذا Path Traversal أخطر مما يبدو؟

غالبًا ما ترتبط ثغرات:

text
Path Traversal

بمحاولة الوصول إلى ملفات خارج المسار المسموح، مثل انتقال المهاجم من دليل التطبيق إلى ملفات أخرى في النظام.

الفكرة التقليدية تبدو كالتالي:

text
../../../../

لكن التأثير الفعلي يعتمد على المكان الذي يصل إليه المسار، وما الذي يفعله التطبيق بالملف الناتج، وما إذا كانت هناك طبقات أخرى تتعامل معه لاحقًا.

إذا دخل المسار إلى منطق يقوم بتحميل ملفات أو تنفيذ وحدات أو بناء موارد ديناميكية، فقد تتحول الثغرة من:

text
Arbitrary File Access

إلى:

text
Remote Code Execution

وهذا يفسر سبب تقييم ثغرة Windows بدرجة حرجة.


الثغرة الثانية: ملف AVIF واحد قد يصل إلى الذاكرة

الثغرة الثانية أكثر إثارة من الناحية التقنية، لأنها لا تبدأ داخل منطق التوجيه أو المصادقة في Next.js.

بل تبدأ من صورة.

يعتمد Next.js في تحسين الصور على مكتبة:

text
sharp

بينما تعتمد sharp بدورها على مكتبة:

text
libheif

لمعالجة صيغ مثل:

text
AVIF
HEIF
HEIC

الخلل الحقيقي موجود في libheif، وتم توثيقه تحت:

text
GHSA-g89c-p67h-r497

أما تأثر Next.js فتم توثيقه تحت:

text
GHSA-2xp9-vwfh-vxw4

والتقييم الأمني:

text
CVSS v4 9.5

#من صورة إلى Heap Buffer Overflow

عند استقبال صورة AVIF، لا يقوم Next.js بفهم بنية الصورة بالكامل بنفسه.

المسار التقريبي يكون:

text
Attacker-controlled AVIF
        |
        v
Next.js Image Optimization
        |
        v
sharp
        |
        v
libheif
        |
        v
Image decoding / scaling

المشكلة تظهر داخل عملية معالجة الصورة.

يمكن لملف AVIF مصمم بطريقة خاصة أن يحتوي على مراجع متداخلة من نوع:

text
identity-derivation (iden)
auxiliary item references (auxl)

هذا يؤدي إلى بناء صورة مفكوكة تحتوي على قناتين Alpha بعمقي بت مختلفين.

إحداهما:

text
8-bit Alpha

والثانية:

text
16-bit Alpha

المكتبة تقوم بحجز مساحة ذاكرة بناءً على القناة ذات حجم 8-bit، لكنها لاحقًا تكتب بيانات 16-bit في نفس المساحة.

والنتيجة:

text
Heap Buffer Overflow

أي أن الكتابة تتجاوز الحدود التي تم حجزها في الذاكرة.

وفق تفاصيل الإفصاح، يمكن أن يصل التجاوز إلى نحو:

text
16,384 bytes

خارج حدود التخصيص.

وهنا تتحول المشكلة من خطأ في معالجة صورة إلى Memory Corruption يمكن، عند السيطرة على ظروف الذاكرة بصورة كافية، أن يصبح أساسًا لتنفيذ أوامر عن بُعد.


#لماذا Memory Corruption بهذه الخطورة؟

عندما يحصل التطبيق على ذاكرة من الـHeap، يفترض أن يكتب داخل مساحة محددة فقط.

يمكن تبسيط الصورة كالتالي:

text
Allocated Buffer
+-------------------------+
| Valid Memory            |
| Valid Memory            |
| Valid Memory            |
+-------------------------+

لكن في حالة Heap Buffer Overflow تصبح الكتابة:

text
Allocated Buffer
+-------------------------+
| Valid Memory            |
| Valid Memory            |
| Valid Memory            |
+-------------------------+
| OVERWRITE               |
| OVERWRITE               |
| OVERWRITE               |
+-------------------------+

أي أن بيانات يسيطر عليها المهاجم قد تبدأ بالكتابة في مواقع ذاكرة لم يكن من المفترض الوصول إليها.

هذه المنطقة المجاورة قد تحتوي على هياكل بيانات أو مؤشرات أو كائنات أخرى يعتمد عليها البرنامج.

لذلك فإن:

text
Out-of-Bounds Write

لا يُعامل عادة كعطل عادي في التطبيق.

إنه Primitive خطير قد يُستخدم لبناء سلسلة استغلال تؤدي إلى:

text
Process Crash
Memory Corruption
Arbitrary Code Execution
Remote Code Execution

بحسب طبيعة البرنامج وآليات الحماية الموجودة حوله.


#هل كل تطبيق Next.js معرض لثغرة AVIF؟

لا.

وهذه نقطة مهمة جدًا عند تقييم الخطر.

تحسين AVIF في Next.js لا يكون مفعلاً بالضرورة في كل تطبيق، وإنما يتطلب وجود الصيغة ضمن إعدادات الصور في:

text
next.config.js

على سبيل المثال:

javascript
const nextConfig = {
  images: {
    formats: ['image/avif', 'image/webp'],
  },
}

module.exports = nextConfig

إذا لم يكن:

text
image/avif

مفعلاً ضمن إعدادات formats، فإن التطبيق لا يكون معرضًا لمسار الاستغلال الخاص بهذه الثغرة وفق الإفصاح المنشور.

وهذا يغيّر تقييم التعرض بشكل كبير.

فالسؤال الصحيح ليس فقط:

هل نستخدم Next.js؟

بل:

هل نستخدم نسخة متأثرة؟ وهل لدينا مسار Image Optimization يستقبل AVIF؟ وهل يمكن للمهاجم التحكم بالصورة التي تصل إلى هذا المسار؟


سلسلة الاعتماديات هي جزء من سطح الهجوم

هذه الثغرة مثال واضح على مخاطر:

text
Software Supply Chain
Transitive Dependencies

قد يراجع الفريق تطبيقه ويجد أنه لا يستدعي libheif بشكل مباشر.

لكن العلاقة الفعلية قد تكون:

text
Application
   |
   v
Next.js
   |
   v
sharp
   |
   v
libheif

الثغرة في الطبقة الرابعة، لكن الأثر يصل إلى الطبقة الأولى.

وهذا يعني أن تقييم أمان التطبيق اعتمادًا على المكتبات التي يضيفها المطور يدويًا فقط لم يعد كافيًا.

ينبغي النظر إلى كامل:

text
Dependency Graph

بما في ذلك الاعتماديات غير المباشرة.


لماذا عطلت Next.js دعم AVIF مؤقتًا؟

في النسخ المصححة، اتخذت Next.js خطوة دفاعية مباشرة: تعطيل تحسين AVIF مؤقتًا إلى أن ينتشر الإصلاح من libheif إلى سلسلة الاعتماديات المستخدمة فعليًا داخل الإطار.

الفكرة هنا مهمة من منظور هندسة الأمن.

عندما تكون الثغرة موجودة في اعتماد upstream، قد يكون أمام المشروع الأعلى في السلسلة خياران:

text
Wait for upstream dependency

أو:

text
Disable the vulnerable functionality

Vercel اختارت تعطيل الوظيفة المتأثرة مؤقتًا لمنع وصول مدخلات AVIF إلى المسار المعرض للخطر.


ما النسخ الآمنة؟

الإصدارات المصححة هي:

text
15.5.24
16.3.3

للترقية على خط 15.5:

bash
npm install next@15.5.24

وللترقية على خط 16.3:

bash
npm install next@16.3.3

ثم يمكن التحقق من النسخة المثبتة عبر:

bash
npm list next

أو:

bash
npx next --version

ويجب عدم افتراض أن تحديثات يوليو 2026 كافية، لأن هذه الثغرات جاءت ضمن إصدار أمني لاحق في أغسطس.


كيف تعرف إن كنت ضمن نطاق الخطر؟

يمكن تقسيم التقييم إلى مسارين.

#المسار الأول: Windows RCE

تحقق من نظام تشغيل الخادم:

text
Windows

ثم تحقق من إصدار Next.js:

bash
npm list next

ثم راجع البنية المستخدمة داخل التطبيق لمعرفة ما إذا كان التطبيق يستخدم:

text
Pages Router
App Router

مع عدم استخدام:

text
Cache Components

إذا اجتمعت هذه الشروط مع نسخة متأثرة، فالتعرض مرتفع.


#المسار الثاني: AVIF RCE

ابدأ من ملف:

text
next.config.js

وابحث عن:

javascript
formats: ['image/avif']

أو أي صياغة مكافئة تتضمن:

text
image/avif

ثم راجع إصدار Next.js.

بعد ذلك اسأل السؤال الأهم:

هل يستطيع مصدر غير موثوق التحكم في الصورة التي تصل إلى Image Optimization؟

إذا كانت الإجابة نعم، فإن سطح الهجوم يصبح أكثر وضوحًا.


لماذا التطبيقات المستضافة على Vercel في وضع مختلف؟

بحسب Vercel، التطبيقات المستضافة مباشرة على منصتها محمية من الثغرتين ولا تحتاج إلى الترقية من أجل هاتين الثغرتين تحديدًا.

لكن هذه النقطة لا يجب تعميمها على:

text
Self-hosted Next.js
Docker
Windows Server
Kubernetes
VM deployments
On-premises hosting

فالاستضافة الذاتية تعني أن مسؤولية تحديث الإطار وسلسلة الاعتماديات والـRuntime والـOS تقع على الجهة المشغلة.

وهذا فرق جوهري من منظور:

text
Shared Responsibility Model

من منظور GRC: المسألة أكبر من تحديث npm

من ناحية تقنية، قد يبدو الحل واضحًا: تحديث Next.js.

لكن من منظور الحوكمة والمخاطر والالتزام، هذه الحادثة تكشف عدة أسئلة أكبر.

المحورالسؤال الذي يجب أن تستطيع الجهة الإجابة عنه
Asset Managementأين توجد تطبيقات Next.js داخل البيئة؟
Software Inventoryما الإصدارات المستخدمة في كل تطبيق؟
Dependency Managementما الاعتماديات المباشرة وغير المباشرة؟
Vulnerability Managementكم يستغرق الانتقال من الإفصاح إلى التصحيح؟
Configuration Managementهل AVIF مفعّل؟ وعلى أي الأنظمة تعمل التطبيقات؟
Third-Party Riskما أثر ثغرة في مكتبة مثل libheif على الخدمة؟
Change Managementهل يمكن نشر تحديث أمني عاجل دون انتظار دورة إصدار طويلة؟
Detection & Responseهل توجد رؤية كافية لاكتشاف استغلال محتمل؟

هذه الأسئلة تحدد ما إذا كانت المؤسسة تعرف فعلًا حجم تعرضها، أم أنها تكتشف وجود التقنية المتأثرة فقط بعد نشر الثغرة.


المشكلة التي تكشفها الثغرتان: Context هو الذي يحدد الخطر

في إدارة الثغرات، الاعتماد على درجة:

text
CVSS

وحدها لا يكفي.

خذ ثغرة AVIF كمثال.

قد تكون درجتها:

text
9.5

لكن تطبيقًا لا يستخدم AVIF Optimization قد لا يكون معرضًا لها.

وفي المقابل، تطبيق آخر يستقبل صورًا من مستخدمين خارجيين ويمررها مباشرة إلى Image Optimization قد يملك Exposure مرتفعًا جدًا.

لذلك فإن التقييم الفعلي يجب أن يجمع بين:

text
CVSS
+
Asset Criticality
+
Internet Exposure
+
Configuration
+
Reachability
+
Data Sensitivity
+
Exploitability

وهذه هي النقطة التي يلتقي عندها العمل التقني مع إدارة المخاطر.


ماذا تكشف هذه الحادثة عن إدارة الاعتماديات؟

هناك فرق بين معرفة أن التطبيق يستخدم:

text
Next.js

ومعرفة سلسلة المكونات التي يعتمد عليها Next.js فعليًا.

في المؤسسات الكبيرة، يمكن أن يكون وجود:

text
SBOM

أو:

text
Software Bill of Materials

عاملًا حاسمًا في تقليل زمن التقييم.

بدل البحث اليدوي داخل عشرات المستودعات لمعرفة ما إذا كانت libheif مستخدمة، يمكن ربط الثغرة بمكونات سلسلة التوريد البرمجية ثم تحديد التطبيقات المتأثرة.

وتصبح الأسئلة مثل:

text
Where is libheif used?
Which apps depend on sharp?
Which Next.js versions are deployed?
Which assets are internet-facing?

قابلة للإجابة بسرعة أكبر.


من المسؤول: فريق التطوير أم البنية التحتية أم الأمن؟

الثغرتان توضحان أن الإجابة ليست فريقًا واحدًا.

فريق التطوير مسؤول عن:

text
Framework Versions
Application Configuration
Dependency Updates

فريق البنية التحتية مسؤول عن:

text
Operating System
Hosting Model
Runtime
Deployment Environment

فريق الأمن مسؤول عن:

text
Exposure Assessment
Vulnerability Prioritization
Threat Monitoring
Incident Readiness

أما فرق GRC فتحتاج إلى التأكد من أن هذه المسؤوليات ليست ضمنية فقط، بل موثقة ومقاسة ويمكن إثبات تنفيذها.

لأن ثغرة Windows هنا لا يمكن فهمها من خلال الكود وحده، وثغرة AVIF لا يمكن تقييمها من خلال اسم الإطار وحده.


ماذا عن الاستغلال الفعلي؟

حتى 27 أغسطس 2026، لم يتم الإبلاغ علنًا عن استغلال فعلي للثغرتين ضمن هجمات واسعة وفق المعلومات المنشورة.

لكن الباحثين المرتبطين بثغرة libheif ذكروا أنهم تمكنوا من الوصول إلى RCE على عدة تطبيقات.

كما نُشر Proof of Concept يثبت حدوث الكتابة خارج حدود الذاكرة تحت بيئة اختبار مزودة بـ:

text
AddressSanitizer

ومع ذلك، فإن إثبات:

text
Heap Corruption

ليس بالضرورة مساويًا تلقائيًا لإثبات استغلال موثوق كامل في كل بيئة إنتاجية.

وهذا التفريق مهم عند قراءة التقارير الأمنية.


سباق جديد بين اكتشاف الثغرات وسرعة التصحيح

أطلقت Vercel في يوليو 2026 برنامجًا أمنيًا شهريًا لإصدارات Next.js، وفي أغسطس كان من المفترض إصدار الدفعة الأمنية في 26 أغسطس.

لكن وجود ثغرة حرجة إضافية في اعتماد upstream دفع الشركة إلى تقديم الإصدار إلى 25 أغسطس.

هذه ليست مجرد ملاحظة زمنية.

إنها تعكس واقعًا جديدًا في أمن البرمجيات: سرعة اكتشاف الثغرات تزداد، وسلسلة الاعتماديات تصبح أعمق، والأدوات المدعومة بالذكاء الاصطناعي بدأت ترفع حجم البحث الأمني واكتشاف الحالات الطرفية.

في المقابل، دورة التصحيح داخل المؤسسة ما زالت في كثير من الأحيان تعتمد على عمليات صُممت لعالم أبطأ.


الخلاصة

ثغرتا أغسطس في Next.js تبدوان مختلفتين تمامًا.

واحدة تبدأ من:

text
Windows Path Handling

والأخرى تبدأ من:

text
AVIF Image Parsing

لكن النتيجة المحتملة واحدة:

text
Unauthenticated Remote Code Execution

وهنا تكمن أهمية الحادثة.

أمن تطبيقات الويب لم يعد محصورًا في حماية صفحة تسجيل الدخول أو فحص مدخلات API فقط. نظام التشغيل، مكتبة الصور، الاعتماديات غير المباشرة، إعدادات الـFramework، وطريقة الاستضافة أصبحت كلها أجزاء مترابطة من سطح الهجوم نفسه.

قد يكون التطبيق آمنًا على مستوى الكود الذي كتبته أنت، لكنه ما زال يحمل المخاطر الموجودة في كل طبقة تحته.

وفي عالم الأطر الحديثة، أحيانًا لا يحتاج المهاجم إلى تجاوز تسجيل الدخول.

قد يحتاج فقط إلى مسار ملف غير متوقع... أو صورة مصممة بعناية.


#المصادر