Egy C++ kódolási szabvány apropóján

2011.08.01. 16:00 | aliceesbob | 1 komment

Címkék: programozás cpp sdlc

Nemrég találtam rá a "Joint Strike Fighter Air Vehicle C++ Coding Standard"-ra. Két dologra voltam igazából kíváncsi. Egyrészt, hogy egy ilyen komoly valaminek a programozásakor milyen dolgokat írnak elő úgy általában, a másik, pedig, hogy a biztonságos programozási szempontok milyen formában jelennek meg benne.

Egy apró megjegyzés. Engem, aki soha nem dolgozott beágyazott rendszerek fejlesztésén újra és újra csodálkozással tölt el, hogy az üzleti rendszereken túl (ahol "látszik" a program), programok mozgatnak, irányítanak fizikai dolgokat is. Egyszer olvastam, hogy a lopakodó bombázó lopakodási képességei érdekében olyan kompromisszumokat kellett kötni, hogy a gép a levegőben körülbelül úgy viselkedik mint egy tégla. A többit programok pótolják ki. Szóval a C++ kód itt egy 100 millió dolláros eszköz vezérlésére kell.

A doksit elolvasva az látszik, hogy nem csak a kötelező köröket akarták megfutni. A kódolási szabvány túlmegy a szokásos szintaktikai dolgokon. Tipikus megoldásként a magyar piacon én eddig azzal találkoztam, ahol egyáltalán ilyennel foglalkoztak, hogy behivatkozzák, mondjuk a Java coding standardot és kész. Addig amig a JCS az 90% szintaxis és 10% practice, addig itt az arány fordított. 

Néhány terület, amivel foglalkozik:

  • hibakezelés,
  • engedélyezett könyvtárak,
  • osztályok felépítése,
  • memóriakezelés,
  • dokumentálás, tesztelés.

Külön tanulságos a 4.2-es fejezet, ami a szabályok alkalmazási feltételeit tárgyalja. Itt bevezetik az RFC-kből ismerős should, will shall fogalmakat, de ami itt plusz, hogy megmondják milyen szintű felhatalmazás kell ahhoz, hogy egy shall (amúgy kötelező) szabálytól eltérjen a programozó: software engineering lead és sotfware product manager jóváhagyása, ami a CM szoftverben van dokumentálva. Tehát a kódolási szabvány "integrálva" van a fejlesztési folyamatba is. Ez pedig egy olyan ritka kivétel, ami nekem annyira szokott hiányozni.

Pl. 71.1-es szabály: "A class’s virtual functions shall not be invoked from its destructor or any of its constructors. "

A következő, amit észrevettem, hogy a szabvány az undefined, plattform függő, nehezen olvasható, félreérthető C++ programozási technikák használtát tiltja. Tehát ahelyett, hogy azt mondaná, tanuld meg az apró trükköket, inkább a biztonságos nyelvi részhalmaz használtát írja elő. Ezzel például erősen szembe megy a GOTW és a C++ könyvek általános tematikájától, ahol a különleges nyelvi leleményekre helyezik a hangsúlyt, sokszor a perverzióig fokozva a "na ez most szerinted mit csinál" játékot. Ez egyébként a programozás egyik alapkérdése: mennyire kell a nyelv határait feszegetni? Az egyik véglet, hogy nagyon, beleértve az adott plattform, fordító nüanszait is, a másik meg, hogy a nagyon átlagos, nagyon közepes programozóra kell a programot írni (mivel hosszú távon és statisztikailag ilyen programozók fogják a kódot karban tartani).

Végigolvasva a legtöbb dologgal egyet lehet érteni, még csak azt sem mondom, hogy a valóságtól elrugaszkodott formalizmusokat követelne meg. Az kifejezetten tetszett hogy a kód komplexitásával, az ovlashatósággal és a teszt lefedettséggel is foglalkozik. Azonban ez utóbbinál nekem hiányzott, hogy nem határozott meg célértéket, mondjuk 100%-ot.

De ami miatt végül is elolvastam a doksit az az , hogy kíváncsi voltam mennyire foglalkozik a biztonságos kódolási technikákkal. Nos, a meglepő dolog, hogy semennyire! Illetve majdnem.

Az biztos, hogy a divatos secure, security szavakra még hivatkozás sincs a dokumentumban. Már jobb a helyzet, ha mondjuk az overflow-t nézzük. Azonban "tudományos" is megvizsgáltam a kérdést. Fogtam a SANS top 25 software error leírást és megnéztem, hogy

  1. A kódolási szabvány kitér e rájuk explicit.
  2. A kódolási szabványt betartva mennyiben lehet az adott hibát elkerülni.

A téma specialitásából következik, hogy jó pár általános biztonsági hiba ebben a környezetben nem értelmezhető (pl. CSRF, de kár mert vicces lenne)

Íme az eredmény:

SANS programozási hiba JSF kódolási szabvány megfelelő fejezet
(1) Improper Neutralization of Special Elements used in an SQL Command ('SQL Injection') Nem releváns. Talán nem is véletlen. Nem tudom elképzelni, hogy egy beágyazott rendszerben ilyen bonyolult rendszert építenének be.
(2) Improper Neutralization of Special Elements used in an OS Command ('OS Command Injection') Nem releváns.  Igazából ebben a környezetben ez sem (lehet) releváns.
(3) Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting') Nem releváns. Nem tudom, hogy mennyire van webes felülete egy vadászgépnek...
(4) Unrestricted Upload of File with Dangerous Type

Nem foglalkozik vele. Ez már talán lehetne releváns, amennyiben van valamilyen input device, ahol adatot lehet benyomni (mondjuk küldetés adatokat, legalábbis a filmek alapján). Mégis erre nézve sincs semmi utalás a doksiban.

(5) Cross-Site Request Forgery (CSRF) Nem releváns, de azért durva lenne, ha működne! Gondoljunk az alábbira: https://usaf.gov.us/strike-fighter/1001/fire?target=xy
(6) URL Redirection to Untrusted Site ('Open Redirect') Nem releváns.
(7) Buffer Copy without Checking Size of Input ('Classic Buffer Overflow') Részben tárgyalja. Nem direktben, de azért benne van: AV Rule 15, 76. De igazából nem nevén nevezve a BO-t, hanem mondjuk, mint "defensive programming".
(8) Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') Nem tárgyalja. Nem foglalkozik vele, de adjuk meg, hogy azért elég nehézkesen képzelhető el mint attack vector.
(9) Download of Code Without Integrity Check Részben tárgyalja: Rule 2: "There shall not be any self-modifying code. " A letöltős megoldás ennek egy alesete, tehát megtiltja a dolgot.
(10) Inclusion of Functionality from Untrusted Control Sphere Tárgyalja. Tiltja: Rule 16.
(11) Use of Potentially Dangerous Function Tárgyalja. Erre van példa bőven: Rule 18-25, 29, 70. Bár a legtöbb nem biztonsági kérdések miatt tiltott, hanem programhelyesség miatt.
(12) Incorrect Calculation of Buffer Size Tárgyalja. Foglalkozik vele: Rule 96. De azért nem biztonsági oldalról...
(13) Uncontrolled Format String Tárgyalja. Az egész használatát tiltja: Rule 22. Bár nem mondja meg miért is.
(14) Integer Overflow or Wraparound Tárgyalja. Foglalkozik vele: Rule 154, 184, 203, 212, meg a jó öreg defensive prorgamming. Azért az érdekes, hogy nem tiltja, csak nagyon alapos megfontoláshoz köti a dolgot. Azonban sehol sem szerepel ennek biztonsági aspektusa. Abból indul ki, hogy egyszerűen a túlcsordulás általában nem jó.
(15) Missing Authentication for Critical Function Nem tárgyalja. Nem foglalkozik vele, bár azért el tudom képzelni, hogy különböző bizalmi-szintek vannak a programban, akár a különböző alrendszerek között. Nem adnám meg mint nem releváns témát, bár nem írtam még JSF kódot...
(16) Missing Authorization Nem tárgyalja. Indoklás mint 15-nél.
(17) Use of Hard-coded Credentials Nem tárgyalja. Indoklás mint 15-nél.
(18) Missing Encryption of Sensitive Data Nem tárgyalja. Indoklás mint 15-nél.
(19) Reliance on Untrusted Inputs in a Security Decision Nem tárgyalja. Indoklás mint 15-nél.
(20) Execution with Unnecessary Privileges Nem tárgyalja. Indoklás mint 15-nél.
(21) Incorrect Authorization Nem tárgyalja. Indoklás mint 15-nél.
(22) Incorrect Permission Assignment for Critical Resource Nem tárgyalja. Indoklás mint 15-nél.
(23) Use of a Broken or Risky Cryptographic Algorithm Részben tárgyalja: Rule16. Már amennyiben broken vagy kockázatos kriptográfiai algoritmusra nem lehet DO-178B level A vagy SEAL 1 minősítést megszerezni. Gondolom nem.
(24) Improper Restriction of Excessive Authentication Attempts Nem tárgyalja. Indoklás mint 15-nél.
(25) Use of a One-Way Hash without a Salt Nem tárgyalja. Indoklás mint 15-nél.

 

A fenti táblázat alapján adódik néhány tanulság:

  • A SANS top 25 nem igazán húzható rá a JSF kódolási szabványra. Ennek az lehet az oka, hogy a SANS a leggyakoribb programozási hibákról szólnak és gondolom elsősorban üzleti szoftverekből van merítésük és főleg a most tipikus webes technológiákból. Ezért a speciális környezetekben előforduló hibákra nem igazán alkalmazhatóak.
  • Ahol kapcsolatot lehetett találni a két dokumentum között (részben tárgyalja, vagy tárgyalja), ott is az látható, hogy a JSF a fejlesztői jógyakorlat oldaláról közelít és nem az esetleges hibák biztonsági aspektusai felől. Ez azonban nem meglepő, mert a biztonsági hiba a programkód szintjén amúgy meg hiba is. A hibákat a programozó "teszi" a kódba, ami ellen egy jó kódolási szabványban amennyire lehet készülni kell. Ezért is nehéz dolog a biztonságos programozási praktikák megállapítása, mert ha elrugaszkodunk a "strcpy függvényt nem szabad használni" szinttől, akkor utána már olyan kérdések maradnak, olyan területeket kell szabályozni, ami már a programozás napi gyakorlatába "gázol bele" (és így a programozó lelkivilágába).
  • A JSF kódolási szabvány esetében a security nem önálló terület. A security, secure, authentication, trust szavak a dokumentumban elő sem fordulnak. Meg mondom őszintén nincs is ötletem, hogy miért nem. A dokumentum nem túl régi (2005), ezen azért csodálkoztam erősen. Vagy azt jelenti, hogy a JSF fejlesztésénél nagyon speciális trust környezetben működnek a programok, amiket elemezve arra jutottak, hogy nincs speciális támadási vektor amire készülni kell, vagy azt nem hozták nyilvánosságra, vagy ez kimaradt?!

Szumma-szummárum én úgy gondolom, hogy aki olyan cégnél van, ahol a méretnél fogva már fordítanak időt kódolási szabvány kidolgozására, használatára, érdemes belenézni ebbe a doksiba, mert legalább lát egy gyakorlatban használt, működő példát.

Tiborcz József

A bejegyzés trackback címe:

https://aliceesbob.blog.hu/api/trackback/id/tr43037218

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

butcher__ 2011.08.07. 21:47:39

Hú ez nagyon nagyon érdekes téma!
süti beállítások módosítása