Serangan perangkat keras pada mikrokontroler menggunakan ChipWhisperer dan metode perlindungan terhadap mereka


Serangan perangkat keras menimbulkan ancaman besar bagi semua perangkat dengan mikrokontroler (selanjutnya - MK), karena mereka dapat mem-bypass berbagai mekanisme keamanan. Sulit untuk bertahan terhadap serangan seperti itu menggunakan perangkat lunak atau perangkat keras. Misalnya, Anda dapat membaca artikel dari STMicroelectronics tentang berbagai jenis serangan perangkat keras dan metode melindungi MK.
Kami, tim Keamanan Raccoon, tertarik dengan topik ini, karena salah satu bidang aktivitas perusahaan kami adalah pengembangan perangkat yang disematkan, termasuk yang berisi mekanisme perlindungan informasi. Untuk sebagian besar, kami tertarik pada serangan kesalahan, karena memungkinkan Anda untuk melewati instruksi MK yang dapat dieksekusi. Ini adalah ancaman serius terhadap informasi rahasia yang terkandung dalam MK, dan konsekuensi paling berbahaya dari serangan tersebut adalah membaca firmware tertutup, melewati mekanisme keamanan yang disediakan oleh pengembang MK.


Di Hardwear.io 2018 di Den Haag dan EmbeddedWorld 2019 di Nuremberg, NewAE mendemonstrasikan perangkat ChipWhisperer, yang memungkinkan penerapan bagian serangan perangkat keras non-invasif yang tidak memerlukan pengetahuan mendalam tentang nanoelektronika dan ketersediaan peralatan khusus. Menggunakan perangkat ini, kami mempelajari keamanan perangkat yang disematkan dan menemukan cara untuk meminimalkan hasil dari serangan tersebut. Di bawah potongan - apa yang kami lakukan.


Chipwhisperer


Kit ChipWhisperer adalah toolkit open source untuk menganalisis keamanan dari MK yang paling populer (STM, Xmega, Intel D2000, SAM, LPC, MSP, 78K dan lainnya) dan FPGA. Proyek ini dimulai pada 27 Februari 2015 di Kickstarter . Saat ini, ada berbagai versi ChipWhisperer (semua opsi dapat ditemukan di katalog ). Mereka memiliki seperangkat alat yang berbeda, tetapi umumnya diarahkan pada jenis serangan perangkat keras berikut:


• serangan sisi-saluran (SCA);


• serangan kesalahan.


Untuk analisis lebih lanjut, kami memilih ChipWhisperer-Pro (CW1200), yang merupakan model ChipWhisperer tertua saat ini dan memiliki fungsionalitas luas dan paket besar:



ChipWhisperer Kit (CW1200)


Di papan, CW1200 memiliki osiloskop, yang terdiri dari penguat yang dapat disesuaikan dan ADC dengan sampel 105 MSPS. Serangkaian alat ini memungkinkan Anda untuk mendaftarkan level sinyal dalam seperseratus milivolt dan mendapatkan basis waktu yang baik. Juga di CW1200 ada port untuk mengatur CLK-glitch dan Vcc-glitch, port GPIO yang dapat ditetapkan sebagai pemicu input untuk melacak asal suatu acara (permintaan entri kata sandi, status unduhan, status unduhan, dll.). CW1200 terhubung ke PC melalui USB dan memiliki dua protokol komunikasi dengan MK: UART dan SPI.


Untuk bekerja dengan ChipWhisperer, Anda perlu menginstal driver, mengunduh pustaka Python dan contoh-contoh yang berfungsi dari GitHub, atau mengunduh gambar yang disiapkan dari mesin virtual di Linux, di mana semua pustaka dan contoh kerja sudah diinstal sebelumnya. Perpustakaan terbuka ini mengandung:


• protokol komunikasi dengan ChipWhisperer;


• algoritma matematika untuk memproses serangan pada metode enkripsi populer;


• protokol untuk berkomunikasi dengan bootloader MK populer;


• firmware yang disiapkan untuk pelatihan di papan dengan MK, termasuk dalam kit.


Kami memutuskan untuk membaca semua tutorial di situs web NewAE lama . Sekarang sumber daya lain sedang dikembangkan, di mana informasi yang lebih relevan disajikan dan ada forum .


Dalam artikel ini, kami hanya akan menyajikan beberapa contoh panduan dari pengembang ChipWhisperer dan kami menerapkannya bukan di papan dengan MK yang termasuk dalam paket, tetapi pada STM32F103RBT6:



Papan STM32F103RBT6


Kami juga menulis kode yang identik dengan contoh yang disiapkan, tetapi dengan pustaka HAL yang dihasilkan dari CubeMX. Semua tindakan ini diperlukan untuk mengonfirmasi bahwa serangan dengan ChipWhisperer dapat diimplementasikan pada perangkat acak apa pun, dan tidak hanya pada papan yang ada dalam kit.


Selanjutnya, kami memberikan tinjauan umum singkat dan contoh serangan SCA dan serangan glitch.


Analisis SCA


Dasar dari serangan SCA adalah melacak perubahan faktor eksternal dari keadaan MC (konsumsi saat ini dari MC, suhu, medan elektromagnetik) selama pengembangan berbagai instruksi. ChipWhisperer mengimplementasikan saluran untuk memantau daya menggunakan ADC dan medan elektromagnetik menggunakan antena.


Analisis SCA efektif dalam mendeteksi kata sandi, kunci enkripsi, dll. Situs web NewAE memiliki banyak perbedaan
pedoman yang berguna untuk menemukan kunci enkripsi dan untuk serangan SCA , tetapi kami hanya akan memberikan satu contoh analisis SCA, karena serangan glitch paling menarik bagi kami.


Contoh Serangan SCA - Analisis Power Signature


Panduan ini menunjukkan satu jenis serangan SCA - melacak entri kata sandi karakter demi karakter dengan memantau tanda tangan pada saluran listrik. Dengan mengulangi tanda tangan listrik, dimungkinkan untuk mengidentifikasi pengembangan berbagai instruksi program di dalam MK. Contoh di atas menunjukkan pengembangan input kata sandi MK dengan melacak tanda tangan dari operasi break .


Mari kita mulai persiapannya. Pertama-tama, Anda perlu membuat koneksi sesuai dengan gambar:



Koneksi MC untuk analisis SCA


Diagram dicoret melalui komponen yang tidak perlu dihubungkan (tidak seperti koneksi MK standar). Tanda panah menunjukkan titik koneksi ChipWhisperer, dan tanda tangan menunjukkan pinnya.


Siapkan firmware MK. Fungsi berikut berada di loop 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 //Get password 036 uart_send("Please enter password to continue: "); 037 uart_receive(passwd, 32); 038 039 uint8_t passbad = 0; 040 041 led_on(); 042 043 for(uint8_t i = 0; i < sizeof(correct_passwd); i++) 044 { 045 if (correct_passwd[i] != passwd[i]) 046 { 047 passbad = 1; 048 break; 049 } 050 } 051 052 if (passbad) 053 { 054 //Stop them fancy timing attacks 055 int wait = rand() % 100000; 056 for(volatile int i = 0; i < wait; i++) 057 { 058 ; 059 } 060 HAL_Delay(4); 061 uart_send("PASSWORD FAIL\n"); 062 } 063 else 064 { 065 uart_send("Access granted, Welcome!\n"); 066 } 067 while(1) 068 { 069 ; 070 } 071 } 

Baris 030 menetapkan kata sandi untuk entri - Vulkan. Selanjutnya, LED menyala
led_on() dan pesan UART dikirim tentang permintaan kata sandi. Fungsi led_on() mengaktifkan pin GPIO PA12 MK dan memberi tahu tentang peristiwa yang mana ChipWhisperer akan mulai mengumpulkan bentuk gelombang. Ke pin inilah CW_TRIG harus terhubung. Semua ini "disintesis" untuk kenyamanan, tetapi dalam kasus nyata perbedaannya tidak signifikan, karena Anda dapat memasukkan penundaan waktu dalam jumlah siklus jam JAM relatif terhadap peristiwa apa pun yang terhubung dengan CW_TRIG. Misalnya, ini bisa menjadi awal dari pengunduhan MK, penerimaan / pengiriman pesan, penyertaan LED, dll.


Selanjutnya, MK menunggu kata sandi dimasukkan, yang akan memverifikasi karakter demi karakter. Jika ada karakter dalam antrian yang tidak cocok, misalnya, tiga karakter sudah benar, dan yang keempat tidak, maka Anda harus keluar dari loop for dengan pernyataan break dan melaporkan kata sandi yang salah. Dalam baris 055–059, generator penundaan acak diimplementasikan. Desain ini paling sering digunakan untuk mempersulit pelaksanaan serangan sementara (mis., Melacak perubahan dalam waktu respons seluruh sistem). Desain ini termasuk untuk memahami bahwa kami tidak memilih kata sandi menggunakan metode serangan sementara.


Kode tutorial Jupyter Python di-host pada sumber yang sesuai. Gambar di bawah ini menunjukkan contoh memasukkan kata sandi dengan output bentuk gelombang catu daya dari MK dengan setiap simbol baru yang benar. Perhatikan bahwa dengan input karakter kata sandi yang benar (kata sandi yang Anda masukkan ditampilkan di bagian atas gambar), tanda tangan dari operasi break digeser ke baris 046 (disorot dengan warna oranye pada gambar di bawah). Ini adalah "kelemahan" gangguan oleh operasi break ketika kata sandi verifikasi karakter.



Oscillograms kata sandi


Sebagai hasil dari pengenalan dengan panduan ini, kami menemukan betapa mudahnya untuk memotong perlindungan kata sandi dengan pendekatan ini untuk memeriksanya menggunakan analisis SCA. Cukup dengan mengomentari operasi break pada baris 048 dalam firmware ini dan, secara umum, pemeriksaan kata sandi akan berhasil, tetapi pelacakan pemrosesan tanda tangan akan menjadi lebih rumit. Oleh karena itu, untuk mengurangi efektivitas serangan semacam itu, Anda harus menghindari operasi gangguan segera dari siklus pemindaian.


Kompleksitas analisis ini terletak pada menemukan tanda tangan yang diperlukan. Oleh karena itu, melakukan serangan seperti itu dapat secara signifikan mempersulit pengenalan konstruksi rand() sementara rand() pada saat verifikasi kata sandi, menambahkan perhitungan tambahan, atau menambahkan suara ke komponen lain.


Serangan kesalahan


Serangan kesalahan dilakukan oleh serangkaian impuls jangka pendek pada saat yang tepat sesuai dengan metode pengaruh tertentu. Metode yang paling populer adalah: clock (CLK-glitch), power (Vcc-glitch), dan medan elektromagnetik. Medan elektromagnetik dihasilkan oleh percikan tegangan tinggi di dekat MC. Untuk ini, NewAE menggunakan peralatan ChipSHOUTER . Kami tidak membelinya, jadi kami hanya melakukan serangan CLK-glitch dan Vcc-glitch.


Serangan kesalahan dilakukan dengan menambahkan pulsa tegangan: untuk CLK-glitch - ke sinyal CLOCK eksternal dari MK (dari kuarsa atau generator eksternal), untuk Vcc-glitch - pada daya.


Secara umum, serangan glitch memungkinkan Anda untuk memotong instruksi MK, misalnya, memasukkan kata sandi, permintaan akses, perjanjian lisensi, dll. Serangan kesalahan lebih kompleks, melelahkan, dan menghabiskan waktu. Selain itu, perlu untuk mengulangi serangan glitch berulang kali, karena keberhasilannya bersifat probabilistik dan tergantung pada parameter denyut nadi. Berikut ini adalah opsi kesalahan:


• scope.glitch.width - lebar pulsa dalam persen relatif terhadap JAM;


• scope.glitch.offset - offset impuls dalam persen relatif terhadap JAM;


• scope.glitch.repeat - jumlah pengulangan pulsa serangan;


• scope.glitch.ext_offset - jumlah tindakan yang terlewatkan setelah pemicu acara.


Pemetaan kesalahan untuk CLK-glitch dan Vcc-glitch ditunjukkan dalam diagram waktu:



Diagram waktu untuk CLK-glitch



Diagram waktu untuk Vcc-glitch


Semua parameter pulsa kesalahan dipilih sehingga inti MK beroperasi dalam mode yang tidak stabil (karena instruksi dilewati).


Menurut hasil dari glitch-attack, terungkap bahwa jika nilai dari parameter scope.glitch.repeat terlalu kecil, "selip" instruksi tidak terjadi. Jika Anda menetapkan nilai yang besar, maka Anda dapat melewati tidak hanya instruksi yang diperlukan, tetapi juga semua instruksi selanjutnya. Dalam kebanyakan kasus, mencari scope.glitch.ulang di wilayah 5–25 sudah cukup. Berkenaan dengan parameter lain, itu semua tergantung pada jenis serangan dan kondisi koneksi.


CLK-kesalahan


Serangan CLK-glitch dilakukan dengan menambahkan pulsa durasi yang lebih pendek ke sinyal CLOCK MK. Oleh karena itu, CLOCK harus diputuskan dari MK dan memberinya makan dari ChipWhisperer sudah dengan serangan CLK-glitch.


Pertama, Anda perlu menghubungkan ChipWhisperer ke MK:



Diagram koneksi untuk CLK-glitch


Semua kode Python dan deskripsi rinci dari manual disajikan pada sumber daya . Kemudian, di STM32F103RBT6, "isi" firmware, di mana fungsi berikut ditambahkan ke 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 //Simple test - doesn't check for too-long password! 096 for(cnt = 0; cnt < 5; cnt++) 097 { 098 if (inp[cnt] != passwd[cnt]) 099 { 100 passok = 0; 101 } 102 } 103 if (!passok){ 104 uart_send("Denied\n"); 105 } 106 else 107 { 108 uart_send("Wow! Vulkan win!\n"); 109 } 110 } 

Tujuan kami adalah untuk mem-bypass if pada baris 103 ketika memasukkan kata sandi yang salah dan masuk ke case else pada baris 106. Yang paling penting dalam serangan ini adalah memeriksa variabel passok pada baris 103. Untuk melakukan ini, pilih parameter scope.glitch.ext_offset. Ini paling mudah dilakukan dengan menghubungkan osiloskop ke UART dan mengatur glitch ke lokasi gangguan, karena glitch merembes ke seluruh MK:



Lokasi kesalahan


Kode dan metodologi serangan diambil dari manual ini (bagian Loop serangan, blok 9-10). Satu-satunya hal yang kami ubah dalam kode adalah untuk mengaktifkan output dari semua pesan print(response) tanpa pemfilteran, karena peristiwa penting sering dilewati karena filter yang dikonfigurasi seperti:


 if need_response not in response: pass else: print ("!") 

Gambar-gambar di bawah ini menunjukkan contoh log output pesan yang muncul ketika serangan CLK-glitch dekat dengan kesuksesan atau jauh dari sukses. Ketika mendekati parameter kesalahan yang benar, ketidakstabilan dalam operasi MK mulai muncul (pesan terputus, MK masuk ke reboot). Ini mungkin petunjuk saat mencari.



Output pesan selama serangan kesalahan dengan parameter yang jauh dari berhasil (a) dan hampir berhasil (b)



Hasil dari serangan CLK-glitch yang sukses


Sebagai hasil dari serangan, terungkap bahwa parameter dari pulsa CLK-glitch dapat "mengambang" tergantung pada kualitas koneksi ChipWhisperer ke CLOCK MK. Misalnya, ketika mengatur probe osiloskop ke pin CLOCK, parameter scope.glitch.offset menjadi berbeda untuk serangan yang berhasil, karena probe memiliki parameter induktif kapasitif sendiri yang mengoreksi kesalahan frekuensi tinggi. Jadi menghubungkan melalui kabel panjang tanpa pelindung bisa membawa kejutan. Jika tidak, serangan CLK-glitch dapat disebut stabil, sebagai parameternya sedikit berubah untuk berbagai instruksi (jika, untuk, saat diperiksa).


Metode perlindungan terhadap serangan semacam itu adalah dengan menggunakan sinyal CLOCK MK internal, tetapi memiliki suhu dan stabilitas waktu terburuk. Juga, metode yang efektif mungkin untuk memperkenalkan penundaan waktu acak sebelum dan sesudah instruksi penting (memeriksa kata sandi, data pribadi, dll.), Yang dapat mempersulit hit tepat dari pulsa kesalahan CLK pada waktu yang tepat.


Vcc-kesalahan


Vcc-glitch, seperti CLK-glitch, memperkenalkan interferensi frekuensi tinggi ke dalam pengoperasian MK, hanya dengan menghubungkan arus pendek catu daya MK ke ground. Ketika melakukan serangan Vcc-glitch, harus diperhitungkan bahwa parameter dari pulsa yang berhasil tergantung pada banyak faktor, seperti:


• fitur desain papan sirkuit tercetak untuk MK dan adanya pengikat yang beragam;


• panjang kabel koaksial untuk menghubungkan MK dan port kesalahan dari ChipWhisperer (semakin panjang kabel, semakin kecil kemungkinan serangan yang berhasil, panjang optimal adalah 10-15 cm);


• seri MK;


• instruksi untuk dilewati;


• Optimalisasi kompiler MK;


• jenis transistor MOSFET (karena perbedaan dalam komponen frekuensi tinggi dari S-parameter).


Oleh karena itu, ketika melakukan serangan, perlu untuk memastikan bahwa parameter ini tidak berubah.


Pertama, Anda harus menghubungkan ChipWhisperer ke MK:



Skema koneksi untuk serangan Vcc-glitch


Selanjutnya, kita "flash" firmware di MK, di mana di while(1) utama while(1) ada fungsi berikut:


 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 setelah mengirim pesan "Hello habr!" Pergi ke loop tak berujung pada baris 122. Tugas kami adalah untuk menghapus MK dari loop ini menggunakan Vcc-glitch. Dalam loop ini, variabel volatile uint8_t infinity digunakan sebagai suatu kondisi, yang tidak akan pernah sama dengan dua ketika program volatile uint8_t infinity normal. Jika kita meletakkan while(1) alih-alih while(infinity != 2) , kompiler akan mengabaikan kode di bawah ini, termasuk pesan kami yang mengumumkan keluar dari loop tak terbatas. Karena variabel tipe volatile kompiler tidak akan dapat melakukan ini. while(1) baris 127 ditambahkan sehingga setelah WOW !!! Pekerjaan Vcc Glitch! kami belum ditampilkan lagi Halo habr!


Kami menggunakan kode Python untuk mengontrol ChipWhisperer dari panduan ini. Ini pesan dari MK:



Hasil dari serangan Vcc-glitch yang sukses


Seperti yang bisa dilihat dari gambar, serangan Vcc-glitch berhasil.


Kesulitan dalam melakukan serangan Vcc-glitch terletak pada pemilihan parameter pulsa yang benar. Implementasi serangan ini memakan waktu paling lama dibandingkan yang lain, karena keberhasilan implementasi serangan-Vcc-kesalahan tergantung pada faktor-faktor yang dijelaskan di atas.


Metode perlindungan terhadap serangan semacam itu juga dapat berupa pengenalan waktu tunda acak sebelum instruksi penting dan setelahnya (memeriksa kata sandi, data pribadi, dll.). Ini dapat mempersulit hit tepat dari pulsa Vcc-glitch pada waktu yang tepat. Peningkatan kopling kapasitif antara daya dan arde selama pengkabelan PCB juga dapat sedikit membantu.


Kesimpulan


Serangan yang dilakukan memungkinkan Anda untuk menghindari instruksi di MK. Contoh analisis SCA menunjukkan bahwa jenis serangan yang paling sederhana pun dapat mengancam keamanan data Anda (kata sandi, kunci enkripsi). Kami memastikan bahwa serangan kesalahan dapat menghindari berbagai instruksi dan metode perlindungan perangkat lunak yang disediakan untuk perangkat. Metode universal perlindungan terhadap serangan dalam manual yang dipertimbangkan dapat menjadi pengenalan penundaan waktu acak ketika menjalankan instruksi penting dalam MC.


Studi kami tentang serangan perangkat keras tidak berakhir di sana. Di masa mendatang, kami berencana untuk mengeksplorasi kemungkinan melewati verifikasi byte firmware dari firmware MK menggunakan serangan Vcc-glitch. Akses ke firmware MK dapat membuka peluang besar bagi penyerang: mulai dari mengkloning perangkat untuk dijual kembali hingga akses penuh ke semua informasi hak milik dan kontrol atas MK.


Dalam percobaan kami dengan Vcc-glitch, kami mencoba memintas perlindungan firmware, dan kami berhasil. Kami memastikan ini mungkin. Kami akan menyajikan eksperimen yang menunjukkan pembacaan firmware MK tersembunyi di artikel berikutnya.



Raccoon Security adalah tim ahli khusus di Volcano Scientific and Technical Center di bidang keamanan informasi praktis, kriptografi, sirkuit, rekayasa balik, dan pembuatan perangkat lunak tingkat rendah.

Source: https://habr.com/ru/post/id480500/


All Articles