هندسة عكسية لبروتوكول RF: لما الموجات الراديوية تفضح المفاتيح

🇺🇸EN🇸🇦AR

تخيّل مبنى يثق في موجات الراديو بنفس الطريقة اللي الناس بيثقوا فيها في باب مقفول. الحساسات بتتكلم مع الـ controllers في الهوا، الإنذارات قاعدة ساكتة لحد ما حاجة تتحرك، والوثائق بتقول إن البروتوكول "فعال ومرن". الجملة دي غالباً صح لحد اللحظة اللي حد يبدأ يقرأ الـ packets نفسها.

المقال ده بيمرّ على العملية العملية لهندسة عكسية لبروتوكول RF أمني خاص: تحديد الهيكل، استرجاع الـ CRC، فهم الـ addressing، وفي الآخر صياغة packets النظام بيقبلها فعلاً. مفيش سحر، بس ملاحظة منهجية واستعداد تختبر الـ parameters اللي الوثائق ما ذكرتهاش.

إيه هي الهندسة العكسية للبروتوكولات أصلاً؟

الهندسة العكسية للبروتوكول هي فن إعادة بناء قواعد المحادثة لما يكون عندك المحادثة بس. في عالم الـ RF ده معناه تصوير الإشارة الراديوية، تحويل الـ waveform التناظري لـ bits، تجميع الـ bits في fields، وبعدين اكتشاف أي field بيتحكم في أي سلوك.

بخلاف الـ web API اللي بيرجع رسائل خطأ JSON بأدب، نظام أمني لاسلكي ببساطة بيرمي أي packet يفشل في الـ validation. الصمت هو الرد الوحيد. ده بيفرض أسلوب تحقيق مختلف: تصوير traffic معروف إنه سليم، مقارنة packets بتعمل أفعال مختلفة، وبالتدريج ترسيم كل byte.

البروتوكول في السيناريو ده كان مصمم لحساسات منخفضة الطاقة بتشتغل حوالي 433.92 MHz. الأجهزة شملت ليزر محيط ووحدات إنذار محتاجة تفضل متناسقة من غير محادثة عالية الـ bandwidth طول الوقت. الوثائق ذكرت أكواد الأوامر (suppress، alert، broadcast، turn-on، turn-off، move-left، move-right) وذكرت CRC بقيمة ابتدائية محددة، لكنها سابت تخطيط الـ packet وقواعد الـ addressing غامضة عن قصد.

ليه لازم تهتم؟

  • أنظمة الأمن المادي بتعتمد أكتر وأكتر على روابط RF خاصة. CRC مكسور أو نموذج addressing ضعيف يقدر يخلي المهاجم يسكت الإنذارات أو يعطل الحساسات من غير ما يلمس سلك.
  • نفس التقنيات بتنطبق على أجهزة فتح الجراجات، أجهزة التحكم الصناعية عن بعد، وكثير من أجهزة الـ IoT اللي لسه بتعامل "الأمن بالغموض" كأنه ميزة.
  • parameters الإرسال (modulation، samples-per-symbol، bits-per-symbol) غالباً مهمة قد الـ payload نفسه. packet مثالي اتبعت بـ bit length غلط لسه garbage بالنسبالـ receiver.
  • الوثائق دايماً تقريباً ناقصة. القواعد الحقيقية عايشة في الـ silicon وفي الـ traffic اللي الـ silicon بيولّده.

مثال عملي: من التصوير للسيطرة

تصوير المحادثة

الخطوة الأولى هي الحصول على traffic حقيقي. ملفات الإشارة بصيغة complex (عينات I/Q متداخلة) اتاستوردت في أداة تقدر تعمل demodulate لـ FSK وتعرض الـ bits المسترجعة. الكشف التلقائي عادةً أنتج parameters قابلة للاستخدام: FSK، حوالي 100 sample لكل symbol، و 1 bit لكل symbol.

لما الـ bits بانت، عرض الـ hex كشف patterns واضحة عبر عدة packets:

  • preamble متكرر من بايتات aa لفئة أجهزة و bb لفئة تانية.
  • تسلسل ثابت من ثلاث بايتات ما اتغيرش أبداً.
  • بايت واحد مرتبط بنوع الجهاز (إنذار مقابل ليزر).
  • حقول عنوان وأمر متغيرة.
  • بايتين أخيرين بيتغيروا مع كل payload مختلف — الـ CRC.

المقارنة جنب بعض لـ packets بتعمل أفعال مختلفة خلت حدود الـ fields واضحة. packets الـ broadcast استخدمت قيمة receiver خاصة؛ أوامر الحركة والتشغيل/الإيقاف استخدمت identifiers أوامر مختلفة مذكورة في الوثائق.

استرجاع الـ CRC

الوثائق ذكرت قيمة CRC ابتدائية 0x1D0F وأشارت لتطبيق Microchip/STM32. ده وجّه بقوة نحو CRC-16/CCITT. إدخال الـ payload (من غير الـ CRC نفسه) في حاسبة قياسية بالقيمة الابتدائية دي أنتج نتائج مطابقة لكل packet متصور. الـ CRC كان متخزّن high-byte first.

بوجود دالة CRC شغالة، أي packet جديد كان ممكن يتعمل valid. ده شال وضع الفشل "اترمى بصمت" وسبّى الأخطاء المنطقية بس للـ debugging.

مفاجأة الـ addressing

المحاولات الأولى استخدمت أكواد الأوامر من الوثائق وعنوان receiver على طريقة الـ broadcast. الـ packets اتقبلت من طرف الـ transmitter (رد 200) لكن ما عملتش أي تأثير ظاهر على الحساسات.

تدوير البايت الغامض اللي فضل ثابت في كل الـ captures كشف القاعدة في الآخر: النظام كان متوقع الـ packet يكون موجّه لنفسه. حقل الـ sender وحقل الـ receiver لازم يحتويوا نفس معرف الجهاز. لما النمط ده اتطبق، أوامر الـ suppress سكّتت إنذارات فردية وأوامر الـ turn-off عطّلت ليزرات فردية.

الوثائق ما قالتش المطلب ده أبداً. بقى ظاهر بس لما البايت الثابت اتعامل كمتغير واتراقب رد فعل النظام.

الـ parameter اللي كان هيخرّب كل حاجة

حتى مع هيكل صحيح، CRC صحيح، وأوامر موجّهة للجهاز نفسه، الحساسات رفضت تغيّر حالتها لما الإرسال استخدم 100 sample لكل symbol. تغيير parameter الـ bits-per-symbol لـ 1 أنتج رد فعل فوري: أول إنذار تحوّل للون الأحمر. إرسال التسلسل الكامل بالـ parameter الواحد ده مقفول سكّت كل الإنذارات وكل الليزر.

الـ backend كان واضح إنه حساس لتوقيت وparameters الـ symbol اللي الجهاز الأصلي استخدمها. packet شكله مثالي في الـ hex لسه فشل لو parameters الراديو ما تطابقتش مع اللي الـ receivers متوقعينه.

أنماط تصميم ضعيفة (وإزاي بتبان في الكود)

stacks الـ RF الخاصة غالباً بتنفّذ الـ validation بطريقة شبه كده:

// validation بأسلوب ضعيف (مبسط)
uint16_t received_crc = (packet[12] << 8) | packet[13];
uint16_t calculated = crc16_ccitt(packet, 12, 0x1D0F);

if (received_crc != calculated) {
    discard();          // إسقاط صامت
    return;
}

if (packet[9] != packet[10]) {   // فحص self-address مش موثّق
    discard();
    return;
}

dispatch_command(packet[8], packet[11]);

أسلوب دفاعي أكتر هيكون:

  • يرفض packets بتيجي بتوقيت أو modulation مش متوقع.
  • يطلب مصادقة cryptographic بالإضافة للـ CRC.
  • يسجّل (أو يعمل rate-limit) للمحاولات الباطلة المتكررة بدل ما يفشل بصمت.
  • يوثّق نموذج الـ addressing عشان المشغّلين ما يضطرّوش يعملوا له هندسة عكسية.

الدفاع / إزاي تصلح

  1. اعمل authenticate، متكتفيش بـ checksum. الـ CRC بيكتشف التلف؛ مش بيثبت المصدر. زوّد MAC بمفتاح أو طبقة challenge-response.
  2. خلّي نموذج الـ addressing صريح. لو أوامر self-addressed مطلوبة، قول كده في الوثائق وطبّقها بشكل متسق.
  3. تحقق من parameters الراديو. اقبل بس الـ modulation والتردد وتوقيت الـ symbol اللي الجهاز اتصمم عليه.
  4. افشل بشكل ملحوظ أثناء التطوير. الإسقاط الصامت مريح في الـ production لكنه بيخلّي الـ debugging (وتحليل سطح الهجوم) أصعب بكتير.
  5. افترض إن الهوا عدو. أي بروتوكول ممكن يتسجل ممكن يتكرر أو يتعدّل. صمّم كأن المهاجم أصلاً عنده transmitter متوافق.

أفكار أخيرة

أفشل الإخفاقات إثارة في أمن اللاسلكي نادراً ما تكون كسور تشفيرية غريبة. هي التناقضات الهادية بين اللي الوثائق بتدعيه واللي الـ silicon بيقبله فعلاً. CRC ممكن يتعاد حسابه، قاعدة addressing ممكن تتكتشف بالقوة الغاشمة، وparameter إرسال واحد لازم يطابق الجهاز الأصلي، غالباً كفاية عشان تحوّل محيط "آمن" لدعوة مفتوحة.

الموجات الراديوية ما بتخبّيش أسرار. هي بس بتخبّي الناس اللي ما بيحاولوش يسمعوا.