Monday, January 28, 2019

Firmware researching/secrets (part 1)

İllərdir həmişə məni Firmware/Hardware ilə bağlı mövzular marağlandırıb ki bununla bağlı araşdırmalarımda olub müxtəlif. Ancaq 3–4 ay öncə qərara gəldimki istifadə etdiyimiz kompüterlərdə və ya motherboardlar üzərində daha dərin araşdırma aparım. Modern istifadə etdiyimiz prosessorlar komponentlərini/periferik qurğularını firmware (hardware depended application) vasitəsi ilə idarə edirlər. Firmware haqqında məlumata keçməmişdən əvvəl araşdırmam ilə bağlı yazmaq istəyirəm ki. Araşdırmamda Lenovo E580 model Intel 8th Generation prosessor istifadə edən notbuk üzərində etdim. Əsas analiz etdiyim komponent isə UEFI idi ki, modern kompüterlər artıq BIOS əvəzinə UEFI istifadə edir. Bu firmware faylı (UEFI) isə prosessor tərəfindən istifadə edilən flash memory üzərində saxlanılır və bildiyimiz fiziki yaddaşdan və yaxud HDD storage-dən müstəqil şəkildə prosessor ilə işləyir. Buna görədə biz əməliyyat sistemini dəyişsək və yaxud hdd yaxud ram kimi qurğuları dəyişsək belə firmware hər hansı bir əlaqəsi olmur. Yəni hər hansı bir hücumçu bu flash memory-ə hər hansı bir kod yazarsa artıq burada malware üçün kod parçası qalıcı ola bilər. Yəni biz HDD dəyişsək və ya əməliyyat sistemini reinstall etsək belə kod parçası qalır və malware yenidən sistemə yüklənə bilir. Bu Flash memory-ə aid zonaya əməliyyat sistemindən və yaxud digər proqram təminatlarından hər hansı bir modifikasiya ola bilməməsi üçün OEM-lər (Original Equipment Manufacture) tərəfindən müxtəlif qorunma mexanizmləri istifadə edilir. (BIOS_CNTL, PRx etc.). Mənim tapdığım boşluq isə bu qorunma mexanizmlərindən birinin (PRx) deaktiv edilməsinə gətirib çıxarırdı. Analiz etdiyimiz prosessora aid diaqram:
Buradaki əsas komponentlər PCİe (PCİ Express) və PCH-dır ki ilkin olaraq bundan danışaq. İlkin olaraq onu deyimki mənim istifadə etdiyim Lenovo E580 notbuku İntel 8th Generation S-Processor istifadə edir. Bu prosessor isə Intel® Z370 Chipset PCH (Platform Controller Hub) istifadə edir. Platform Controller Hub isə CPU ilə işləyən birçox interfeysləri və ya capabilities-ləri(DMI, FDI, PCI Express, SATA Controller etc.) idarə edir. Burdaki əsas “key component” isə PCI Expressdir. Peripheral Component Interconnect (PCI) periferik qurğuların motherboard üzərindən CPU ilə əlaqə yaratması üçün istifadə edilən bus-dır.
Figure 1
Yuxarıdaki diagramnan göründüyü kimi PCI Bus və PCI Bridge sistem komponentlərini birləşdirir. CPU yaxud digər local sistemlər (memory, cache etc.) PCI Bridge vasitəsi ilə PCI Bus-a qoşulur daha sonra isə periferik qurğuları PCI bus vasitəsi ilə bağlantı qurur. Diagramda göstərilən kimi primary bus olaraq PCI to PCI Bridge secondary bus üçün isə PCI Bus əlaqələndirilir. Digər bir diagram:
Figure 2 (Source: Oracle)
Bu mətndə olan Host address domain və PCI address domain terminlərini diagramnan baxaraq başa düşə bilərsiniz.
Görüldüyü kimi PCI bus bridge, PCI host bridge altında kompleks cihazların birləşdirilməsi üçün bir neçə bus olaraq genişləndirilə bilər. PCI host bridge prosessor və periferik qurğular arazında interconnection təmin edir. Yəni prosessor PCI host bridge vasitəsi ilə digər PCI bus masterlərdən müstəqil olaraq fiziki yaddaşa access-ə icazə verir. PCI Host Bridge CPU və I/O periferik cihazlar arasında məlumat mübadiləsinə imkan yaradır. Yəni hər bir periferik cihazı host adres blokuna (Figure 2: Host address domain) map edir və bu sayədə prosessorun I/O instruksiyalar və yaxud müxtəlif programmed interfeyslər ilə cihazlara accessi olur. Local bus tərəfdə isə PCI host bridge sistem yaddaşını PCI adres blokuna (Figure 2: PCI address domain) map edir bu sayədə isə PCI cihazların host adres blokuna accessi olur. PCI bus master host/PCI bridge daxil olmağla) 3 ayrı address space-dən ibarətdir: configuration, memory və I/O space. Bu address space-lər CPU və digər PCI cihazların aralarında məlumat mübadiləsi üçün istifadə edilir.

PCI Configuration Address Space:

Figure 3: The PCI Configuration Header (Source: tldp.org)
PCI cihazlarının hər biri configuration space (PCI Express-də extended configuration space olaraq adlandırılır) registerlərinə məxsusdur. Configuraiton space registerləri müəyyən yaddaş bloklarına yerləşdirilir. Bu configuration space registerləri özlərində konfigurasiya data strukturaları daşıyır ki, buda sistemə (prosessor or anyone) cihazların tanınması və idarə edilməsi imkanı yaradır. Yəni periferik qurğuların hər birinin yerləşləməsi onların interconnected PCI bus bridge-lərdəki fiziki location-ı ilə detekt edilir. Cihazlar onların bus numberdevice (slot) number dəyərləri ilə yerləşdirilir. Bu məlumatlarda onlara aid PCI configuration space-də olur. PCI configuration space 256 bayt məlumatdan ibarət olur. Hər target device Configuration Space Access üçün Initialization Device Select (IDSEL) signalı ilə müraciət edə bilər.

PCI Configuration Base Address Register:

Figure 5 (Source: Oracle)
PCI configuration space hər bir cihaz üçün 32-bit base address register təmin edir. Bu BAR cihaz tərəfindən istifadə edilən yaddaş adresi və yaxud port adresi üçün offset saxlaya bilər. Adətə, memory address BAR fiziki yaddaşda (physical ram) yerləşməlidir. Ancaq I/O space BAR isə hər hansı bir yaddaş blokunda yerləşə bilər (hətta fiziki yaddaşdan kənarda). Bu informasiyaları ayırmaq üçün (I/O yaxud Memory space olduğunu) BAR value-dakı lowest bit yoxlanıla bilər (Figure 5-də göstərildiyi kimi).

PCI Memory Address Space:

System firmware PCI address domaində PCI periferik üçün müəyyən yaddaş regionu təyin edir. Bu yaddaş regionun base address dəyəri hər cihaza aid PCI configuration space-dəki Base Address registerdə (BAR) saxlanılır. Yaddaşdaki qurğuya aid adres host address domain-ə yerləşdirilir (memory-mapped). Buna görədə hər hansı prosessora aid hər hansı bir load və ya store instrukturasiya ilə qurğu ilə məlumat mübadiləsi ola bilər. *Bu hissə dəqiq oxunmalıdır*

PCI I/O Address Space:

PCI həmçinin 32-bit I/O space dəstəkləyir. I/O space fərqli platformalarda fərqli metodlarla istifadə edilə bilər. İntel kimi prosessorlarda I/O space access üçün in out kimi instruksiyalar istifadə edilir. Xüsusi I/O instruksiyalar olmayan cihazlar, host address domainindəki PCI host bridge qarşılıq olan adres locationı ilə map (yerləşdirilir) edilir. Yəni prosessor I/O request gönədirir PCI host bridge-ə daha sonra bu adres translate edilir I/O sorğularına sonra isə bu PCI bus-a göndərilir.

SPI Controller

Ikinci əsas məsələ isə SPI controller/interface və onun qorunma mexanizmləri ilə bağlıdır. Daha öncə bildirdiyim kimi PCH BIOS flash cihazı (flash memory) üçün SPI interfeys istifadə edir. Serial peripheral Interface (SPI) standart asinxron serial portun (TX/RX lines) əksinə sinxron serial kommunikasiya interfeysi olaraq embeded sistemlərdə geniş istifadə edilir. SPI cihazlar master-slave arxitekturası ilə tək master ilə full duplex modda işləyirlər. Bir SPI Master birneçə slave ilə əlaqələndirilərək SS xətti üzrə (Select slave) məlumat mübadiləsi edə bilirlər:
Figure 6: Multiple slave (Source wikipedia)
SPI bus 4 əsas məntiqi signalı bildirir:
  • SCLK: Serial Clock (output from master)
  • MOSI: Master Output Slave Input, or Master Out Slave In (data output from master)
  • MISO: Master Input Slave Output, or Master In Slave Out (data output from slave)
  • SS: Slave Select (often active low, output from master)
Figure 7: Data transmission in SPI (Source: sparkfun)
BIOS/UEFI isə firmware olaraq Reset vector prosesində prosessor tərəfindən icra edilməyə başlayır. Hardware Boot Sequence isə belədir:
Mən analiz etdiyim prosessora aid PCH sistem flash və TPM üçün bir ədəd SPI (Serial Peripheral Interface) təmin edir. Bu interfeys 3 Chip Select Signal (CS#) iki flash cihazın bir TPM cihazın PCH-ə qoşulmasını təmin edir. CS0# və CS1# flash cihazlar üçün, CS2# isə TPM üçün istifadə edilir. PCH SPI interfeys 17-Mhz, 30-Mhz, 48-Mhz tezlikləri dəstəkləyir. Həmçinin 3.3V və ya 1.8V elektrik yükünü dəstəkləyə bilir.
Figure 7 (Source: Intel PCH manual)
Descriptor mode-da Flash 5 regiona bölünür:
Burada bizə əsas marağlı olan 2 region var Flash descriptor və BIOS region.

Digər partlarda BIOS və UEFİ fərqləri, Capsule Update, Secure Boot, Boot Guard, Flash Security mexanizmləri haqqında yazacam.