14.3.4. Poznámka k ochraně proti čtení obsahu flash paměti

Ve výchozím stavu je firmware na dodávané OpenMV cam čitelný pro každého, kdo má k zařízení fyzický přístup. Útočník, který má kameru v ruce, může připojit SWD sondu k ladicímu konektoru, komunikovat s ladicím rozhraním MCU a vyčíst flash paměť – která zahrnuje každý zamrazený Python modul i obsah ROMFS oddílu. Standardní firmware OpenMV neaktivuje ochranu proti čtení flash paměti ve výchozím nastavení.

Tato stránka to dokumentuje explicitně, aby tým dodávající produkt věděl, kde leží odpovědnost.

14.3.4.1. Co kamera dělá ve výchozím nastavení

Bootloader a běhové prostředí kamery nezapínají žádnou funkci ochrany proti čtení v základním MCU. Ladicí rozhraní zůstává otevřené, flash paměť zůstává čitelná a sestavení běží stejně jako na pracovním stole vývojáře. To je správné výchozí nastavení pro publikum tohoto návodu – kamera, která se dodává se zapnutou ochranou proti čtení, je kamera, kterou nelze přeflashovat přes IDE, nelze ji znovu naimagovat po nepovedeném nasazení a nemůže ji zachránit nikdo kromě sestavovacího týmu.

Tento kompromis se mění, když kamera přechází z „vývojářského zařízení“ na „produkt.“ Produkt, jehož hodnota závisí na tom, že aplikační kód zůstane soukromý, musí ochranu aktivovat sám; firmware OpenMV to neudělá.

14.3.4.2. Co dělá produktový tým

Každý výrobce MCU nabízí mechanismus ochrany proti čtení. Detaily se liší – bitové pojistky, jednorázové přechody životního cyklu, podepsané flash image – ale společný tvar je následující:

  • Bit (nebo sada bitů) specifický pro výrobce se zapíše do křemíku, obvykle pomocí nástroje výrobce, který naposledy komunikuje s ladicím portem MCU.

  • Po zápisu ladicí port odmítne číst flash paměť. Kamera se stále spustí a běží aplikace; jen už nevystavuje svůj obsah sondě.

  • Zápis je nevratný. Neexistuje způsob, jak kameru vrátit do laditelného stavu bez jejího zničení.

Nastavení tohoto je specifické pro MCU a kroky závisí na chráněné součástce na kameře. Referenční příručka výrobce je zdrojem pravdy; podpora výrobce je kanál pro správné provedení na výrobní lince.

To je ta snadná část.

Tou těžkou částí je uzavření každé další cesty, kterou má útočník ke spuštění kódu na kameře nebo ke čtení toho, co aplikace dělá. Ochrana proti čtení zabrání pouze ladicí sondě vyčíst flash paměť. Kamera stále musí uzavřít:

  • MicroPython REPL. REPL připojený přes USB přijímá libovolný Python. Ochrana proti čtení to nemění. Relace REPL může číst RAM, volat funkce, exfiltrovat cokoli, co běžící aplikace vidí – v podstatě dostupný REPL obejde vše, co ochrana proti čtení přináší. Zakázání přístupu k REPL je změnou v sestavení firmwaru, kterou vlastní produktový tým.

  • Nahrávání skriptu z IDE. Cesta IDE „spusť tento skript na kameře“ jede po stejném povrchu USB protokolu jako REPL. Uzavření REPL uzavře i toto; ponechání kteréhokoli z nich otevřeného ponechává kanál pro spouštění libovolného kódu do kamery.

  • Únos vstupního bodu ze souborového systému. Již uzavřeno, když je aplikace dodávána prostřednictvím Zmrazení skriptů do firmwaru – běhové prostředí vyhodnocuje zamrazené boot.py a main.py před jakoukoli kopií ze souborového systému, takže nic uložené na flash nebo SD je nemůže přepsat. Tato ochrana je zdarma, jakmile je aplikace v sestavení.

  • Externí flash paměť na novějších kamerách. Kamery, které ukládají aplikační image v externí flash paměti, umisťují tento image na čip ležící na očích na PCB; čip lze odpájet a přečíst přímo běžně dostupnými nástroji, nebo jej přečíst na místě sondováním sběrnice. Jeho ochrana vyžaduje zapnutí hardwaru na čipu, který dešifruje obsah flash paměti během čtení, vygenerování šifrovacího klíče, jeho nahrání do kamery a nevratné vypálení do jednorázově programovatelného úložiště MCU. Každá z těchto operací je samostatná jednorázová operace a jakákoli z nich provedená špatně na produkční jednotce tuto jednotku znehodnotí.

Každá položka tohoto seznamu je svým vlastním souborem práce na sestavení firmwaru, kroků na výrobní lince a nevratných zápisů. Skutečně uzamčený produkt je přizpůsobené sestavení firmwaru, přizpůsobený bootloader, výrobní postup, který provisioning klíčů provádí pro jednotlivé jednotky, a sada testů, které prokazují, že je zámek skutečně uzavřený, než jednotka opustí linku. To je práce na měsíce, nikoli na dny, a nevratnost znamená, že chyby stojí jednotky.

Proč je výchozí stav otevřený

Tento seznam je také důvodem, proč se standardní firmware OpenMV dodává bez zapnuté ochrany proti čtení. Kamera s uzavřeným REPL, zakázaným nahráváním skriptu z IDE a uzamčeným firmwarem je kamera, na které se vůbec nedá vyvíjet – pracovní postup, který kamery OpenMV vůbec dělá použitelnými, by prostě zmizel. Výchozí stav ponechává vše otevřené; produktový tým si vybírá, které části na cestě k dodávané jednotce uzavřít.

14.3.4.3. Co fyzický přístup stále přináší

I se zapnutou ochranou proti čtení může útočník, který drží kameru, udělat docela dost:

  • Přehrávat síťový provoz kamery odposlechem jejích výstupů.

  • Pozorovat její viditelné chování a odvodit, jak reaguje na vstupy.

  • V některých případech získat tajemství pomocí útoků injektáží chyb nebo postranními kanály specializovanými proti chráněnému MCU.

Ochrana proti čtení zvyšuje cenu za získání zdrojového kódu aplikace. Neeliminuje tuto cenu. „Fyzický přístup = kompromitace“ je pracovní předpoklad, ze kterého by mělo vycházet bezpečnostní hodnocení; ochranný mechanismus jen rozhoduje, kolik tato kompromitace stojí v čase a vybavení.

14.3.4.4. S čím se firmware OpenMV dodává

Souhrn, aby to bylo konkrétní:

  • Žádná ochrana proti čtení není ve výchozím nastavení zapnuta.

  • Ve standardním firmwaru není žádný příznak sestavení, který by ji zapnul.

  • Žádné API na úrovni aplikace, které by se dalo volat z MicroPython.

Produkt, který potřebuje ochranu, dodává přizpůsobený firmware. Toto přizpůsobení žije v bootloaderu desky a ve výrobním postupu a je mimo kódovou základnu OpenMV. Týmy, které to dělají poprvé, by to měly naplánovat do vývojového harmonogramu jako samostatný kus práce, nikoli jako něco, co se přidá na konci – nevratnost dělá „přidat to později“ nákladným.