Skąd się biorą dziury
- 16.06.2009
Kod ze strzykawki
Innym atakiem jest wstrzyknięcie kodu SQL, czyli popularne SQL Injection. Luka polega na tym, że
błędów w aplikacjach webowych dotyczy tzw. Cross-Site Scripting, na drugim miejscu jest wyciek informacji (13,86%) i SQL Injection (13,52%).
W wyniku tego ataku, napastnik ogląda dane pobierane wprost z bazy, których nie powinien widzieć. Za pomocą
SQL Injection można także zmodyfikować dane w bazie, a nawet całkowicie je usunąć. Jest to bardzo niebezpieczny błąd, gdyż włamywacz może niemal dowolnie manipulować danymi bazy, obchodząc wszelkie zabezpieczenia wbudowane w aplikacje. Możliwe są wszystkie najważniejsze ataki - naruszenie poufności danych, integralności oraz dostępności aplikacji. Przyczyną błędu SQL Injection jest przeważnie niedbalstwo przy kodowaniu aplikacji, polegające na braku filtrowania i walidacji wprowadzanych danych.Luka w serwerze
Nawet najlepiej napisana aplikacja nie będzie bezpieczna, jeśli będzie pracować w nieaktualizowanym, błędnie skonfigurowanym oraz posiadającym poważne luki serwerze. Oprócz typowych luk, takich jak przepełnienie bufora, należy wziąć pod uwagę także kombinację podatności. Luka we włączonym, ale nieużywanym module, może nie być bardzo istotna, gdy aplikacja z niej nie korzysta, ale w połączeniu z możliwością wykonania poleceń systemowych z uprawnieniami serwera WWW, tworzy bardzo poważny błąd, który może posłużyć do przejęcia kontroli nad aplikacją i serwerem.
Od serwera do systemu
Stosunkowo rzadką, ale bardzo ważną podatnością, jest możliwość wykonania przez napastnika poleceń systemu operacyjnego lub konsoli serwera aplikacyjnego na poziomie uprawnień użytkownika, na którym pracuje serwer. W ten sposób napastnik może wykonać bardzo wiele poleceń, począwszy od wyświetlenia zawartości zasobów dyskowych, a skończywszy na pobraniu całej zawartości bazy. Możliwe są też ataki odmowy obsługi oraz fałszowanie zapisów w systemie. Niekiedy można dokonać w ten sposób nawet kompromitacji całej domeny Active Directory albo bazy Oracle, skutki zależą od poziomu uprawnień, na którym wykonywane jest polecenie napastnika.
Z badań nad jakością kodu prowadzonych na uniwersytecie Carnegie Mellon w Pittsburghu wynika, że na każde 1000 linii kodu przypada od 15 do 30 błędów. Licząc średnio 20 błędów, oznacza to odsetek równy 2%. Z podobnych badań wynika, że na każde 100 błędów programistycznych, od 3 do 6 to są błędy skutkujące naruszeniem bezpieczeństwa. Zatem średni odsetek błędów bezpieczeństwa wśród wszystkich błędów programistycznych wynosi około 5%. Należy pamiętać, że nie każdy błąd, który potencjalnie powoduje naruszenie bezpieczeństwa, nadaje się do wykorzystania. Oprócz samej istoty błędu, ważna jest jego kategoria i waga problemu, który wywołuje. Najważniejsze z błędów to takie, które umożliwiają przejęcie kontroli nad systemem. Spośród wszystkich błędów bezpieczeństwa, odsetek takich poważnych luk wynosi od 0,5 do 3%, zależnie od rozległości projektu, jego skomplikowania, narzędzi ułatwiających kontrolę kodu oraz zależności między modułami napisanymi przez różne grupy i projekty. Odsetek błędów wysoce krytycznych można przyjąć na poziomie 2% ogółu błędów, które mogą powodować naruszenie bezpieczeństwa. Z prostego przemnożenia powyższych liczb wynika, że w projekcie, który zawiera 10 mln linii kodu, ilość wysoce krytycznych błędów, które dają szansę przejęcia kontroli nad aplikacją, może być rzędu 200 (10 000 000 x 0,02 x 0,05 x 0,02 = 200 błędów). Oszacowanie to jest dość zgrubne i nie zawsze się sprawdza, ale umożliwia uzmysłowienie rozmiaru problemu. Atakującemu wystarczy wykrycie jednego takiego błędu, by skompromitować aplikację lub nawet cały system. Z powyższych zależności wynika, że napisanie bezbłędnej aplikacji jest trudne.