Skąd się biorą dziury

Kod ze strzykawki

Innym atakiem jest wstrzyknięcie kodu SQL, czyli popularne SQL Injection. Luka polega na tym, że

67,59%

błędów w aplikacjach webowych dotyczy tzw. Cross-Site Scripting, na drugim miejscu jest wyciek informacji (13,86%) i SQL Injection (13,52%).

odpowiednio spreparowane dane podawane na przykład w formularzu, są wykonywane przez serwer aplikacyjny jako kod języka bazodanowego SQL. Atak odbywa się w ten sposób, że napastnik odnajduje słaby punkt w aplikacji webowej, polegający na tym, że dane wprowadzane do aplikacji nie są odpowiednio analizowane i czyszczone ze znaków, które nie powinny się tam pojawić. Po przygotowaniu takich danych, są one wysyłane do serwera, który wykonuje podstawiony skrypt języka SQL, razem z właściwym zapytaniem.

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.

Czy można napisać bezbłędne oprogramowanie

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.


TOP 200