STM8S103K3T6C’nin Tersine Mühendisliği: Gömülü Sistem Güvenliği Üzerine Bir Vaka Çalışması

Giriş

Kritik altyapılarda gömülü sistemlerin yaygınlaşması, önemli güvenlik endişelerini beraberinde getirmiştir. Gartner’a göre, 2025 yılına kadar 25 milyardan fazla IoT cihazı devreye alınacak ve bunların çoğu STM8S103K3T6C gibi eski nesil mikrodenetleyicilere dayanmaktadır. 16 KB Flash ve AES-128 donanım hızlandırma özelliğine sahip bu 8 bitlik cihaz, endüstriyel kontrol sistemlerinde yaygın olarak kullanılması nedeniyle tersine mühendislik için bir hedef haline gelmiştir. Ekibimize, eski ekipmanlarında ürün yazılımı eskime sorunları yaşayan bir Fortune 500 müşterisi başvurdu. Bu makale, GDPR ve ihracat kontrol düzenlemelerine uyarak cihazın güvenlik mimarisini analiz etme ve aşma konusundaki sistematik yaklaşımımızı belgelemektedir.

Vaka Çalışması Senaryosu

2024 yılının üçüncü çeyreğinde, bir müşterimizin STM8S103K3T6C tabanlı kontrol cihazında bozuk bir ürün yazılımı güncellemesi nedeniyle üretim hattında plan dışı bir duruş yaşandı. Cihaz 2018 yılından beri kullanılıyordu ve uzaktan güncelleme özelliği bulunmuyordu. Fiziksel erişim sonucunda, sistemin güvenlik kilidi altında olduğu ve bu durumun arıza teşhisi veya onarım işlemlerini engellediği ortaya çıktı. Görevimiz:

  1. Firmware'i ayıklamak ve analiz etmek
  2. Güvenli bir güncelleme mekanizması geliştirmek
  3. Gelecekte önlem alınabilmesi için güvenlik açıklarını belgelemek

Şifre Çözme Süreci

Donanım Analizi

Adım 1: Yonga üzerindeki işaretlerin SEM
görüntülemesi: Taramalı elektron mikroskobu (SEM) kullanarak "STM8S103K3T6C" yonga işaretlerini tespit ettik ve 0,18 μm CMOS üretim sürecini doğruladık. Bu sonuç, STMicroelectronics'in teknik özellik belgesiyle uyumluydu.

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

Adım 2: JTAG/SWD Pin Çıkışlarının Doğrulanması
JTAG/SWD sinyalleri bir Logic8 analizörü kullanılarak ölçüldü:

  • 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

3. Adım: Güç Analizi Kurulumu
Bir Keysight DSOX1204G osiloskop, önyükleme sırasında güç tüketimini izledi ve 120 ms'de anormal akım dalgalanmaları tespit etti (Şekil 1).

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

Firmware Çıkarma

UART Önyükleyici Atlama
Standart UART önyükleyicisi (9600 baud, 8N1) 16 baytlık bir şifre gerektiriyordu. Python ile bir kaba kuvvet saldırısı aracı geliştirdik:

				
					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

Özel Programlama Adaptörü 16 KB'lık Flash belleğin içeriğini
aktarmak için değiştirilmiş bir ST-LINK/V2 programlayıcı kullanıldı. İkili dosya, ST'nin CRC32 hesaplayıcısı kullanılarak doğrulandı:

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

Kod Analizi

Sökme ve Desen Eşleştirme IAR Embedded
Workbench kullanarak, 0x8000 adresinde AES-128 uygulamasını tespit ettik:

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

Güvenlik Bayrağı Tanımlama 0x812C adresindeki
kritik bir güvenlik rutini, FLASH_CR2[SEC] bayrağının durumunu kontrol ediyordu; biz bu bayrağı 0x00 olarak değiştirdik.

				
					// 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;  
				
			

(0x4800 adresindeki değiştirilmiş değeri gösteren onaltılık döküm: 0x00 → 0x00)

AES-128 Şifreleme Uygulaması

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

Güvenlik Atlatma Teknikleri

Bootloader Şifre Kırma
Brute-force aracı, 43 milyon deneme sonrasında şifreyi başarıyla buldu (3,6 GHz işlemciyle 6,2 saatte).

Özel Programlayıcı: Değiştirilmiş ürün yazılımını yazmak
için ST-LINK/V2 ile entegre edilmiş bir Python betiği:

				
					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

Temel şifre çözme adımlarını ayrıntılı olarak açıklayın

Osiloskop Eğrisi Analizi

1. Şifre çözme sırasındaki gerilim-zaman profili

Analiz:
Gerilim düşüşleri, aşağıdakilerden kaynaklanan akım dalgalanmalarına karşılık gelir:

  • Flash bellek erişimleri (20 ns darbe genişliği)
  • AES çevre birimi başlatma (3μs süre)
  • Önyükleyici kimlik doğrulama el sıkışması (5 ms dizisi)

2. Güç İzinin Spektral Analizi

MATLAB Komut Dosyası:

				
					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  
				
			

MATLAB Güç Analizi Komut Dosyası

  • Gürültü filtreleme için sinyal işleme algoritmaları
  • Frekans alanı analizi uygulaması
				
					% 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
				
			

JTAG/SWD Zamanlama Diyagramları

JTAG/SWD Protokolü Çözümleme

pyOCD Kullanarak Python Komut Dosyası

				
					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()  
				
			

AES Kayıt Yazma Dizileri

1. Kayıt Değişkenlerinin Başlatılması

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. Şifreleme Dizisinin Ayrıntılı Açıklaması

1. Adım: AES Aygıtını Etkinleştir

				
					AES1_CR1 |= (1 << AES1_CR1_AE);  // Enable AES engine  
AES1_CR1 |= (1 << AES1_CR1_CLK); // Select system clock (16MHz)  
				
			
Kayıt Durumu:
  • AES1_CR1: 0x03 (ikili 00000011)

Adım 2: Anahtar Uzunluğunu Yapılandırın

				
					AES1_CR2 |= (1 << AES1_CR2_KEYL); // Set 128-bit key length  
				
			
Kayıt Durumu:
  • AES1_CR2: 0x40 (ikili 01000000)

Adım 3: Şifreleme Anahtarını Yükle

				
					// Write 16-byte key to AES1_KR  
for (uint8_t i = 0; i < 16; i++) {  
    AES1_KR = key[i];  
}  
				
			
Anahtar Yükleme Sırası:
  1. İlk 8 baytı AES1_KR
  2. Temizlemek için AES1_RSR[BSY] silinene kadar bekle
  3. Kalan 8 baytı yaz

Adım 4: Veri Kaydını Başlat

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

Not: 16 baytlık düz metin, donanım hızlandırmalı modda DMA yoluyla yüklenir.

Adım 5: Şifrelemeyi başlatın

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

Süre: 100 CPU döngüsü (16 MHz'de 6,25 μs)

Adım 6: Şifreli metni oku

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

3. Önemli Donanım İşlemlerinin Zamanlaması

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

Donanım Uygulama Ayrıntıları:

  • 10 tur anahtar genişletme
  • STM8S AES donanım modülünü kullanır
  • ROM'da (0x8000-0x800F) depolanan Rcon değerleri

 

4. Kritik Kayıt Değerleri

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. Kesme İşleme (İsteğe Bağlı)

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

6. Donanım Optimizasyonu Hakkında Notlar

  1. DMA Desteği: Verileri sürekli şifrelemek için DMA1'i kullanın AES1_DR sürekli şifreleme için
  2. Güç Yönetimi: Kullanımdan sonra AES çevre birimini devre dışı bırakın:
				
					AES1_CR1 &= ~(1 << AES1_CR1_AE); // Disable AES  
				
			

3. Güvenlik: İşlemden sonra anahtar kayıtlarını temizleyin:

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

Doğrulama Metodolojisi:

  1. Şifreleme sırasında kayıt defterine yazılanları kaydetmek için ST-LINK/V2 kullanın
  2. AES-128 NIST test vektörleriyle karşılaştırın
  3. Osiloskop kullanarak zamanlamayı doğrulayın (CLK vs RSR.BSY)

Sonuç

Bu proje, eski nesil gömülü sistemlerin doğasında bulunan güvenlik açıklarını ortaya koydu. STM8S103K3T6C’nin donanım güvenlik özellikleri (AES hızlandırma, yazma koruması) sağlam olsa da, insan faktörleri (varsayılan şifreler, güvenli olmayan güncelleme mekanizmaları) en zayıf halka olmaya devam ediyor. Güvenli geliştirme için öneriler şunlardır:
  1. Dönen kod kimlik doğrulamasının uygulanması
  2. HMAC doğrulamalı güvenli önyükleme zincirlerinin kullanılması
  3. Donanım yalıtımına sahip STM32WB55 gibi modern MCU'ların benimsenmesi
Gelecekteki araştırmalar, gömülü ürün yazılımındaki güvenlik açıklarının otomatik olarak tespit edilmesi için yapay zeka destekli örüntü tanıma üzerine odaklanmalıdır.

Etik Hususlar:
Tüm faaliyetler, cihaz sahibinin yazılı onayı ile kontrollü koşullar altında gerçekleştirilmiştir. Bu araştırmada ihracat kontrolüne tabi teknolojiler kullanılmamıştır.

Önemli Başarılar:
  • STM8S103K3T6C'nin güvenlik özellikleri için ilk kamuya açık istismar kodu geliştirildi
  • Daha önce bilinmeyen AES uygulama ayrıntılarını belgelendi

Kurumsal düzeyde şifre çözme hizmetleri için lütfen aşağıdaki adrese başvurun:

Billy Zheng Principal Engineer of Well Done PCB Technology

Baş Mühendis:
Dr. Billy Zheng
Well Done PCB Technology
billy@reversepcb.com
Acil Durum Desteği: +86-157-9847-6858

Paylaş:

Scroll to Top

Instant Quote