HEKLANJE

5 Sigurnosna razmatranja prilikom kodiranja

TEMU APP 100 E KUPON

1. Provjera unosa

Uvijek provjerite korisnički unos kako biste bili sigurni da je ono što ste očekivali. Uvjerite se da ne sadrži znakove ili druge podatke koje vaš program ili programi koje poziva vaš program mogu tretirati na poseban način. To često uključuje provjeru znakova kao što su navodnici i provjeru neobičnih znakova unosa kao što su ne- alfanumeričke znakove gdje se očekuje tekstualni niz. Često su to znak pokušaja napada neke vrste.



2. Provjera raspona

Uvijek provjeravajte raspone prilikom kopiranja podataka, dodjele memorije ili izvođenja bilo koje operacije koja bi potencijalno mogla doći do prekoračenja. Neki programski jezici omogućuju pristup spremniku s provjerom raspona (kao što je std::vector::at() u C++, ali mnogi programeri inzistiraju na korištenju neprovjerenog zapisa indeksa polja []. Osim toga, upotreba funkcija kao što je strcpy( ) treba izbjegavati radije nego strncpy(), koji vam omogućuje određivanje maksimalnog broja znakova za kopiranje. Slične verzije funkcija kao što je snprintf() za razliku od sprintf() i fgets() umjesto gets() pružaju ekvivalent specifikacija duljine međuspremnika. Upotreba takvih funkcija u vašem kodu trebala bi spriječiti prekoračenje međuspremnika. Čak i ako vaš znakovni niz potječe iz programa, a vi mislite da se možete izvući s strcpy() jer znate duljinu niza, to ne znači reći da vi ili netko drugi neće promijeniti stvari u budućnosti i dopustiti da niz bude specificiran u konfiguracijskoj datoteci, na naredbenom retku ili iz izravnog unosa korisnika. Prelazak u naviku provjere raspona sve bi trebalo spriječiti veliki e broj sigurnosnih propusta u vašem softveru.

3. Načelo najmanjih privilegija

Ovo je osobito važno ako se vaš program izvodi kao root tijekom bilo kojeg dijela vremena izvođenja. Gdje je to moguće, program bi trebao ispustiti sve privilegije koje mu nisu potrebne i koristiti više privilegije samo za one operacije koje ih zahtijevaju. Primjer za to je poslužitelj pošte Postfix, koji ima modularan dizajn koji dopušta da se dijelovi koji zahtijevaju root povlastice pokreću odvojeno od dijelova koji to ne zahtijevaju. Ovaj oblik odvajanja privilegija smanjuje broj putanja napada koji vode do root privilegija i povećava sigurnost cijelog sustava jer se tih nekoliko preostalih staza može kritički analizirati radi sigurnosnih problema.

4. Nemojte se utrkivati

Stanje utrke je situacija u kojoj program izvodi operaciju u nekoliko koraka, a napadač ga ima priliku uhvatiti između koraka i promijeniti stanje sustava. Primjer bi bio program koji provjerava dopuštenja datoteke, a zatim je otvara. Između poziva stat() za provjeru dopuštenja i poziva za otvaranje datoteke fopen() napadač bi mogao promijeniti datoteku koja se otvara preimenovanjem druge datoteke u izvorni naziv datoteke. Kako biste to spriječili, prvo fopen() datoteku, a zatim upotrijebite fstat(), koja uzima deskriptor datoteke umjesto naziva datoteke. Budući da deskriptor datoteke uvijek ukazuje na datoteku koja je otvorena s fopen(), čak i ako se naziv datoteke naknadno promijeni, poziv fstat() će zajamčeno provjeravati dopuštenja iste datoteke. Postoje mnogi drugi uvjeti utrke, a često postoje načini da ih se spriječi pažljivim odabirom redoslijeda izvršavanja određenih funkcija.

5. Registrirajte rukovatelje greškama



Mnogi jezici podržavaju koncept funkcije koja se može pozvati kada se otkrije pogreška, ili fleksibilniji koncept iznimaka. Iskoristite ih da uhvatite neočekivane uvjete i vratite se na sigurnu točku u kodu, umjesto da slijepo napredujete u nadi da korisnički unos neće srušiti program, ili još gore!