Sprawa zaciemnienia kodu?


47

Jakie są główne powody, by pisać zaciemniony kod, pod względem realnej korzyści dla osób opracowujących kod oraz firmy, która go uruchamia (jeśli kod jest faktycznie kodem komercyjnym)? Czy istnieją udokumentowane przypadki (dostępne online w niektórych lokalizacjach), które opisują, kiedy zaciemnianie było bardziej dobre niż złe? Czy istnieją dobrze znane przykłady, w których udowodniono, że na przykład zaciemnianie znacząco opóźnia dostęp złośliwego oprogramowania do kodu? Wygląda na to, że podobnie jak zwijanie szyb samochodowych nie powstrzyma ludzi przed rozbiciem ich i kradzieżą stereo, zaciemnienie kodu po prostu sprawia, że ​​uczciwi ludzie są uczciwi.

=========

Tło:

Jest to próba celowego zakwestionowania moich założeń na ten temat.

Od dawna jestem przeciwny zaciemnianiu kodu, ale jestem ciekawy, czy coś pominąłem. Rozumiem, dlaczego w przypadkach takich jak JavaScript, minifikacja pomaga szybciej ładować rzeczy (i jest to prawdziwa, funkcjonalna korzyść), ale nie wydaje mi się, żeby wymyślił jeden powód, dla którego zaciemnianie kodu jest przeszkodą odkrywanie, co robi sekcja kodu / algorytmu , jest faktycznie skuteczne w dowolnym celu.

Ponieważ open source jest szalenie popularny, pytanie wydaje się brzmieć: „udostępnić kod, czy zachować go jako zastrzeżony?” Jeśli chodzi o kodeks handlowy, rozumiem, dlaczego nie możesz udostępniać wszystkiego, a masz prawo do walki z kradzieżą.

BTW, jeśli powodem, dla którego ktoś pisze zaciemniony kod, jest „bezpieczeństwo pracy”, zwolniłbym każdego programistę, który konsekwentnie i celowo używa zaciemniania, którego jedynym celem jest pomoc w utrzymaniu ich pracy, chyba że może w uzasadniony sposób wykazać, że miał trochę korzyść biznesowa. Jest tak całkowicie przeciwny zespołowi, że jest absurdalny i wskazuje na kogoś, kto jest bardziej zainteresowany utrzymywaniem swojej pracy poprzez błędne praktyki, a następnie utrzymywaniem go, ponieważ piszą niesamowite oprogramowanie.

Wspominam tylko o tym konkretnym przypadku, ponieważ chociaż zdaję sobie sprawę, że ludzie zwykle żartują, chciałbym odstraszyć wszelkie odpowiedzi, których podstawowym założeniem jest to, że zaciemnianie samego bezpieczeństwa pracy jest dobrym pomysłem.


3
Myślę, że powiedziałeś wszystko
Paul


6
Mówiąc najprościej, zaciemnianie zmienia ekonomię inżynierii wstecznej kodu, nic więcej.
Mark Booth,

Dziękuję wszystkim. Z pewnością widziałem inne spojrzenie na to, dzięki twoim szczegółowym odpowiedziom i komentarzom. Istnieje kilka wysokiej jakości odpowiedzi, które mówią o różnych aspektach tego problemu. Zamiast zadać jedno pytanie, podniosłem głos na moich ulubionych.
jefflunt

Zastanawiasz się nad kodem źródłowym lub kodem obiektowym / wykonywalnym ? Na przykład oprogramowanie Gimpel dystrybuuje wersję swojego narzędzia do kłaczkowania w zaciemnionym kodzie źródłowym C, tak aby klienci, zwykle uniksowi, mogli go skompilować do działania w dowolnym środowisku, bez potrzeby Gimpel, który musiałby obsługiwać / utrzymywać N liczby środowisk docelowych , w tym nieparzyste lub starsze środowiska. Jest to uzasadnione odmienne od obiektowego / wykonywalnego zaciemniania stosowanego do ochrony kopii lub danych (np. Nielegalne kopiowanie) jako warstwy bezpieczeństwa w celu opóźnienia / powstrzymania inżynierii wstecznej.
mctylr

Odpowiedzi:


49

Jednym z bardzo interesujących przypadków użycia zaciemniania jest śledzenie pochodzenia nielegalnych kopii. Zakładając, że zaciemnianie jest stosunkowo tanią operacją, oryginalny autor może dostarczyć każdemu klientowi odmiennie zaciemnioną wersję aplikacji, w przypadku znalezienia nielegalnej kopii autor może porównać z dostarczonymi wersjami i prześledzić źródła piractwa.

Jest to forma steganografii , inspirowana i będąca odmianą schematów kryptograficznych „zdrajców” . Nie mam pojęcia, czy jest to powszechne 1 , czy nawet dobry pomysł, ale widziałem, że jest stosowany w praktyce przy następujących parametrach:

  • Wysoce konkurencyjny rynek krajowy z zaledwie dwoma dostawcami,
  • Około 50 wdrożeń obejmowało rynek,
  • Średni czas opracowywania dla obu aplikacji wynosił kilka lat (mniej więcej),
  • Średni czas zaciemnienia dla naszej aplikacji wynosił kilka godzin,
  • Żywotność obu aplikacji powinna wynosić około 10 lat.

Uzasadnieniem było oczywiście początkowo bezpieczeństwo poprzez niejasność i ewoluowało na wspomnianym schemacie w pewnym punkcie 2 . Obaj dostawcy mieli dostęp do swojego kodu binarnego, legalnie, i myślę, że oczywiste jest, że oczekiwano od obu prób dekompilacji. Na dłuższą metę zaciemnianie nie zrobiło nic pod względem bezpieczeństwa. Obaj dostawcy mieli wysoce zmotywowane i utalentowane zespoły, pracujące na niezwykle zyskownym i niszowym rynku, ostatecznie nasze produkty były bardziej podobne niż nie, a jakąkolwiek przewagę konkurencyjną uzyskano za pomocą innych, mniej niejasnych środków.

Naprawdę nie mogę się rozwinąć, ponieważ (a) to był bardzo wczesny etap mojej kariery i nie uzyskałem jasnego przeglądu decyzji projektowych ani wyników schematu śledzenia (jeśli w ogóle) oraz (b) części mojego zaangażowania z projektem był objęty NDA.

Kolejnym ważnym przypadkiem użycia do zaciemnienia może być, gdy jesteś prawnie zobowiązany do przekazania swojego kodu stronie trzeciej :

Jeśli Twoja firma działa w zakresie własności intelektualnej dla firm technologicznych lub bierze udział w sprawach dotyczących kodu źródłowego oprogramowania, możesz być zobowiązany do przekazania kodu źródłowego klienta do USPTO, sądu lub strony trzeciej.

Ponieważ kod źródłowy jest uważany za tajemnicę handlową, większość agencji regulacyjnych stosuje zasadę „50%”. Przesłany kod źródłowy jest zasłonięty, więc nie można go używać w obecnej postaci.

IANAL, a link jest bardziej odpowiedni dla drukowanych kopii kodu niż dla faktycznego kodu roboczego, więc może to być zupełnie nieistotne.

Ponieważ Javascript jest kanonicznym przykładem zaciemniania, istnieje jeden efekt uboczny, który nie jest powszechnie brany pod uwagę i polega na ukrywaniu złośliwego kodu w zaciemnionym Javascript. Chociaż minimalizowanie 3 skryptów JavaScript ma wyraźne zalety , nie widzę sensu w faktycznym zaciemnianiu i cieszę się, że Douglas Crockford zgadza się ze mną :

Wreszcie jest kwestia prywatności kodu. To przegrana sprawa. Żadna transformacja nie powstrzyma zdecydowanego hakera przed zrozumieniem twojego programu. Okazuje się, że jest to prawdą we wszystkich programach we wszystkich językach, jest to po prostu bardziej oczywiste w JavaScript, ponieważ jest dostarczany w formie źródłowej. Korzyści z zaciemnienia wynikające z prywatności są iluzją. Jeśli nie chcesz, aby inni widzieli twoje programy, odłącz serwer.

Jeśli chodzi o zaciemnianie „bezpieczeństwa pracy”, jest to zachowanie, które nigdy nie powinno przejść przeglądu kodu, a jeśli zostanie zidentyfikowane, nie powinno być tolerowane. Na początku nie posunąłbym się tak daleko, jak zwolnienie winowajcy, ale powtarzający się przestępcy zdecydowanie zasługują przynajmniej na dobre klapsy.

Podsumowując, zaciemnianie jest typowym przykładem bezpieczeństwa poprzez zaciemnienie, jego oczywistą zaletą jest odstraszanie i nic więcej. Mogą istnieć kreatywne przypadki użycia 4 , o których nie wiem, ale ogólnie korzyści są w najlepszym razie minimalne.

1 Po napisaniu tego znalazłem odpowiedź, która zasadniczo opisuje ten sam schemat, więc może być bardziej powszechna, niż myślałem.
2 Chociaż steganografia jest nadal zabezpieczeniem poprzez niejasność.
3 Minimalizacja ~ usuwanie białych znaków i skracanie żetonów, nie celowe zaciemnianie.
4 Czy liczy się międzynarodowy konkurs zaciemnionego kodu C ?


„Jeśli nie chcesz, aby inni widzieli twoje programy, odłącz serwer.” - lub użyj rozszerzeń Software Guard i zaufaj firmie Intel.
user253751

40

Przypadek zaciemnienia kodu polega na tym, że podnosi on poprzeczkę dla strony trzeciej, aby określić, co / jak działa kod.

Jednak, że nie nie znaczy to, że deweloper nie powinien nigdy być pisanie kodu pogmatwanego.

Widzisz, to jest fragment, który moim zdaniem brakuje w twoim pytaniu: zaciemnianie kodu (podobnie jak minimalizacja JavaScript) nie musi - i nie powinno - być wykonywane ręcznie przez programistę. Podobnie nie powinno to być również przechowywane jako podstawowe pliki źródłowe w kontroli wersji.

Ukrywanie kodu powinno odbywać się jako etap przetwarzania końcowego podczas kompilacji do kompilacji produkcyjnej. Istnieje również wiele produktów innych firm, więc prawie nie ma powodu, aby robić to samodzielnie.

Na przykład: Dotfuscator

IEEE ma artykuł na temat skuteczności zaciemniania kodu

Wyniki pokazują, że zmiana nazwy identyfikatora znacznie zmniejsza skuteczność ataków, co najmniej podwajając czas potrzebny do wykonania udanego ataku (nawet w najgorszym scenariuszu, tj. Przeciwko najlepszemu atakującemu). Ponadto zaciemnianie zmniejsza lukę między początkującymi a wykwalifikowanymi atakującymi, co sprawia, że ​​ci ostatni są mniej wydajni , i sprawia, że ​​systemy łatwiejsze do ataku są wyraźnie bardziej podobne do tych, które są z natury trudniejsze do złamania.

Podkreśl moje.


2
Dałbym to +1, ale link wymaga płatnej subskrypcji, do której nie wszyscy czytelnicy będą mieli dostęp.
mattnz

Tak, to niefortunny fakt IEEE, z którego nie jestem do końca zadowolony, ale to kolejny temat
Dan McGrath

8
Jest tutaj publicznie dostępna wersja pdf . Myślę, że można zamiast tego użyć tego, jest on na stronie głównej jednego z autorów artykułu, Mariano Ceccato.
yannis

Świetne znalezisko. Szukałem go w Google Scholar, ale go nie znalazłem. Zaktualizowałem link.
Dan McGrath,

1
+1 za „Ukrywanie kodu (podobnie jak minimalizacja JavaScript) nie jest - i nie powinno - być wykonywane ręcznie przez programistę”
João Portela

35

Brałem udział w tworzeniu MMORPG. Dotyczyło to logiki serwera i logiki klienta. Podczas wieloletniego rozwoju projektu, ilekroć rozważaliśmy interfejs między klientem a serwerem, reguła była taka, że ​​serwer powinien być traktowany przez serwer przez cały czas, przy założeniu, że został zhakowany. Innymi słowy, serwer musiał być napisany w taki sposób, aby klient nie otrzymał odpowiedzi, która spowodowałaby awarię serwera lub pozwoliłaby klientowi oszukiwać. Mimo to od samego początku wiadomo było, że hakerzy nieuchronnie znajdą dziury w systemie i wykorzystają je w celu oszukiwania. I po chwili to zrobili.

Oczywiście, zanim wysłaliśmy klienta do wielkiego wielkiego świata, musieliśmy go zaciemnić. Uważamy, że zaciemnianie miało następujące skutki:

  1. Odstraszyło nie-ekspertów od hakerów nawet próbowania.
  2. Opóźniało hakerów ekspertów w uzyskiwaniu jakichkolwiek hacków.
  3. Zmniejszyło liczbę włamań osiągniętych przez ekspertów hakerów.
  4. Ograniczało to skuteczność włamań.
  5. Co najważniejsze: spowodowało, że hakerzy przeprowadzili więcej testów na swoich serwerach przed zhakowanymi klientami, zanim uzyskali działający hack, co zwiększyło szanse, że je wykryjemy, szukając nieregularnej aktywności w logach serwera.

Konta gier odkrytych hakerów zostały zakończone bez zwrotu pieniędzy, dzięki czemu działalność hakerów była droższa i mniej atrakcyjna.

Z tego powodu uważam, że zaciemnianie miało ogólnie pozytywny wpływ na naszą grę, a co za tym idzie, zaciemnianie może mieć ogólnie pozytywny efekt w każdym oprogramowaniu, które może zostać zhakowane. (Na przykład oprogramowanie zawierające środki ochrony przed kopiowaniem.)

Wpływ zaciemnienia na utrzymanie był prawie żaden. Było kilka miejsc, w których niektórzy niedoświadczeni programiści przyjmowali założenia dotyczące nazw identyfikatorów (korzystali z refleksji), ale gdy już je uporządkowano, wszystko było w porządku. Krok zaciemniania stał się częścią ogólnego etapu kompilacji produkcyjnej wersji gry, więc większość programistów nigdy nie musiała się tym martwić ani mieć z tym nic wspólnego. Mieliśmy już narzędzie do przeglądania dzienników gry, więc zmodyfikowaliśmy to narzędzie, aby używało tabeli asocjacji (mapowania zaciemnionych identyfikatorów na odpowiednie identyfikatory) wygenerowanej przez obfuscator w celu przetłumaczenia dzienników dla nas w locie, więc nigdy nie Musiał nawet zobaczyć zaciemnione identyfikatory podczas badań pośmiertnych na podstawie logów zebranych z pola.


Jaki to miało wpływ na utrzymanie?
deworde

2
@deworde Zaktualizowałem swoją odpowiedź jeszcze jednym akapitem na temat wpływu zaciemnienia na utrzymanie.
Mike Nakis,

@MikeNakis: Darkfall? :-)
Carson63000,

@ Carson63000 Tak. (A LOL na twoim awatorze - czy to kolczuga i czy
dzierżysz

@MikeNakis: miło! I tak na temat awatara - cóż, to dzianinowa kolczuga i drewniany miecz, firma, dla której pracowałem, gromadziła zasoby na banery reklamowe i zatrudniała pracowników do przebierania się zamiast wynajmowania modeli. :-)
Carson63000,

3

Czytanie i rozumienie (i oczywiście pisanie) zaciemnionego kodu może być ciekawym wyzwaniem umysłowym. Prawdopodobnie nie mieści się w zakresie tego, o co prosiłeś, ale przykłady takie jak IOCCC mogą być zarówno źródłem rozrywki, jak i grozy.


3
To naprawdę powinien być komentarz do pytania, a nie odpowiedź.
Dan McGrath,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.