Chciałbym użyć Raspberry Pi w produkcie komercyjnym, ale chciałbym zapobiec odwrotnej inżynierii oprogramowania na urządzeniu. Oprogramowanie, o którym mowa, zostanie napisane w języku Ruby. Zakładam, że użytkownik końcowy ma fizyczny dostęp do karty SD i jest wystarczająco inteligentny, aby uzyskać dostęp root do Pi.
Według mnie opcje mogą obejmować:
- Zaszyfruj część (lub całość) karty SD
- Ukryj kod Ruby lub skompiluj go do kodu bajtowego (JRuby lub Rubinius)
Szyfrowanie byłoby najlepszym rozwiązaniem, ale nie mogę wymyślić sposobu na odszyfrowanie bez pytania użytkownika o klucz. Zaciemnianie kodu jest zdecydowanie możliwe, ale mniej bezpieczne w moim umyśle.
Czy można zaszyfrować część karty SD bez pytania użytkownika o klucz do jej odszyfrowania? Czy jest lepszy sposób, aby upewnić się, że kod jest dostępny tylko na wybranym urządzeniu?
ruby
commercial-use
Schrockwell
źródło
źródło
Odpowiedzi:
Oczywiście możliwe jest odszyfrowanie zaszyfrowanego pliku / kontenerów / itp. bez pytania o hasło. Wystarczy zapisać (zaszyfrowane) hasło na karcie SD i użyć go do odszyfrowania danych. Na przykład łatwym
openssl
pokazem może być:Szyfrowanie zostanie przeprowadzone podczas instalacji oprogramowania na Pi, a odszyfrowanie zostanie wykonane w czasie wykonywania, prawdopodobnie w pamięci RAM. Na przykład, hasło może być kombinacją jakiegoś pseudolosowego numeru sekwencyjnego (znanego) i określonego numeru seryjnego Pi uzyskanego z
cat /proc/cpuinfo
. Następnie musisz znaleźć odpowiednio ukrytą lokalizację do przechowywania tego pseudolosowego numeru, który do wszystkich celów i celów jest „ hasłem ”, a tym samym słabym punktem całego mechanizmu szyfrowania. Na przykład sektor zapasowy na karcie SD byłby typowym wyborem, ale możesz nawet osadzić go w jednym ze swoich plików wykonywalnych.W każdym razie najlepszym rozwiązaniem jest zarówno szyfrowanie, jak i kompilowanie oprogramowania, aby dodać różne warstwy zaciemnienia do oprogramowania.
Wreszcie, jeśli twoje oprogramowanie wymaga połączenia z Internetem, możesz nawet poprosić Pi o podanie hasła za każdym razem. Nadal będziesz musiał ukryć hasło w połączeniu, będziesz musiał również użyć
https
i będziesz chronić przed atakami odpowiedzi, wykorzystując bieżący czas jaksalt
dla szyfrowania.Masz wiele (tanich) opcji zapewniających bezpieczeństwo oprogramowania. Ale musisz wiedzieć, że jeśli twoje oprogramowanie osiągnie dobrze określony próg popularności, na pewno zostanie złamane, nawet jeśli zainwestujesz znaczne kwoty w jego ochronę.
źródło
Praktycznie, jeśli kod i klucze znajdują się na komputerze z kartą SD, będą mogli go skompilować, będą mogli odkryć klucze i będą mogli wyodrębnić poufne dane.
To jest jak szyfrowanie filmów, DVD musi zawierać wszystkie informacje wymagane do odszyfrowania filmu, aby mógł zostać wyświetlony widzowi, więc wszystkie mechanizmy ochrony przed kopiowaniem filmów są ostatecznie skazane na zagładę.
Najlepsze, co możesz zrobić, to zmienić ekonomikę inżynierii odwrotnej swojego produktu.
Czy warto szyfrować i / lub zaciemniać?
Teraz ustaliliśmy, że nie ma sposobu, aby całkowicie się chronić, powstają pytania
Jeśli powodują one znaczący ekonomiczny imperatyw w celu ochrony twojego algorytmu / danych, powinieneś to zrobić. Na przykład, jeśli zarówno wartość usługi, jak i koszt dla klientów są wysokie, ale koszt inżynierii wstecznej kodu jest znacznie niższy niż koszt jego samodzielnego opracowania, ludzie mogą spróbować.
To prowadzi do twojego pytania
Zaciemnianie
Sugerowana przez Ciebie opcja zaciemnienia kodu nie zgadza się z powyższą ekonomią - stara się znacznie podnieść ich koszt (5 powyżej) bez znacznego wzrostu kosztu dla ciebie (6). Problem polega na tym, że podobnie jak w przypadku szyfrowania DVD, jest on skazany na niepowodzenie, a jeśli jest wystarczająca różnica między 3, 4 a 5, to ostatecznie ktoś to zrobi.
Inną opcją może być forma steganografii , która pozwala zidentyfikować, kto odszyfrował kod i zaczął go rozpowszechniać. Na przykład, jeśli masz 100 różnych wartości zmiennoprzecinkowych jako część danych, a 1-bitowy błąd w LSB każdej z tych wartości nie spowodowałby problemu z aplikacją, zakoduj unikalny (dla każdego klienta) identyfikator w tych bitach . Problem polega na tym, że jeśli ktoś ma dostęp do wielu kopii danych aplikacji, byłoby oczywiste, że są one różne, co ułatwia identyfikację ukrytej wiadomości.
Ochrona
Jedyną naprawdę bezpieczną opcją jest dostarczenie krytycznej części oprogramowania jako usługi , a nie włączenie go do aplikacji.
Pod względem koncepcyjnym aplikacja zbierałaby wszystkie dane wymagane do uruchomienia algorytmu, spakowała je jako żądanie do serwera (kontrolowanego przez Ciebie) w chmurze , a następnie usługa obliczyłaby wyniki i przekazała je z powrotem do klienta, który by to pokazał.
Dzięki temu wszystkie twoje zastrzeżone, poufne dane i algorytmy znajdują się w domenie, którą całkowicie kontrolujesz, i eliminuje wszelkie możliwości wyodrębnienia klienta.
Oczywistym minusem jest to, że klienci są związani z twoimi usługami, są na łasce twoich serwerów i ich połączenia internetowego. Na plus są zawsze na bieżąco z poprawkami błędów. Niestety wiele osób sprzeciwia się SaaS właśnie z tych powodów.
Byłby to jednak ogromny krok i może kosztować 6 powyżej, ale jest to jedyny sposób, w jaki mogę zapewnić całkowite bezpieczeństwo algorytmu i danych .
źródło
Ostatnio wymyśliłem bardzo eleganckie rozwiązanie tego nierozwiązywalnego problemu. Został zainspirowany tym komiksem xkcd:
Tak więc rozwiązanie nazywa się super klejem . Jeśli jedna karta Superglue SD do PI Wyodrębnienie karty bez jej uszkodzenia będzie prawie niemożliwe.
Możesz nawet użyć zewnętrznego dysku SSD, zaszyfrowanego hasłem zapisanym na karcie SD i poczuć się bezpiecznie!
źródło
dd
) i odpowiednio go użyć!Kompilacja do kodu bajtowego byłaby najlepszym repelentem. Jeśli chodzi o szyfrowanie, oprogramowanie może być przechowywane w wolumenie TrueCrypt, ale tylko wtedy, gdy użytkownik nie uzyskał dostępu do konta root; po prostu nie ma możliwości bezpiecznego przechowywania hasła, ponieważ pamięć / dysk można w dowolnym momencie zrzucić do kontroli. Nawet pomoc bezpiecznych urządzeń (kart inteligentnych) niewiele by zrobiła, gdyby oprogramowanie działało tam, gdzie użytkownik ma mnóstwo narzędzi linuksowych. O ile wiem, bezpieczny rozruch nie jest opcją na R-Pi, która uniemożliwiałaby majsterkowanie użytkownika w systemie operacyjnym.
źródło
Jeśli chcesz stworzyć prawdziwą aplikację komercyjną, to Pi, tak jak jest w formie użytkownika końcowego, nie jest dla ciebie dobre!
Będziesz musiał zaprojektować własną płytkę drukowaną, na przykład użyć procesora znajdującego się na Pi i osadzić pamięć flash na płytce drukowanej.
WSKAZÓWKI
Koniec dnia. Raspberry Pi jest przeznaczony do celów edukacyjnych dla dzieci, aby nauczyć się korzystać z Linuksa i pisać niektóre programy.
Nie nadaje się do głośnego użytku komercyjnego. Musisz stworzyć własne urządzenie i wymyślić własne systemy ochrony. Ponieważ jeśli tylko ty i nikt inny nie wiesz, w jaki sposób chronisz swoje informacje o prawości, to szanse na włamanie się do nich przez znanego exploita lub brutala wynoszą 0,001%
ALTERNATYWY
źródło
Jednym z rozwiązań jest użycie adresu MAC RaspberryPi, który jest prawie unikalny dla danego Pi. Sprawdź ten adres w kodzie i podaj skompilowaną wersję. Utrudni to inżynierię wsteczną.
W przypadku osób, które na ślepo kopiują kartę SD na nową, nie będzie ona działać na innym Pi. To odstraszy większość ludzi kradnących twoje oprogramowanie. Inni, którzy są na tyle sprytni, aby to przełamać, mogą być na tyle sprytni, aby przerobić oprogramowanie, ich nie ma wielu i nie sądzę, że zaszkodzą twojej sprzedaży.
źródło
Możesz użyć rozwiązania opartego na barana: Software Serial Protection dla Raspberry Pi
źródło
Dlaczego nie dodać flasha opartego na SPI do tablicy operatora i zapisać na nim swój kod? Rozważam tę opcję dla własnego produktu. W przypadku uszkodzenia SD chcę, aby użytkownik końcowy mógł napisać nowy, który zawiera niestandardowy raspbian oraz kod do zamontowania pamięci flash SPI i uruchomienia pliku wykonywalnego.
Inną opcją jest przechowywanie klucza szyfrowania w RTC. Większość układów RTC ma trochę pamięci i można je wstępnie zaprogramować za pomocą klucza, który pozwala odblokować i zamontować plik wykonywalny z pamięci SD lub SPI.
źródło
Uważam, że wszystkie procesory używane w zakresie Raspberry Pi same obsługują bezpieczny rozruch. Sądzę, że potrzeba 12 woltów, aby przeflashować 4,8,16,32 lub 64K wewnętrznej pamięci flash lub EEPROM, której samo pi nie ma. Na ich podstawie możesz skonfigurować Strefę Trust za pomocą swojego kodu, aby wszystkie dobre rzeczy nie były widoczne. Rozumiem również, że obie formy statycznej pamięci RAM są stabilne tylko dla określonej liczby ponownych zapisów. Pierwszym krokiem byłoby posiadanie zapasowego procesora i próba ponownego flashowania tej bezpiecznej pamięci rozruchowej na kilka godzin lub dni. W końcu wszystkie bity zostają naprawione, więc nikt inny nie może modyfikować kodu, a w zależności od rzeczywistego produktu możesz okresowo poprosić o identyfikację 2-czynnikową (jak banki), aby produkt wydzielił kod, a kod reaktywacji zostanie wysłany na adres Adres e-mail. Jeśli trochę zmodyfikujesz pi, Uważam, że ARM ma również CPUID, więc są to poziomy bezpieczeństwa, na które możesz pójść. Mam na myśli, że możesz również zaoferować SMS na określony numer. Wiele sposobów.
źródło