A végfelhasználói eszközök piacán a változások őrületes sebességgel történnek, az innováció gyorsulásában megtorpanás jelei egyáltalán nem láthatóak. Életünket alapvetően határozzák meg az internetképes eszközök és szociális központú szolgáltatások új generációi – elég, ha csak a hangvezérelt okosotthonokra vagy arra a több száz szenzoros hálózatra gondolunk, amely gondoskodik az otthonainkul szolgáló városok forgalmának optimálisabbá tételéről. A hálózatképes eszközök tömeges terjedése azonban különböző biztonsági és személyiségijog-védelmi kérdéseket vet fel.
A szoftverbiztonság kérdése manapság mindenhol felbukkan, amelyről egyetlen szervezetnek sem tanácsos megfeledkezni vagy félvállról venni. A beágyazott szoftverek fejlesztésének első számú programnyelve továbbra is a C a végfelhasználói termékeknél, azonban megfigyelhető a C++ növekedő népszerűsége. Cikkünkben összehasonlítjuk a mai legkorszerűbb kódolási szabványokat, és elmagyarázzuk, hogy követésükkel hogyan lehet biztonságosabb C és C++ nyelvű programkódot fejleszteni. A teljes szoftverbiztonság eléréséhez nem vezetnek kiskapuk, a benne rejlő veszélyek kiiktatásához azonban összehangolt erőfeszítésekre és a legjobb iparági irányelvek alkalmazására van szükség.
A biztonságos szoftverek fejlesztését támogató kódolási szabványok
A biztonsági szempontból kényes (vagy kritikus) szoftverek fejlesztéséhez kódolási szabványt követni manapság elterjedt gyakorlatnak számít, azonban a biztonsági kérdésekre megoldásokat szolgáltató kódolási szabványok még relatíve újabb keletűek. A szoftverbiztonsági szabványok iránti igény az Internet of Things (IoT)-alkalmazások terjedésével jelentősen nőtt, hiszen már elég korán bebizonyosodott, hogy az adatbiztonság és az eszközök hálózati kapcsolata biztonsági szempontból aligha nevezhető elégségesnek. Nem kell az időben túlságosan visszamenni és nagyon mélyre ásni ahhoz, hogy valódi példákat találjunk, elég, ha csak például a TrendNet kameráinak feltörésére vagy a Nest termosztátok balul sikerült szoftverfrissítésére gondolunk. A biztonsági hibák nemcsak veszélyt jelenthetnek a felhasználóra, hanem jelentősen rombolhatják is az érintett gyártók/szolgáltatók hírnevét és ezzel piaci megítélését. A biztonság tehát minden lényeges szempontból nézve alapvető fontosságú.
A biztonsági kérdések fontosságának megítélése az elmúlt években jelentősen nőtt az elektronikai iparban, ami egyebek mellett új, biztonságra fókuszáló kódolási szabványokat és üzembiztonsági szabványokat hívott életre, amelyek alapvető céljai nem teljesen ugyanazok, mégis sok ajánlás átlapolódását figyelhetjük meg a kettő között.
A cikkünkben tárgyalt kódolási szabványok többsége szabályokat tartalmaz, amelyek a szabványalkotó testület meglátása szerint helytelen programnyelv-gyakorlatok megkerülésére, ill. mellőzésére irányulnak, illetve ajánlásokat tartalmaznak a fejlesztés elősegítésére és a nyelv hatékonyságának növelésére. Néhány esetben új nyelvet írnak le, amelyek célja természetesen a biztonság, kiszámíthatóság, robusztusság és kezelhetőség mindenekfelett.
Napjaink legfőbb biztonsági szempontú kódolási szabványai a CERT C Secure Coding Standard, a MISRA C:2012, illetve a C Secure Coding Rules (ISO/IEC TS 17961:2013).
A kódolási szabványok összehasonlítása
A cikkben sorra vett kódolási szabványok hatékony összehasonlítása érdekében kilenc összehasonlítási szempontot állapítottunk meg, amelyek közül némelyik kvalitatív módon ad értékelést az egyes szabványok teljesítőképességére nézve. Az 1–3 csillaggal értékelő teljesítőképességi indikátor a PRQA által gyűjtött tapasztalatokra és ügyfelektől szerzett benyomásokra épül, amelyek közvetlenül engednek következtetni a hivatalos szabványok értékére.
A szabványok értékelésénél az alábbi fő szempontokat vesszük figyelembe:
- Iparág: a kódolási szabvány által elsődlegesen megcélzott iparág(ak).
- Referencianyelv verziója: a C szabvány verziója, amelyet jelenleg referenciaként használnak a kódolási irányelvekben. Ez azért nagyon fontos, mert alapvetően meghatározhatja az adott projektre implementált kódolási szabványt. Ha például a választás a C11-re esik (például annak egyedileg nagyon hasznos szolgáltatáskészlete okán az adott alkalmazásnál), a MISRA C:2012 kódolási szabvány nem lesz jó választás, és csak különleges megfelelőségi követelmények esetén jöhet szóba a használata.
- Automatizálás támogatása: az automatikus ellenőrzés implementálásának egyszerűsége az irányelveket illetően, amely nem szolgáltat téves pozitív eredményt. Ez általában kapcsolatban áll az irányelvek definíciójának szigorúságával vagy éppen engedékenységével.
- Kiterjedés: számszerű indikátor, amely kifejezi az adott kódolási szabvány kiterjedését és a definiált irányelvek számát. Minél nagyobb a kiterjedtség, annál nagyobb a kódolási szabvány oktatási értéke, ám egy széles kiterjedés komplexitást is jelenthet az irányelvek gondozása és eszközfejlesztés során.
- Piaci jelenlét: az adott kódolási szabvány piaci penetrációja valódi projekteknél formális megfelelőség (pl. funkcionális biztonsági alkalmazások) és önkéntes, minőségnövelési célú alkalmazás tekintetében.
- Eszközök elérhetősége: a kódolási szabvány implementálását támogató, automatizált kódelemző eszközök piaci elérhetősége, amely összefüggésben áll a szabvány piaci jelenlétével.
- Evolúció: egy gyorsan fejlődő kódolási szabvány természetszerűleg jobban tud alkalmazkodni a felhasználói visszajelzésekhez és igényekhez, továbbá az új megoldásokat is gyorsabban hozza el a fejlesztőknek. A végfelhasználói termékeknél ez kedvező, azonban más szektorok számára kevésbé. A CERT C az irányelveket kétféleképpen teszi közzé: egy webalapú wikiben, illetve egy szabadon letölthető, pdf-formátumú dokumentációban. Frissülés tekintetében a wikialapú közzététel természetesen naprakészebbnek tekinthető.
- Támogatóeszközök: ezekbe beleértendők például a C vagy más programnyelvi referenciák, szakmai anyagok vagy egyéb olyan források, amelyek a fejlesztésre nézve hasznos tartalommal bírnak.
- Minták: olyan leíró segédanyagok, amelyek illusztrálják az adott irányelv megsértésével járó következményeket.
Az alábbi táblázat összehasonlítja a már említett három kódolási szabványt a felsorolt kilenc kategória szempontjából:
A megfelelő kódolási szabvány kiválasztása
A biztonságos szoftverkódolás szempontjából nincs univerzálisan optimális megoldás. A megfelelő szabvány kiválasztása során számos különböző szempontot figyelembe kell venni, úgymint a projekt időtartama (amelynél kiemelten fontos a referencia stabilitása), a felhasznált nyelv verziója stb.
Az alábbi, egyszerű folyamatábra elősegíti a felelős választás meghozatalát.
1. eset
Ha a követelmények előírják a megfelelőséget egy elfogadott kódolási szabvánnyal (jellemzően biztonsági szempontból kritikus alkalmazás esetében), az ideális választás nagy eséllyel a MISRA C, amelynek legfrissebb verziója a MISRA C:2012 Amendment 1. Ha korábbi verziójú MISRA követése van előírva (pl. MISRA C:2004), a projekt előnyöket élvez az ISO/IEC 17961:2013 biztonsági előírásainak felvételéből. Némi munkára szükség lesz a C-s verzió átdolgozásához és az átlapolódások eltávolításához, amelyhez jó támpontot nyújt a MISRA C:2012 Addendum 2 („Coverage of MISRA C:2012 against ISO/IEC 17961:2012 C Secure”).
2. eset
Ha az alkalmazásnak nincsenek megfelelőségi követelményei, továbbá nincs igény kifejezetten nagy, a kód hordozhatóságát feláldozó teljesítményre sem, szintén a MISRA C:2012 az ajánlottan követendő kódolási szabvány.
3. eset
A CERT C az 1. és 2. esetben is értékes támogatást nyújthat biztonsági szempontból, és ajánlott lehet a CERT C irányelveinek követése párhuzamosan az elsődlegesen javasolt szabványokkal (ezt a folyamatábrában szaggatott vonallal jelöltük). Ha az integritás nem kiemelt szempont, a MISRA C:2012 a kelleténél jobban korlátozhatja az alkalmazást, így ebben az esetben javasolt lehet mindösszesen a CERT C implementálása a megfelelő szintű kódbiztonság eléréséhez.
Összefoglalás
A biztonsági szempontú kódfejlesztés során a megfelelő kódolási szabvány kiválasztása számos szempont függvénye. Ismerni és érteni kell hozzá az egyes szabványok jellemzőit és szolgáltatásait, és tisztában kell lenni azzal, hogyan képesek a folyó fejlesztési projekt követelményeinek megfelelni.
A cikkben bemutatott folyamat lényegi mondanivalója továbbá az automatizált tesztelés lehetősége és értéke az olyan eszközökkel, mint például a PRQA-féle statikus analizátorok, a QA·C és QA·C++. Ezek az eszközök mélyreható elemzést valósítanak meg a szoftverkódon, képesek a hibák felismerésére és kiküszöbölésére, és alkalmasak arra is, hogy a kódolási szabványokat automatikusan implementálják a teljes megfelelőség érdekében.
Röviden a PRQA cégről
A PRQA cég 1985 óta vezető szerepet tölt be a szoftverfejlesztést szabályozó megoldások szolgáltatásában a gépjárműipar, űripar, közlekedésfejlesztés, pénzügyi szektor, egészségügy és energiaipar területein. Az egészen kis méretű, akár startup cégektől kezdve a világcégekkel bezárólag minden piaci szereplőt ellátó PRQA kifinomult megoldásokat kínál kódelemzés, robusztus hibafelismerés és kódolási szabványok implementálása céljára, a teljes funkcionális integritás és alkalmazástechnikai biztonság nyújtása útján.
Az ISO9001 és TickIT tanúsítványokkal is rendelkező PRQA piacvezető megoldásai a QA·C, QA·C++ és QA·J nevekre hallgatnak, és az elterjedten használt programozási nyelvekhez a legkifinomultabb módszereket kínálják iparszerte. Akár lokálisan futtatva, akár a QA·Verify minőségirányítási rendszerben, központilag használva a megoldásokat gyorsaságra, hatékonyságra és teljes átláthatóságra lehet számítani, ami a döntéshozók munkáját is jelentősen leegyszerűsíti.