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



Similar documents
The Universal Boot Loader ( Das U-Boot )

Embedded Trusted Computing on ARM-based systems

Embedded Linux Platform Developer

opensuse for ARM On Your Device Sonntag, 21. Oktober 12

Linux flash file systems JFFS2 vs UBIFS

BIRD Internet Routing Daemon

YOUTUBE 4.0. Postup upgrade Youtube z Youtube 3.1 na Youtube 4.0 pro produkty EAGET X5R, M6, M7 a M9:

Application Development Kit for Android Installation Guide

ARP,TCP,IP utility -zjednodusene a rychle Jiri Kubina jiri.kubina@osu.cz Ver. 1.0 leden 2006

UBIFS file system. Adrian Hunter (Адриан Хантер) Artem Bityutskiy (Битюцкий Артём)

i.mx Trust Architecture Protects assets of multiple stakeholders Guards against sophisticated attacks Assures software measures TM 2

SheevaPlug Development Kit README Rev. 1.2

Jazyk C# (seminář 8)

Survey of Filesystems for Embedded Linux. Presented by Gene Sally CELF

i.mx USB loader A white paper by Tristan Lelong


Building Embedded Systems

The Freescale Embedded Hypervisor

How to Run the MQX RTOS on Various RAM Memories for i.mx 6SoloX

Přednášející... Kamil Juřík. Lead Consultant & Platform Architect

Smart Nest Thermostat: A Smart Spy in Your Home

Booting from NAND Flash Memory

aneb Perfektní minulost.

IBM WebSphere Application Server V8.5

Booting Linux from a USB Flash Device on MPC5200 Systems David Wolfe, Infotainment, Multimedia and Telematics Division

Market Consistent Embedded Value

The embedded Linux quick start guide lab notes

Eureka Technology. Understanding SD, SDIO and MMC Interface. by Eureka Technology Inc. May 26th, Copyright (C) All Rights Reserved

Installation, backup and recovery of Windows XP embedded systems

There are various types of NAND Flash available. Bare NAND chips, SmartMediaCards, DiskOnChip.

SD Card Hacking. The Exploration and Exploitation of an SD Memory Card. bunnie & xobs 30c3

Update on filesystems for flash storage

Secure Boot on i.mx50, i.mx53, and i.mx 6 Series using HABv4

Encryption Security Recommendations

Rychlý průvodce instalací Rýchly sprievodca inštaláciou

Verified Boot in Chrome OS and how to make it work for you. Simon Glass Embedded Linux Conference Europe Edinburgh, October 2013

NAND Flash FAQ. Eureka Technology. apn5_87. NAND Flash FAQ

Ústav radioelektroniky. Pomocné obvody a základní periférie

Update on filesystems for flash storage

Buildroot Workshop. Libre Software Meeting Thomas Petazzoni Free Electrons

Track One Building a connected home automation device with the Digi ConnectCore Wi-i.MX51 using LinuxLink

VoIP Laboratory B How to re flash an IP04

Embedded Linux Systems

SBC8600B Single Board Computer

Security Policy for FIPS Validation

Version 1.0. File System. Network Settings

ELCE Secure Embedded Linux Product (A Success Story)

File Systems for Flash Memories. Marcela Zuluaga Sebastian Isaza Dante Rodriguez

Upozorňujeme,že můžete formáty pro čtečky převádět ON-LINE na internetu do formátu PDF apod.

EUDAR Technology Inc. Rev USB 2.0 Flash Drive. with Card Reader. Datasheet. Rev. 1.0 December 2008 EUDAR 1

Northrop Grumman M5 Network Security SCS Linux Kernel Cryptographic Services. FIPS Security Policy Version

Smart Nest Thermostat A Smart Spy in Your Home

NAND Flash Memories. Using Linux MTD compatible mode. on ELNEC Universal Device Programmers. (Quick Guide)

Linux Kernel and Driver Development Training

Embedded Display Module EDM6070

Software Prerequisites Linux Ubuntu LTS. Estimated completion time: 15min. The goal of this hands-on is to:

Technical Note TN_146. Creating Android Images for Application Development

LINUX BOOT TIME OPTIMIZATION FTP SERVER

Infrastuktura IPv6 na otevřených systémech

How To Understand The Linux Kernel And Its History

MBC-SAM9G35 Core Board Overview

aneb Perfekt perfektně.

The Embedded Linux Quick Start Guide In the Beginning... Embedded Linux Conference Europe 2010

Bootloader with AES Encryption

FPGA pro BFU. Marek Vašut October 10, 2015

Friendly ARM MINI2440 & Dalvik Virtual Machine with Android

Embedded Linux BSP BootCAMP

UT165 Advanced USB2.0 Flash Drive Controller

Secure Boot on i.mx25, i.mx35, and i.mx51 using HABv3

System administration basics

WLA-5000AP. Quick Setup Guide. English. Slovensky. Česky a/b/g Multi-function Wireless Access Point

UM0586 User manual. STM32 Cryptographic Library. Introduction

LV5WDR Wireless Display Receiver Rýchla príručka

AN10860_1. Contact information. NXP Semiconductors. LPC313x NAND flash data and bad block management

Design of Remote Security System Using Embedded Linux Based Video Streaming

TVL32915LED NÁVOD K POUŽITÍ NÁVOD NA POUŽITIE BAREVNÝ TELEVIZNÍ PŘÍJÍMAČ S DÁLKOVÝM OVLÁDÁNÍM FAREBNÝ TELEVÍZNY PRIJÍMAČ S DIALKOVÝM OVLÁDÁNÍM

Reverse engineering hardware for software reversers: studying an encrypted external HDD

USB 2.0 Flash Drive User Manual

Embedded Linux development training 4 days session

IPMI Firmware Update (AMI) In WEB-GUI/DOS/WIN/Linux

NAND Flash & Storage Media

8.2 Transformace, množinové operace

Intel Do-It-Yourself Challenge Lab 2: Intel Galileo s Linux side Nicolas Vailliet

Important Differences Between Consumer and Enterprise Flash Architectures

Sistemi ad agenti Principi di programmazione di sistema

Open Network Linux. A Path to an Open Source Network OS. Rob Sherwood Big Switch Networks CTO

Running Debian on Inexpensive Network Attached Storage Device

Môže sa to stať aj Vám - sofistikované cielené hrozby Ján Kvasnička

MCF54418 NAND Flash Controller

BLADESYSTEM FIRMWARE UPDATES BEST PRACTICES

Altera SoC Embedded Design Suite User Guide

SBC6245 Single Board Computer

Linux File System Analysis for IVI Systems

Návod k použití: Boxovací stojan DUVLAN s pytlem a hruškou kód: DVLB1003

SEAGATE BUSINESS NAS ACCESSING THE SHELL. February 1, 2014 by Jeroen Diel IT Nerdbox

Five standard procedures for building the android system. Figure1. Procedures for building android embedded systems

Technical Brief Distributed Trusted Computing

ARM Cortex -A8 SBC with MIPI CSI Camera and Spartan -6 FPGA SBC1654

Transcription:

Zabezpečení embedded systému proti degradaci úložiště October 5, 2014

Marek Vasut Software engineer pro DENX S.E. od r. 2011 Embedded and Real-Time Systems Services, Linux kernel and driver development, U-Boot development, consulting, training. Linux kernel hacker Custodian @ 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, SHA256... ) 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 { kernel@1 { description = "Linux kernel"; data = /incbin/("./arch/arm/boot/zimage"); arch = "arm"; os = "linux"; type = "kernel"; compression = "none"; load = <0x8000>; entry = <0x8000>; hash@1 { algo = "crc32"; configurations { default = "conf@1"; conf@1 { description = "Boot Linux kernel"; kernel = "kernel@1"; hash@1 { 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 {... + fdt@1 { + description = "Flattened Device Tree blob"; + data = /incbin/("./arch/arm/boot/dts/socfpga_cyclone5_mcvevk.dtb"); + type = "flat_dt"; + arch = "arm"; + compression = "none"; + hash@1 { + algo = "sha256"; + +... configurations { conf@1 {... + fdt = "fdt@1";...

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 { kernel@1 { kernel@2 { fdt@1 { fdt@2 {... configurations { conf@1 { kernel = "kernel@1"; fdt = "fdt@1";... conf@2 { kernel = "kernel@1"; fdt = "fdt@2";... => bootm ${loadaddr}#conf@2 => bootm ${loadaddr}:kernel@2 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 {... + firmware@1 { + description = "My FPGA firmware"; + data = /incbin/("./firmware.rbf"); + type = "firmware"; + arch = "arm"; + compression = "none"; + hash@1 { + algo = "sha256"; + +... => imxtract ${loadaddr} firmware@1 ${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 10000000... FIT image found FIT description: Linux kernel and FDT blob for mcvevk Created: 2014-09-22 15:37:52 UTC Image 0 (kernel@1) Description: Linux kernel Created: 2014-09-22 15:37:52 UTC Type: Kernel Image Compression: uncompressed Data Start: 0x100000d8 Data Size: 3363584 Bytes = 3.2 MiB Architecture: ARM OS: Linux Load Address: 0x00008000 Entry Point: 0x00008000 Hash algo: crc32 Hash value: 5c7efdb5 Image 1 (fdt@1) Description: Flattened Device Tree blob Created: 2014-09-22 15:37:52 UTC Type: Flat Device Tree... Default Configuration: conf@1 Configuration 0 (conf@1) Description: Boot Linux kernel with FDT blob Kernel: kernel@1 FDT: fdt@1 ## Checking hash(es) for FIT Image at 10000000... Hash(es) for Image 0 (kernel@1): crc32+ Hash(es) for Image 1 (fdt@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 { conf@1 {... + signature@1 { + 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 <marex@denx.de>