Pendahuluan
Pada dasarnya, secure boot cara untuk memastikan perangkat menajalankan firmware yang kita kembangkan dan mencegah pihak ketiga memanipulasi. Sebelumnya mari kita bahas mengenai boot process pada ESP32.
Terdapat 3 stages:
- Stage pertama bootloader: Terjadi saat reset. ESP32 memiliki dua processors, yaitu PRO CPU (cpu0) dan APP CPU (cpu1). PRO CPU melakukan semua hardware initialization. Kita tidak memiliki control pada stage ini. Setelah inisialisasi, control diberikan ke bootloader stage kedua.
- Stage kedua bootloader: Tanggungjawab utama dari bootloader stage kedua adalah mencari dan load aplikasi. Akan membacapartition table, checks factory dan
OTA partitions, dan berdasarkan OTA info, akan diload partition yang tepat. bootloader Juga mengatur flash encryption, secure boot, dan OTA updates. Pada tahap ini dapat memodifikasi bootloader sesuai kebutuhan kita. - Application startup: Pada tahap ini, aplikasi mulai dijalankan. Kedua processor akan menjalankan FreeRTOS schedulers. Kemudian, PRO CPU akan menjalankan main task yang akan menjalankan app_main function.
ESP-IDF menyediakan 2 skema secure boot schemes untuk revisio ESP32 yang berbeda.
Secure boot v1 adalah versi awal dari ESP32, dan secure boot v2 didukung mulai dari ESP32 Rev3 dan ESP-S2 series chips.
Sayangnya pada revisi ESP32 sebelumnya, banyak celah keamanan. Kabar baiknya adalah, attacker perlu memiliki akses fisik pada perangkat dan memahami tipe attack yang digunakan, yaitu voltage fault injection, untuk bypass secure boot dan flash encryption.
Secure Boot v1
Teknik untuk mengamankan perangkat yang direkomendasikan oleh Espressif adalah dengan mengkonfigurasi perangkat dengan:
- Secure boot
- Flash encryption
Secure boot akan membuat chain of trust, dari boot sampa ke application firmware, dengan men-otentikasi software pada setiap step. Prosesnya terlihat cukup rumit, namun dalam bahasa sederhananya, bekerja seperti berikut:
Authenticate bootloader menggunakan symmetric key (AES-256) pada eFuses
Block2: ESP32 memiliki 1024-bit One-Time Programmable (OTP) memory untuk menyimpan system setting dan secrets. OTP ini terdiri dari empat blocks eFuses. Secure boot key disimpan di block 2. Setelah enabling secure boot, key tidak akan bisa dibaca. ESP32 me-verifikasi bootloader image dengan menggunakan secure boot key.
Authenticate application dengan menggunakan asymmetric key pair yang digenerate Elliptic Curve Digital Signature Algorithm (ECDSA): Setiap application di-signed menggunaknan private part dari key pair dan bootloader memiliki public key. Sebelum aplikasi diload ke memory, bootloader meverifikasi signature menggunakan public key.
Untuk informasi lebih lengkap mengenai secure boot v1, kunjungi documentation di: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/security/secure-boot-v1.html.
Proteksi layer kedua adalah flash encryption. Flash encryption key (AES-256) disimpan eFuses Block1. key tidak dapat diakse menggunakan software. Ketika flash encryption enabled, ESP32 encrypts bootloader, partition table, dan application partition.
Dokumentasi lengkap mengenai flash encryption dapat dilihat di:
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/security/flash-encryption.html
Secure Boot v2
Secure boot v2 tersedia pada ESP32 Rev3 dan ESP-S2 series chips.
Perbedaan utama dari secure boot v1 adalah bootloader authentication juga menggunakan asymmetric key signature verification, menggunakan Rivest–Shamir–Adleman-Probabilistic Signature Scheme (RSA-PSS).
eFuses Block2 menyimpan public key dalam SHA-256, yang terintegrasi dalam bootloader.
ESP32 pertama mevalidasi public key dari bootloader, lalu meverifikasi signature dari bootloader dengan menggunakan public key. Setelah bootloader terotentsikasi, control diberikan ke bootloader untuk melanjutkan application authentication.
Jika signatures tidak match, ESP32 tidak akan menjalankan aplikasi. Keunggulan dari skema ini adalah tidak digunakannya private key pada ESP32, oleh karena itu, tidak mungkin untuk menjalankan code yang berbahaya pada perangkat.
Informasi lebih lengkap untuk secure boot v2, dapat lihat di: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/security/secure-boot-v2.html.
Perhatian Secure boot dan flash encryption tidak reversible. Karena itu, hanya terapkan pada production devices.
Beberapa point yang perlu diperhatikan sebelum melakukan mass production:
- Pastikan authenticity dari firmware; yaitu, firmware yang berjalan pada perangkat ESP32 adalah firmware yang kita sediakan. Caranya dengan secure boot. Hal penting disini adalah generation cryptographic keys dan keamaan dari private keys. Pastikan private keys tidak dapat diakses dan dengan pihak ketiga, kita hanya menggunakan public keys
- Secure boot memastikan authenticity, namun tidak firmware tidak di encrypt, yang berarti dalam format plaintext. Siapapun dapat membaca isi firmware. Jika kita menyimpan sensitive data, dapat menyebakan celah keamaan pada perangkat. Flash encryption digunakan untuk mencegah attacks. Namun, firmware tetap bisa di eksploaitasi pada pabrik assembly factory. Oleh karena itu, dapat digunakan dua firmware binaries yang berbeda: yang pertama untuk assembly factory, dan yang kedua adalah real application, dimaka kita flash di trusted factory area dengan flash encryption.
Pada section ini kita tidak akan membuat contoh project secure boot dan flash encryption. Tapi akan membahas secure OTA update via https, yang akan kita bahas pada modul selanjutnya.