Jste zde

Bezpečnost IoT - část 4: Ochrana v Runtime režimu

Hardwarová kryptografie s bezpečným úložištěm poskytuje základní bezpečnostní ochranu daného zařízení. Zabezpečené spouštění a aktualizace firmwaru prostřednictvím bezdrátové sítě (FOTA) je dalším článkem bezpečnosti. Nicméně embeded zařízení připojená k internetu vyžadují neustálou ochranu před útoky, které náhodně nebo úmyslně nabourávají chod aplikačního nebo systémového kódu v runtime režimu.

Internet věcí rychle pronikl do všech koutů digitálního světa a stal se běžnou součástí průmyslových lékařských, dopravních a jiných aplikacích. Vnitřní průmyslové sítě jsou běžně důmyslně zabezpečeny, ale problém nastává s rozšířením sítě o zařízení, které nemají dostatečný výkon procesoru pro složité bezpečnostní algoritmy. Hackeři jsou si této zranitelnosti vědomi, a tak připojená zařízení čelí obrovskému počtu hrozeb. Proto je nutné, aby každé zařízení IoT obsahovalo důmyslná bezpečnostní opatření. Proto vznikla série článků pojednávající o různých stupních bezpečnosti Embeded zařízení.

Série článků o bezpečnosti Embeded zařízení:

  • Část 1 pojednává o kryptografických algoritmech, které jsou základem bezpečnosti.
  • Část 2 pojednává o roli soukromých klíčů, správě klíčů a bezpečném uložišti.
  • Část 3 zkoumá mechanismy integrované přímo do procesorů k odrazení útoků na systémové a aplikační části software.
  • Část 4 ukazuje použití bezpečnostního mechanismu přímo v procesorech k zajištění bezpečnosti v runtime režimu.
  • Část 5 popisuje zabezpečení na vyšší úrovni při komunikaci s cloudovými službami.

Tento článek popisuje, jak používat bezpečnostní mechanismy integrované do některých procesorů z NXP Semiconductors , STMicroelectronics a dalších k efektivní ochraně systémů před hrozbami, ke kterým dochází během chodu aplikace.

Jak lze ohrozit zařízení v runtime režimu?

Jak již bylo řečeno v předchozích dílech této série článků o bezpečnosti IoT, kryptografie, zabezpečené úložiště klíčů a bezpečné spouštění a aktualizace firmwaru poskytují nezbytné stavební bloky pro zabezpečení embeded zařízení. Nicméně embeded zařízení připojená k internetu vyžadují neustálou ochranu před útoky, které náhodně nebo úmyslně nabourávají chod aplikačního nebo systémového kódu v runtime režimu.

Hackeři mohou pomocí celé řady metod zneužít bezpečnostní chyby v jedné části systému k útoku na jinou část. Jedním takovým útokem je vyvolání přetečení vyrovnávací paměti. To se provádí tak, že se velké množství dat zapisuje kolem zamyšlené oblasti vyrovnávací paměti. Pokud přetečená data obsahují kód, procesor by je mohl později spustit a poskytnout hackerům vstupní bod pro další útoky. Pomocí této metody mohou hackeři postupně rozšiřovat pronikání do širší částí systému.

Zranitelnost kódu může existovat v jakékoli softwarové komponentě a v jakékoli vrstvě software. Čím je software obsáhlejší, tím roste počet míst, kde hrozí bezpečnostní riziko. Existuje seznam společných chyb zabezpečení (Common Vulnerabilities and Exposures - CVE), který se meziročně zvýší o 15%.

Úrovně ochrany

Ochrana před útoky je neustávající boj. Nové kybernetické hrozby se budou neustále objevovat, a proto je nutné výrazně zvýšit bezpečnost embeded zařízení využitím tzv. víceúrovňové ochrany. Jednotlivé kruhy představují ochranu pro danou vrstvu software. Aplikace běžící na nejvzdálenější vrstvě má omezený přístup k ovladačům zařízení a systémovým službám ve vnitřních vrstvách, které mají zase omezený přístup k softwarovému jádru v nejvnitřnější vrstvě (obrázek 1).

Obrázek 1: Zabezpečený software používá víceúrovňovou ochranu, která zamezuje přístup mezi jednotlivými vrstvami software. (Zdroj obrázku: Wikipedia)

Moderní architektury procesorů jsou procesory Arm s technologií TrustZone, které významně rozšířily bezpečnostní mechanismy určené k izolaci uživatelských procesů v runtime režimu. Tento druh ochrany lze najít v řadě procesorů:

Technologie Arm TrustZone pro Cortex-M přináší vylepšené bezpečnostní funkce pro LPC55S69JBD100K od NXP a STM32L552VET6 od STMicroelectronics. TrustZone pro Cortex-A je implementována do procesorů i.MX 8M Mini MIMX8MM6DVTLZAA od NXP a STM32MP157AAC3T od STMicroelectronics.

Pro každou řadu Arm procesorů nabízí TrustZone mimo bezpečnostních prvků v runtime režimu také bezpečný spouštěcí kód a zabezpečenou oblast paměti pro data. TrustZone pro procesory Cortex-M obsahuje vylepšení výkonu díky rychlému bezpečnému přerušení a rychlému přechodu mezi jednotlivými stavy zabezpečení.

Různé provozní režimy procesoru umožňují širší ochranu

V jádru architektury TrustZone mohou procesory běžet v několika různých provozních režimech, které podporují izolaci jednotlivých softwarových procesů. Režimy „secure“ a „non-secure“ procesoru umožňují izolaci důvěryhodných procesů od nedůvěryhodných. Režimy „handler“ a „thread“ poskytují podrobnější izolaci jednotlivých procesů.

V architektuře TrustZone se režim handler doporučuje pro operační systém v reálném čase (RTOS) nebo pro spouštění obrazu firmware, přístup k zabezpečeným klíčům a dalším důležitým zdrojům dat. V režimu thread běží některé procesy, které mohou změnit úroveň oprávnění části software. Režim thread se obvykle používá pro spuštění kódu aplikace. Například v procesoru STM32L552VET6 od STMicroelectronics lze izolovat důvěryhodný kód s plnými oprávněními od nedůvěryhodného kódu s minimálními oprávněními (obrázek 2).

Obrázek 2: Procesory TrustZone poskytují kombinaci procesorových režimů, které umožňují izolovat důvěryhodný systémový software od nedůvěryhodných aplikačních kódů jako jsou komunikační sady třetích stran. (Zdroj obrázku: Digi-Key, ze zdroje STMicroelectronics)

Mechanismus izolace procesů integrované do zmíněných procesorů má i své nevýhody. Například je omezen přístup různým procesům do některých oblastí programové datové paměti.

Například pokud je jádro NXP LPC55S6x v zabezpečeném stavu, nemůže získat přístup k nezabezpečené programové paměti. A naopak, pokud je jádro LPC55S6x spuštěno v nezabezpečeném stavu, může přistupovat pouze k nezabezpečené části programové či datové paměti (obrázek 3).

Obrázek 3: Procesor LPC55S6x od NXP může zajistit, aby jádro běžící v zabezpečeném stavu (stav S) mohlo číst jen zabezpečenou programovou paměť (zelená oblast) a naopak v nezabezpečeném stavu (stav NS) může číst jen nezabezpečenou programovou paměť. (Červené). (Zdroj obrázku: NXP Semiconductors)

Nicméně kód aplikace obvykle vyžaduje schopnost vykonávat důvěryhodný kód v zabezpečených knihovnách. Procesory TrustZone umožňují splnit tento požadavek definováním nezabezpečených volitelných paměťových oblastí (NSC), které poskytují povolené vstupní body pro zabezpečené knihovny (obrázek 4).

Obrázek 4: Nezabezpečené oblasti poskytují bezpečné vstupní body z nezabezpečených do zabezpečených paměťových oblastí. To umožňuje nezabezpečeným aplikacím vykonávat funkce v zabezpečených knihovnách. (Zdroj obrázku: STMicroelectronics)

Zvýšení bezpečnosti používáním aliasů paměti

Procesory s technologií TrustZone jako jsou LPC55S69JBD100K od NXP a STM32L552VET6 od STMicroelectronics řídí provádění funkcí pomocí aliasů fyzické programové paměti do zabezpečených a nezabezpečených paměťových prostorů.

Například STM32L552VET6 má aliasy kódu do Flash a SRAM paměti. Jednou do nezabezpečeného rozsahu adres (0x0800_0000 až 0x0BFF_FFFF) a pak znovu do zabezpečeného rozsahu adres (0x0C00_0000 až 0x0FFF_FFFF). Podobně tomu tak je u procesoru LPC55S69JBD100K, kde aliasy fyzické programové paměti odkazují do nezabezpečeného prostoru od 0x0000_0000 a zároveň do zabezpečeného prostoru počínaje 0x1000_0000. Každý z těchto procesorů používá podobný přístup i pro jiné typy paměti a periferie, které rovnou přiřazují zabezpečené a zároveň nezabezpečené oblasti.

Když procesor potřebuje přístup k paměti, je tento přístup určen atributem generovaným dvěma hardwarovými jednotkami:

  • Implementační definovaná přiřazovací jednotka (IDAU). Jedná se o pevnou hardwarovou jednotku, která je mimo jádro procesoru a poskytuje pevně určená práva (atributy) zabezpečení paměti definované výrobcem.
  • Secure Attribution Unit (SAU). Jedná se o jednotku, kterou je možno naprogramovat a je integrovaná přímo do jádra procesoru. Slouží k definování stavu zabezpečení až osmi paměťových oblastí.

Během inicializace systému se definuje stav zabezpečení každé oblasti nastavením několika registrů SAU:

  • SAU Region Number Register (SAU_RNR) pro definování oblasti pro další operace
  • Registr základních adres oblasti SAU (SAU_RBAR) pro definování počáteční adresy regionu
  • Registr limitů SAU oblasti (SAU_RLAR) pro definování rozsahu oblasti

Součástí softwarového balíčku MCUSTM32Cube od STMicroelectronics pro řadu STM32L5 jsou také šablony, které slouží ke konfiguraci SAU. Jak je uvedeno ve Výpisu 1, vývojáři mohou definovat tyto oblasti pro každý konfigurační parametr pomocí makra (SAU_INIT_REGION (n)), které nastavuje hodnoty registru ve struktuře SAU používané při zápisu konfigurace do zařízení.

/*
//   <e>Initialize SAU Region 0
//   <i> Setup SAU Region 0 memory attributes
*/
#define SAU_INIT_REGION0    1
 /*
//     <o>Start Address <0-0xFFFFFFE0>
*/
#define SAU_INIT_START0     0x0C03E000      /* start address of SAU region 0 */
 /*
//     <o>End Address <0x1F-0xFFFFFFFF>
*/
#define SAU_INIT_END0       0x0C03FFFF      /* end address of SAU region 0 */
 /*
//     <o>Region is
//         <0=>Non-Secure
//         <1=>Secure, Non-Secure Callable
*/
#define SAU_INIT_NSC0       1
/*
//   </e>
*/
 /*
//   <e>Initialize SAU Region 1
//   <i> Setup SAU Region 1 memory attributes
*/
#define SAU_INIT_REGION1    1
 /*
//     <o>Start Address <0-0xFFFFFFE0>
*/
#define SAU_INIT_START1     0x08040000      /* start address of SAU region 1 */
 /*
//     <o>End Address <0x1F-0xFFFFFFFF>
*/
#define SAU_INIT_END1       0x0807FFFF      /* end address of SAU region 1 */
 /*
//     <o>Region is
//         <0=>Non-Secure
//         <1=>Secure, Non-Secure Callable
*/
#define SAU_INIT_NSC1       0
/*
//   </e>
*/
   .
   .
   .
**
  \brief   Setup a SAU Region
  \details Writes the region information contained in SAU_Region to the
           registers SAU_RNR, SAU_RBAR, and SAU_RLAR
 */
__STATIC_INLINE void TZ_SAU_Setup (void)
{
 
#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)
 
  #if defined (SAU_INIT_REGION0) && (SAU_INIT_REGION0 == 1U)
    SAU_INIT_REGION(0);
  #endif
   .
   .
   .
#define SAU_INIT_REGION(n) \
    SAU->RNR  =  (n                                     & SAU_RNR_REGION_Msk); \
    SAU->RBAR =  (SAU_INIT_START##n                     & SAU_RBAR_BADDR_Msk); \
    SAU->RLAR =  (SAU_INIT_END##n                       & SAU_RLAR_LADDR_Msk) | \
                ((SAU_INIT_NSC##n << SAU_RLAR_NSC_Pos)  & SAU_RLAR_NSC_Msk)   | 1U
 

Výpis 1: V softwarovém balíčku MCU STM32Cube MCU od STMicroelectronics pro řadu STM32L5 jsou šablony, které slouží k definování paměťové oblasti a jejich přidružený stav zabezpečení. (Zdroj kódu: STMicroelectronics)

IDAU a SAU pracují společně, aby určily, zda je paměťové místo přístupné. Protože procesor pracuje s paměťovým aliasem odpovídajícím jeho zabezpečenému / nezabezpečenému provoznímu stavu, bezpečnostní atribut generovaný kombinací IDAU a SAU zajišťuje přístupnost do oblastí s odpovídající úrovní zabezpečení (obrázek 5).

Obrázek 5: V procesoru LPC55S69JBD100K od NXP se IDAU a SAU kombinují, aby vytvořily atribut zabezpečení pro každý alias paměti. Tím se účinně zablokuje kód, který nemá práva na spuštění z určité oblasti paměti. (Zdroj obrázku: NXP Semiconductors)

Například pokud procesor PC55S69JBD100K pracuje v zabezpečeném režimu, bezpečnostní atribut generovaný IDAU a SAU zabrání přístupu k nezabezpečeným aplikacím, čímž účinně eliminuje spuštění nezabezpečeného kódu. A naopak, když procesor pracuje v nezabezpečeném režimu, bezpečnostní atribut IDAU a SAU účinně eliminuje zabezpečené aplikace.

Nastavení oprávnění a řízení přístupu

Zatímco IDAU a SAU přímo provádějí omezení, současně spolupracují s jednotkami zabezpečené a nezabezpečené paměti (MPU), aby určily jejich přístupová práva (obrázek 6).

Obrázek 6: U procesorů TrustZone, jako jeNXP LPC55S69JBD100K se atribut zabezpečení generovaný SAU a IDAU kombinuje s nastaveními MPU, aby se dosáhla vyšší úroveň zabezpečení. (Zdroj obrázku: NXP Semiconductors)

MPU je integrovaný přímo do procesoru a poskytuje jemnější kontrolu přístupu k paměťovým oblastem. Například v STM32L552VET6 podporuje MPU řadu přístupových práv, která se liší, když je procesor spuštěn v režimu handler nebo v režimu thread (tabulka 1).

Tabulka 1: STM32L552VET6 od STMicroelectronics umožňuje používat své MPU k definování různých úrovní přístupu, které fungují odlišně v privilegovaném (handler) a neprivilegovaném (thread) režimu. (Zdroj tabulky: STMicroelectronics)

Mezi těmito atributy je také atribut Execute Never (XN), který zajišťuje, aby se procesor nikdy nepokoušel vykonat kód z přidružené paměťové oblasti, čímž poskytuje další úroveň runtime ochrany. Například v systémech provozujících kód přímo z flash paměti lze nastavit atribut XN tak, aby se nikdy nepoužila paměť SRAM. Tím se vyloučí jakákoli možnost ohrožení systému, i když by se v paměti SRAM vyskytoval škodlivý kód (malware).

Rozšíření ochrany na další periferie a paměť

Procesory LPC55S69JBD100K a STM32L552VET6 využívají další atributy pro řízení procesů na periferiích. STM32L552VET6 doplňuje nativní mechanismus TrustZone vlastním globálním kontrolérem TrustZone (GTZC) navrženým na ochranu periferií, vestavěných SRAM a externích pamětí (obrázek 7).

Obrázek 7: Procesor STM32L552VET6 má integrován globální řadič TrustZone (GTZC), který rozšiřuje bezpečnostní ochranu na periferie a paměť, které nejsou součástí nativního rámce TrustZone. (Zdroj obrázku: STMicroelectronics)

V LPC55S69JBD100K od NXP jsou atributy HPRIV a HNONSEC přenášeny přes interní sběrnici Advanced High-Performance Bus (AHB), aby bylo dosaženo ochrany paměti (MPC - Memory Protection Checkers), periferie (PPC - Peripheral Protection Checkers) a hlavního systému (MSW  Master Security Wrappers) (obrázek 8).

Obrázek 8: V procesoru LPC55S69JBD100K je možné úrovně oprávnění a zabezpečení přenést na další hardwarové jednotky jako jsou periferie. (Zdroj obrázku: NXP Semiconductors)

STMicroelectronics poskytuje vývojové desky STM32L552E-EV a NUCLEO-L552ZE-Q, které jsou vhodné pro vývoj aplikací založených na procesorech STM32L5. Integrované vývojové prostředí (IDE) STM32CubeIDE poskytuje komplexní prostředí pro programování software a jeho programátor STM32CubeProgrammer nabízí jak grafické uživatelské rozhraní (GUI), tak i rozhraní s příkazovým řádkem (CLI) pro programování interních a externích pamětí. Pomocí tohoto nástroje lze definovat zabezpečené oblasti v paměti Flash (obrázek 9).

Obrázek 9: Programátor STM32CubeProgrammer od STMicroelectronics nabízí jednoduché definování bezpečných oblastí v paměti flash. (Zdroj obrázku: STMicroelectronics)

Pro rychlý vývoj systémů založených na procesorech LPC55S69 od NXP mohou vývojáři začít vyvíjet své aplikace na vývojové desce LPC55S69-EVK. Pro konfiguraci systému a programování poskytuje NXP komplexní platformu MCUXpresso IDE.

Závěr

Zabezpečení internetu věcí závisí na základních bezpečnostních mechanismech jako je kryptografie, bezpečné úložiště a bezpečné spouštění aplikace a aktualizace firmware. Ochrana systému musí být komplexní a musí být silná i v runtime režimu, jelikož během provozu přibývá stále více útoků. Mezi těmito útoky je například vyvolání přetečení, aby se škodlivý kód dostal do příslušné paměti a procesor tento kód spustil a otevřel další vrátka k mnohem větším útokům. Tomu se dá zabránit vícestupňovou ochranou, která přiděluje priority a práva jednotlivým procesům, a tím zamezí přístup do jednotlivých oblastí paměti. To je jeden z mála mechanismů, které činní embeded zařízení odolné vůči hackerským útokům.

Článek vyšel v originále  na webu DigiKey.com, autorem je Stephen Evanczuk.

Hodnocení článku: