Żyjemy w czasach, w których cyberataki stają się coraz bardziej powszechne. Wraz z rozwojem technologii pojawiają się nowe formy ataków, a także nowe złośliwe oprogramowanie, które umożliwia coraz łatwiejsze przeprowadzanie cyberataków. Obecnie cyberprzestępcy mogą łatwo i szybko odtwarzać wykonywalny kod binarny, dzięki czemu są w stanie znaleźć luki w zabezpieczeniach programu i wykorzystać te luki do przeprowadzenia ataku. Cyberprzestępcy są w stanie stworzyć program, który na podstawie analizy wykonywalnego kodu binarnego będzie w stanie automatycznie wykrywać luki w zabezpieczeniach (ang. exploity) i dokonywać ataków, co sprawia, że zagrożenie potencjalnym atakiem dla wielu organizacji rośnie. Jednym ze sposobów obrony przed cyberatakami jest inżynieria wsteczna.
Czym jest inżynieria wsteczna?
Inżynieria wsteczna (ang. reverse engineering) polega na analizowaniu sposobu działania wykonywalnego kodu i programu złośliwego oprogramowania (malware). Dzięki analizie kodu binarnego jesteśmy w stanie zrozumieć sposób w jaki działa złośliwe oprogramowanie i na tej podstawie zabezpieczyć nasz program przed ewentualnym atakiem. Właściwe zrozumienie zagadnień inżynierii wstecznej jest podstawą do tworzenia bezpiecznych programów. Jeżeli rozumiemy jak działa złośliwe oprogramowanie i w jaki sposób przeprowadza ataki możemy zabezpieczyć naszą infrastrukturę jeszcze przed wystąpieniem ataku lub zlokalizować ewentualne luki w krótkim okresie po ataku, co jest kluczowe przy minimalizowaniu potencjalnych strat.
Szybkie wykrywanie exploitów (luk bezpieczeństwa w oprogramowaniu), które stanowią podatność programu na ataki jest kluczowe. Obecnie cyberataki stają się coraz bardziej powszechne za sprawą zwiększającej się dostępności do złośliwego oprogramowania w dwóch głównych kategoriach; malware i ransomware. Na rynku funkcjonują już rozwiązania udostępniania złośliwego oprogramowania działające w formule SaaS, co sprawia, że dostęp do złośliwego oprogramowania nigdy nie był łatwiejszy. Wraz ze wzrostem popularności takich form udostępniania złośliwego oprogramowania cyberataki staną się coraz bardziej powszechne, co wymusi na organizacjach zwiększenie inwestycji w cyberbezpieczeństwo. Jedną z tych inwestycji będzie pozyskanie i szkolenie pracowników, którzy rozumieją zagadnienie inżynierii odwrotnej i potrafią wykorzystać ją w praktyce.
W przypadku wystąpienia cyberataku czas reakcji specjalistów ds. cyberbezpieczeństwa jest kluczowy. Jeśli będą w stanie szybko znaleźć exploity, przez które doszło do ataku to będą w stanie wykonać stosowne patche (łatki) w oprogramowaniu i ograniczyć skalę ataku. Zależnie od wielkości organizacji szybkość działania może przyczynić się do ochrony dziesiątek a nawet setek milionów dolarów w potencjalnych stratach spowodowanych cyberatakiem. To właśnie techniki inżynierii wstecznej pozwalają specjalistom ds. cyberbezpieczeństwa na zrozumienie sposobu w jaki został przeprowadzony atak i skuteczne zabezpieczenie infrastruktury przed kolejnymi atakami.
Jakie są standardy inżynierii wstecznej?
W przypadku działań związanych z inżynierią wsteczną, tak jak w przypadku większości działań w sektorze cyberbezpieczeństwa istnieją pewne standardy. Standardy te dotyczą przede wszystkim wiedzy i umiejętności jakimi powinni legitymować się specjaliści ds. cyberbezpieczeństwa wykorzystujący w swojej pracy zagadnienia inżynierii wstecznej. Najważniejszymi standardami dotyczącymi inżynierii wstecznej są wymagania stawiane przez NSA Cyber Operations czyli program stworzony przez Narodową agencję bezpieczeństwa w Stanach Zjednoczonych.
Jakie podstawowe umiejętności powinni posiadać specjaliści ds. cyberbezpieczeństwa zajmujący się inżynierią wsteczną?
Przede wszystkim powinni znać techniki statycznej i dynamicznej analizy kodu binarnego nieznanego pochodzenia, w tym tak zwanego “zaciemniania” (ang. obfuscation) i posiadać umiejętności posługiwania się odpowiednimi narzędziami do przeprowadzania analizy (statycznej i dynamicznej) kodu. Powinni umieć przeprowadzać praktyczną analizę kodu binarnego za pomocą narzędzi do debuggowań i deasemblacji przeprowadzanej w tzw. sandboxach (środowiskach odizolowanych od infrastruktury, przeznaczonych do przeprowadzania testów). Dodatkowo powinni znać podstawowe zagadnienia dotyczące technicznych aspektów danych języków programowania i architektury urządzeń.
Dlaczego warto znać standardy NSA Cyber Operations?
Spełnianie przez pracownika wymagań stawianych przez NSA Cyber Operations gwarantuje, że zna on techniki inżynierii wstecznej a także, że będzie w stanie używać jej w praktyce podczas zabezpieczania organizacji. Warto wspomnieć o tym, że pracodawcy chętniej wybierają kandydatów, którzy legitymują się posiadaniem umiejętności powszechnie wykorzystywanych na rynku, a takimi są właśnie umiejętności, o których mówi NSA Cyber Operations. Warto więc dodać tematy związane z inżynierią wsteczną do programu nauczania aby przygotować uczniów do przyszłej pracy w branży IT i zwiększyć ich szansę na znalezienie zatrudnienia.
Jak można nauczać inżynierii wstecznej?
Odpowiedzi na to pytanie poszukiwali naukowcy z Florida Institute of Technology w Stanach Zjednoczonych. W ramach stosowanego przez nich programu nauczania stworzyli kurs dotyczący zagadnień inżynierii wstecznej. Podczas tworzenia kursu akademicy z Florida Institute of Technology chcieli aby uczniowie, którzy go ukończą spełniali wszystkie wymagania stawiane przez NSA Cyber Operations. Jako wymagania wstępne do rozpoczęcia kursu założyli konieczność wcześniejszego ukończenia kursu wprowadzającego w tematykę cyberbezpieczeństwa i kursu dotyczącego programowania w assemblerze. Tworząc taką barierę wejścia akademicy sprawili, że osoby odbywające kurs z inżynierii odwrotnej posiadały wiedzę z zakresu cyberbezpieczeństwa i programowania w assemblerze, dzięki czemu nie musieli poświęcać czasu na nauczanie podstawowych zagadnień cyberbezpieczeństwa. Kurs odbywał się zarówno w formie wykładów jak i laboratoriów. Trwał 16 tygodni a zajęcia odbywały się dwa razy w tygodniu i trwały po 75 minut. Taka częstotliwość pozwalała na łatwiejsze przyswajanie nowych informacji a także ich zapamiętywanie.
Jakie wyglądał kurs inżynierii wstecznej w praktyce?
Ciekawe są laboratoria praktyczne przygotowane w ramach tego kursu. Podczas trwania kursu, studenci pracowali w różnych laboratoriach, które rozwijały umiejętności z zakresu inżynierii wstecznej. Każde z laboratoriów rozwijało inną umiejętność związaną z inżynierią wsteczną. Jakie to były laboratoria?
Pierwsze laboratorium dotyczyło analizy dynamicznej kodu binarnego. Zadania w laboratorium były podzielone na pięć poziomów trudności i ułożone w trybie sekwencyjnym; po wykonaniu zadań z pierwszego poziomu aktywowały się zadania z drugiego poziomu. Każdy kolejny poziom wymagał coraz większej wiedzy i umiejętności do rozwiązania zadań. Taka formuła budowała w studentach zaangażowanie w naukę i wykonywanie kolejnych zadań. Zadania w tym laboratorium dotyczyły takich zagadnień analizy dynamicznej jak konwencje wywołań, zarządzanie pamięcią, rozpoznanie konstrukcji programistycznych, śledzenie wykonania kodu.
Drugie laboratorium wprowadzało zagadnienie analizy statycznej kodu. Studenci musieli ręcznie analizować kod assemblera. Podczas analizy kodu studenci musieli prześledzić kod assemblera, stan stosu programu a także rejestr pamięci. Analiza statyczna jest niezwykle żmudnym zadaniem gdyż wymaga ręcznego sprawdzania kodu, co jest zadaniem niezwykle czasochłonnym.
Trzecie laboratorium wprowadzało automatyzację analizy kodu assemblera. Studenci musieli wykonać wtyczki, które zawierały adnotacje dotyczące wywołań sieciowych z analizowanego kodu assemblera. Dotyczyło to analizy programu, który działał w sieci i pojawiały się w nim pewne wywołania. Studenci musieli określić parametry każdego połączenia sieciowego. Twórcy kursu wygenerowali 12 plików binarnych przy pomocy Linux Metaspolit Metapreter, które następnie były podlegały automatycznej analizie przeprowadzanej przez studentów.
W czwartym laboratorium przedstawiono studentom złożone programy binarne. Każdy program zawarty w laboratorium prosił użytkownika o wprowadzenie danych wejściowych a następnie przeprowadzał te dane przez serię permutacji. Następnie program dokonywał permutacji końcowej i zwracał dane na wyjściu, których wartość musiał wskazać student. Celem tego zadania było pokazanie uczniom działania mechanizmu wywołań symbolicznych, które znacznie skracają czas debuggowania; studenci nie musieli ręcznie analizować poszczególnych permutacji, ale musieli wykorzystać wywołania symboliczne w celu uproszczenia analizy.
Piąty rodzaj laboratoriów dotyczył zagadnienia funkcjonowania architektury ARM64, która jest powszechnie używana w urządzeniach mobilnych takich jak smatrfony. Miało to na celu wykształcenie u studentów umiejętności przeprowadzenia inżynierii wstecznej na różnych architekturach, co jest niezwykle ważne gdyż obserwujemy wzrost liczby urządzeń mobilnych opartych na architekturze ARM64. Takie zadanie wymagało od studentów samodzielnego komponowania rozwiązań a nie jedynie wykonywania sekwencyjnej listy kroków, gdyż ich podstawowy wprowadzający program nauczania nie obejmował szeroko zagadnień dotyczących architektury ARM64 .
Środowisko pracy, w którym pracują uczniowie ma ogromne znaczenie
Bardzo ważne było też środowisko pracy przygotowane przez prowadzących kurs. Tworząc kurs stworzyli modelowe środowisko pracy, które wykorzystywało prostotę i integrację rozwiązań. Wiemy, że dobrze zorganizowane środowisko pracy jest równie ważne jak wiedza i umiejętności prowadzącego. W jaki sposób prowadzący zbudowali środowisko? Wykupili dla studentów pakiety rozwiązań na różnych platformach a także zastosowali niektóre rozwiązania w formule open-source. Między innymi wykupili miejsce na platformie CTDF do hostowania plików binarnych, licencje do programu Binary Ninja, Ghidra czy Haxrace. Udostępnili też studentom Dokkera aby ustandaryzować środowisko pracy wszystkich studentów. Wszystko zostało zainstalowane na systemie Kali Linux, który był podstawą wszystkich laboratoriów. Dane środowiska pracy były używane zarówno podczas pracy w laboratoriach podczas zajęć jak i wykorzystane podczas egzaminu końcowego, dzięki czemu podczas egzaminu końcowego uczniowie znali środowisko i nie musieli poświęcać czasu na jego poznawanie.
Jak wyglądał egzamin końcowy z przedmiotu?
Ciekawym aspektem dotyczącym kursu była forma egzaminu końcowego. Egzamin został bowiem przeprowadzony w formie konkursu. Studenci mieli za zadanie stworzyć narzędzie, które automatycznie wykrywało i wykorzystywało luki w zabezpieczeniach programu. I to był egzamin końcowy z przedmiotu, który wymagał od uczniów posiadania zarówno wiedzy teoretycznej jak i praktycznej. Na egzaminie nie było zadań testowych, jedynie zadanie praktyczne polegające na napisaniu programu, które wykorzystywało całą zdobytą podczas kursu wiedzę. Prowadzący podzielili studentów na trzy grupy o wyrównanym poziomie tak aby zrównoważyć potencjalne negatywne skutki współzawodnictwa. Studenci pracując w grupach stworzyli programy, których skuteczność była podstawą do wystawienia oceny. Narzędzie napisane przez studentów musiało znaleźć exploity w programie stworzonym na potrzeby egzaminu; do znalezienia było 85 exploitów.
Jak z taką formą egzaminu poradzili sobie studenci?
Najlepsza grupa napisała narzędzie, które znalazło 82% exploitów, druga 52% exploitów a trzecia 40% exploitów. Widoczna jest więc różnica poziomów poszczególnych grup. Prowadzący zaobserwowali także w jaki sposób współpracowali studenci. W trakcie przygotowań do egzaminu podzielili się na dane obszary specjalizacji, dzięki czemu na egzaminie każdy mógł zająć się tą częścią programu, w której się specjalizował. Pokazuje to istotę pracy zespołowej. Co ważne studenci współpracując ze sobą budowali specjalistyczną wiedzę a także rozwijali swoje kompetencje społeczne. Prowadzący przyznali też, że studenci początkowo obawiali się egzaminu gdyż nie byli pewni swoich umiejętności. Dopiero po zakończeniu egzaminu i otrzymaniu wyników zdobyli pewność siebie i byli dumni ze swojego kodu. Wielu z nich eksponowało swój kod na GitHubie. I to jest bardzo ważny aspekt, pewność siebie i entuzjazm wynikające z pracy. To dzięki temu uczniowie chętniej pracują, angażują się w nowe, nieznane projekty i odnoszą sukcesy zawodowe.
Dlaczego tak ważne jest zapewnienie odpowiedniego środowiska pracy?
Sytuacja dotycząca standaryzacji środowiska ukazuje nam jak ważne jest jego ustandaryzowanie i ułatwienie dostępu do niego. Prowadzący kurs zauważyli, że standaryzacja środowiska pracy przy użyciu Dokkera przyniosła znaczne korzyści zarówno prowadzącym jak i studentom. Dlaczego? Dlatego, że wyeliminowała bariery wejścia związane z koniecznością samodzielnego instalowania narzędzi i przygotowywania środowiska pracy.
Brak odpowiedniego środowiska pracy stawia bariery wejścia i zniechęca do pracy
Każdy kto kiedykolwiek miał styczność z przygotowaniem specjalistycznego środowiska pracy wie, że takie zadanie jest bardzo trudne, często frustrujące. Musimy samodzielnie wyszukiwać narzędzi, aktualizować je do najnowszych wersji, samodzielnie pobierać nowe biblioteki, nowe zależności. Bardzo często nie zgadzają się wersje, przez co środowisko pracy nie działa. Skutkuje to zaprzestaniem dalszej pracy, co bardzo często sprawia, że dane zagadnienie nie jest opracowywane. Nauczyciele bardzo często rezygnują z przygotowania środowiska pracy dla swoich uczniów właśnie z powodu komplikacji jakie wynikają z samodzielnego tworzenia środowiska. Skutkuje to tym, że niektóre zagadnienia nie są omawiane, gdyż nie ma technicznej możliwości opracowania danego zagadnienia bez odpowiedniego środowiska pracy. W najlepszym wypadku zagadnienie jest opracowywane jedynie w sposób teoretyczny, co sprawia, że uczniowie nie mogą zapoznać się z praktycznymi zagadnieniami funkcjonowania danego zagadnienia. Dokładnie taka sama sytuacja spotyka studentów, gdy to na nich ciąży obowiązek instalowania środowiska pracy. Owszem student otrzymuje instrukcje, ale podczas tworzenia środowiska i tak występują problemy, co skutkuje rezygnacją studenta z dalszej pracy.
Rozwiązaniem takiej sytuacji jest zakupienie zewnętrznego, zintegrowanego i ustandaryzowanego środowiska pracy
Takim środowiskiem jest platforma CyberSkiller. Platforma posiada zaimplementowane środowiska pracy w chmurze, co sprawia, że są dostępne 24/7 z dowolnego miejsca na ziemi. Dodatkowo środowisko jest ustandaryzowane, nie występują w nim błędy spowodowane niedopasowaniem wersji, a także zawsze posiada aktualną wersję danych programów. Na platformie CyberSkiller dostępne są kursy praktyczne z informatyki, które wykorzystują środowiska pracy jako poligon do ćwiczeń dla uczniów. Dzięki wykorzystaniu platformy CyberSkiller nauczyciel nie musi samodzielnie przygotowywać zadań ani tworzyć środowiska pracy, wystarczy przypisanie uczniów do danej grupy kursowej i uczniowie automatycznie otrzymują dostęp do danego odpowiedniego środowiska pracy. Pozwala to na bezproblemową naukę i gwarantuje, że nawet najbardziej skomplikowane zagadnienia mogą być omówione w każdej szkole.
Podsumowanie
Inżynieria wsteczna to skomplikowane zagadnienie, którego znaczenie we współczesnym świecie nieustannie rośnie. Nauczanie zagadnień inżynierii wstecznej musi być efektywne więc najlepszym rozwiązaniem jest nauczanie ich przy wykorzystaniu gotowych rozwiązań opracowanych przez ekspertów z branży. Dzięki temu środowisko pracy jest zintegrowane i nie występują problemy z jego funkcjonowaniem a materiały edukacyjne cechują się wysoką jakością. Aby zwiększać nasze cyfrowe bezpieczeństwo musimy ułatwić dostęp do edukacji zagadnień związanych z inżynierią wsteczną. Dlatego na platformie CyberSkiller już niedługo pojawi się kurs dotyczący zagadnień inżynierii wstecznej, który w praktyczny sposób będzie nauczał tego zagadnienia. Mamy nadzieję, że ten kurs pozwoli zwiększyć świadomość istoty zagadnienia jakim jest inżynieria odwrotna i pozwoli wykształcić nowych specjalistów w tej dziedzinie.