Co nowego w Microsofcie?

27 maja miałem okazję brać udział w prezentacji Johna Lamberta, głównego szefa zespołu ds. bezpieczeństwa pracującego nad Windowsem. Prezentacja była na temat procesu tworzenia najnowszego dziecka z Redmond - Windowsa Visty. Prezentacja traktowała nie tylko o samym procesie inżynieryjnym, w którym biorą udział setki architektów Microsoftu lecz również o nowej, znacznie zmodyfikowanej polityce bezpieczeństwa systematycznie wdrażanej wewnątrz firmy od momentu rozpoczęcia prac nad dodatkiem SP2 do Windowsa XP.

Zmiany w postępowaniu firmy i nie tylko

Nowy sposób tworzenia kodu, nazwany SDL (z ang. Secure Development Lifecycle) ma głównie na celu poprawienie bezpieczeństwa i zmniejszenie ilości błędów krytycznych występujących w produkcie, który ma trafić do odbiorców końcowych. Elementami nowej strategiii są między innymi systematyczne audyty kodu przeprowadzane na przede wszystkim nowych komponentach, które zanim zostaną włączone do "winmain" (nazwa funkcjonująca wewnątrz Microsoftu określająca główne repozytorium kodu Windowsa Vista) muszą pozytywnie przejśc kolejne szczeble weryfikacji. Poza przeglądaniem nowych komponentów prowadzone są również przeglądy starszych wersji kodu - i tu miała miejsce radykalna zmiana w sposobie postępowania. W dotychczasowych działaniach pracownicy stosowali filozofię "to jest już w kodzie od tylu lat więc na pewno jest poprawne"; filozofia stosowana od momentu rozpoczęcia prac nad SP2 - "ten kod jest stary, więc musi być obowiązkowo zweryfikowany". Często zdarza się jednak, że zespół pracujący nad "winmain" nie zawsze dostaje kod źródłowy od innych zespołów; w takim wypadku ważną rzeczą jest by zespół od którego pochodzi dany komponent w wersji binarnej również stosował politykę SDL - w przeciwnym wypadku plik binarny nie zostanie zaakceptowany co jest równoznaczne z odmową włączenia go do głównego drzewa.

Podczas oględzin kodów źródłowych zespół ds. bezpieczeństwa korzysta z wielu ciekawych nowinek prosto z centrum rozwoju i badań naukowych Microsoftu. Tymi nowinkami są kolejno: SAL, PREfix oraz PREfast. SAL czyli Standard Annotation Language - są to pewnego rodzaju rozszerzenia do języka C, tzw. annotacje definiowane za pomocą specjalnych makr. Każdy kod w "winmain" docelowo będzie kodem z annotacjami. Czym są owe annotacje? Są to proste wskazówki dla kompilatora lub innych programów dostarczające informacji semantycznych na temat pewnych fragmentów kodu. Kompilatory dokonując analizy leksykalno składniowej nie są w stanie zrozumieć znaczenia poszczególnych zmiennych, funkcji, etc. Wzbogacając kod w informacje semantyczne, uposażamy wcześniej wymienione programy w wiedzę na temat semantyki kodu, np. możliwe staje się zapisanie połączenia logicznego między zmienną opisującą pewną wielkość liczbową a buforem o długości opisywanej przez tą zmienną. Do analizy semantycznej kodu annotowanego za pomocą SAL wykorzystywane są wymienione PREfix - program dokonujący analizy statycznej i wykrywający typowe błędy jak np. przepełnienia bufora, oraz PREfast - lżejszy odpowiednik programu PREfix, który został wymyślony do rozwiązywania problemów w trochę inny sposób[1]

Programy te zostały zaprojektowane tak by ostrzegać w możliwie jak najwcześniejszej fazie projektowania - warto wspomnieć, że od momentu ich wdrożenia do użytku w MS sprawdzają one kod regularnie i produkują ostrzeżenia, zapisując je równocześnie w dzienniku, który jest dostępny dla całego zespołu. Ciekawostką potwierdzającą skuteczność pary PREfix/PREfast był zaprezentowany fragment dziennika z wykrytym błędem przepełnienia bufora w programie Internet Explorer 7 na 2 miesiące przed odkryciem i opublikowaniem błędu w internecie. Podczas wyświetlania tego slajdu natychmiast padły pytania dlaczego w takim razie IE7 został dopuszczony do użytku? Odpowiedź była taką jakiej mniej więcej można było się spodziewać - zespół programistyczny skupił swą pracę na dodawaniu jak największej ilości nowych funkcji do wersji Beta 2 niż na poprawianiu drobnych błędów. Podejście, które jest całkowicie(!) do usprawiedliwienia. Kolejną ciekawą zmianą w metodologii było zaprzestanie używania słabych funkcji tworzących skróty plików takich jak MD5 oraz SHA-1. Zastąpiły je dość nowe algorytmy takie jak np. SHA-256/512.

Ostatnim już faktem prawdopodobnie niezbyt znanym szerszej publiczności jest to iż Microsoft, w przeciwieństwie do innych wielkich korporacji z branży informatycznej, zamiast tępić zaawansowanych użytkowników publikujących kompromitujące informacje takie jak m.in. błędy w systemie, zaczął z nimi aktywnie współpracować. I tak oto miłym zaskoczeniem jest iż kadrę Microsoftu od czasów wydania SP2 zasila m.in. polski zespół LSD-PL[2].

Co nowego w samym Windowsie?

Ograniczenia architektur 32-bitowych stały się widoczne dość dawno temu, a od kilkunastu miesięcy twórcy nowych procesorów wciąż zaskakują coraz to wydajniejszymi układami 64-bitowymi zachęcając do migracji. Podobny trend jest widoczny wewnątrz Microsoftu. Windows Vista wydawany w dwóch różnych wersjach, na platformy x86 i x86_64, będzie miał domyślnie ustawione dwie całkowicie różne wbudowane polityki bezpieczeństwa. Dla platform 32-bitowych będzie to domyślnie polityka "opt-in", polegająca na tym, że ochrona przed atakami na system będzie włączana na żądanie tylko dla wybranych przez użytkownika aplikacji, oraz "opt-out", która będzie polityką domyślną dla architektur 64-bitowych, polegającą na tym, że wszystkie funkcje ochronne są uaktywnione domyślnie a użytkownik może zaznaczać aplikacje, które nie mają z nich korzystać. Na każdej architekturze będzie można przełączać się pomiędzy tymi dwoma sposobami ochrony. Ten dość ciekawy chwyt ma zachęcać do przechodzenia na architektury 64-bitowe, które oferują znacznie lepszą protekcję poprzez zastosowanie bitu NX. I tu warto wspomnieć, że tym razem zastosowane mechanizmy naprawdę budzą podziw. Nowatorski sposób ochrony przed atakami przepełnienia bufora będzie polegał na kilku dotąd nigdzie nie używanych pomysłach. Najpierw jednak o tym co już jest znane.

Nowy Windows będzie uwzględniał losowe generowanie przestrzeni adresowej (ang. Address Space Randomization) jako czynnik znacznie utrudniający podatność systemu i jego aplikacji na ataki. Można pomyśleć, że to całkiem rozsądny krok, gdyż niewiele systemów ma taki mechanizm domyślnie włączony. A to jeszcze nie koniec! Niesamowicie ciekawym i genialnym w swojej prostocie rozwiązaniem jest wprowadzenie weryfikacji adresów procedur obsługi wyjątków krytycznych (ang. SEH - Structured Exception Handler). I tak gdy jakaś aplikacja przepełni bufor i nadpisze adres procedury SEH to od momentu wygenerowania wyjątku do momentu wykonania procedury SEH daleka droga. W pierwszej kolejności zostanie sprawdzona poprawność adresu SEH, który nie będzie już tak łatwy do wygenerowania. Wszystko za sprawą wprowadzonego pomysłu - wskaźniki do procedur SEH będą zakodowane. Każdy wskaźnik będzie reprezentował bitową alternatywę rozłączną (XOR) wskaźnika do funkcji i losowo generowanego ciasteczka procesu, to jest tak zwanego security cookie. Proces podczas powstawania dostaje unikalne nie powtarzające się w systemie ciasteczko które będzie służyć do kodowania wskaźników. Aby utworzyć odpowiednio zakodowany wskaźnik trzeba będzie znać ciasteczko, w przeciwnym wypadku nici z podatności na atak. Gdy to się jednak uda kolejną warstwą ochronną będą specjalne wartości sztucznie odkładane na stosie użytkownika i będą one spełniać funkcję oczywistą - system używa ich do sprawdzania integralności danych; gdy nastąpi nieumiejętnie wykonane przepełnienie wartości te zostaną nadpisane co zostanie wykryte przez system. Gdy to zabezpieczenie zostanie ominięte pozostanie jeszcze ostatnie, sprzętowe, a mianowicie nowy dodatkowy bit w procesorach 64-bitowych, który może posłużyć do oznaczenia segmentu pamięci jako segmentu bez praw do wykonywania instrukcji w nim się znajdujących. Jak widać kombinacja tych kilku mechanizmów robi wrażenie w porównaniu z tym co mogliśmy spotkać w poprzednich wersjach Windowsa. Ten warstwowy sposób ochrony John Lambert uzasadnił również rzeczowo w momencie wydania systemu ma on być odporny na większość ataków w przyszłości, a nawet gdy cel okaże się niemożliwy do osiągnięcia to technologia zawarta w systemie powinna maksymalnie utrudniąc wykonywanie ataków na system.

Oprócz niezwykłych jak na Microsoft innowacji, w systemie miało miejsce również kilka mniej ciekawych dla zwykłego użytkownika zmian. Jedną z nich jest system raportowania błędów. W nowym Windowsie dane jakie zostają przesłane do Microsoftu są danymi dokładnie wyświetlanymi w okienku informującym o wystąpieniu błędu aplikacji. Microsoft dołożył wszelkich starań by usuwać informacje personalne, w tym. m.in. by raport nie zawierał adresów MAC kart sieciowych, 16 bitów adresu IP z którego pochodzi raport i innego rodzaju podobnych informacji. Całe raporty przesyłane są protokołem HTTP przy użyciu protokołu SSL. Podczas prezentacji pokazany został fragment dziennika ze wspomnianym już błędem w Internet Explorerze 7 jaki został wysłany przez jeden z komputerów beta-testerów. Ciekawą funkcjonalnością nowego Windowsa, z punktu widzenia osoby ceniącej swoją prywatność, jest technologia BitLocker umożliwiająca całkowite szyfrowanie dysku twardego, domyślnie włączony i znacznie usprawniony firewall oraz oprogramowanie anti-spyware okresowo sprawdzające integralność systemu. Wspominając o nowym firewallu nie można również zapomnieć o fakcie iż domyślna instalacja Visty ma włączoną obsługę IPv6 oraz znacznie zredukowaną(do niezbędnego minimum) ilość aktywnie nasłuchujących na różnych portach usług sieciowych oraz znacznie zmieniony i całkowicie od nowa napisany kod obsługi wywołań procedur zdalnych RPC. Z ważnych zmian nie wolno również zapomnieć o usprawnieniu protokołu SMB używanego do współdzielenia plików i drukarek w środowiskach sieciowych. Wiedza o tym, że protokół SMB jest protokołem, który został źle zaprojektowany zaczynając już od początków jego historii jest w posiadaniu nielicznych. Również relatywnie mała grupa osób jest świadoma tego, że protokół SMB w wersji używanej w Windowsach XP i starszych w ogóle nie dostarcza ochrony udostępnionych udziałów w postaci plików, katalogówi drukarek nawet w przypadku stosowania list kontroli dostępu jak i ochrony udziałów hasłem. Vista idzie o krok dalej i używa domyślnie protokołu SMB w wersji drugiej, który jest znacznie bezpieczniejszy i nie tylko ze względu na zmodyfikowane procedury autoryzowania dostępu. Niestety nie miałem możliwości zweryfikowania tego faktu osobiście, gdyż jak można się domyslić potrzeba do tego dwóch komputerów z zainstalowanym Windowsem Vista.Moją uwagę zwrócił również fakt iż w jądrze systemu zaszły dość znaczące zmiany, takie jak np. zapoczątkowany został proces wyodrębniania sterowników jak największej liczby urządzeń z przestrzeni jądra i zastępowane ich sterownikami działającymi w przestrzeni użytkownika ze znacznie ograniczonymi przywilejami. Takie rozwiązanie powoduje, że sterowniki stanowią mniejsze ryzyko dla integralności systemu, gdyż nie są w stanie spowodować zatrzymania pracy systemu nawet w czasie ich awarii lub nieprzewidzianego zachowania.

Ostatnią rzeczą o jakiej bym chciał wspomnieć w tym krótkim przeglądzie jest fakt,o którym wiele serwisów korzystających z wcześniej udostępnionych wersji Windowsa Vista już zdążyło napisać przede mną. W wersji Beta 2 występuje nadmiar okienek informujących o różnych aplikacjach próbujących uzyskać dostęp do chronionych zasobów systemu. Nie było by w tym nic złego gdyby nie to, że takie okienka pojawiają się nawet gdy otwieramy poszczególne sekcje panelu sterowania. Niesie to ze sobą pewne ryzyko dla bezpieczeństwa systemu, gdyż poziom bezpieczeństwa został podniesiony do poziomów wręcz paranoidalnych(?). Użytkownik zamiast uważnie czytać ostrzeżenia uzna je za nieodłączny fragment użytkowania komputera i zamiast być świadomym potencjalnych zagrożeń - efekt na jakim zależy Microsoftowi, będzie zamykał okienka bez uprzedniego przejrzenia ich zawartości, co sprzyja obniżeniu czujności użytkownika - efekt od jakiego Microsoft planuje się oddalić. Czas pokaże, w która z tych stron zawędruje Windows nowej generacji.

[1] PREfix został napisany przez J. Pincusa pracującego w firmie Intrinsa która została przejęta przez Microsoft wraz z ich produktem. Natomiast PREfast jest lżejszym i szybszym odpowiednikiem PREfix - został on jednak utworzony przy użyciu trochę innych technologii i niezależnie od PREfix przez inżynierów Microsoftu.

[2] LSD-PL : http://lsd-pl.net

Realizacja: SIPLEX Studio