Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním
description
Transcript of Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním
Coping with Safe Programming
Ako sa vyrovnať s bezpečným programovaním
Frank Schindler
University of Maryland University College
European Division
Heidelberg, Germany
ÚVOD
Bezpečnosť počítačových systémov
versus programovanie
Bezpečnosť programového vybavenia
(OS, Aplikácii)
• ako malé chyby v jednom programe možu mať katastrofálne dôsledky na bezpečnosť celého PS (chýbajúca inicializácia premmených; preteče- nie/podtečenie zásobnika; uvoľnenie pamäte, na ktorú ukazuje iný vystrčeny smerník, a pod.)
• ako klasifikovať chyby v programe • ako dodržiavať princípy bezpečného
programovania v teame programátorov • príklady bezpečného programovania
PRED ČÍM MÁ BYŤ PROGRAM UCHRÁNENÝ?
• omylom zo strany užívateľa (paradoxy)
• bezohladným užívateľom
• zákerným užívatelom
ČO SA MOŽE STAŤ KEĎ PROGRAM ZLYHÁ?
• program ignoruje zlý vstup bez chybového hlásenia resp. väčších problémov
• program produkuje nesprávny výstup, ktorý sa šíri
celým programom
• program zrúti celý operačny systém (veľmi
nebezpečné pre bezpečnosť systému)
PRINCÍPY PRE BEZPEČNÉ PROGRAMOVANIE
• "information hiding" (ukrývanie informácii: encapsulation, principle of least privilege)
• defenzívne (robustné) programovanie • testovanie všetkého možného a aj
nemožného (paradoxov)
PRINCÍPY - Pokračovanie
• používanie robustných knižnic funkcii
• správne zvolený kompromis medzi efektívnostou programu a jeho bezpečnosťou
KLASIFIKÁCIA CHÝB V PROGRAME
GRADE
A čistý => bez závažných chýb resp. chýb počas exekucie, jednotný, rozumne zvolený štýl, vhodná abstrakcia/ukrývanie údajov a metód,
defenzívne programovanie, rozsiahle testovanie
KLASIFIKÁCIA-PokračovanieGRADE
B opraviteľny => štrukturálne chyby v dátovych typoch, napr. dlžka nie je jednotná, kryptický kód resp. premenné/funkcie, bez kontroly správnosti vstupov, resp. vstupov obsahujúcich zákerne údaje, bez chybových hlásení, resp. null-condition obmedzení, pretečenie/podtečenie zásobnika a pod.
KLASIFIKÁCIA-Pokračovanie
• C chybný => zbytočná zložitosť algoritmov resp. údajových typov, nezhody medzi nimi,
prehnaná dedičnosť objektov a pod.
• D kompromitujúci => chýbajúca
konceptualizacia, mnohé ľubovolné obmedzenia, veľa nepotrebných a zdvojených údajov, program viazne resp. mrzne, vystrčene smerníky a pod.
KLASIFIKÁCIA - Pokračovanie
• F nefunkčný => nebeži správne resp. funguje na základe hrubej sily
INFORMATION HIDING Ukrývanie údajov zahrňuje implementáciu dátových štruktúr a funkcii, ktoré s týmitoštruktúrami narábajú. Funkcie poskytujú interface,pomocou ktorého program má prístup k dátam.
DEFENZÍVNE PROGRAMOVANIE
• program by sa nemal spoliehať na nič, čo nie je nim generované
• zabrániť vykonaniu neočakávanych akcii, ktoré hrubo porušujú špecifikáciu programu
• všetky používané premenné musia byt riadne
inicializovane • funkcie by nemali vracat smerníky na údajové štruktúry
DEF. PROG. - Pokračovanie
• funkcie by nemali vracať indexi poľa • chybové hlásenia prichádzajuce z funkcii by
sa mali vždy riadne kontrolovať • uvoľňovanie pamäte pridelenej smerníkom
by malo byť striktne obmedzene
ROBUSTNÉ PROGRAMOVANIE
• ukrývanie informácii (hiding information) • defenzívne programovanie • treba očakavať, že nemožne veci sa možu stať
(paradoxy)
• povinné testovanie a inšpekcia napísaneho kódu inými členmi programovacieho teamu
PRÍKLADY
1. Chýbajúca inicializácia premenných
#include <stddef.h> // for NULL
...
int i; // malo by byt: int i = 0;
int *ptr; // int *ptr = NULL;
...
free(ptr);
PRÍKLADY - Pokračovanie
2. Kryptický kód
char *p1, *p2;
...
while (*p1++ = *p2++)
;
// *p1++ is equivalent to: *(p1++) it is a unary operator...right to left
PRÍKLADY - Pokračovanie
3. Program ignorujúci chybové hlásenia
int one_function(char ch, char *ptr);
int chyba;
char u, v;
chyba = one_function('?', &v);
u = v; // malo by byt: if (chyba == 0)
// u = v;
PRÍKLADY - Pokračovanie
4. Chýbajúce obmedzenia typu null-condition
int a[5];
int top = -1;
i = pop();
// malo by byt:
if (top != -1) // ak zásobnik nie je prázdny
i = pop();
PRÍKLADY - Pokračovanie5. Vystrčené smerníky
#include <stddef.h> // for NULLint *ptr1 = new int;int *ptr2 = new int; *ptr2 = 42;*ptr1 = *ptr2;delete ptr1; // avoid an inaccessible objectptr1 = ptr2;delete ptr2;
PRÍKLADY - Pokračovanie
Vystrčené smerníky
chýba príkaz:
ptr1 = NULL; // avoid dangling pointer
PRÍKLADY - Pokračovanie
6. Narábanie s knižničnými funkciami
Je dobre dať študentom úlohu napísať program, ktorý volá knižnične vstupno-vystupné funkcie v C, a ich úlohou je dať im taký vstup, aby tieto funkcie zrútili systém. Ked sa im to podari, mali by použiť debugger, aby videli prečo došlo ku kolapsu systému.
KNIŽNIČNÉ FUNKCIE
Príklad:
char a, b, c, s[100];
int n;
double x;
scanf ("%c%c%c%d%s%lf", &a, &b, &c, &n, s, &x);
KNIŽNIČNÉ FUNKCIE – Pokr.
Ako pokračovanie tejto úlohy je možné
požiadať študentov, aby napísali robustnú
knižničnu funkciu toho istého typu.
Príklady tohoto typu sú veľmi učinné vo
vyučbe!!!
PRÍKLADY - Pokračovanie7. Paradoxy - testovanie nemožneho "Y2K Bug" Poisťovna poskytuje životnu poistku na základe veku poisteného. Jej programy načítavajú súbor obsahujúci zoznam osôb a ich príslušný rok narodenia – položka typu 00..99. Predpokladáme, že sme v 20. storočí a práve je 01. 01. 2000. Vek osoby narodenej v roku 1925 dostaneme ako "00" - "25" = -25 rokov
ZÁVERBEZPEČNE PROGRAMY JE MOŽNE PÍSAŤNA ZÁKLADE• defenzívneho (robustného) programovania • dosledného ukrývania údajov/metód v objektoch
(encapsulation, principle of least privilege) • správneho výberu vhodného programovacie
jazyka pre danú aplikáciu napr. Java • rozsiahleho (úplneho) testovania
ZÁVER - Pokračovanie
POTREBA UČIT „ÚVOD DO
BEZPEČNOSTI POČÍTAČOVÝCH
SYSTÉMOV"
PARALELNE S ÚVODNÝM KURZOM
DO PROGRAMOVANIA