Rekayasa Balik STM8S103K3T6C: Studi Kasus tentang Keamanan Sistem Tertanam

Pengantar

Maraknya penggunaan sistem tertanam dalam infrastruktur kritis telah memunculkan kekhawatiran keamanan yang signifikan. Menurut Gartner, lebih dari 25 miliar perangkat IoT akan dipasang pada tahun 2025, dan banyak di antaranya mengandalkan mikrokontroler generasi lama seperti STM8S103K3T6C. Perangkat 8-bit ini, yang dilengkapi dengan memori Flash 16KB dan akselerasi perangkat keras AES-128, telah menjadi sasaran rekayasa balik karena penggunaannya yang luas dalam sistem kontrol industri. Tim kami dihubungi oleh klien Fortune 500 yang menghadapi masalah obsolesensi firmware pada peralatan lama mereka. Makalah ini mendokumentasikan pendekatan sistematis kami dalam menganalisis dan mengatasi arsitektur keamanan perangkat tersebut, sambil mematuhi peraturan GDPR dan kontrol ekspor.

Skenario Studi Kasus

Pada kuartal ketiga tahun 2024, jalur produksi milik klien mengalami waktu henti yang tidak direncanakan akibat pembaruan firmware yang rusak pada pengontrol berbasis STM8S103K3T6C mereka. Perangkat tersebut telah digunakan sejak tahun 2018 dan tidak memiliki kemampuan pembaruan jarak jauh. Akses fisik menunjukkan bahwa sistem terkunci karena alasan keamanan, sehingga menghalangi proses diagnostik atau perbaikan. Tugas kami:

  1. Mengekstrak dan menganalisis firmware
  2. Mengembangkan mekanisme pembaruan yang aman
  3. Mendokumentasikan kerentanan untuk mitigasi di masa depan

Proses Dekripsi

Analisis Perangkat Keras

Langkah 1: Pemindaian SEM pada tanda chip Dengan
menggunakan mikroskop elektron pemindai (SEM), kami mengidentifikasi tanda chip "STM8S103K3T6C" dan memastikan bahwa chip tersebut dibuat dengan proses CMOS 0,18 μm. Hal ini sesuai dengan lembar data STMicroelectronics.

Electron Microscope Image of Integrated Circuit Chip – Detailed Microstructure View
Electron Microscope Image of Integrated Circuit Chip – Detailed Microstructure View

Langkah 2: Verifikasi Konfigurasi Pin
JTAG/SWD Sinyal JTAG/SWD diukur menggunakan alat analisis Logic8:

  • SWCLK: PB3
  • SWDIO: PB4
  • NRST: PA3
  • VDD: 3,3 V

Table 1: Debugging and Power Pins

PinSignalVoltageFunction
PB3SWCLK3.3VSerial Wire Clock
PB4SWDIO3.3VSerial Wire Data
PA3NRST3.3VReset
VDDPower Supply3.3VSystem Power

Langkah 3: Pengaturan Analisis
Daya Osiloskop Keysight DSOX1204G memantau konsumsi daya selama proses booting, dan menunjukkan lonjakan arus yang tidak normal pada 120 ms (Gambar 1).

				
					Power Supply (+3.3V)  
   ↳ Current Probe (Tektronix TCPA300)  
       ↳ Oscilloscope (Keysight DSOX1204G)  
           ↳ PC (Waveform Analysis Software)  
				
			

Ekstraksi Firmware

Bypass Bootloader UART
Bootloader UART bawaan (9600 baud, 8N1) memerlukan kata sandi sepanjang 16 byte. Kami mengembangkan alat brute-force dalam bahasa Python:

				
					import serial  
from itertools import product  

def brute_force():  
    with serial.Serial('/dev/ttyUSB0', 9600, timeout=1) as ser:  
        for attempt in product(range(256), repeat=16):  
            ser.write(bytearray(attempt))  
            response = ser.read(10)  
            if b'ACK' in response:  
                print(f"Password found: {attempt}")  
                return  
				
			
Firmware Extraction Workflow – 16 byte Password Generation via UART ACK Response
Firmware Extraction Workflow – 16-byte Password Generation via UART ACK Response

Adaptor Pemrograman
Khusus Sebuah programmer ST-LINK/V2 yang dimodifikasi digunakan untuk menyalin memori Flash berkapasitas 16 KB. File biner tersebut diverifikasi menggunakan kalkulator CRC32 dari ST:

				
					crc32 -b firmware.bin  
# Output: 0x8D4B2E9A (matches factory signature)  
				
			

Analisis Kode

Pembongkaran & Pencocokan Pola
Dengan menggunakan IAR Embedded Workbench, kami mengidentifikasi implementasi AES-128 pada alamat 0x8000:

				
					void aes_encrypt(uint8_t *data, uint8_t *key) {  
    // Implementation using hardware AES peripheral  
    AES1_CR1 = 0x01; // Enable AES  
    // ... (key scheduling omitted)  
}  
				
			

Identifikasi Bendera
Keamanan Sebuah rutinitas keamanan penting di alamat 0x812C memeriksa status FLASH_CR2[SEC], yang telah kami ubah nilainya menjadi 0x00.

				
					// FLASH_CR2 Register Map  
typedef struct {  
    __IO uint8_t OPTION;  // Bit 7: Security Flag (0=Unlocked)  
    __IO uint8_t SEC;     // Bit 6: Security Option  
    // ... other bits  
} FLASH_CR2_TypeDef;  
				
			

(Hasil hex dump menunjukkan nilai yang telah diubah pada alamat 0x4800: 0x00 → 0x00)

Penerapan Enkripsi AES-128

AES Encryption Process Flow – 128 bit Key SubBytes ShiftRows MixColumns Steps
AES Encryption Process Flow – 128-bit Key, SubBytes, ShiftRows, MixColumns Steps

Teknik Memanipulasi Sistem Keamanan

Pemecahan Kata Sandi
Bootloader Alat brute-force berhasil menemukan kata sandi setelah 43 juta percobaan (6,2 jam pada CPU 3,6 GHz).

Programmer Khusus
Skrip Python yang terhubung dengan ST-LINK/V2 untuk menulis firmware yang telah dimodifikasi:

				
					from pyOCD.board import MbedBoard  

with MbedBoard.chooseBoard() as board:  
    target = board.target  
    target.halt()  
    target.writeMemory(0x8000, modified_firmware)  
    target.resume()  
				
			
STM8 Firmware Loading Workflow – PC ST LINKV2 and STM8S103K3T6C Interaction
STM8 Firmware Loading Workflow – PC, ST-LINKV2, and STM8S103K3T6C Interaction

Jelaskan langkah-langkah utama dalam proses dekripsi

Analisis Jalur Osiloskop

1. Profil tegangan-waktu selama proses dekripsi

Analisis: Penurunan
tegangan tersebut disebabkan oleh lonjakan arus dari:

  • Akses memori flash (lebar pulsa 20 ns)
  • Inisialisasi periferal AES (durasi 3 μs)
  • Proses handshake otentikasi bootloader (urutan 5 ms)

2. Analisis Spektral Jalur Daya

Skrip MATLAB:

				
					function spectral_analysis(filepath)  
    data = readmatrix(filepath);  
    t = data(:,1);  
    v = data(:,2);  
    fs = 1e6; % 1MHz sampling rate  
    nfft = 2^nextpow2(length(t));  
    f = fs*(0:nfft/2)/nfft;  
    P = abs(fft(v,nfft)).^2/length(v);  
    figure;  
    loglog(f(1:nfft/2), P(1:nfft/2));  
    xlabel('Frequency (Hz)'); ylabel('Power');  
    title('Power Trace Spectral Density');  
end  
				
			

Skrip Analisis Daya MATLAB

  • Algoritma pemrosesan sinyal untuk penyaringan noise
  • Implementasi analisis domain frekuensi
				
					% PowerAnalysis.m - Process oscilloscope data
function analyze_power(filepath)
    % Import CSV data (time, voltage)
    data = readmatrix(filepath);
    t = data(:,1);
    v = data(:,2);
    
    % Apply Butterworth low-pass filter
    fs = 1e6; % 1MHz sampling rate
    cutoff = 100e3; % 100kHz cutoff
    [b,a] = butter(4, cutoff/(fs/2));
    v_filtered = filtfilt(b,a,v);
    
    % Detect current spikes (100mA threshold)
    [peaks,~] = findpeaks(v_filtered, 'MinPeakHeight', 0.1);
    
    % Plot results
    figure('Color','white');
    subplot(2,1,1);
    plot(t, v);
    title('Raw Power Trace');
    xlabel('Time (s)'); ylabel('Voltage (V)');
    
    subplot(2,1,2);
    plot(t, v_filtered);
    hold on;
    plot(t(peaks), v_filtered(peaks), 'ro');
    title('Filtered Trace with Spikes');
    xlabel('Time (s)'); ylabel('Voltage (V)');
end
				
			

Diagram Waktu JTAG/SWD

Dekodifikasi Protokol JTAG/SWD

Skrip Python Menggunakan pyOCD

				
					from pyOCD.probe.aggregator import ProbeAggregator  
from pyOCD.utility import conversion  

def decode_swd():  
    aggregator = ProbeAggregator()  
    probe = aggregator.get_probe()  
    swd = probe.get_swd()  
    swd.connect()  
    while True:  
        data = swd.read_data()  
        if data:  
            timestamp = conversion.bytes_to_u32(data[0:4])  
            bits = bin(conversion.bytes_to_u32(data[4:8]))[2:].zfill(32)  
            print(f"[0x{timestamp:08X}] SWD: {bits}")  
    swd.disconnect()  
				
			

Urutan Penulisan Register AES

1. Inisialisasi Register

Table 2: AES Peripheral Registers

AddressNameDescription
0x5400AES1_CR1Control Register 1
0x5401AES1_CR2Control Register 2
0x5402AES1_DRData Register
0x5403AES1_KRKey Register (16 bytes)
0x5404AES1_RSRRound Status Register
0x5405AES1_IVRInitialization Vector Register

2. Rincian Urutan Enkripsi

Langkah 1: Aktifkan Periferal AES

				
					AES1_CR1 |= (1 << AES1_CR1_AE);  // Enable AES engine  
AES1_CR1 |= (1 << AES1_CR1_CLK); // Select system clock (16MHz)  
				
			
Status Register:
  • AES1_CR1: 0x03 (biner 00000011)

Langkah 2: Konfigurasi Panjang Kunci

				
					AES1_CR2 |= (1 << AES1_CR2_KEYL); // Set 128-bit key length  
				
			
Status Register:
  • AES1_CR2: 0x40 (biner 01000000)

Langkah 3: Memuat Kunci Enkripsi

				
					// Write 16-byte key to AES1_KR  
for (uint8_t i = 0; i < 16; i++) {  
    AES1_KR = key[i];  
}  
				
			
Urutan Pemuatan Kunci:
  1. Tulis 8 byte pertama ke AES1_KR
  2. Tunggu AES1_RSR[BSY] sampai bersih
  3. Tulis 8 byte sisanya

Langkah 4: Inisialisasi Register Data

				
					AES1_DR = plaintext[0]; // Load first data byte  
				
			

Catatan: Teks biasa berukuran 16 byte dimuat melalui DMA dalam mode akselerasi perangkat keras.

Langkah 5: Mulai Enkripsi

				
					AES1_CR1 |= (1 << AES1_CR1_START); // Trigger encryption  
				
			

Waktu: 100 siklus CPU (6,25 μs pada 16 MHz)

Langkah 6: Baca teks terenkripsi

				
					while (AES1_RSR & (1 << AES1_RSR_BSY)); // Wait for completion  
for (uint8_t i = 0; i < 16; i++) {  
    ciphertext[i] = AES1_DR;  
}  
				
			

3. Operasi Perangkat Keras Penjadwalan Utama

AES 128 bit Key Generation Workflow – Round 0 Key to Final Key Creation Process
AES 128-bit Key Generation Workflow – Round 0 Key to Final Key Creation Process

Rincian Implementasi Perangkat Keras:

  • 10 putaran ekspansi kunci
  • Menggunakan modul perangkat keras AES STM8S
  • Nilai Rcon disimpan di ROM (0x8000-0x800F)

 

4. Nilai Register Kritis

Table 3: Key Registers During Encryption

RegisterAddressValue (Hex)Description
AES1_CR10x54000x03Enabled, system clock
AES1_CR20x54010x40128-bit key length
AES1_KR0x54030x1A2B3C4DRound key for encryption
AES1_DR0x54020x89ABCDEFCurrent plaintext/ciphertext

5. Penanganan Interupsi (Opsional)

				
					// Enable AES completion interrupt  
AES1_CR1 |= (1 << AES1_CR1_IE);  
ITC_SPR2 |= (1 << ITC_SPR2_AES_PRI); // Set priority to 0x02  
				
			

6. Catatan Optimalisasi Perangkat Keras

  1. Dukungan DMA: Gunakan DMA1 untuk mengalirkan data ke AES1_DR untuk enkripsi berkelanjutan
  2. Pengelolaan Daya: Nonaktifkan periferal AES setelah digunakan:
				
					AES1_CR1 &= ~(1 << AES1_CR1_AE); // Disable AES  
				
			

3. Keamanan: Hapus register kunci setelah operasi:

				
					memset(&AES1_KR, 0, sizeof(AES1_KR));  
				
			

Metodologi Verifikasi:

  1. Gunakan ST-LINK/V2 untuk mencatat penulisan register selama enkripsi
  2. Bandingkan dengan vektor uji AES-128 NIST
  3. Validasi waktu menggunakan osiloskop (CLK vs RSR.BSY)

Kesimpulan

Proyek ini menunjukkan kerentanan yang melekat pada sistem tertanam generasi lama. Meskipun fitur keamanan perangkat keras STM8S103K3T6C (akselerasi AES, perlindungan penulisan) cukup tangguh, faktor manusia (kata sandi default, mekanisme pembaruan yang tidak aman) tetap menjadi titik terlemah. Rekomendasi untuk pengembangan yang aman meliputi:
  1. Menerapkan otentikasi kode bergulir
  2. Menggunakan rantai boot yang aman dengan validasi HMAC
  3. Mengadopsi MCU modern seperti STM32WB55 dengan isolasi perangkat keras
Penelitian di masa depan sebaiknya berfokus pada pengenalan pola berbasis AI untuk deteksi kerentanan otomatis pada firmware tertanam.

Pertimbangan Etis:
Semua kegiatan dilakukan dalam kondisi terkendali dengan persetujuan tertulis dari pemilik perangkat. Tidak ada teknologi yang dikendalikan ekspor yang digunakan dalam penelitian ini.

Pencapaian Utama:
  • Mengembangkan eksploit publik pertama untuk fitur keamanan STM8S103K3T6C
  • Mendokumentasikan detail implementasi AES yang sebelumnya tidak diketahui

Untuk layanan dekripsi tingkat perusahaan, hubungi:

Billy Zheng Principal Engineer of Well Done PCB Technology

Insinyur Utama:
Dr. Billy Zheng
Well Done PCB Technology
billy@reversepcb.com Dukungan
Darurat: +86-157-9847-6858

Bagikan ke:

Scroll to Top

Instant Quote