هجمات التوقيت في الشيفرة على مستوى التطبيق
تعلّموا كيف يكشف توقيت مقارنة السلاسل الأسرار، وكيف تمنع المقارنة ذات الزمن الثابت ذلك.
هجمات التوقيت في الشيفرة على مستوى التطبيق درس مجاني في Cryptology Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Cryptology Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Cryptology Academy 4 دروس في المجموع.
مقارنة السلاسل النصية بزمن غير ثابت
ينهي معامل مساواة السلاسل النصية القياسي في معظم لغات البرمجة عمله بمجرد العثور على عدم تطابق. فـ == في Python مع كائنات bytes، وstrcmp في C، وString.equals في Java، كلها تعيد النتيجة فور العثور على أول بايت مختلف. وتُعد هذه العملية تحسينًا في المقارنة العادية للسلاسل النصية، لكنها عند مقارنة قيم سرية مثل علامات MAC أو كلمات المرور تنشئ قناة جانبية قابلة للقياس للتوقيت، فتسرّب معلومات.
قياس زمن مقارنة HMAC
يقيس المهاجم الوقت المستغرق لمقارنة وسم HMAC المُرسَل بالقيمة الصحيحة. ويستغرق إرسال HMAC يتطابق بايته الأول بشكل صحيح وقتًا أطول قليلًا من إرسال قيمة يكون فيها البايت الأول خاطئًا، لأن المقارنة تتضمن بايتًا إضافيًا. ومن خلال إرسال العديد من القيم التي تحتوي على كل احتمال للبايت الأول وقياس أزمنة الاستجابة، يحدد المهاجم البايت الأول الصحيح. وتتكرر هذه العملية بايتًا تلو الآخر حتى استعادة الوسم الكامل.
دقة توقيت الهجمات العملية
يمكن لهجمات التوقيت الحديثة عبر الشبكات تحديد فروق زمنية تتراوح من عشرات النانوثواني إلى مئاتها عبر الإنترنت. وتوفر مقارنة HMAC بطول 32 بايت، حيث يضيف كل بايت صحيح نحو 10-100ns إلى وقت المعالجة، إشارة قابلة للقياس عند إجراء قياسات متكررة كافية لحساب المتوسط والتغلب على تذبذب الشبكة. وفي سياق شبكة محلية، يمكن استغلال فروق لا تتجاوز نانوثانية واحدة عند استخدام عدد كافٍ من العينات الإحصائية.
ثغرة عامل == في Python
تُعد مقارنة وسوم MAC باستخدام == في Python غير آمنة؛ إذ تُرجع mac == submitted_mac القيمة True أو False بناءً على موضع أول اختلاف. ويمكن لمهاجم يرسل آلاف الوسوم المُعدّة بعناية ويقيس أزمنة الاستجابة استعادة الوسم المتوقع بايتًا تلو الآخر. وقد ظهرت هذه الثغرة في تطبيقات ويب مستخدمة في بيئات الإنتاج، بسبب تنفيذ مقارنة رموز الجلسات أو مفاتيح API بشكل غير صحيح ومن دون استخدام دوال ذات زمن ثابت.
hmac.compare_digest في Python
تقارن hmac.compare_digest(a, b) في Python قيمتي بايت أو سلسلتين نصيتين بزمن ثابت، إذ تستغرق المدة نفسها بغض النظر عن موضع أول اختلاف. وقد نُفذت هذه الدالة بلغة C لضمان سلوك الزمن الثابت حتى مع الكلفة الإضافية لتفسير بايت كود Python. استخدم دائمًا hmac.compare_digest لمقارنة وسوم MAC أو رموز الجلسات أو مفاتيح API أو أي قيمة قد يشكل كشف معلومات التوقيت خطرًا أمنيًا فيها.
CRYPTO_memcmp في OpenSSL
يوفر OpenSSL الدالة CRYPTO_memcmp(a, b, length) لإجراء مقارنة للذاكرة بزمن ثابت. وعلى خلاف memcmp، تعالج هذه الدالة دائمًا جميع البايتات وعددها length، بغض النظر عن وجود اختلافات مبكرة. وتكون القيمة المُعادة صفرًا إذا تساوت القيمتان، وغير صفرية إذا اختلفتا. ومن المهم دائمًا مقارنة الطول المتوقع كاملًا؛ إذ إن مقارنة قيم مختلفة الطول باستخدام الطول الأقصر قد تسرّب معلومات عن الطول. استخدم CRYPTO_memcmp في أي مقارنة حساسة أمنيًا ضمن تعليمات برمجية بلغة C/C++ تستخدم OpenSSL.
هجمات التوقيت على RSA: هجوم Bleichenbacher
لا تقتصر هجمات التوقيت على مقارنة السلاسل النصية. فقد أظهر هجوم Bleichenbacher عام 2006 على فك تشفير RSA PKCS#1 v1.5 وجود قناة توقيت عملية ضد تطبيقات SSL/TLS. وكان زمن تنفيذ عملية RSA بالمفتاح الخاص يتغير تبعًا لاحتواء القيمة المفككة على حشو PKCS#1 صالح. ومن خلال إرسال آلاف النصوص المشفرة المُعدّة بعناية، تمكن المهاجمون من استعادة مفاتيح RSA الخاصة. وقد حفّز ذلك استخدام RSA-OAEP وتطبيقات RSA ذات الزمن الثابت.
هجمات توقيت ذاكرة التخزين المؤقت على AES
تصل تطبيقات AES التي تستخدم جداول البحث، وهو أمر شائع لتحسين الأداء، إلى إدخالات مختلفة في الجدول تبعًا للمفتاح والنص الصريح. وينتج عن إصابات ذاكرة التخزين المؤقت وإخفاقاتها فروق زمنية قابلة للقياس، تسرّب معلومات حول إدخالات الجدول التي جرى الوصول إليها. ويمكن لهذه القناة الجانبية كشف مفاتيح AES. ويتمثل الدفاع في استخدام تطبيقات AES التي لا تعتمد على البحث في الجداول، مثل تعليمات العتاد AES-NI أو تطبيقات البرمجيات المعتمدة على تقسيم البتات.
مبادئ تنفيذ بزمن ثابت
تتطلب كتابة تعليمات برمجية بزمن ثابت تجنب ما يلي: الفروع الشرطية المعتمدة على بيانات سرية، مع استخدام اختيار دون فروع بواسطة الأقنعة؛ وأنماط الوصول إلى الذاكرة التي تعتمد على بيانات سرية، مع تجنب جداول البحث المفهرسة بالأسرار؛ وأي عمليات يعتمد زمن تأخيرها على القيم السرية، مثل القسمة في بعض المعالجات. وقد يحسّن المصرّف هذه البنى الخاصة بالزمن الثابت ويفقدها خصائصها، لذلك قد يلزم استخدام لغة التجميع أو عمليات الوصول إلى الذاكرة باستخدام volatile في المقاطع الحرجة.
AEAD يلغي مقارنة MAC على مستوى التطبيق
أفضل دفاع ضد هجمات التوقيت على مقارنة MAC هو استخدام أوضاع AEAD، مثل GCM وChaCha20-Poly1305، وتفويض التحقق من MAC إلى مكتبة التشفير. إذ تنفذ تطبيقات المكتبة عملية التحقق بزمن ثابت داخليًا. وعند استخدام AEAD بشكل صحيح، بحيث يفشل فك التشفير عند حدوث أي عبث ولا يجري فك التشفير قبل التحقق من الوسم، لن تحتاج أبدًا إلى مقارنة وسوم MAC في تعليمات التطبيق، وبذلك تُزال ثغرة التوقيت بالكامل.
اختبار ثغرات التوقيت
يتطلب اختبار ثغرات التوقيت تحليلًا إحصائيًا لتوزيعات أزمنة الاستجابة. وتساعد أدوات مثل tlsfuzzer ونصوص اختبار هجمات التوقيت وإطار dudect على اكتشاف فروق التوقيت في تطبيقات التشفير. ويمكن لاختبار t على عينات أزمنة الاستجابة لمدخلات يُفترض أن تنتج التوقيت نفسه أن يكشف عن فروق ذات دلالة إحصائية. وتظل النتائج السلبية الكاذبة ممكنة؛ لذلك تظل مراجعة التعليمات البرمجية بحثًا عن خصائص الزمن الثابت ضرورية إلى جانب الاختبار.
المقارنة بزمن ثابت
ما دالة Python التي ينبغي استخدامها لمقارنة وسم HMAC بأمان لمنع هجمات التوقيت؟
مراجعة هجمات التوقيت
مراجعة هجمات التوقيت: تسرّب مقارنة السلاسل النصية التي تتوقف عند أول اختلاف القيم السرية بايتًا تلو الآخر من خلال فروق أزمنة الاستجابة، ويمكن قياس هذه الفروق عبر الشبكة عند جمع عينات كافية. استخدم hmac.compare_digest في Python وCRYPTO_memcmp في OpenSSL لإجراء المقارنة بزمن ثابت. ويمكن لهجمات التوقيت على حشو RSA اختراق المفاتيح الخاصة، لذا استخدم RSA ذا الزمن الثابت وOAEP. كما تسرّب هجمات توقيت البحث في جداول AES أجزاءً من المفتاح، لذا استخدم AES-NI أو تطبيقات معتمدة على تقسيم البتات. ويُلغي تحقق مكتبة AEAD الحاجة إلى مقارنة MAC على مستوى التطبيق.
الأسئلة الشائعة
هل درس «هجمات التوقيت في الشيفرة على مستوى التطبيق» مجاني؟
نعم — نص درس «هجمات التوقيت في الشيفرة على مستوى التطبيق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Cryptology Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Cryptology Academy 4 دروس في المجموع.
ماذا ستتعلم في «هجمات التوقيت في الشيفرة على مستوى التطبيق»؟
تعلّموا كيف يكشف توقيت مقارنة السلاسل الأسرار، وكيف تمنع المقارنة ذات الزمن الثابت ذلك. تتمرن على Cryptology Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Cryptology Academy؟
لا تُشترط خبرة سابقة. Cryptology Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «هجمات التوقيت في الشيفرة على مستوى التطبيق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Cryptology Academy هذا؟
نعم. كل درس في Cryptology Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- هجمات Padding Oracle بالتفصيل
- هجمات إعادة الإرسال وثغرات إعادة استخدام Nonce
- هجمات التوقيت في الشيفرة على مستوى التطبيق
- أبرز أنماط إساءة استخدام التشفير