Boot aman di i.MX6

Boot aman di i.MX6


Saat mengembangkan proyek apa pun untuk sistem tertanam, pengembang harus menyelesaikan dua masalah tambahan:

  • Bagaimana cara melindungi firmware dari spoofing dalam produk;
  • Bagaimana melindungi perangkat lunak dari penyalinan.

Artikel ini menjelaskan cara melindungi prosesor i.MX6 dari mengubah bootloader di produk dan mempersulit proses menyalin firmware.



pengantar


Untuk melindungi kekayaan intelektual jika proyek bare metal [1] terutama membantu kompleks perangkat keras, keduanya ada di mikrokontroler, dan eksternal. Contoh diberikan di situs yang memiliki reputasi [2] . Metode perangkat lunak tambahan, seperti [3] digunakan, namun, mereka didasarkan pada mekanisme perlindungan yang tidak diketahui. Ini disebabkan rendahnya daya komputasi perangkat dan ketidaknyamanan dalam mengimplementasikan generasi firmware dinamis.

Ketika SoC berperan dengan sistem operasi seperti Linux, perlindungan perlu diatur secara bersamaan di beberapa tingkatan:

  • Akhiri level aplikasi
  • Tingkat sistem operasi
  • Tingkat bootloader

Dalam hal mendapatkan akses di salah satu level, cukup mudah untuk mempengaruhi perangkat lunak level selanjutnya dan membuat perubahan pada interaksi antar level.
Contoh paling sederhana: Perangkat lunak Anda yang terinstal di Linux berkomunikasi melalui protokol UART (misalnya, melalui / dev / ttyACM0) dengan mikrokontroler. Seorang penyerang mendapatkan akses ke sistem menggunakan sumber daya UART yang sama dan mengulangi paket yang dikirim secara acak. Atau, misalnya, jika driver dibangun ke dalam kernel, penyerang mengkompilasi ulang kernel dengan menulis ulang kode driver UART dengan cara lain. Aplikasi terakhir tidak tahu apa yang sedang terjadi.

Apa itu boot aman dan mengapa itu diperlukan?


Tingkat perlindungan pertama untuk perangkat lunak Anda pada sistem target adalah boot aman. Selanjutnya, boot aman dijelaskan untuk prosesor dari keluarga i.MX6.

Boot aman di i.MX6 diimplementasikan melalui Boot jaminan tinggi (HAB) dan dapat melakukan dua fungsi:

  • boot aman
  • unduhan terenkripsi.

Pada artikel ini, saya akan menjelaskan proses memastikan pemuatan prosesor yang aman. I.MX6 juga mengimplementasikan algoritma yang menyediakan enkripsi bootloader. Namun, penggunaannya memerlukan pembuatan bootloader unik untuk setiap produk, karena menggunakan fungsi enkripsi unik untuk setiap prosesor. Ini adalah prosedur yang tidak nyaman dalam seri ini, jadi saya tidak menjelaskannya. Jika Anda memiliki sesuatu untuk dikatakan tentang topik ini, saya akan senang mendengarnya.
Boot aman mencoba memastikan bootloader dimulai pada produk Anda, dengan kernel yang Anda masukkan ke dalamnya.

Tentang definisi yang saya berikan boot aman. Boot aman tidak menyelamatkan Anda dari menyalin produk. Ya, ini membuat prosedur lebih sulit, tetapi tidak banyak. Loader tidak dapat menandatangani seluruh FS, oleh karena itu ia tidak memberikan perlindungan pada level OS dan pada level aplikasi akhir. Semuanya berfungsi secara klasik: melalui enkripsi asimetris. Saya akan menjelaskan prosesnya dengan jari, bisa dibaca lebih dalam di [4]. Bootloader menunjukkan skrip untuk HAB, di mana area memori yang ditandatangani ditunjukkan, dan di mana tanda tangan digital berada. Kunci publik sudah dipra-lokasi dalam memori prosesor One time programmable (OTP). Saat memuat, skrip memeriksa area memori yang ditentukan menggunakan tanda tangan digital yang terpasang dan kunci kabel. Jika pengujian gagal, prosesor tidak memulai pengunduhan. Operasi HAB juga harus diaktifkan dengan menetapkan sedikit di wilayah memori OTP.

Kerugian dari boot aman:

  • Jika HAB tidak diaktifkan, firmware akan tetap dimulai. Ini artinya tanpa add. metode perlindungan firmware Anda akan berjalan pada salinan produk. Untuk mencegah hal ini terjadi, bootloader harus secara mandiri mengaktifkan HAB pada saat startup. Tetapi kemudian dengan memasukkan flash drive USB ke produk lain dan lupa mem-flash kunci publik, Anda dapat membuang prosesor.
  • Saat mengakses memori prosesor, Anda dapat menyalin kunci publik, ini sudah cukup untuk menyalin produk.

Penerapan


Secara umum, ada cukup banyak artikel berbahasa Inggris [5] [6] di Internet tentang topik implementasi, tetapi tidak ada satu pun metode yang diusulkan lepas landas sekaligus, dan tautan ke perangkat lunak mulai mati, jadi saya memutuskan untuk menyimpan ini sebagai artikel terutama untuk saya sendiri, ketika Saya akan kembali ke masalah ini di masa mendatang.

Pertama, Anda perlu mengunduh perangkat lunak berikut: alat penandatanganan kode [7] dan skrip yang diperlukan untuk menghasilkan kunci dan penandatanganan. Dalam arsip yang ditentukan, saya menghapus semua utilitas dan perpustakaan yang tidak perlu, karena ada cukup banyak yang tidak digunakan untuk tugas kami.

Selanjutnya, Anda perlu membuat kunci:

cd ${CST_PATH}/release/keys
echo ${serial} > serial //8 ,     
echo ${password} >  key_pass.txt //   ,     
echo ${password} >>  key_pass.txt //
./hab4_pki_tree.sh //     
Do you want to use an existing CA key (y/n)?: n 
Do you want to use Elliptic Curve Cryptography (y/n)?: n
Enter key length in bits for PKI tree: 4096
Enter PKI tree duration (years): 10
How many Super Root Keys should be generated? 4
Do you want the SRK certificates to have the CA flag set? (y/n)?: y
 ../linux64/bin/srktool -h 4 -t SRK_1_2_3_4_table.bin -e SRK_1_2_3_4_fuse.bin \
 -d sha256 -c ./SRK1_sha256_4096_65537_v3_ca_crt.pem,\
./SRK2_sha256_4096_65537_v3_ca_crt.pem,./SRK3_sha256_4096_65537_v3_ca_crt.pem,\
./SRK4_sha256_4096_65537_v3_ca_crt.pem -f 1

Skrip generasi kunci menimbulkan pertanyaan di atas. Saya memberi contoh opsi standar. Jawaban untuk mereka menentukan bagaimana kunci dan parameter yang dihasilkan dari kunci yang dihasilkan akan dipanggil. Pertimbangkan dengan perintah lebih lanjut. Selanjutnya, kita membaca kunci publik yang diperlukan untuk menulis ke prosesor. Kami akan menggunakan skrip yang mudah digunakan dari [5] untuk ini .

cd ${CST_PATH}/release/linux64/bin
./var-u-boot_fuse_commands.sh 
fuse prog 3 0 0xFFFFFFFF //   uboot.
fuse prog 3 1 0xFFFFFFFF //     
fuse prog 3 2 0xFFFFFFFF //       .
fuse prog 3 3 0xFFFFFFFF //  -   .
fuse prog 3 4 0xFFFFFFFF //      .
fuse prog 3 5 0xFFFFFFFF //
fuse prog 3 6 0xFFFFFFFF  //
fuse prog 3 7 0xFFFFFFFF //

Tugas ini dapat diterapkan ke uboot dengan SPL terintegrasi atau dengan SPL dan uboot terpisah (misalnya rilis rocko). Saya menulis rilis sehingga Anda tahu di mana mereka digunakan sebagai standar. Jika Anda mengkompilasi sendiri uboot, maka kemungkinan besar SPL Anda akan diintegrasikan ke dalam uboot. Poin penting dalam bootloader defconfig adalah menambahkan opsi berikut:

CONFIG_SECURE_BOOT=y
CONFIG_SYS_FSL_HAS_SEC=y 
#define CONFIG_SYS_FSL_SEC_COMPAT    4 /* HAB version */
#define CONFIG_FSL_CAAM
#define CONFIG_CMD_DEKBLOB
#define CONFIG_SYS_FSL_SEC_LE
#define CONFIG_FAT_WRITE

Opsi ini mengaktifkan driver untuk bekerja dengan modul perangkat keras. Semuanya seperti di menuconfig untuk Linux. Saat mengkompilasi bootloader, gunakan mode verbose (hapus V = 1. Rakitan dengan parameter ini ditulis dalam panduan. Namun, saya membersihkannya sendiri). Dalam hal ini, informasi tentang alamat titik masuk dan hal-hal lain yang diperlukan untuk merekam tanda tangan digital ditambahkan ke log kompilasi. Setelah kompilasi, kita membutuhkan file output berikut:

  • u-boot-ivt.img
  • u-boot-ivt.img.log
  • SPL
  • SPL.log

salin ke $ {CST_PATH} / release / linux64 / bin. Selanjutnya, Anda perlu menjalankan skrip yang cukup sederhana.

Penjelasan rinci tentang prosedur skrip
(*.csf). , :

  • .

. , ( ).

:

Image Name:   U-Boot 2019 //  U-boot
Created:      XXXXXX
Image Type:   ARM U-Boot Firmware with HABv4 IVT (uncompressed)
Data Size:    339904 Bytes = 331.94 KiB = 0.32 MiB
Load Address: 17800000
Entry Point:  00000000
HAB Blocks:   0x177fffc0   0x0000   0x00051020

Image Type:   Freescale IMX Boot Image //  SPL
Image Ver:    2 (i.MX53/6/7 compatible)
Mode:         DCD
Data Size:    61440 Bytes = 60.00 KiB = 0.06 MiB
Load Address: 00907420
Entry Point:  00908000
HAB Blocks:   00907400 00000000 0000cc00
DCD Blocks:   00910000 0000002c 00000004

ยซHAB Blocksยป. ,

cd ${CST_PATH}/release/linux64/bin
./cst --o u-boot_csf.bin --i u-boot.csf
cat u-boot-ivt.img u-boot_csf.bin > u-boot_signed.img


Sejauh yang saya ingat dalam kasus SPL terintegrasi, kemungkinan besar semuanya akan bekerja dengan cara yang sama, tetapi ada baiknya memeriksanya. Saya tidak ingat sekarang dan tidak mulai mengkompilasi ketika menulis artikel ini.

cd ${CST_PATH}/release/linux64/bin
SOC=mx6 ./var-som_sign_image.sh SPL u-boot-ivt.img

Menurut hasil skrip, Anda akan mendapatkan dua file: SPL_signed, u-boot-ivt.img_signed, yang harus ditulis ke disk sistem target. Saya menerapkan contoh skrip rekaman ke sistem target. Tanpa sudo, agar tidak sengaja menembak kaki Anda.

dd if=SPL_signed of=${DEVICE(/dev/sd*)} bs=1K seek=1; sync
dd if=u-boot-ivt.img_signed of=${DEVICE(/dev/sd*)} bs=1K seek=69; sync

Setelah menulis ke media kosong, Anda harus mendapatkan bootloader tanpa kernel yang akan menabrak konsol, karena tidak akan menemukan dtb dan kernel. Di konsol, Anda dapat memeriksa apakah yang telah Anda lakukan atau tidak benar-benar berfungsi. Di hadapan acara - ada yang salah. Penting: jika bootloader dikompilasi tanpa dukungan HAB, tidak akan ada kesalahan juga.

hab_status
HAB Configuration: 0xf0, HAB State: 0x66
No HAB Events Found!

Langkah terakhir adalah mengaktifkan HAB, perhatian adalah perintah satu kali, tidak bisa diperbaiki, jadi hati-hati

fuse prog 0 6 0x2

Kesimpulan


Saya tidak mulai menggambarkan proses mengintegrasikan semua ini ke dalam yocto, tetapi saya harus menyimpan rahasia. Namun, ini layak dan tidak membutuhkan banyak waktu.

referensi


[1] perangkat lunak tertanam logam telanjang yang langsung berjalan pada perangkat keras tanpa abstraksi dalam bentuk sistem operasi
[2] we.easyelectronics.ru/Soft/zaschita-ustroystva-ot-vzloma-i-kopirovaniya.html
[3 ] habr.com/en/post/350602
[4] HAB4_API.pdf di github.com/BMValeev/CST_TOOL
[5] variwiki.com/index.php?title=High_Assurance_Boot
[6] boundarydevices.com/high-assurance-boot -hab-dummies
[7] github.com/BMValeev/CST_TOOL

All Articles