r   e   k   l   a   m   a
r   e   k   l   a   m   a

Matematyczne puzzle pozwolą na zabezpieczenie oprogramowania przed odwrotną inżynierią?

Strona główna AktualnościOPROGRAMOWANIE

Dla wielu producentów oprogramowania, szczególnie tych, którzy rozwijają wysoce specjalistyczne narzędzia, techniki odwrotnej inżynierii stanowią spore zagrożenie – pozwalają konkurencji odtworzyć kod źródłowy, poznać wykorzystywane algorytmy i zastosować je w swoich produktach. Zapewne podobnie myślą twórcy szkodliwego oprogramowania, poszukujący sposobów na zabezpieczenie swojego kodu przed antywirusowymi skanerami. Jedni i drudzy nie od dzisiaj więc szukają sposobów na takie zabezpieczenie programów, by stały się one dla osób postronnych „czarnymi skrzynkami”, a przy tym zachowywały wszystkie swoje funkcje, uruchomione na komputerach końcowych użytkowników (czy ofiar). Za sprawą prac grupy amerykańskich informatyków nad szyfrowaniem funkcjonalnym i nieodróżnialnym zaciemnianiem zabezpieczenia takie miałyby stać się powszechnie wykorzystywane do ochrony własności intelektualnej.

Stojący na czele grupy prof. Amit Sahai z University of California, wraz ze swoimi kolegami z IBM Research i University of Texas, zajęli się problemem takiego szyfrowania oprogramowania, by nie tylko zachowało ono wszystkie swoje funkcje, ale też było z zasady niemożliwe do dekompilacji, odporne na wszystkie znane techniki odwrotnej inżynierii. Dostępne do tej pory techniki zaciemniania kodu pozwalały co najwyżej na zwiększenie stopnia trudności dekompilacji – ale zdeterminowany napastnik, poświęcając nieco czasu, mógł sobie z nimi ostatecznie poradzić i uzyskać wgląd w działanie programu.

Sahai wyjaśnia, że kluczem do nowej techniki zaciemniania są nowego rodzaju wieloliniowe puzzle: matematyczna układanka, której siłowe rozwiązanie wymagałoby setek lat pracy współczesnych komputerów, która zamienia strukturę kodu w bezsensowne dla napastnika ciągi liczb. To co dajemy to tylko matematyka, tylko liczby, sekwencja liczb. Jednak liczby te żyją w matematycznej strukturze, poprzez którą te indywidualne elementy układanki, te sekwencje liczb mogą być połączone z innymi elementami tylko w ściśle określony sposób. Możesz to przeglądać z góry do dołu, z różnych stron, i wciąż nie będziesz wiedział, co zaciemniony program robi. Jedyne co możesz zrobić, to zestawić go razem tak, jak miał być zestawiony; każde inne zestawienie – np. jakbyś chciał rozbić jeden element i zwrócić go w innej formie – zwróci ci tylko śmieci.

W metaforze wieloliniowego puzzle poszczególne fragmenty kodu postrzegane są jako elementy puzzle – i podobnie jak w namacalnej układance, mogą być zestawione tylko w sposób zgodny z ich strukturą. Poprawna wieloliniowa forma tych elementów jest sugerowanym rozwiązaniem układanki, sugeruje, w jaki sposób można połączyć jej części. Do tworzenia układanki wykorzystywane są dwa algorytmy: generator i weryfikator. Pierwszy buduje parametry systemu i elementy grup, drugi weryfikuje, czy stanowią one poprawne rozwiązanie układanki. Jedynie ten, kto wygenerował parametry systemowe może zakodować ustawienie elementów.

Podjęte przez zespół prace nad technikami zaciemniania oprogramowania przyniosły też inne znaczące osiągnięcie – możliwość wykorzystania w szyfrowaniu funkcjonalnym, czyli technice zastępowania zaszyfrowanych wiadomości zaszyfrowanymi funkcjami, dowolnej obliczalnej funkcji (do tej pory możliwe było wykorzystanie jedynie kilku ściśle określonych funkcji). Według Sahaiego technika ta może posłużyć do zabezpieczenia pojedynczej wiadomości rozsyłanej do dużej grupy odbiorców, tak by każdy z nich otrzymał inną treść, uzależnioną od np. swojego adresu. W ten sposób odbiorca uzyskując odpowiedź na swoje zapytanie, nie jest w stanie dowiedzieć się niczego więcej ponad to, co było dla niego zamierzone.

Artykuł pt. Candidate Indistinguishability Obfuscation and Functional Encryption for all circuits, w którym szczegółowo opisano tę technikę zaciemniania kodu, to ponad 40 stron algebraicznych rozważań, których przeniesienie na język mniej formalny nie jest łatwym zadaniem. Z tego co bez głębszej analizy udało się nam w redakcji ustalić, obwody (ang. circuits) o którym mowa w tekście to liniowe zestawienia bramek logicznych AND, OR i NOT, które na wejściu przyjmują łańcuch bitów i zwracają kolejny łańcuch o określonej długości. Zaciemnianie polegałoby na przekształcaniu obwodów w ich równoważniki, uzupełnione losowo dobraną logiką, nie wpływającą ostatecznie na wynik. A jak mogłoby to wyglądać od strony samego uruchamiania kodu? Zapewne rezerwowany byłby odpowiednio duży obszar pamięci, po którym następnie rozrzucane byłyby fragmenty kodu, połączone wieloma instrukcjami skoku i indeksami (strukturą układanki, o której piszą autorzy).

Oczywiście wątpliwości co do skuteczności takiego zabezpieczenia jest sporo. Wydaje się, że wydajność przetworzonego tak oprogramowania może znacznie spaść – sami autorzy piszą: choć nasza obecna konstrukcja zaciemniania działa w czasie wielomianowym, to jest prawdopodobnie za mało wydajna dla większości praktycznych problemów. Ważnym celem będzie zwiększenie wydajności, by wykorzystać tę metodę w praktycznych zastosowaniach. Z drugiej strony nie wiadomo, jak takie zaciemnianie miałoby chronić przed napastnikiem uruchamiającym program w maszynie wirtualnej, pod kontrolą hiperwizora pozwalającego na zrzuty pamięci i zapis kompletnych stanów maszyny. W ten sposób cierpliwy napastnik mógłby odtworzyć całe zachowanie algorytmu z informacji o kolejnych krokach procesora i operacjach na pamięci.

r   e   k   l   a   m   a
© dobreprogramy
r   e   k   l   a   m   a
r   e   k   l   a   m   a

Komentarze

r   e   k   l   a   m   a
r   e   k   l   a   m   a
Czy wiesz, że używamy cookies (ciasteczek)? Dowiedz się więcej o celu ich używania i zmianach ustawień.
Korzystając ze strony i asystenta pobierania wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.