Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

26
Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním Frank Schindler University of Maryland University College European Division Heidelberg, Germany

description

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. B ezpečnosť počítačových systémov versus programovanie B ezpečnosť programového vybavenia (OS, Aplik á cii). - PowerPoint PPT Presentation

Transcript of Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

Page 1: 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

Page 2: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

ÚVOD

Bezpečnosť počítačových systémov

versus programovanie

 

Bezpečnosť programového vybavenia

(OS, Aplikácii)

Page 3: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

• 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

Page 4: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

PRED ČÍM MÁ BYŤ PROGRAM UCHRÁNENÝ?

•  omylom zo strany užívateľa (paradoxy)

 

• bezohladným užívateľom

• zákerným užívatelom

Page 5: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

Č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)

Page 6: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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)

Page 7: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

PRINCÍPY - Pokračovanie

• používanie robustných knižnic funkcii

 

• správne zvolený kompromis medzi efektívnostou programu a jeho bezpečnosťou

Page 8: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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

 

Page 9: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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.

Page 10: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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.

Page 11: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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.

Page 12: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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

Page 13: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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

Page 14: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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

Page 15: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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);

Page 16: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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

Page 17: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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;

Page 18: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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();

Page 19: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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; 

Page 20: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

PRÍKLADY - Pokračovanie

Vystrčené smerníky

chýba príkaz:

ptr1 = NULL; // avoid dangling pointer

Page 21: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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.  

Page 22: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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);

Page 23: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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!!!

Page 24: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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

Page 25: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

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

Page 26: Coping with Safe Programming Ako sa vyrovnať s bezpečným programovaním

ZÁVER - Pokračovanie

POTREBA UČIT „ÚVOD DO

BEZPEČNOSTI POČÍTAČOVÝCH

SYSTÉMOV"

PARALELNE S ÚVODNÝM KURZOM

DO PROGRAMOVANIA