14.3.4. Napomena o zaštiti od čitanja flash memorije¶
Po isporuci, ugrađeni program (firmware) na isporučenoj OpenMV kameri moguće je pročitati svakome tko ima fizički pristup uređaju. Napadač koji drži kameru u ruci može spojiti SWD sondu na priključak za otklanjanje pogrešaka, komunicirati s MCU-ovim sučeljem za otklanjanje pogrešaka i izvući flash memoriju – što uključuje svaki zamrznuti Python modul i sadržaj ROMFS particije. Standardni OpenMV firmware ne omogućuje zaštitu od čitanja flash memorije prema zadanim postavkama.
Ova stranica to dokumentira eksplicitno kako bi tim koji isporučuje proizvod znao gdje leži odgovornost.
14.3.4.1. Što kamera radi prema zadanim postavkama¶
Kamerin pokretač (bootloader) i izvršno okruženje ne uključuju nikakvu značajku zaštite od čitanja temeljnog MCU-a. Sučelje za otklanjanje pogrešaka ostaje otvoreno, flash memorija ostaje čitljiva, a build se izvodi onako kako se izvodi na razvojnom stolu. To je ispravna zadana postavka za publiku ovog tutorijala – kamera koja se isporučuje s uključenom zaštitom od čitanja je kamera koja se ne može ponovno programirati putem IDE-a, ne može se ponovno imageirati nakon neuspjele implementacije i ne može je spasiti nitko osim razvojnog tima.
Kompromis se mijenja kada kamera prijeđe iz „razvojnog uređaja” u „proizvod”. Proizvod čija vrijednost ovisi o tome da aplikacijski kod ostane privatan mora sam omogućiti zaštitu; OpenMV firmware to ne čini.
14.3.4.2. Što radi proizvodni tim¶
Svaki proizvođač MCU-a nudi mehanizam zaštite od čitanja. Detalji se razlikuju – osigurači na razini bitova, jednokratni prijelazi životnog ciklusa, potpisani flash imageovi – ali zajednički oblik je:
Bit (ili skup bitova) specifičan za proizvođača trajno se upisuje u silicij, obično putem alata proizvođača koji posljednji put komunicira s MCU-ovim priključkom za otklanjanje pogrešaka.
Nakon upisa, priključak za otklanjanje pogrešaka odbija čitati flash memoriju. Kamera se i dalje pokreće i izvodi aplikaciju; samo više ne izlaže svoj sadržaj sondi.
Upis je nepovratan. Ne postoji način da se kamera vrati u stanje u kojem se može otklanjati pogreške bez njezina uništavanja.
Postavljanje ovoga specifično je za MCU, a koraci ovise o dijelu na kameri koji se štiti. Referentni priručnik proizvođača je izvor istine; podrška proizvođača je kanal za ispravnu izvedbu na proizvodnoj liniji.
Ovo je lakši dio.
Teži dio je zatvaranje svakog drugog puta koji napadač ima do izvođenja koda na kameri ili čitanja onoga što aplikacija radi. Zaštita od čitanja samo sprječava sondu za otklanjanje pogrešaka da izvuče flash memoriju. Kamera i dalje mora zatvoriti:
MicroPython REPL. REPL spojen putem USB-a prihvaća proizvoljni Python. Zaštita od čitanja to ne mijenja. REPL sesija može čitati RAM, pozivati funkcije, izvući sve što izvođena aplikacija može vidjeti – zapravo, dostupan REPL zaobilazi sve što zaštita od čitanja pruža. Onemogućavanje pristupa REPL-u promjena je u buildu firmwarea koju posjeduje proizvodni tim.
Učitavanje skripte iz IDE-a. IDE-ov put „pokreni ovu skriptu na kameri” koristi istu površinu USB protokola kao i REPL. Zatvaranje REPL-a zatvara i ovo; ostavljanje bilo kojeg od njih otvorenim ostavlja kanal za izvođenje proizvoljnog koda u kameru.
Otimanje ulazne točke iz datotečnog sustava. Već zatvoreno kada se aplikacija isporučuje putem Zamrzavanje skripti u ugrađeni program (firmware) – izvršno okruženje razrješava zamrznute
boot.pyimain.pyprije bilo kakvog kopiranja iz datotečnog sustava, tako da ih ništa stavljeno na flash ili SD ne može nadjačati. Ova zaštita je besplatna jednom kada je aplikacija u buildu.Vanjska flash memorija na novijim kamerama. Kamere koje pohranjuju aplikacijski image u vanjsku flash memoriju stavljaju taj image na čip koji je vidljiv na PCB-u; čip se može odlemiti i izravno pročitati standardnim alatima, ili pročitati na mjestu sondiranjem sabirnice. Njegova zaštita zahtijeva uključivanje hardvera na čipu koji dešifrira sadržaj flash memorije tijekom čitanja, generiranje ključa za šifriranje, dodavanje tog ključa na kameru i njegovo nepovratno upisivanje u MCU-ovu jednokratno programabilnu pohranu. Svaka od tih radnji zasebna je jednokratna operacija, a bilo koja od njih izvedena pogrešno na proizvodnoj jedinici uništava tu jedinicu.
Svaka stavka na ovom popisu vlastiti je niz posla na buildu firmwarea, koraka na proizvodnoj liniji i nepovratnih upisa. Stvarni zaključani proizvod prilagođeni je build firmwarea, prilagođeni pokretač (bootloader), proizvodni tok koji dodaje ključeve po jedinici i skup testova koji dokazuju da je brava stvarno zatvorena prije nego što jedinica napusti liniju. To su mjeseci posla, ne dani, a nepovratnost znači da greške koštaju jedinica.
Zašto je zadano stanje otvoreno
Ovaj popis je također razlog zašto se standardni OpenMV firmware isporučuje bez omogućene zaštite od čitanja. Kamera sa zatvorenim REPL-om, onemogućenim učitavanjem skripte iz IDE-a i zaključanim firmwareom je kamera na kojoj se uopće ne može razvijati – radni tok koji čini OpenMV kamere upotrebljivima na prvome mjestu jednostavno bi nestao. Zadano stanje ostavlja sve otvorenim; proizvodni tim bira koje dijelove zatvoriti na putu do isporučene jedinice.
14.3.4.3. Što fizički pristup i dalje pruža¶
Čak i s uključenom zaštitom od čitanja, napadač koji drži kameru može učiniti poprilično mnogo:
Ponoviti mrežni promet kamere prisluškivanjem njezinih izlaza.
Promatrati njezino vidljivo ponašanje i zaključiti kako reagira na ulaze.
U nekim slučajevima, povratiti tajne putem napada ubacivanjem grešaka (fault-injection) ili napada bočnim kanalima (side-channel) specijaliziranih protiv zaštićenog MCU-a.
Zaštita od čitanja podiže trošak dolaska do izvornog koda aplikacije. Ne uklanja trošak. „Fizički pristup = kompromitacija” je radna pretpostavka od koje bi sigurnosna provjera trebala krenuti; mehanizam zaštite samo odlučuje koliko ta kompromitacija košta u vremenu i opremi.
14.3.4.4. S čime se OpenMV firmware isporučuje¶
Sažetak, da bude konkretno:
Zaštita od čitanja nije omogućena prema zadanim postavkama.
Nema build zastavice u standardnom firmwareu koja je uključuje.
Nema API-ja na razini aplikacije koji se može pozvati iz MicroPythona.
Proizvod kojem je potrebna zaštita isporučuje prilagođeni firmware. Ta prilagodba živi u pokretaču (bootloaderu) ploče i proizvodnom toku, te je izvan OpenMV baze koda. Timovi koji ovo rade prvi put trebali bi to planirati u razvojnom vremenskom okviru kao zaseban dio posla, a ne kao nešto što se dodaje na kraju – nepovratnost čini „dodaj kasnije” skupim.