Jak mogę chronić oprogramowanie na Pi do użytku komercyjnego?

16

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?

Schrockwell
źródło
Szukam podobnego rozwiązania. Najlepsza odpowiedź, jaką otrzymałem, to zamontowanie obrazu (partycji), który jest szyfrowany po uruchomieniu przy użyciu określonych warunków (być może wywoływanie ajax jak DRM w celu zapewnienia dynamicznego klucza deszyfrującego, numeru seryjnego z blokującym algoruthym ((SN * data - 1)) - Tylko innym sposobem jest użycie kodu, który może skompilować Twój kod w pliki binarne - takie jak c ++ lub .net (mono) i mam nadzieję, że dobre programy do krakowania oprogramowania nie będą atakować twojego oprogramowania - wiesz, że Microsoft nie miał tego problemu przez eony .. i nadal nie rozwiązane .. Powodzenia!
Piotr Kula

Odpowiedzi:

8

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 opensslpokazem może być:

openssl enc -a -e -salt -aes-256-cbc -pass pass:abc123 -in /tmp/plaintext.txt -out /tmp/ciphertext.enc

openssl enc -d -a -aes-256-cbc -pass pass:abc123 -in /tmp/ciphertext.enc

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ć httpsi będziesz chronić przed atakami odpowiedzi, wykorzystując bieżący czas jak saltdla 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ę.

Avio
źródło
1
Mogę zalogować się jako root w trybie awaryjnym, odczytać plik klucza i odszyfrować całą jego ciężką pracę i sprzedać go Rosjanom za miliony. Dobra próba ... ale nie kuloodporna. Nawet https można oszukać za pomocą przekierowań DNS i fałszywych certyfikatów w obrębie zarządzanej sieci. Oops
Piotr Kula,
1
@Avio: Przede wszystkim sektor nie jest nieznany. To musi być znane, po prostu nie jest oczywiste, gdzie to jest. Ale ponieważ trzeba to znaleźć za pomocą jakiegoś skryptu / aplikacji deszyfrującej, można to znaleźć. Musisz gdzieś umieścić kod, który dokona deszyfrowania. Gdzie byś to położył? W initramfs jakaś partycja karty SD lub inne niechronione miejsce. Każdy może zobaczyć aplikacje / skrypty używane do odszyfrowania zaszyfrowanej partycji i / lub po prostu je zmienić, aby uzyskać pewien dostęp przed ich uruchomieniem.
Krzysztof Adamski
1
Wszystkie metody szyfrowania są w porządku - z wyjątkiem tego, że klucz jest zapisany na karcie SD. Op najprawdopodobniej chce sprzedać karty SD dla / z Pi użytkownikowi końcowemu. Następnie mogę wziąć kartę SD, brutalnie ją zhakować, wykorzystać, tryb awaryjny do roota - odczytać plik klucza i zinfiltrować wszystkie pozostałe urządzenia komunikacyjne i kod źródłowy. To jest zagadka. Jestem pewien, że OP wie, jak szyfrować różne rzeczy. Pyta, jak zabezpieczyć swoje oprogramowanie przed odszyfrowaniem, jednocześnie pozwalając systemowi automatycznie je odszyfrować.
Piotr Kula
1
@Avio: Nie, nie bardzo. Ale skoro zapytałeś „jak?”, Odpowiedziałem na to. Nie wiedziałem, że to retoryczne pytanie. Napisałeś, że wdrożenie Twojego pomysłu wystarczy, aby rozpocząć dystrybucję aplikacji, ale uważam, że OP (i inni czytający to) powinni być świadomi słabych stron tego podejścia. Biorąc to pod uwagę, nie sądzę, aby istniało znacznie lepsze rozwiązanie dla Raspberry Pi. Jedyne, co można zrobić, to po prostu zaciemnić jeszcze bardziej. Może aplikacja OP jest po prostu zbyt cenna, aby zaryzykować i decyduje się użyć czegoś innego niż RPi, gdzie może stworzyć lepszy mechanizm ochrony.
Krzysztof Adamski
1
Chociaż wszystkie odpowiedzi tutaj zawierają świetną dyskusję na temat kompromisów i wyzwań związanych z moim pytaniem, na razie przyjmuję tę odpowiedź, ponieważ ma ona najbardziej konkretne rozwiązanie. Użycie numeru seryjnego z / proc / cpuinfo może być brakującym linkiem.
Schrockwell
6

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

  1. Jak prawdopodobne jest to?
  2. Jaka jest wartość dla twojego algorytmu i danych dla kogoś innego?
  3. Jaki jest dla nich koszt zakupu licencji na korzystanie z oprogramowania?
  4. Jaki jest dla nich koszt replikacji algorytmu i danych?
  5. Jaki jest dla nich koszt inżynierii wstecznej algorytmu i danych?
  6. Jaki jest koszt ochrony twojego algorytmu i danych?

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

  • Jak zabezpieczyć algorytm i dane?

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 .

Mark Booth
źródło
SaaS może być opcją, ale musisz pamiętać, że będziesz musiał ponownie sprawdzić punkty od 1 do 6 dla każdego serwera, który umieścisz online. Narażasz się także na ataki DDoS.
Avio
4

Ostatnio wymyśliłem bardzo eleganckie rozwiązanie tego nierozwiązywalnego problemu. Został zainspirowany tym komiksem xkcd:

wprowadź opis zdjęcia tutaj

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!

wprowadź opis zdjęcia tutaj

ADOConnection
źródło
Ktoś może jednak łatwo utworzyć z niego plik obrazu ( dd) i odpowiednio go użyć!
Vassilis,
@Vassilis jest to niemożliwe bez logowania, czy nie?
ADOConnection
Każdy, kto ma obraz linux na żywo, może to zrobić! Nie jest konieczne, aby być źródłem twojego systemu.
Vassilis,
@Vassilis, mogę prosić o wskazanie dowolnego artykułu wyjaśniającego tę procedurę, proszę
ADOConnection
pierwszą rzeczą, która pojawiła się w Google, jest to
Vassilis,
2

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.

Tomas Q.
źródło
1
Szyfrowanie podczas rozruchu nie jest tak bezpieczne, jak mogłoby się wydawać. Musisz tylko uzyskać dostęp / ominąć normalny rozruch systemu i to wszystko jest mięso mielone. Nawet Blurays nie mają racji ... cholera!
Piotr Kula,
Tylko całkowicie zamknięte systemy mogą chronić twoją aplikację. Znam tylko jedną rzecz, która jest nieco programowalna - Java Card.
Tomas Q.
1
Tak - ale zawsze musisz podać PIN - PIN NIGDY nie jest zapisywany na karcie.
Piotr Kula
1

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.

  1. Napisz odpowiednie oprogramowanie dla BCM, które wygenerowało pojedynczy kod logowania na podstawie ściśle tajnego algorytmu, którego można użyć tylko w ciągu następnych 10 sekund.
  2. Skompiluj własne jądro za pomocą odpowiedniego oprogramowania i włącz niektóre funkcje systemu Linux, które pozwalają montować root z zaszyfrowanego pliku we flashu, który zawiera inną zaszyfrowaną partycję z twoim oprogramowaniem. (Podwójna ochrona)
  3. Twoje oprogramowanie sprzętowe BCM wygeneruje ściśle tajny klucz autoryzacyjny na podstawie niektórych sprytnych algorytmów lub kluczy publicznych i przekaże go do niestandardowego jądra systemu Linux, który załaduje zaszyfrowaną partycję root i wykona więcej operacji kryptograficznych podczas rozruchu, aby załadować zaszyfrowany dysk oprogramowania w zaszyfrowanym obrazie.

WSKAZÓWKI

  • Dobre klucze uwierzytelniania nie mają długości 8-16 znaków Ważne jest, aby podać klucze uwierzytelniania o długości 256/512 bajtów, używając więcej symboli systemowych (HEX) i mniej znaków (ASCII)
  • Nie używaj AES, TKIP, ponieważ łatwo się pęka
  • Na dzień dzisiejszy szyfrowanie Whirlpool jest jednym z najbardziej skomplikowanych do złamania przy użyciu kluczy 256/512
  • Nawet jeśli haker może usunąć dysk flash lub zrzucić zawartość. twoje oprogramowanie jest szyfrowane dwukrotnie.
  • Jeśli przechwycą klucz uwierzytelniania, bardzo trudno będzie wydostać się z oprogramowania (ponieważ BCM może zapobiec zrzutom oprogramowania)
  • Niektóre sprytne ROM-y Flash mają również funkcję zapobiegającą pełnym zrzutom pamięci.
  • Jeśli projektujesz płytkę drukowaną, zaimplementujesz (podobnie jak Dell i Apple) układy zabezpieczające, które zapewniają wszystkie Twoje dane i klucze szyfrowania i zapobiegają próbom użycia siły. Niektóre Dell mają autodestrukcję do celów wojskowych. Jeśli wpiszesz nieprawidłowe hasło BIOS 2 razy, spowoduje to wyczyszczenie dysków bombami rozpraszającymi. Możesz zaimplementować to samo, jeśli wykryjesz manipulacje przy użyciu klucza autoryzacji.

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

  • Napisz swoje oprogramowanie, aby można je było skompilować i wdrożyć w systemie docelowym w formacie binarnym. Przykład EXE dla systemu Windows działającego na platformie .NET, JAR dla Java lub (Nie masz pewności w Linuksie, C ++?)
  • Pamiętaj, że tym większe bezpieczeństwo chcesz - tym więcej pieniędzy będziesz musiał na to wydać. Nie ma wyjątków.
Piotr Kula
źródło
1

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.

b26
źródło
0

Możesz użyć rozwiązania opartego na barana: Software Serial Protection dla Raspberry Pi

Paulo Arede
źródło
2
Popraw mnie, jeśli się mylę, ale wydaje się, że to urządzenie nie zapewnia żadnej ochrony przed inżynierią wsteczną. To samo zrobiłoby proste, zakodowane na stałe sprawdzenie numeru seryjnego procesora.
EDP
0

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.

Thomas McNeill
źródło
-4

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.

Sean
źródło
1
Cześć i witaj. Jest dużo zgadywania i uwierz w ten post. Przed zaleceniem ludziom zastosowania napięcia 12 V do Pi bardzo wskazane byłoby udzielić bardziej szczegółowej odpowiedzi i poprzeć ją odpowiednimi referencjami.
Ghanima