
تشكل هجمات الأجهزة تهديدًا كبيرًا لجميع الأجهزة المزودة بوحدات تحكم دقيقة (المشار إليها فيما يلي - MK) ، حيث يمكنها تجاوز آليات الأمان المختلفة. من الصعب الدفاع ضد هذه الهجمات باستخدام البرامج أو الأجهزة. على سبيل المثال ، يمكنك قراءة مقال من STMicroelectronics حول أنواع مختلفة من هجمات الأجهزة وطرق حماية MK.
نحن ، فريق أمان الراكون ، مهتمون بهذا الموضوع ، لأن أحد مجالات نشاط شركتنا هو تطوير الأجهزة المدمجة ، بما في ذلك الأجهزة التي تحتوي على آليات حماية المعلومات. بالنسبة للجزء الأكبر ، نحن مهتمون بهجمات الخلل ، لأنها تتيح لك تجاوز تعليمات MK القابلة للتنفيذ السابقة. هذا تهديد خطير للمعلومات السرية الواردة في MK ، وأخطر عواقب مثل هذه الهجمات هي قراءة البرامج الثابتة المغلقة ، وتجاوز آليات الأمان التي يوفرها مطورو MK.
في Hardwear.io 2018 في لاهاي و EmbeddedWorld 2019 في نورمبرغ ، أظهرت NewAE جهاز ChipWhisperer ، والذي يسمح بتنفيذ هذا الجزء من هجمات الأجهزة غير الغازية التي لا تتطلب معرفة متعمقة بالإلكترونيات النانوية وتوافر معدات محددة. باستخدام هذا الجهاز ، درسنا أمان الأجهزة المدمجة وفهمنا كيفية تقليل نتيجة هذه الهجمات. تحت خفض - ماذا فعلنا.
ChipWhisperer
مجموعة ChipWhisperer عبارة عن مجموعة أدوات مفتوحة المصدر لتحليل أمان أكثر أعضاء MK شعبية (STM و Xmega و Intel D2000 و SAM و LPC و MSP و 78K وغيرها) و FPGA. بدأ المشروع في 27 فبراير 2015 على كيك ستارتر . في الوقت الحالي ، هناك إصدارات مختلفة من ChipWhisperer (يمكن العثور على جميع الخيارات في الكتالوج ). لديهم مجموعة مختلفة من الأدوات ، ولكن يتم توجيههم عمومًا نحو الأنواع التالية من هجمات الأجهزة:
• هجمات القناة الجانبية (SCA) ؛
• هجمات خلل.
لمزيد من التحليل ، اخترنا ChipWhisperer-Pro (CW1200) ، وهو أقدم طراز ChipWhisperer في الوقت الحالي ولديه وظائف واسعة وحزمة كبيرة:

ChipWhisperer Kit (CW1200)
على متن الطائرة ، يحتوي CW1200 على مرسمة الذبذبات ، والتي تتكون من مكبر للصوت قابل للتعديل و ADC مع عينة من 105 MSPS. تتيح لك هذه المجموعة من الأدوات تسجيل مستوى الإشارة بالمئات من المليون فولت والحصول على قاعدة زمنية جيدة. يوجد أيضًا في CW1200 منافذ لتنظيم CLK-خلل و Vcc-خلل ، ومنافذ GPIO التي يمكن تعيينها كمشغلات إدخال لتتبع أصل الحدث (طلب إدخال كلمة المرور ، حالة التنزيل ، وما إلى ذلك). يتصل CW1200 بكمبيوتر شخصي عبر USB ولديه بروتوكولا اتصال مع MK: UART و SPI.
للعمل مع ChipWhisperer ، تحتاج إلى تثبيت برامج التشغيل وتنزيل مكتبات Python وأمثلة العمل من GitHub ، أو تنزيل الصورة المعدة لجهاز ظاهري على نظام Linux ، حيث يتم تثبيت جميع المكتبات وأمثلة العمل مسبقًا. تحتوي هذه المكتبات المفتوحة على:
• بروتوكول الاتصال مع ChipWhisperer.
• الخوارزميات الرياضية لمعالجة الهجمات على طرق التشفير الشائعة ؛
• بروتوكولات للتواصل مع محمل الإقلاع من عضو الكنيست الشعبي ؛
• إعداد البرامج الثابتة للتدريب على لوحات مع MK ، المدرجة في المجموعة.
قررنا الاطلاع على جميع البرامج التعليمية على موقع NewAE القديم . الآن يتم تطوير مورد آخر ، حيث يتم تقديم المزيد من المعلومات ذات الصلة وهناك منتدى .
في هذه المقالة ، سنقدم فقط أمثلة قليلة من الأدلة من مطوري ChipWhisperer ولن نطبقها على اللوحات التي تحتوي على MK المضمنة في الحزمة ، ولكن على STM32F103RBT6:

مجلس STM32F103RBT6
لقد كتبنا أيضًا رمزًا متطابقًا مع الأمثلة المعدة لها ، ولكن مع مكتبات HAL التي تم إنشاؤها من CubeMX. كل هذه الإجراءات مطلوبة لتأكيد أنه يمكن تنفيذ الهجمات على ChipWhisperer على أي أجهزة عشوائية ، وليس فقط على اللوحات الموجودة في المجموعة.
بعد ذلك ، نقدم لمحة موجزة وأمثلة عن هجمات SCA وهجمات الخلل.
تحليل SCA
أساس هجمات SCA هو تتبع التغييرات في العوامل الخارجية لحالة MC (الاستهلاك الحالي لل MC ، درجة الحرارة ، المجال الكهرومغناطيسي) عندما تقوم بتطوير تعليمات مختلفة. ChipWhisperer تنفذ قنوات لمراقبة الطاقة باستخدام ADC والمجال الكهرومغناطيسي باستخدام هوائي.
تحليل SCA فعال في الكشف عن كلمات المرور ، ومفاتيح التشفير ، إلخ. يتميز موقع NewAE بالعديد من الميزات المختلفة
إرشادات مفيدة للعثور على مفاتيح التشفير ولهجمات SCA ، لكننا سنقدم مثالًا واحدًا فقط على تحليل SCA ، نظرًا لأن هجمات العيوب تهمنا كثيرًا.
مثال على هجمات SCA - تحليل توقيع القوة
يوضح هذا الدليل نوعًا واحدًا من هجمات SCA - تتبع إدخال كلمة مرور حرف تلو الآخر من خلال مراقبة التواقيع على قناة الطاقة. من خلال تكرار توقيعات الطاقة ، من الممكن تحديد تطوير تعليمات البرنامج المختلفة داخل MK. يوضح المثال أعلاه تطور كلمة مرور إدخال MK عن طريق تتبع توقيع عملية break
.
لنبدأ التحضير. بادئ ذي بدء ، تحتاج إلى إجراء اتصالات حسب الشكل:

اتصال MC لتحليل SCA
يتخطى الرسم التخطيطي المكونات التي لا تحتاج إلى الاتصال (على عكس اتصال MK القياسي). تشير الأسهم إلى نقاط اتصال ChipWhisperer ، وتشير التواقيع إلى دبابيسها.
إعداد البرامج الثابتة MK. الوظيفة التالية هي في حلقة while(1)
الرئيسية:
028 void password_check() { 029 char passwd[32]; 030 char correct_passwd[] = "Vulkan"; 031 HAL_Delay(10); 032 uart_send("WARNING: UNAUTHORIZED ACCESS WILL BE PUNISHED\n"); 033 led_off(); 034 035
السطر 030 يعين كلمة المرور للدخول - فولكان. بعد ذلك ، يتم تشغيل الصمام
led_on()
و يتم إرسال رسالة UART حول طلب كلمة المرور. تقوم وظيفة led_on()
بتنشيط دبوس GPIO الخاص بـ PA12 MK وإعلام الحدث الذي سيبدأ ChipWhisperer في تجميع الأشكال الموجية فيه. يجب أن تكون متصلاً CW_TRIG إلى هذا الدبوس. كل هذا يتم "توليفه" للراحة ، ولكن في الحالات الحقيقية ، سيكون الفرق ضئيلًا ، حيث يمكنك إدخال تأخير زمني في عدد دورات ساعة CLOCK المتعلقة بأي حدث يتصل به CW_TRIG. على سبيل المثال ، يمكن أن يكون بداية تنزيل MK ، استقبال / إرسال الرسائل ، تضمين LED ، إلخ.
علاوة على ذلك ، ينتظر MK إدخال كلمة مرور ، والتي ستتحقق من حرف تلو الآخر. إذا لم يتطابق أي حرف في قائمة الانتظار ، على سبيل المثال ، ثلاثة أحرف صحيحة والرابع غير صحيح ، فأنت بحاجة إلى الخروج من حلقة مع بيان break
والإبلاغ عن كلمة مرور خاطئة. في الخطوط 055 - 05 ، يتم تنفيذ مولد تأخير عشوائي. غالبًا ما يستخدم هذا التصميم لتعقيد سير الهجمات المؤقتة (على سبيل المثال ، تتبع التغييرات في وقت استجابة النظام بأكمله). تم تضمين هذا التصميم لفهم أننا لم نحدد كلمة مرور باستخدام طريقة الهجوم المؤقت.
يتم استضافة رمز Jupyter Python التعليمي على المورد المقابل. يوضح الشكل أدناه مثالًا لإدخال كلمة مرور مع إخراج شكل موجة إمدادات الطاقة من MK مع كل رمز صحيح جديد. لاحظ أنه مع إدخال حرف كلمة المرور الصحيحة (تظهر كلمة المرور المراد إدخالها في الجزء العلوي من الشكل) ، يتم تحويل توقيع عملية break
إلى السطر 046 (مظلل باللون البرتقالي في الشكل أدناه). هذا هو "ضعف" الانقطاع عن طريق عملية break
عند التحقق من كلمة المرور بكلمة مرور.

كلمة المرور التذبذبات
نتيجة للتعرف على هذا الدليل ، اكتشفنا مدى سهولة تجاوز حماية كلمة المرور من خلال هذا النهج للتحقق من ذلك باستخدام تحليل SCA. يكفي التعليق على عملية break
في السطر 048 في هذه البرامج الثابتة ، وبوجه عام ، سيكون التحقق من كلمة المرور ناجحًا ، ولكن تتبع معالجة التوقيع سوف يصبح أكثر تعقيدًا. لذلك ، لتقليل فعالية مثل هذه الهجمات ، يجب عليك تجنب تشغيل الانقطاع الفوري لدورات المسح.
يكمن تعقيد هذا التحليل في العثور على التوقيعات اللازمة. لذلك ، قد يؤدي إجراء مثل هذه الهجمات إلى تعقيد إدخال rand()
المؤقتة في وقت التحقق من كلمة المرور أو إضافة حسابات إضافية أو إضافة ضوضاء إلى المكونات الأخرى.
هجمات خلل
يتم تنفيذ هجمات الخلل من خلال سلسلة من النبضات قصيرة الأجل في لحظة زمنية محددة وفقًا لطريقة معينة من التأثير. الأساليب الأكثر شعبية هي: ساعة (CLK- خلل) ، والطاقة (VCC- خلل) ، والحقل الكهرومغناطيسي. يتم إنشاء المجال الكهرومغناطيسي بواسطة شرارة عالية الجهد بالقرب من MC. لهذا ، تستخدم NewAE معدات ChipSHOUTER . لم نقم بشرائه ، لذلك قمنا بتنفيذ هجمات CLK-خلل و Vcc-خلل فقط.
يتم تنفيذ هجمات الخلل عن طريق إضافة نبض الجهد: لخلل CLK - إلى إشارة CLOCK الخارجية من MK (من الكوارتز أو مولد خارجي) ، للحصول على خلل VCC - على السلطة.
بشكل عام ، تسمح لك هجمات الخلل بتجاوز أي تعليمات MK ، على سبيل المثال ، إدخال كلمة مرور ، طلب وصول ، اتفاقية ترخيص ، إلخ. هجمات خلل أكثر تعقيدا ، ومضنية وتستغرق وقتا طويلا. بالإضافة إلى ذلك ، من الضروري تكرار هجوم الخلل مرارًا وتكرارًا ، نظرًا لأن نجاحه ينطوي على احتمالية بطبيعته ويعتمد على معايير النبضة. فيما يلي خيارات خلل:
• range.glitch.width - عرض النبض في المئة نسبة إلى CLOCK ؛
• scope.glitch.offset - إزاحة النبض بالنسب المئوية نسبة إلى CLOCK ؛
• scope.glitch.repeat - عدد مرات تكرار نبضات الهجوم ؛
• scope.glitch.ext_offset - عدد التدابير الفائتة بعد بدء الحدث.
تظهر مخططات خلل CLK-خلل و Vcc-خلل في الرسوم البيانية توقيت:

توقيت الرسم البياني ل CLK- خلل

مخطط توقيت ل VCC- خلل
يتم تحديد جميع المعلمات من نبض خلل بحيث يعمل نواة MK في وضع غير مستقر (بسبب تخطي التعليمات).
وفقًا لنتائج هجمات الخلل ، تم اكتشاف أنه إذا كانت قيمة المعلمة range.glitch.repeat صغيرة جدًا ، فلن يحدث "الانزلاق" للتعليمات. إذا قمت بتعيين قيمة كبيرة ، فلا يمكنك تخطي التعليمات الضرورية فحسب ، بل يمكنك أيضًا تخطي جميع التعليمات اللاحقة. في معظم الحالات ، يكون البحث عن range.glitch.repeat في المنطقة من 5 إلى 25 عامًا كافيًا. فيما يتعلق بالمعلمات الأخرى ، كل هذا يتوقف على نوع الهجوم وظروف الاتصال.
CLK-خلل
يتم تنفيذ هجمات خلل CLK عن طريق إضافة نبضات أقصر مدة إلى إشارة CLOCK MK. لذلك ، يجب فصل CLOCK عن MK وإطعامها من ChipWhisperer بالفعل بهجوم CLK-glitch.
تحتاج أولاً إلى توصيل ChipWhisperer بـ MK:

مخطط اتصال ل CLK- خلل
يتم عرض كل رمز بايثون ووصف مفصل للدليل على المورد . ثم ، في STM32F103RBT6 ، "املأ" البرنامج الثابت ، حيث تتم إضافة الوظيفة التالية إلى الحلقة الرئيسية while(1)
:
075 void glitch_password(void) 076 { 077 char inp[16]; 078 char c = 'A'; 079 unsigned char cnt = 0; 080 uart_send("Password:"); 081 082 while((c != '\n') & (cnt < 16)) 083 { 084 c = getch(); 085 inp[cnt] = c; 086 cnt++; 087 } 088 089 char passwd[] = "Vulkan"; 090 char passok = 1; 091 092 led_on(); 093 led_off(); 094 095
هدفنا هو تجاوز if
على السطر 103 عند إدخال كلمة المرور غير passok
والدخول إلى الحالة else
في السطر 106. إن الشيء الأكثر أهمية في هذا الهجوم هو التحقق من متغير passok
على السطر 103. للقيام بذلك ، حدد المعلمة range.glitch.ext_offset. هذا هو أسهل من خلال توصيل الذبذبات إلى UART وتحديد خلل إلى موقع التداخل ، منذ خلل تتسرب عبر MK بأكمله:

موقع خلل
يؤخذ رمز الهجوم ومنهجيته من هذا الدليل (قسم حلقة الهجوم ، الكتل 9-10). الشيء الوحيد الذي قمنا بتغييره في الكود هو تمكين إخراج جميع رسائل print(response)
دون التصفية ، حيث يتم تخطي الأحداث المهمة غالبًا بسبب عوامل التصفية التي تم تكوينها مثل:
if need_response not in response: pass else: print ("!")
توضح الأشكال أدناه أمثلة لسجل إخراج الرسائل الذي يظهر عندما يكون هجوم خلل CLK على وشك النجاح أو بعيدًا عن النجاح. عند الاقتراب من معلمات خلل الصحيح ، تبدأ عدم الاستقرار في تشغيل MK في الظهور (تنقطع الرسائل ، يبدأ MK في إعادة التشغيل). قد يكون هذا تلميحًا عند البحث.

إخراج الرسالة أثناء هجوم خلل مع المعلمات التي هي أبعد ما تكون عن النجاح (أ) وقريبة من النجاح (ب)

نتيجة هجوم خلل CLK ناجح
كنتيجة للهجمات ، تم الكشف عن أن معلمات نبض خلل CLK يمكن أن "تطفو" اعتمادًا على جودة اتصال ChipWhisperer بـ CLOCK MK. على سبيل المثال ، عند تعيين مسبار الذبذبات على دبوس CLOCK ، أصبحت المعلمة range.glitch.offset مختلفة لهجوم ناجح ، لأن المسبار له معلمات حثية مكثفة خاصة بتصحيح خلل التردد العالي. لذا فإن التوصيل عبر كابل طويل غير محمي يمكن أن يحقق مفاجآت. خلاف ذلك ، يمكن أن يسمى هجمات خلل CLK مستقرة ، كما تغيرت المعلمات الخاصة بهم قليلا للحصول على تعليمات مختلفة (إذا ، من أجل ، في حين تم فحص).
تتمثل طريقة الحماية من مثل هذه الهجمات في استخدام إشارة CLOCK MK الداخلية ، ولكنها تتمتع بأسوأ درجات الحرارة واستقرار الوقت. قد تكون الطريقة الفعالة أيضًا هي تقديم تأخير زمني عشوائي قبل وبعد التعليمات المهمة (التحقق من كلمات المرور والبيانات الشخصية ، وما إلى ذلك) ، مما قد يؤدي إلى تعقيد الضرب الدقيق لنبض CLK-glitch في الوقت المناسب.
VCC-خلل
يقدم خلل Vcc ، مثل خلل CLK ، تداخلًا عالي التردد في تشغيل MK ، فقط عن طريق قصر دائرة تزويد MK بالطاقة على الأرض. عند القيام بهجمات Vcc-خلل ، يجب أن تؤخذ في الاعتبار أن معلمات النبض الناجح تعتمد على العديد من العوامل ، مثل:
• ميزات تصميم لوحة الدوائر المطبوعة ل MK ووجود مجموعة متنوعة من الربط ؛
• طول الكبل متحد المحور لاتصال MK ومنفذ خلل ChipWhisperer (كلما كان الكبل أطول ، وفرصة أقل لهجوم ناجح ، يكون الطول الأمثل هو 10-15 سم) ؛
• سلسلة MK ؛
• تعليمات لتخطي.
• الأمثل MK مترجم.
• نوع من الترانزستور MOSFET (بسبب الاختلاف في مكونات عالية التردد من المعلمات S).
لذلك ، عند تنفيذ الهجمات ، من الضروري التأكد من أن هذه المعلمات لا تتغير.
يجب عليك أولاً توصيل ChipWhisperer بـ MK:

مخطط اتصال لهجمات خلل Vcc
بعد ذلك ، "نومض" البرامج الثابتة في MK ، حيث توجد في الحلقة الرئيسية while(1)
الوظيفة التالية:
115 void glitch_while() 116 { 117 volatile uint8_t infinity = 0; 118 uart_send(" Hello habr!"); 119 led_on(); 120 led_off(); 121 122 while(infinity != 2) 123 { 124 ; 125 } 126 uart_send("WOW!!! Vcc Glitch work!"); 127 while(1) 128 { 129 ; 130 } 131 }
MK بعد إرسال الرسالة "Hello habr!" تدخل حلقة لا نهائية على الخط 122. مهمتنا هي إزالة MK من هذه الحلقة باستخدام خلل Vcc. في هذه الحلقة ، يتم استخدام متغير volatile uint8_t infinity
المتغير كشرط ، والذي لن يساوي مطلقًا اثنين عند volatile uint8_t infinity
البرنامج بشكل طبيعي. إذا وضعنا while(1)
بدلاً من while(infinity != 2)
، فإن المترجم سيتجاهل الكود أدناه ، بما في ذلك رسالتنا التي تعلن عن الخروج من الحلقة اللانهائية. نظرًا لمتغير النوع volatile
لن يتمكن المترجم من القيام بذلك. تتم إضافة while(1)
السطر 127 بحيث بعد WOW !!! VCC خلل العمل! نحن لم نعرض مرة أخرى مرحبا habr!
استخدمنا رمز Python للتحكم في ChipWhisperer من هذا الدليل . فيما يلي رسائل MK:

نتيجة هجوم خلل ناجح
كما يتبين من الشكل ، كان الهجوم خلل Vcc- ناجحة.
تكمن الصعوبة في تنفيذ هجوم خلل Vcc في اختيار معلمات النبض الصحيحة. استغرق تنفيذ هذا الهجوم أطول وقت مقارنة بالآخرين ، حيث أن التنفيذ الناجح لهجمات Vcc-خلل يعتمد على العوامل المذكورة أعلاه.
يمكن أن تكون طريقة الحماية من مثل هذه الهجمات هي إدخال تأخير زمني عشوائي قبل الإرشادات المهمة وبعدها (التحقق من كلمات المرور ، والبيانات الشخصية ، وما إلى ذلك). هذا يمكن أن يعقد بالضبط ضرب نبض VCC- خلل في الوقت المناسب. زيادة في الاقتران بالسعة بين السلطة والأرض خلال الأسلاك ثنائي الفينيل متعدد الكلور قد يساعد أيضا قليلا.
النتائج
تسمح لك الهجمات التي تم إجراؤها بالتحايل على التعليمات في MK. أظهر مثال لتحليل SCA أنه حتى أبسط أنواع مثل هذا الهجوم يمكن أن يهدد أمان بياناتك (كلمات المرور ، مفاتيح التشفير). لقد تأكدنا من أن هجمات الخلل تحايل على العديد من الإرشادات وطرق حماية البرامج المنصوص عليها في الأجهزة. يمكن أن تتمثل الطريقة العالمية للحماية من الهجمات في الكتيبات المدروسة في تقديم تأخير زمني عشوائي عند تنفيذ التعليمات المهمة في MC.
دراستنا لهجمات الأجهزة لا تنتهي عند هذا الحد. في المستقبل ، نخطط لاستكشاف إمكانية تجاوز التحقق من بايت البرامج الثابتة لبرنامج MK الثابت باستخدام هجمات خلل Vcc. يمكن الوصول إلى البرامج الثابتة MK فتح فرص كبيرة للمهاجمين: من استنساخ جهاز لإعادة بيعها إلى الوصول الكامل إلى جميع المعلومات الشخصية والسيطرة على MK.
في تجاربنا مع خلل Vcc ، حاولنا تجاوز حماية البرنامج الثابت ، ونجحنا. لقد تأكدنا من أن هذا ممكن. سنقدم تجارب توضح قراءة البرامج الثابتة MK المخفية في المقالة التالية.

راكون سيكيوريتي هو فريق خاص من الخبراء في مركز فولكانو العلمي والتقني في مجال أمن المعلومات العملي ، والتشفير ، والدوائر ، والهندسة العكسية ، وإنشاء برامج منخفضة المستوى.