ثغرة Unsafe Consumption of APIs (الاستهلاك غير الآمن للـ APIs) تحدث عندما يثق الـ API الخاص بك بشكل "أعمى" في البيانات القادمة من APIs أخرى (سواء كانت تابعة لجهات خارجية مثل Google وStripe، أو حتى APIs داخلية في شركتك).
في العادة، يبذل المطورون جهداً كبيراً لتنقية البيانات التي يدخلها "المستخدم"، لكنهم يفترضون أن البيانات القادمة من "API آخر موثوق" هي دائماً آمنة وسليمة. هذا الافتراض هو الثغرة بعينها.
تخيل أنك تمتلك مطاعماً فاخراً، وأنت حريص جداً على نظافة مطبخك وتفحص كل زبون يدخل من الباب.
-
الوضع الآمن: أنت لا تسمح لأي زبون بالدخول إلى المطبخ، وتغسل الخضروات التي يشتريها العمال من السوق بعناية فائقة لأنك لا تثق بسلامتها مسبقاً.
-
المشكلة (ثغرة Unsafe Consumption): أنت تتعامل مع مورّد لحوم شهير وموثوق جداً منذ سنوات. وبسبب هذه الثقة، قررت أن اللحوم التي تأتي من هذا المورّد تدخل "مباشرة" إلى القِدْر وتُطبخ وتُقدم للزبائن دون فحص.
-
السيناريو الخبيث: في أحد الأيام، تعرض مخزن هذا المورّد للتلوث، أو قام شخص خبيث باستبدال الشحنة بلحوم فاسدة.
- لأنك تثق بالمورّد ثقة عمياء، لم تفتح الصناديق لتفحصها.
- قمت بطبخ اللحم الفاسد وتقديمه لزبائنك.
- النتيجة: أصيب زبائنك بالتسمم، وتدمرت سمعة مطعمك، رغم أن "مطبخك" نظيف جداً وعمالك ملتزمون.
👉 في عالم الـ API:
- المطعم: هو الـ API الخاص بك.
- المورّد الموثوق: هو خدمة خارجية (مثل API الطقس، أو بوابة دفع مثل Stripe، أو حتى خدمة داخلية في شركتك).
- اللحم الفاسد: هو استجابة (Response) خبيثة تحتوي على كود حقن (Injection) أو روابط ضارة.
- التسمم: هو اختراق نظامك لأنك عالجت بيانات الـ API الخارجي وكأنها بيانات آمنة 100%.
هذا النوع يحدث عندما يطلب الـ API الخاص بك بيانات من خدمة خارجية، وتتضمن الاستجابة "رابطاً" (URL) يُفترض أن يزوره نظامك.
- المشكلة: إذا تم اختراق الخدمة الخارجية، قد ترسل لك رابطاً خبيثاً.
- الخطر: قد يقوم نظامك بزيارة الرابط تلقائياً (SSRF) أو تحميل ملف ضار من ذلك الرابط ومعالجته داخل سيرفراتك الخاصة، مما يفتح باباً للمخترق داخل شبكتك الداخلية.
المطورون يفحصون البيانات القادمة من المتصفح، لكنهم ينسون فحص البيانات القادمة من الـ API الصديق.
- المشكلة: استلام بيانات نصية (String) من API خارجي ووضعها مباشرة في استعلام قاعدة بيانات (SQL Query) أو عرضها في صفحة ويب (HTML).
- الخطر: إذا أرسل الـ API الخارجي نصاً مثل
' OR 1=1 --أو سكربت خبيث<script>alert(1)</script>، فسيتم تنفيذه في نظامك وكأنه هجوم مباشر، ولكن مصدره هذه المرة "صديقك الموثوق".
في بعض الأحيان، يعتمد الـ API الخاص بك على "قرار" أمني اتخذه API آخر.
- مثال: الـ API الخاص بك يسأل خدمة الهوية (Identity Provider): "هل هذا المستخدم مسؤول (Admin)؟". إذا ردت الخدمة بـ "نعم"، يتم منحه الصلاحيات فوراً.
- الخطر: إذا تم التلاعب بالاستجابة أو كان هناك ضعف في خدمة الهوية، سيحصل المخترق على صلاحيات كاملة في نظامك لأنك لم تقم بـ "التحقق المزدوج" (Double Check).
- المشكلة: التواصل مع API خارجي عبر
HTTPبدلاً منHTTPS. - الخطر: هجوم Man-in-the-Middle (MitM). يمكن للمخترق الموجود في المنتصف تعديل البيانات القادمة من الـ API الخارجي وحقن أكواد خبيثة فيها قبل أن تصل إلى نظامك، وأنت ستتعامل معها بصفتها بيانات سليمة قادمة من المصدر.
هذا هو الخطر الأكبر. إذا كان الـ API الخاص بك يستقبل بيانات من طرف ثالث ويقوم بمعالجتها باستخدام دالات غير آمنة (مثل eval() في JavaScript أو دالات معالجة النصوص في PHP).
- الأثر: يمكن للمخترق (عبر الطرف الثالث) إرسال كود برمجي يتم تنفيذه مباشرة على السيرفر الخاص بك، مما يمنحه سيطرة كاملة على نظامك.
كما ذكرنا في الأمثلة السابقة، إذا كنت تثق في الروابط (URLs) القادمة من الـ API الخارجي.
- الأثر: يمكن للمخترق إجبار السيرفر الخاص بك على مهاجمة نفسه أو مهاجمة سيرفرات داخلية في شبكتك الخاصة لا تظهر للإنترنت، مثل لوحات تحكم السحابة (Metadata) أو قواعد البيانات الداخلية.
المخترق قد يرسل بيانات خبيثة عبر الـ API الخارجي مصممة خصيصاً لقاعدة بياناتك أنت.
- الأثر: تنفيذ هجمات SQL Injection أو NoSQL Injection. بما أن الـ API الخاص بك "يثق" بالخدمة الخارجية، فقد يتخطى فلاتر الحماية، مما يؤدي لتسريب بيانات المستخدمين أو حذف الجداول بالكامل.
إذا كانت الخدمة الخارجية ترسل كميات هائلة من البيانات أو بيانات مصممة لاستهلاك موارد النظام (مثل قنابل الـ XML أو ملفات ضخمة جداً).
- الأثر: السيرفر الخاص بك سيقضي كل وقته في محاولة معالجة هذه البيانات الخبيثة، مما يؤدي لانهياره وتوقفه عن خدمة المستخدمين الحقيقيين.
- الأثر: إذا قام الـ API الخارجي بتغيير نوع البيانات التي يرسلها (مثلاً بدأ يرسل بيانات حساسة لا يفترض بك تخزينها) وقمت أنت بحفظها "تلقائياً"، فقد تجد نفسك فجأة خارقاً لقوانين حماية البيانات مثل GDPR، مما يعرضك لمساءلة قانونية ضخمة.
أول خطوة هي معرفة من هم "أصدقاء" الـ API الخاص بك.
- التجربة: ابحث في الكود عن أي دالات تقوم بعمل طلبات خارجية (مثل
fetch,axios,curl,requests.get). - ماذا تبحث عنه: هل يتصل التطبيق بخدمة طقس؟ بوابة دفع؟ خدمة توليد ملفات PDF؟ خدمة توثيق (OAuth)؟ كل نقطة اتصال هي هدف محتمل.
- التجربة: راقب حركة المرور الصادرة من السيرفر (Outbound Traffic).
- ماذا تبحث عنه: هل هناك أي اتصالات تتم عبر
http://بدلاً منhttps://؟ أي اتصال غير مشفر يعني أنك عرضة لهجوم Man-in-the-Middle الذي قد يحقن بيانات خبيثة في استجابة الطرف الثالث.
هذه هي الطريقة الأكثر فعالية إذا كنت تملك بيئة اختبار.
- التجربة: استخدم أداة مثل Burp Suite أو محاكي للـ API (Mock Server) لاعتراض الاستجابة القادمة من الطرف الثالث "قبل" أن تصل إلى الـ API الخاص بك.
- المحاولة: قم بتغيير البيانات القادمة من الطرف الثالث إلى قيم خبيثة:
- بدل اسم المستخدم، ضع:
<script>alert('XSS')</script>. - بدل رقم التعريف، ضع:
' OR 1=1 --. - بدل رابط الصورة، ضع رابطاً لسيرفر داخلي:
http://localhost:8080/admin.
- بدل اسم المستخدم، ضع:
- الاكتشاف: إذا قام الـ API الخاص بك بتنفيذ السكربت، أو حدث خطأ في قاعدة البيانات، أو حاول السيرفر الاتصال بالرابط الداخلي، فقد وجدت الثغرة!
- التجربة: ابحث عن أي استجابة من طرف ثالث تحتوي على روابط (URLs) يتم معالجتها لاحقاً.
- ماذا تبحث عنه: هل يقوم الـ API الخاص بك بتحميل ملفات من هذه الروابط تلقائياً؟ هل يقوم بزيارتها لجلب معلومات؟ إذا كان يتبع الروابط دون فحص "النطاق" (Domain) المسموح به، فهذا مؤشر قوي على وجود ثغرة SSRF.
- التجربة: إذا كان تطبيقك يستقبل Webhooks (تنبيهات تلقائية من خدمة خارجية مثل GitHub أو Stripe).
- ماذا تبحث عنه: هل يتأكد الـ API الخاص بك من "توقيع" الطلب (Signature Verification)؟ إذا كان يقبل الـ Webhook دون التأكد من أنه قادم فعلاً من الخدمة الأصلية، يمكن للمخترق إرسال Webhook مزيف يحتوي على بيانات خبيثة.
لا تكتفِ بفحص مدخلات المستخدم؛ بل قم بفحص كل "استجابة" (Response) تأتي من API خارجي.
- الإجراء: تأكد من أن البيانات تطابق التنسيق المتوقع (Schema). إذا كنت تتوقع "رقم تعريف"، فتأكد أنه رقم وليس نصاً يحتوي على أوامر SQL.
- القاعدة: استخدم مكتبات مثل
JoiأوZodلفرض بنية محددة للبيانات القادمة من الخارج.
- الإجراء: لا تسمح للـ API الخاص بك بالاتصال بأي خدمة خارجية عبر
HTTP. استخدمHTTPSدائماً. - الإجراء المتقدم: قم بعمل Certificate Pinning إذا كان ذلك ممكناً، لضمان أنك تتحدث فعلياً مع السيرفر الأصلي وليس مهاجماً في المنتصف.
إذا كان الـ API الخارجي يرسل لك روابط (URLs) لتحميل ملفات أو جلب بيانات.
- الإجراء: لا تتبع الرابط مباشرة. قارن "النطاق" (Domain) الموجود في الرابط بقائمة بيضاء مخزنة لديك مسبقاً.
- مثال: إذا كنت تتوقع صوراً من Amazon S3، فارفض أي رابط لا ينتهي بـ
s3.amazonaws.com.
عند استقبال تنبيهات (Webhooks) من خدمات مثل Stripe أو PayPal.
- الإجراء: استخدم "المفتاح السري للـ Webhook" للتحقق من التوقيع الرقمي الموجود في رأس الطلب (Header). هذا يضمن أن الطلب جاء فعلاً من الشركة المعنية ولم يتم تزويره من قبل مخترق.
إذا كان الـ API الخاص بك يستهلك بيانات معقدة (مثل ملفات XML أو ملفات تنفيذية) من طرف ثالث.
- الإجراء: قم بمعالجة هذه البيانات في بيئة معزولة (Sandbox) أو حاوية (Container) محدودة الصلاحيات، بحيث لو كانت البيانات خبيثة، لن تستطيع الوصول إلى ملفات النظام الرئيسية أو قاعدة البيانات.
- الإجراء: لا تترك اتصالك بالطرف الثالث مفتوحاً للأبد. ضع حداً زمنياً (Timeout) قصيراً. أيضاً، حدد عدد الطلبات التي يمكن للطرف الثالث إرسالها إليك (إذا كنت تستقبل بيانات منه)، لمنع هجمات تعطيل الخدمة (DoS).
"هذا الموقع محمي جداً، لكنني أرى أنه يجلب حالة الطقس من خدمة WeatherFreeAPI.com. ماذا لو كان هذا الموقع الخارجي ضعيفاً؟ سأحاول اختراق خدمة الطقس أو عمل (Man-in-the-Middle) على اتصالها. إذا نجحت في تغيير استجابة الطقس إلى كود خبيث، فهل سيقوم الـ API الرئيسي بتنفيذه؟"
"التطبيق يستلم رابط 'صورة الملف الشخصي' من Google. ماذا لو قمت بالتلاعب بطلب الـ OAuth وجعلت الرابط يشير إلى http://169.254.169.254/latest/meta-data/؟ إذا كان الـ API يتبع الروابط بشكل أعمى لتحميل الصورة، فقد يسرب لي مفاتيح الوصول الخاصة بالسحابة (AWS/Azure) عبر هجوم SSRF."
"الـ API يعالج ملفات XML أو JSON ضخمة قادمة من خدمة شحن. سأحاول إرسال ملف يحتوي على (Entity Expansion) أو حجم هائل. هل سيحاول الـ API معالجتها حتى ينهار السيرفر (DoS)؟ المطور غالباً لا يضع قيوداً (Rate Limits) على الخدمات 'الموثوقة' كما يفعل مع المستخدمين العاديين."
"عندما يرسل Stripe تنبيهاً (Webhook) بنجاح عملية الدفع، هل يتأكد الـ API من التوقيع الرقمي فعلاً؟ سأحاول إرسال طلب Webhook مزيف من جهازي يخبر السيرفر بأنني دفعت 1000 دولار. إذا صدقني السيرفر دون التحقق من التوقيع، فقد حصلت على الخدمة مجاناً!"
"سأفحص الروابط الخارجية التي يتصل بها السيرفر. هل هناك اتصال يتم عبر http؟ إذا وجدته، سأقوم بحقن كود (SQL Injection) في وسط البيانات المنتقلة. المطور يظن أن البيانات آمنة لأنها قادمة من 'سيرفر معروف'، لكنه لا يعلم أنني أتحكم في الطريق بينهما."