Käänteinen suunnittelu eli reverse engineering on valitettavan yleistä nykyään. Suunnittelijoille on kuitenkin olemassa keinoja, joiden avulla piirien salat saadaan piilotettua erittäin tiukasti.
Artikkelin kirjoittaja Sachin Gupta on työskennellyt Cypress Semiconductorin Intian yksikössä vuodesta 2008 lähtien ensin sovellusinsinöörinä ja keväästä 2012 lähtien tuotemarkkinoinnissa. Hänellä on elektroniikka- ja tietoliikenneinsinöörin tutkinto Vaishin teknisestä instituutista, sekä jatko-opintoja Guru Gobind Singh Indraprastha- ja Bharati Vidyapeeth -yliopistoista. |
Yhtiön tulevaisuus riippuu älyllisen omaisuuden (IP, intellectual property) luomisesta ja menestyksekkäästä puolustamisesta, mikä vaatii sekä innovaatioita että kovaa työtä. Esimerkiksi sulautettujen järjestelmiä valmistavalle yritykselle IP voi tuoda tuoda uusia, kilpailijoista erottavia tuotteita. IP on laaja käsite. Se kattaa erityisen ongelman ratkaisemisen uudenlaisella menetelmällä ja järjestelmän tai laitteiston firmware-toteutuksen, kuten signaaliketjun tai -lähdön ohjauksen innovatiivisella menetelmällä, joka erottaa tuotteen muista.
IP-turvallisuus on iso haaste, sillä jokainen tuote edellyttää suurta määrää tutkimusta ja tuotekehitystä sekä innovointia. Uudet markkinoille tulevat tuotteet ovat käänteisen suunnittelun (reverse engineering) ulottuvilla - mikä voi merkittävästi vaikuttaa tuotteen liikevaihtoon, jos kilpailija kopioi suunnittelun.
Sulautettujen järjestelmie IP-turvallisuudesta tulee ensimmäiseksi mieleen firmware-ohjelmisto mikro-ohjaimella. Ohjaimen kohdalla moni järjestelmäsuunnittelija lopettaa keskustelun siihen paikkaan. Mutta entäpä rauta? Jotkut yrittävät piilottaa sen toteutuksen eri tavoilla. Missään sulautetussa järjestelmässä pelkkä firmware ei ole koko järjestelmä. Se sisältää myös paljon laitteistoa (kuva 1).
Kuva 1: Sulautettu järjestelmä
Tätä laitteistoa käytetään vuorovaikutuksessa ulkoisten oheislaitteiden kanssa aistimaan erilaisia syöttöjä, tuottamaan lähtöjä ja myös signaalinkäsittelyyn. Ajatellaanpa vaikka sähköpyörän ohjausjärjestelmää. Kuva 2 näyttää yhden tällaisen järjestelmien mahdollisen toteutuksen.
Kuva 2. Sähköpyörän ohjausjärjestelmä.
Kuten kuvasta 2 näkyy, mikro-ohjaimelle kirjoitettu firmware-ohjelmisto ottaa yleensä syötteinä esimerkiksi väyläjännitteen, nopeuskomennon, sekä käsittelee signaalia ja muuntaa sen digitaaliseksi. Sen jälkeen ohjelmisto tekee erilaisia laskutoimituksia ja muotoilee päätöksiä ohjaimelle kirjoitetun firware-ohjelmiston perusteella - hallitse esimerkiksi moottoria ja ledilähtöjä.
Sulautetun järjestelmän IP-tietoturva voidaan laajasti ottaen jakaa kahteen osaan:
- Suojaaminen firware-ohjelmistoon auktorisoimatonta pääsyä vastaan
- Analogisten ja digitaalisten resurssien ja niiden välisen liitännän piilottaminen
Firmware-ohjelmiston suojaaminen
Eri mikro-ohjaimissa käytetään erilaisia tapoja suojata flash-muistiin tallennetua koodia luvatonta käyttöä vastaan. Jotkut eivät tuo minkäänlaista suojaa. Korkeammalla tasolla kaikki ratkaisut liittyvät lukemisen estämiseen flash-muistista. Jotkut ohjaimet estävät lukemisen ja kirjoittamisen koko flash-muistijärjestelmään. Tämä tekee käynnistyslataimen (bootloader) lisäämisen lopputuotteeseen mahdottomaksi. Jos järjestelmään pitää asentaa käynnistyslatain ja IP-suojaus on tärkeää, pitää järjestelmän suunnittelijan valita sopiva mikro-ohjain.
Jotkut mikro-ohjaimet jakavat flash-muistin lohkoihin, joissa jokaisessa suojaus toteutetaan eritasoisesti. Tällaisissa laitteissa on mahdollista toteuttaa käynnistylohko ja silti saavuttaa korkea suojaustaso. Esimerkiksi PSoC1-piireissä suojaus on mahdolista tehdä monin eri tavoin.
- Suojaamaton moodi
- Tehdaspäivitysmoodi
- Kenttäpäivitettävä moodi
- Täyden suojauksen moodi
Valittu suojaustapa ladataan haihtumattomiin bitteihin ohjelmoinnin aikana, eikä sitä voi ajonaikana muuttaa. Tämä estää suojaustason muuttamisen vahingossa, eikä mahdollinen hyökkääjä voi muokata firmware-ohjelmistoa kirjoittamalla erityiskoodia flashin suojaamattomaan osioon.
“Suojaamattomassa” tilassa kaikki ulkoiset ja sisäiset kirjoitukset ja datanluvut on sallitty. Tätä moodia on hyvä käyttää kehitysvaiheessa, kun laitetta/piiriä ei tarvitse antaa kellekään kolmannelle osapuolelle. Tätä moodia ei pitäisi kuitekin käyttää tuotantolaitteissa.
“Tehdaspäivitysmoodi” on hyödyllinen järjestelmissä, joissa ulkoisen ohjelmoijan pitää päivittää yksittäisiä flash-lohkoja. Tämä suojaustapa ei salli ulkoisia lukuja. Sen sijaan ulkoiset kirjoittamiset, sisäiset lukemiset ja sisäiset kirjoittamiset ovat sallittuja. Jos jokin tietty lohko pitää päivittää ulkoisen ohjelmoijan toimesta niin, ettei koko muistia pyyhitä tyhjäksi, kannattaa käyttää tätä moodia. Yksi esimerkki, jolloin tämä moodi on hyödyllinen, on järjestelmä jonka asiakas tai asennustiimi joutuu kalibroimaan, ja kalibrointidara pitää tallentaa flashiin. Vaikka tämä päivittäminen on hyvin hyödyllistä tällaisessa järjestelmässä, pitää sitä välttää mikäli on mahdollista käyttää korkeamman turvallisuuden moodia. Syynä on suojauksen puute ulkoista kirjoittamista vastaan. Jos joku sijoittaa koodin päivitettävälle alueella flashin lukeakseen, se tekee IP:stä suojaamattoman. Näissä laitteissa tämä turvallisuustaso voidaan osoittaa vain tiettyihin lohkoihin ja muille voidaan toteuttaa korkeammat vaatimukset. Pitää varmistua siitä, että vain ei-kriittistä koodia tallennetaan näihin lohkoihin.
“Kenttäpäivitettävä moodi” estää ulkoiset kirjoitukset ja lukemiset ja sallii sisäiset kirjoitukset ja luvut. Ohjelmointiliitännästä ei ole mahdollista kirjoittaa tai lukea flash-muistia. Tämä moodi sopii parhaiten järjestelmiin, jotka vaativat käynnistyslataimen tukea. Käynnistyslataimella varustetuissa sulautetuissa järjestelmissä käynnistysohjelma vastaanotta kirjoitettavan flash-datan tietoliikenneprotokollalla ja sen jälkeen kirjoittaa sen flashille sisäisellä ohjelmalla. Samoin lukuoperaatio tapahtuu sisäisten käskyjen avulla. Näin flash luetaan vain mikäli käynnistyslatain pyytää sitä. Käynnistysohjelma voidaan tallentaa lohkoihin, joiden turvallisuustaso on korkeampi (Full protection mode), joten itse ohjelmaa ei voida muokata. Käynnistylatainyhteyteen voidaan lisätä salaus, mikä osaltaan vähentää mahdollisuuksia lukea flashista.
“Täyden suojauksen moodi” (Full protection) on ihanteellinen tuotantoon, mikäli flash-lohkoja ei tarvitse päivittää kentällä tai mikäli sisäisiä ohjelmia ei tarvitse käyttää. Tämä moodi estää pääsyn flashiin millä tahansa tavalla. Sisäiset ja ulkoiset kirjoitukset ja luvut ovat kaikki estettyjä.
Järjestelmäsuunnittelijan täytyy asettaa sopivan suojaustason, kun hän luo tuotantovalmiisiin järjestelmiin ohjelmoitavaa hex-tiedostoa. Suunnittelijan täytyy pohtia kaikkia mahdollisia tapoja toteuttaa mahdollisimman korkeatasoinen IP-suojaus.
Jotkut laitevalmistajat laittavat tervaa tai epoksia piirikortille, jotta komponenttinumeroita olisi vaikeampi lukea. Suurivolyymisissä järjestelmissä voi mikropiireille saada asiakaskohtaiset osanumerot, mikä tekee oikeiden numeroiden löytämisestä hankalampaa. Mikää näistä menetelmistä ei ole idioottivarma. Ainoa tapa piilottaa erilaiset oheislaitteet ja niiden liitännät on piilottaa ne fyysisesti. Jos pystyy esimerkiksi piilottamaan kaikki liitännät piirin sisälle, signaalipolkujen ymmärtäminen on vaikeampaa ja käytettyjen oheislaitteiden määrittely samoin. Ja koska oheislaitteiden integrointi samalle sirulla aittaa piilottamaan laiteinformaatiota, SoC-järjestelmäpiirit ovat paras keino suojautua käänteiseltä suunnittelulta. Joissakin SoC-piireissä n dedikoituja nastoja, jotka muodostavat käänteisen suunnittelun porsaanreiän: kun piirillä on dedikoitu nasta oheislaitteelle, on helppoa tietää mitä oheislaitetta käytetään. Tämän takia sellaisen SoC-piirin käyttäminen, jonka reitittäminen on joustavaa ja jossa mikä tahansa oheislaite voidaan liittää mihin tahansa nastaan, tuo paremman suojan kääntesitä suunnittelua vastaan.
Kolme eri suojaustason toteutusesimerkkiä sähköpolkupyörälle on esitetty kuvissa 3(a), 3(b) ja 3(c).
Kuva 3(a). Yksittäisiin komponentteihin perustuva toteutus.
Kuva 3(b). SoC, jossa dedikoituja oheislaitenastoja.
Kuva 3(c). SoC, jossa toteutus perustuu joutavaan I/O-reititykseen.
Mikäli suunnittelijalle annetaan nämä kolme piirikorttia käänteiseen suunnitteluun, minkä salat hän avaa nopemmin? Ilmeinen vastaus näkyy kuvassa 3(a), koska siinä kaikki näkyy suunnittelijalle piirikortilla. Kuvassa 3(b) näkvyän toteutuksen “avaaminen” vie pidemmän aikaa, mutta toteutuksesta on silti mahdollista saada korkean tason kuvaus. Kuvan 3(c) toteutusta on erittäin vaikeata tai oikeastaan mahdotonta määritellä, koska kyse on enemänkin mustasta laatikosta, joka hyväksyy tiettyjä syöttöjä ja tuottaa tiettyjä tuotoksia. Järjestelmässä toteutettua analogista signaaliketjua ei voi selvittää, koska järjestelmässä mikä tahansa oheislaite voidaan liittää mihin tahansa nastaan, ja sisäisesti oheislaitteet voivat liittyä toisiinsa täysin ilman fyysistä nastaa. Lisäksi suojauksen logiikkaa ei voida päätellä, koska ohjelmoitavalla logiikalle ei ole erikseen määriteltyä, dedikoitua nastaa.
Ainoa keino avata tämä ratkaisu käänteisellä suunnittelulla on lukea rekisterit, jotka päättävät oheislaitteiden ja nastojen väliset liitännät. Tämä taasen edellyttää vaativaa prosessia, jossa päästään lukemaan flash-muisti. Mikäli flashin suojaus voidaan murtaa tai mikäli järjestelmäsuunnittelija unohtaa vaadittavan flash-suojauksen, voidaan piiristä päätellä signaaliketju jossa oheislaitteissa on kiinteät osoitteet kuten useimmissa mikro-ohjaimissa.
Esimerkki piiristä, joka tuo tässä ympäristössä parhaan mahdollisen suojauksen on Cypressin PSoC 1. Piiri hyödyntää geneerisiä analogisia ja digitaalisia lohkoja ohjelmoitavalla reitityksellä. Oheislaite voidaan toteuttaa samaan geneeriseen lohkoon. Esimerkiksi ohjelmoitavaa analogista lohkoa voidaan käyttää toteuttamaan ohjelmoitava vahvistin, AD-muunnin, komparaattori, suodin tai jopa kapasitiivinen anturilohko. Ohjelmoitava digitaalinen lohko voidaan konfiguroida ajastimeksi, laskimeski UART-liitännäksi, PRS-generaattoriksi tai jopa SPI-väyläksi. Mikä tahansa näistä lohkoista voidaan liittää mihin tahansa nastaan. Kaikki tämä määritellään rekisteribiteillä, jotka sitten tallenetaan flahsiin ja ladataan käynnistysjakson aikana. Näiden arvojen sijainti tallennetaan flashiin: ne eivät ole kiinteitä, ohjelmasta riippuvia. Järjestelmänsuunnittelija voi myös muuttaa bittien sijaintia missä tahansa kääntämisen vaiheessa. Arvoja voidaan muuttaa ajonaikaisesti, jolloin lohkoja rekonfiguroidaan toimimaan eri oheislaitteina. Esimerkiksi ohjelmoitavaksi vahvistimeksi konfiguroitu lohko voidaan käynnistyksen yhteydessä uudelleenkonfiguroida toimimaan vaikkapa komparaattorina tai AD-muuntimena. Tämäm takia näille piireille pohjautuvien suunnittelujen laiteresursseja on lähes mahdotonta avata käänteisellä suunnittelulla.
Kun käänteinen suunnittelu on nykyään niin tavallista, minkä tahansa tuotteen menestymiseksi IP-suojaustoiminnot täytyy lisätä järjestelmään, jotta IP:n luvaton käyttö estetään. On ehdottoman tärkeätä piilottaa selä laite- että firmware-toteutus mahdollisimman korkean suojauksen saavuttamiseksi. Eri mikro-ohjainvalmistajat tarjoavat erilaisia metodeja, joilla flashia suojataan epätoivotuilta luku- ja kirjoitusjaksoilta, joten ennen piirin valintaa suunnittelijan täytyy arvioida piirien turvatekniikoita ja niiden tehokkuutta. SoC-piiri ohjelmoitavine resursseineen ja ohjelmoitavine reitityksineen abstrahoi järjestelmän alhaisen tason toteutuksen ja näyttää kilpailijalle vain mustan laatikon, jota on lähes mahdotonta avata käänteisen suunnittelun keinoin.