كُشف في أبريل 2025 عن CVE-2025-30065، وهي ثغرة حرجة في مكتبة Apache Parquet Java يمكن أن تؤدي إلى تنفيذ كود عشوائي عند معالجة بيانات Parquet خبيثة عبر الوحدة parquet-avro. أعطتها Apache درجة 10.0/10 وفق CVSS v4.0، بينما قيّمها NVD بدرجة 9.8 وفق CVSS v3.1.
الثغرة لا تعني أن صيغة Parquet نفسها أصبحت غير آمنة في كل تطبيق، ولا أن أي خادم يستخدم ملفات .parquet يمكن اختراقه مباشرة عبر الإنترنت. النطاق المحدد في سجل CVE هو حزمة Java org.apache.parquet:parquet-avro في الإصدارات 1.15.0 وما قبلها. الإصلاح الأساسي وصل في الإصدار 1.15.1.
حتى 28 أغسطس 2026، أصبح هناك كود PoC عام مرتبط بالثغرة، لكن لا تظهر CVE-2025-30065 في كتالوج CISA للثغرات المعروفة بأنها مستغلة فعليًا KEV. لذلك يجب الفصل بين وجود Proof of Concept وإثبات الاستغلال النشط في هجمات حقيقية.
حالة CVE-2025-30065 باختصار
| العنصر | الحالة |
|---|---|
| المعرّف | CVE-2025-30065 |
| المنتج | Apache Parquet Java |
| المكوّن المتأثر | org.apache.parquet:parquet-avro |
| الإصدارات المتأثرة | 1.15.0 وما قبلها |
| أول إصدار يصلح الثغرة | 1.15.1 |
| CVSS v4.0 من Apache | 10.0 — Critical |
| CVSS v3.1 في NVD | 9.8 — Critical |
| CWE | CWE-502 — Deserialization of Untrusted Data |
| PoC عام | نعم |
| CISA KEV حتى 28 أغسطس 2026 | لا تظهر في الكتالوج |
| أحدث Parquet Java مستقر | 1.18.0، صدر في 11 أغسطس 2026 |
ما هي CVE-2025-30065 بالضبط؟
بحسب سجل NVD لـ CVE-2025-30065 وإشعار Apache، توجد المشكلة أثناء تحليل Schema خاص بـ Avro داخل الوحدة parquet-avro. يمكن لبيانات غير موثوقة موجودة ضمن Metadata لملف Parquet أن تصل إلى مسار يسمح في الظروف المناسبة بتنفيذ كود عشوائي داخل عملية Java التي تعالج الملف.
صنّفت Apache الخلل تحت CWE-502: Deserialization of Untrusted Data. هذه الفئة من المشكلات تظهر عندما يسمح التطبيق لبيانات قادمة من مصدر غير موثوق بالتأثير في إنشاء أو تحميل كائنات داخل التطبيق دون قيود كافية.
الإصلاح الذي دخل إلى مشروع Parquet Java عبر التغيير GH-3168 / PR #3169 ركّز على تقييد الحزم الموثوقة داخل parquet-avro بدل السماح بسلوك أكثر اتساعًا أثناء التعامل مع Avro schemas.
لماذا توصف الثغرة بأنها RCE عن بُعد؟
تستخدم Apache في CVSS v4.0 المتجه AV:N/AC:L/AT:N/PR:N/UI:N، ولهذا حصلت الثغرة على الدرجة القصوى 10.0. لكن مصطلح Remote Code Execution يحتاج هنا إلى قراءة دقيقة.
لا يعني ذلك بالضرورة وجود منفذ شبكة في Apache Parquet يستطيع المهاجم إرسال أمر إليه مباشرة. السيناريو الخطير هو أن تكون هناك خدمة أو Data Pipeline تستقبل ملفات Parquet أو بيانات يمكن للمهاجم التأثير فيها، ثم تقوم بمعالجتها باستخدام إصدار ضعيف من parquet-avro.
على سبيل المثال، قد يكون لديك نظام يسمح برفع ملفات بيانات عبر واجهة ويب، أو خدمة ETL تستورد ملفات من Bucket خارجي، أو منصة Analytics تعالج تلقائيًا بيانات أرسلها عملاء أو شركاء. إذا وصلت بيانات Parquet خبيثة إلى عملية Java الضعيفة، تصبح الثغرة جزءًا من مسار هجوم عن بُعد.
أما إذا كانت مكتبة Parquet موجودة كاعتماد غير مستخدم فعليًا، أو كان التطبيق لا يعالج ملفات غير موثوقة عبر parquet-avro، فإن مستوى التعرض العملي يكون مختلفًا. لذلك لا يكفي العثور على رقم الإصدار وحده؛ يجب أيضًا فهم مسار البيانات داخل التطبيق.
هل كل من يستخدم Apache Parquet معرض للثغرة؟
لا. سجل CVE يحدد Apache Parquet Java وتحديدًا parquet-avro، وليس جميع تطبيقات صيغة Parquet في كل لغات البرمجة.
وجود ملف .parquet في مشروع Python يستخدم مكتبة مستقلة لا يعني تلقائيًا أن CVE-2025-30065 تنطبق عليه. في المقابل، قد يكون تطبيقك لا يعلن عن Parquet كاعتماد مباشر لكنه يحصل على نسخة ضعيفة من parquet-avro بصورة Transitive Dependency من إطار أكبر.
هذا مهم خصوصًا في بيئات البيانات الضخمة. فقد ظهرت الحاجة إلى تحديث Parquet بسبب CVE-2025-30065 داخل مشاريع Apache أخرى؛ فعلى سبيل المثال عالج Apache Flink المشكلة عبر تحديث مكتبات Parquet، كما نوقشت نسخة Parquet المستخدمة في بعض إصدارات Spark ضمن SPARK-51795.
لكن هذا لا يعني أن كل إصدار من Spark أو Flink أو أي منصة تستخدم Parquet ما زال معرضًا الآن. المطلوب هو التحقق من نسخة dependency الفعلية التي تصل إلى بيئتك، لا الاعتماد فقط على اسم المنتج الرئيسي.
كيف تتحقق من وجود النسخة الضعيفة داخل مشروعك؟
في مشاريع Maven، يمكنك مراجعة شجرة الاعتمادات والبحث عن Apache Parquet:
mvn dependency:tree
ابحث تحديدًا عن اعتماد يشبه:
org.apache.parquet:parquet-avro:1.15.0
أو أي إصدار أقدم من 1.15.1.
وفي Gradle يمكن مراجعة الاعتمادات عبر:
./gradlew dependencies
لا تكتفِ بفحص ملف pom.xml أو build.gradle يدويًا، لأن الحزمة قد تصل إلى التطبيق بصورة غير مباشرة عبر dependency أخرى. في البيئات الكبيرة، يصبح استخدام Software Composition Analysis أو SBOM أكثر موثوقية لجرد النسخ الفعلية المنتشرة.
ما الإصدار الذي يجب التحديث إليه؟
الإصدار 1.15.1 هو أول إصدار أصلح CVE-2025-30065، وبالتالي يجب ألا يبقى أي نظام معرض على 1.15.0 أو إصدار أقدم.
لكن في 2026 لا يوجد سبب عادةً لاختيار أول Patch قديم إذا كانت بيئتك تستطيع استخدام فرع أحدث. وفق صفحة الإصدار الرسمية لـ Apache Parquet، أصبح Parquet Java 1.18.0 أحدث إصدار مستقر في 11 أغسطس 2026.
إذا كانت متطلبات التوافق تسمح بذلك، يفضّل الانتقال إلى إصدار مستقر حديث بعد اختباره بدل الاكتفاء بالحد الأدنى 1.15.1.
مثال Maven:
<dependency>
<groupId>org.apache.parquet</groupId>
<artifactId>parquet-avro</artifactId>
<version>1.18.0</version>
</dependency>
وفي Gradle:
implementation("org.apache.parquet:parquet-avro:1.18.0")
إذا كان تطبيقك مربوطًا بإطار عمل يحدد إصدار Parquet بنفسه، فلا تفرض نسخة جديدة عشوائيًا قبل مراجعة Compatibility Matrix الخاصة بذلك الإطار. قد يكون الحل الصحيح تحديث Spark أو Flink أو المنتج الذي يضم المكتبة بدل تجاوز dependency يدويًا.
هل يوجد Exploit لـ CVE-2025-30065؟
نعم، وهذه نقطة تغيرت بعد الأيام الأولى للإفصاح. سجل NVD المحدث يتضمن بيانات CISA ADP التي تصنّف حالة الاستغلال على أنها PoC، كما أضيفت مراجع إلى نماذج إثبات مفهوم عامة.
لكن وجود PoC لا يساوي Active Exploitation.
الـ Vulnerability هي الخلل نفسه، والـ Exploit أو PoC يثبت إمكانية الوصول إلى سلوك معين، بينما Active Exploitation يعني وجود دليل على استخدام الثغرة ضد أهداف حقيقية. يشرح دليل مصطلحات الأمن السيبراني هذا الفرق بين الثغرة والاستغلال والمفاهيم المرتبطة بهما.
حتى 28 أغسطس 2026، لا تظهر CVE-2025-30065 في CISA KEV. لذلك من غير الدقيق وصفها بأنها «تُستغل حاليًا على نطاق واسع» دون دليل إضافي.
في الوقت نفسه، وجود PoC عام مع تأثير محتمل مرتفع جدًا يعني أن غيابها عن KEV ليس سببًا لتأجيل التصحيح.
هل كانت CVE-2025-30065 ثغرة Zero-Day؟
لا ينبغي وصفها الآن بأنها Zero-Day، كما لا يوجد في المصادر الرسمية التي اعتمدنا عليها ما يثبت أنها كانت تُستغل سرًا قبل توفر الإصلاح.
الأهم أن الإصلاح دخل إلى المشروع في مارس 2025، وأصدر Apache Parquet Java 1.15.1 في 16 مارس 2025، قبل الإعلان العام عن CVE في 1 أبريل. أي أن المستخدمين حصلوا على نسخة مصححة قبل أن تصبح تفاصيل الثغرة معلنة على نطاق واسع.
إذا أردت فهم الفرق التقني بين ثغرة لم يتوفر لها Patch وبين ثغرة معروفة ومصححة مثل هذه، فراجع شرح Zero-Day Vulnerability وZero-Day Exploit.
ما الخطر الحقيقي على Data Pipelines؟
تزداد أهمية CVE-2025-30065 لأن Parquet يستخدم بكثافة في تحليلات البيانات وData Lakes وعمليات ETL، حيث يُنظر إلى الملفات عادةً باعتبارها «بيانات» لا «كودًا». الثغرة توضح أن ملف البيانات نفسه يمكن أن يصبح جزءًا من سطح الهجوم عندما يؤثر محتواه في عمليات Schema parsing أو object creation داخل مكتبة ذات صلاحيات واسعة.
الخطر الأعلى يكون عندما تجتمع عدة عوامل: إصدار ضعيف من parquet-avro، مصدر بيانات يمكن لمهاجم التحكم فيه، معالجة تلقائية للملفات، ثم تشغيل خدمة المعالجة بصلاحيات كبيرة أو مع إمكانية الوصول إلى Credentials وBuckets وقواعد بيانات وخدمات داخلية.
في هذه الحالة، لا يكون الأثر المحتمل محصورًا في ملف واحد؛ تنفيذ كود داخل Worker لمعالجة البيانات قد يمنح المهاجم الصلاحيات التي يملكها ذلك الـ Worker نفسه.
كيف تحمي الأنظمة من CVE-2025-30065؟
- حدّث parquet-avro: استخدم 1.15.1 على الأقل، والأفضل إصدارًا مستقرًا حديثًا مثل 1.18.0 عندما يسمح التوافق.
- افحص Transitive Dependencies: تأكد من النسخة الفعلية المضمّنة في التطبيق أو الـ Container، وليس فقط النسخة المكتوبة في ملفات المشروع.
- قلّل استقبال Parquet غير الموثوق: لا ترسل ملفات رفعها مستخدمون أو أطراف خارجية مباشرة إلى Data Pipeline حساسة دون طبقات تحقق وعزل.
- اعزل Workers: شغّل خدمات التحويل والمعالجة بصلاحيات محدودة وداخل Containers أو بيئات معزولة عندما يكون ذلك مناسبًا.
- طبّق Least Privilege: لا تمنح عملية قراءة Parquet وصولًا إلى Secrets أو Buckets أو قواعد بيانات لا تحتاجها فعليًا.
- قيّد الاتصالات الصادرة: Data Worker لا يحتاج عادةً إلى اتصال غير محدود بالإنترنت. Egress Filtering يمكن أن يقلص تأثير تنفيذ كود غير متوقع.
- راقب السلوك لا الملفات فقط: إنشاء Process جديد من JVM لمعالجة البيانات، أو اتصالات شبكية غير معتادة، أو قراءة Credentials بواسطة Worker يجب أن تُعامل كمؤشرات تستحق التحقيق.
- ادمج إدارة التصحيحات مع جرد الأصول: التحديث وحده لا يفيد إذا بقيت نسخ قديمة داخل Images أو Jobs منسية. يمكن تطبيق ذلك ضمن أفضل ممارسات إدارة التحديثات والثغرات على مستوى المؤسسة.
ماذا تفعل إذا تعذر التحديث فورًا؟
الحل الحقيقي هو إزالة النسخة الضعيفة، لكن إذا كان لديك عائق تشغيلي مؤقت، فأهم إجراء هو منع البيانات غير الموثوقة من الوصول إلى مسار parquet-avro.
قلّل صلاحيات خدمة المعالجة، اعزلها عن الأنظمة الحساسة، امنع الاتصالات الصادرة غير المطلوبة، وراجع مصادر جميع ملفات Parquet الداخلة إلى النظام. يجب التعامل مع هذه الإجراءات كتعويضات مؤقتة وليست بديلًا دائمًا عن Patch.
كيف تراقب أي محاولة استغلال؟
لا يوجد سبب للاعتماد على توقيع شبكي عام باعتباره وسيلة موثوقة لاكتشاف كل استغلال لهذه الثغرة، لأن التنفيذ يحدث داخل سياق التطبيق الذي يعالج البيانات. الرصد السلوكي أكثر فائدة.
راقب على وجه الخصوص Java processes أو Spark/Flink workers التي تبدأ فجأة بتنفيذ أوامر نظام، أو إنشاء Child Processes غير متوقعة، أو إجراء اتصالات خارجية لا تتناسب مع وظيفة الـ Pipeline، أو محاولة قراءة ملفات Credentials وTokens وEnvironment Variables الحساسة.
إذا كانت لديك حلول EDR أو Runtime Security للحاويات، فمن المفيد إنشاء Baseline للسلوك الطبيعي لخدمات Data Processing ثم التحقيق في الانحرافات، خصوصًا في البيئات التي تستقبل ملفات من مصادر خارجية.
الخط الزمني للثغرة
| التاريخ | ما حدث |
|---|---|
| 7 مارس 2025 | دمج التغيير الذي يقيّد Trusted Packages داخل parquet-avro في مشروع Parquet Java. |
| 16 مارس 2025 | إصدار Apache Parquet Java 1.15.1 المتضمن للإصلاح. |
| 1 أبريل 2025 | الإفصاح العام عن CVE-2025-30065 ونشر Advisory الخاص بـ Apache. |
| مايو 2025 | ظهور مراجع PoC عامة وإضافة CISA ADP حالة Exploitation: PoC إلى سجل الثغرة. |
| 1 مايو 2025 | إصدار Parquet Java 1.15.2 مع تحسينات إضافية مرتبطة بإدارة Trusted Classes. |
| 11 أغسطس 2026 | إصدار Apache Parquet Java 1.18.0 كأحدث إصدار مستقر. |
| 28 أغسطس 2026 | PoC متاح، لكن CVE-2025-30065 لا تظهر في CISA KEV. |
الخلاصة
CVE-2025-30065 ثغرة حقيقية وحرجة في parquet-avro ضمن Apache Parquet Java، وليست مجرد مشكلة نظرية في صيغة الملفات. تؤثر رسميًا في الإصدارات حتى 1.15.0، ويبدأ الإصلاح من 1.15.1.
وفي أغسطس 2026 أصبح أحدث إصدار مستقر من Parquet Java هو 1.18.0، لذلك ينبغي ألا تبقى بيئات الإنتاج على نسخة معرضة من 1.15.0 أو أقدم.
وفي تقييم الخطر يجب تجنب خلط ثلاث حقائق مختلفة: درجة CVSS البالغة 10.0 تعكس أقصى سيناريو للاستغلال، ووجود PoC يعني أن الاستغلال العملي قابل للإثبات، أما الاستغلال النشط في البرية فيحتاج دليلًا منفصلًا. حتى 28 أغسطس 2026 لا تظهر الثغرة في CISA KEV.
الأولوية الدفاعية واضحة: اكتشف أين توجد parquet-avro داخل سلسلة الاعتمادات، حدّثها، ثم راجع مسارات إدخال ملفات Parquet وصلاحيات خدمات معالجة البيانات بدل التعامل مع الملف على أنه محتوى موثوق تلقائيًا.