[ Pobierz całość w formacie PDF ]
.Pozostałe klienty się zawieszały lub blokowały serwer X do czasuzakończenia ich działania.O co więc chodzi?Przyczyną wielu błędów odkrytych przez grupę Millera były typowe błędy w programowaniu wjęzyku C - programiści tworzący zawiły i niezrozumiały kod, popełniający pomyłki, programiści niesprawdzający warunków brzegowych, w końcu programiści zakładający, że ich zmienne typu charbyły również typu unsigned, kiedy naprawdę było inaczej.Te błędy mogą z pewnością powodować nieprawidłowe działanie programów podczas podawaniaim danych wejściowych i mogą być używane przez włamywaczy przygotowujących odpowiednioułożone sekwencje danych dla uzyskania określonego celu.Powróćmy na chwilę do robakainternetowego.Jeśli fingerd zostałby zaatakowany przez programu Fuzz Millera, na pewnozakończyłby działanie z błędem.Jednak podanie mu odpowiednio spreparowanych danychumożliwiło przestępcy uruchomienie powłoki działającej jako rootlNajbardziej przerażające jest to, że testy przeprowadzone przez Millera należą do jednych znajprostszych i najbardziej znanych - testy polegające na dostarczaniu do czarnej skrzynkilosowych danych wejściowych.Inne układy danych wejściowych spowodowałyby z pewnościąpoważne błędy w działaniu badanego programu.Testy z zadanymi sekwencjami wejściowymimogłyby ujawnić te błędy, których testowanie losowe nie ujawniło.Grupa Millera stwierdziła również, że kilka dostępnych komercyjnie narzędzi umożliwiałowykrywanie błędów i przeprowadzanie innych testów.Dotyczyło to również błędów przepełnieniabufora i błędy związane z pamięcią.Te narzędzia są powszechnie dostępne, jednak producenci ichnie używają.Dlaczego producenci nie dbają o jakość? Cóż.Wielu z nich twierdzi, że dbają, ale jakość siędobrze nie sprzedaje.Pisanie dobrych programów i dokładne ich testowanie nie jest zadaniemłatwym ani prostym.Wymaga ono dodatkowego wysiłku i czasu.Dodatkowy czas poświęcony napoprawę jakości programów zwiększa koszty produktu.Jak dotąd niewielu klientów (być możedotyczy to również szanownego czytelnika) wykazało gotowość zapłacenia dodatkowej ceny zalepsze programy.Producenci inwestują w to, za co są skłonni płacić klienci, czyli na przykład zanowe możliwości.Choć uważamy, że wielu producentów powinno lepiej dbać o swoje produkty,nie możemy zapominać również i o tym, że winna jest również cała populacja użytkowników.W pewnym sensie każdy napisany program może działać w krytycznych warunkach i stawać sięofiarą nadużyć.Dlatego należy stosować dobre praktyki programistyczne i zwracać szczególnąuwagę na typowe problematyczne miejsca.Jak unikać błędów wpływających na bezpieczeństwo systemu?Informatycy definiują błędy (ang.error) jako uchybienia popełnione przez ludzi podczaskonstruowania kodu programu.Wady (ang.fault) to przejawy istnienia w programach błędów,które mogą prowadzić do niepowodzeń (ang.failure).Niepowodzenia są pochodną specyfikacjiprogramów.Popularnie w języku angielskim wada jest określana wyrazem bug.Po co wprowadzać taką formalną terminologię? Z trzech powodów:1.Aby uświadomić sobie, że choć wady mogą być obecne w programie, nie stanowią oneproblemu do czasu, kiedy spowodują niepowodzenie.Testowanie służy do wywołanianiepowodzenia, zanim program dopuści się do używania oraz zanim dojdzie do poważnych strat.2.Wady nie pojawiają się w programie nagle.Są one spowodowane błędami popełnianymi przezprogramistów i wynikają z ignorancji, pośpiechu, bezmyślności i wielu innych rzeczy.Wady, doktórych dochodzi w niezamierzony sposób, umożliwiające użytkownikom nielegalne uzyskaniedostępu do pewnych zasobów są powodowane przez osoby popełniające błędy.3.Prawie każdy fragment Unixa był opracowany bez wcześniejszego zdefiniowania specyfikacji.W wyniku tego nie jest łatwo określić, czy program spowodował niepowodzenie.Czasem to, cozwykłemu użytkownikowi wydaje się błędem, może być funkcją zaplanowaną przez autorówprogramu.Podczas pisania programów działających jako superużytkownik lub w innym krytycznymkontekście należy zadbać, aby program był jak najlepiej napisany i miał możliwie najmniejbłędów, dlatego że błąd w programie działającym jako superużyt-kownik może narazićbezpieczeństwo całego systemu.Oczywiście żaden program nie jest doskonały.Funkcja biblioteczna może mieć błędy albo jakaśzabłąkana fala promieniowania gamma zmieni wartość jednego bitu w pamięci komputera iprogram będzie nieprawidłowo działał.Istnieje jednak wiele technik przyczyniających się dominimalizowania wpływu błędów na bezpieczeństwo.Można też programować defensywnie,próbując uprzedzać problemy, jakie się mogą pojawić w przyszłości.Oto kilka ogólnych zasad:1.Dokładnie zaprojektuj program, zanim rozpoczniesz go pisać.Upewnij się, że rozumiesz, co chcesz pisać.Drobiazgowo rozważ środowisko, w którym programbędzie działał, zachowanie wejścia i wyjścia, używane pliki, rozpoznawane argumenty, odbieranesygnały i inne aspekty funkcjonowania programu
[ Pobierz całość w formacie PDF ]