Zabezpečení embedded systému proti degradaci úložiště - PDF

Description
Zabezpečení embedded systému proti degradaci úložiště October 5, 2014 Marek Vasut Software engineer pro DENX S.E. od r Embedded and Real-Time Systems Services, Linux kernel and driver development,

Please download to get full document.

View again

of 35
All materials on our website are shared by users. If you have any questions about copyright issues, please report us to resolve them. We are always happy to assist you.
Information
Category:

Court Filings

Publish on:

Views: 14 | Pages: 35

Extension: PDF | Download: 0

Share
Transcript
Zabezpečení embedded systému proti degradaci úložiště October 5, 2014 Marek Vasut Software engineer pro DENX S.E. od r Embedded and Real-Time Systems Services, Linux kernel and driver development, U-Boot development, consulting, training. Linux kernel hacker U-Boot bootloader Osnova Boot process detailně Hardwarové problémy Softwarová ochrana proti poškozní dat Softwarová ochrana proti změně dat Bootovací process Power on nebo Reset CPU spouští kód od předem definované adresy Bootloader je spuštěn Kernel je spuštěn Root filesystem se začne používat Právě mezi těmito kroky se schovávají problémy. Power on nebo Reset Nejdříve se děje HW magie Relevantní komponenty jsou vytaženy z resetu Komponenty jsou tudíž v definovaném stavu Až pak může CPU začít spouštět kód Reset routing Opakující se problém! Reset není připojen ke všem komponentům Častý případ jsou MTD zařízení (SPI NOR) nebo SD/MMC Příklad: i.mx23 bootuje z 64 MiB SPI NOR i.mx23 BootROM použije READ opcode s 3-byte addresováním SPI NOR nepodporuje opcody s 4-byte adresováním Linux přepne SPI NOR do 4-byte adresovacího režimu Linux používá standardní (3b) opcody se 4-byte adresou Nastane reset Zařízení nenastaruje Proč? Naivní řešení: Poslat RESET opcode ze software (NELZE!) Řešení: CPU má Reset-OUT: Připojit k Reset-In bootovacího media RstOut není k dispozici externí resetovací obvod RstOut nesplňuje časování externí resetovací obvod CPU spouští kód První kód který CPU spouští Může běžet kód interně z CPU (BootROM) Může běžet kód externě z paměti (NOR, FPGA,... ) BootROM: Často closed source Většinou nelze aktualizovat nebo opravit (ROM) Zprostředkovává načítání z netriviálních medíı (SPI NOR, SD/MMC, RAW NAND, USB, Síť,... ) Tipy pro bootvanání Resetujte z PWR/HOT/COLD SPI NOR: Zajistit, že nhold je korektně pullnutý (pokud GPIO) SD/eSD/MMC/eMMC: Pozor na chování na konci životnosti Musí indikovat chybné bloky, ne vracet špatná data NAND: Výrobce garantuje, že první sektor je vždy OK Nemusí se vztahovat na přepis prvního sektoru! Nutno pozorně číst datasheet! První sektor je 1/2/4 KiB U-Boot SPL Pozor na MLC NAND U-Boot SPL U-Boot SPL: První uživatelský kód Mnohem menší než U-Boot Funkcionalita v závislosti na zařízení Provede základní inicializaci HW Načte, ověří a spustí další stupeň Další stupeň je U-Boot, Linux,... Specifika RAW NAND: Plná podpora pro UBI se do 4KiB nevejde U-Boot SPL dělá ECC, ale neaktualizuje NAND Více kopíı dat v NAND, aktualizace kopíı později Lepší řešení: Bootloader v NOR, zbytek v NAND U-Boot Velikostní limity SPL prakticky neexistují Plná podpora pro FS (ext234, reiserfs, vfat... ) Podpora pro UBI/UBIFS pro NAND Podpora fitimage Souhrn (1/4) HW musí mít korektní resetovací logiku Bootování z RAW NAND není dobrý nápad Nikdy neukládat nic důležitého přímo do RAW NAND Pokud nad RAW NAND nemáte UBI Více kopíı ECC + Refresh později Typy obrazů jádra zimage Náchylný k poškození dat, nemusí být detekováno Obsahuje pouze obraz jádra Často používený uimage (legacy) Slabý kontrolní součet CRC32 Obsahuje pouze obraz jádra Často používený fitimage Nastavitelný alg. pro kontrolní součet Může obsahovat jádro, DTB, firmware... Další vlastnosti... Není rozšířen :-( fitimage detailně Následník uimage Popisovač fitimage založen na DTS Nové vlastnosti lze snadno přidat Silnější kontrolní součty (SHA1, SHA ) Může obsahovat více komponent (kernel, DTB, FW... ) Může obsahovat více konfigurací U-Boot může verifikovat obsah oproti certifikátu Ochrana před poškozením dat Ochrana před cílenou změnou dat Linux kernel neumí generovat fitimage uimage vs. fitimage: Vytvoření /dts-v1/; / { description = Linux kernel ; #address-cells = 1 ; images { { description = Linux kernel ; data = /incbin/( ./arch/arm/boot/zimage ); arch = arm ; os = linux ; type = kernel ; compression = none ; load = 0x8000 ; entry = 0x8000 ; { algo = crc32 ; configurations { default = { description = Boot Linux kernel ; kernel = { algo = crc32 ; $ mkimage -f fit-image.its fitimage $ mkimage -A arm -O linux -T kernel -C none -a 0x8000 -e 0x8000 -n Linux kernel -d arch/arm/boot/zimage uimage uimage vs. fitimage: Boot uimage uimage = load mmc 0:1 ${loadaddr} uimage = bootm ${loadaddr} fitimage = load mmc 0:1 ${loadaddr} fitimage fitimage = bootm ${loadaddr} uimage je snadnější na sestavení uimage nepotřebuje soubor fit-image.its uimage a fitimage se startují stejně uimage zatím vede... uimage vs. fitimage: Device Tree Blob... / { images {... + { + description = Flattened Device Tree blob ; + data = /incbin/( ./arch/arm/boot/dts/socfpga_cyclone5_mcvevk.dtb ); + type = flat_dt ; + arch = arm ; + compression = none ; + { + algo = sha256 ; configurations { {... + fdt = uimage vs. fitimage: Boot s DTB uimage uimage uimage = load mmc 0:1 ${loadaddr} uimage = load mmc 0:1 ${fdtaddr} socfpga_cyclone5_mcvevk.dtb = bootm ${loadaddr} - ${fdtaddr} fitimage = load mmc 0:1 ${loadaddr} fitimage fitimage = bootm ${loadaddr} fitimage umožní update všech komponent najednou fitimage chrání DTB kontrolním součtem (zde sha256) Příkaz pro spuštení fitimage s DTB je stejný jako pro fitimage bez DTB fitimage: Více konfigurací... / { images { { { { {... configurations { { kernel = fdt = { kernel = fdt = = bootm = bootm fitimage podporuje předdefinované konfigurace Spuštění konfigurace pomocí znaku # (HASH) Spuštění komponentu fitimage pomocí znaku : (COLON) fitimage: Ochrana FW blobů... / { images {... + { + description = My FPGA firmware ; + data = /incbin/( ./firmware.rbf ); + type = firmware ; + arch = arm ; + compression = none ; + { + algo = sha256 ; = imxtract ${loadaddr} ${fwaddr} = fpga load 0 ${fwaddr} fitimage podporuje libovolné množství FW blobů fitimage chrání vaše bloby proti poškození fitimage: Vylistování obsahu image = iminfo ${loadaddr} ## Checking Image at FIT image found FIT description: Linux kernel and FDT blob for mcvevk Created: :37:52 UTC Image 0 Description: Linux kernel Created: :37:52 UTC Type: Kernel Image Compression: uncompressed Data Start: 0x100000d8 Data Size: Bytes = 3.2 MiB Architecture: ARM OS: Linux Load Address: 0x Entry Point: 0x Hash algo: crc32 Hash value: 5c7efdb5 Image 1 Description: Flattened Device Tree blob Created: :37:52 UTC Type: Flat Device Tree... Default Configuration: Configuration 0 Description: Boot Linux kernel with FDT blob Kernel: FDT: ## Checking hash(es) for FIT Image at Hash(es) for Image 0 crc32+ Hash(es) for Image 1 crc32+ Souhrn (2/4) fitimage je super (a to není vše) fitimage chraní všechny bootovací soubory fitimage umožňuje zabalit všechny soubory do jednoho Update všech bootovacích souborů najednou fitimage překonává uimage ve flexibilitě a rozšiřitelnosti fitimage není tak náchylný k tichému poškození dat fitimage: Podpora podepisování Ochrana proti záměrné změně fitimage (nebo jeho node) se podepíše U-Boot zkonotroluje podpis proti veřejnému kĺıči Certifikát musí být v read-only umístění SHA1/SHA256 + RSA2048 a SHA256 + RSA4096 fitimage: Implementace podepsaného image Zapnutí control FDT v U-Boot Generování kryptomateriálu (OpenSSL) Generování control FDT s veřejným kĺıčem Sestavení U-Boot s podporou verifikace podepsaného fitimage Aktualizace U-Boot a test... fitimage: Úpravy U-Boot Změny pro konfiguraci zařízení: #define CONFIG_OF_LIBFDT #define CONFIG_OF_CONTROL #define CONFIG_FIT #define CONFIG_FIT_SIGNATURE #define CONFIG_RSA /* The FDT blob is not part of the U-Boot binary */ #define CONFIG_OF_SEPARATE /* The $fdtcontroladdr points to where the FDT blob is */ #define CONFIG_EXTRA_ENV_SETTINGS fdtcontroladdr=0x4000\0 SPL musí načíst control FDT na 0x4000 Volba CONFIG OF EMBED pro vestavěný control FDT Volba CONFIG FIT VERBOSE pro extra debug! Nyní je potřeba znovu zkompilovat tools/ (make tools) fitimage: Generování kryptomateriálu Kryptomateriál umístíme do key dir= /work/keys/ Sdílené jméno kĺıčů key name= my key Generování privátního podepisovacího kĺıče (RSA2048): $ openssl genrsa -F4 -out \ ${key dir} / ${key name} .key 2048 Generování veřejného kĺıče: $ openssl req -batch -new -x509 \ -key ${key dir} / ${key name} .key \ -out ${key dir} / ${key name} .crt fitimage: Control FDT Příklad control FDT (u-boot.dts): /dts-v1/; / { model = Keys ; compatible = denx,mcvevk ; signature { key-dev { required = conf ; algo = sha256,rsa2048 ; key-name-hint = my_key ; Hodnota my key v key-name-hint musí být ${key name} Control FDT stále neobsahuje veřejný kĺıč, dostaneme se k tomu! fitimage: Změny ve fitimage Ukázka přidání signature node do fitimage ITS (fit-image.its):... / {... configurations { {... + { + algo = sha256,rsa2048 ; + key-name-hint = my_key ; +... Hodnota my key v key-name-hint musí být ${key name} fitimage: Sestavení Sestavení control FDT pro U-Boot s místem na veřejný kĺıč: $ dtc -p 0x1000 u-boot.dts -O dtb -o u-boot.dtb Sestavení fitimage s místem pro podpis: $ mkimage -D -I dts -O dtb -p 2000 \ -f fit-image.its fitimage Podepsání fitimage a přidání kĺıče do u-boot.dtb: $ mkimage -D -I dts -O dtb -p 2000 -F \ -k ${key dir} -K u-boot.dtb -r fitimage Az nyní je potřeba sestavit U-Boot, aktualizovat U-Boot a u-boot.dtb na zařízení a ověřit, že U-Boot stále správně startuje. fitimage: Testování Načíst podepsaný fitimage a zkusit pomocí bootm start (nebo iminfo): Úspěch (znak +): Verifying Hash Integrity... sha256,rsa2048:my key+ OK Selhání (znak -): Verifying Hash Integrity... sha256,rsa2048:my key- Failed to verify required signature key-my key Podepisování dalších fitimage: $ mkimage -D -I dts -O dtb -p 2000 \ -k ${key dir} -f fit-image.its -r fitimage Souhrn (3/4) Podepsaný fitimage vypadá složitě na sestavení Celá komplikovaná procedura probíha pouze jednou Podepisování dalších fitimage je jeden příkaz Načtení obrazu jádra Příkaz load pro vše co není NAND Příkaz ubi*/ubifs* pro NAND Neukládat data přímo do NAND V Linuxu UBI/UBIFS na flash-based storage Ochrana dat pomocí IMA/EVM (obecně) UBI/UBIFS UBI není kompletní řešení proti poškození dat UBI aktivně neobnovuje data na flash K poškození dat může stále dojít! Je potřeba scrubber (SLC NAND): $ find / -exec cat {} /dev/null 2 &1! UBIFS a MLC NAND Šifrování Šifrování U-Boot (pomocí BootROM) Šifrování U-Boot environmentu U-Boot obsahuje CONFIG ENV AES Nutno implementovat env aes cbc get key Šifrování obrazu jádra U-Boot obsahuje CONFIG CMD AES Použít aes dec Šifrování FS (pomocí dm crypt) Konec Děkuji za pozornost Kontakt: Marek Vasut
Related Search
We Need Your Support
Thank you for visiting our website and your interest in our free products and services. We are nonprofit website to share and download documents. To the running of this website, we need your help to support us.

Thanks to everyone for your continued support.

No, Thanks