Jak łatwo złamać następujące zabezpieczenia przed kopiowaniem? [Zamknięte]

11

Próbuję zabezpieczyć przed kopiowaniem niektóre prace, którymi jest bootowalna karta SD uruchamiająca jądro Linuksa na urządzeniu ARM (Raspberry Pi). Korzystam z tego podejścia:

  1. Podejście wykorzystuje initrd do zamontowania zaszyfrowanego głównego systemu plików.
  2. Initrd generuje hasło systemu plików zgodnie z CID karty SD. (używana jest funkcja skrótu, jeszcze nie zdecydowała się na md5 lub sha1). Initrd spróbuje zamontować system plików przy użyciu wygenerowanego hasła.
  3. Oto najbardziej interesująca / podejrzana część: sam initrd jest szyfrowany za pomocą niestandardowej funkcji C, w zasadzie każdy bajt jest XOR'owany za pomocą niestandardowego generatora pseudolosowego. Jądro zostało zmodyfikowane, aby miało tę samą funkcję szyfrowania, która działa jak deszyfrator.
  4. Sam system jest rozebrany, więc nie ma możliwości korzystania z klawiatury lub pamięci zewnętrznej. Jedna aplikacja działa na pełnym ekranie.

Zatem po załadowaniu jądra i initrd przez moduł ładujący jądro odszyfrowuje initrd i wykonuje skrypt inicjujący, który wygeneruje hasło i zamontuje główny system plików.

Moje pytanie brzmi: jak łatwo byłoby przerwać tę konfigurację (odszyfrować główny system plików i uruchomić go z dowolnej karty SD)? Jakie są najsłabsze części? Jak łatwo jest zdekompilować jądro i znaleźć niestandardowe funkcje szyfrowania?

EDYCJA: Oto kilka poprawek, abyś nie tracił czasu na oczywiste rzeczy:

  1. Urządzenie root zostanie zaszyfrowane za pomocą LUKS (aes256), a klucz zostanie wygenerowany przez jakąś funkcję HMAC przy użyciu CID karty SD i soli.
  2. Pseudolosowym algorytmem szyfrowania initramfs będzie w rzeczywistości RC4, tylko klucz zostanie wygenerowany za pomocą jakiejś niestandardowej funkcji, ponieważ jeśli po prostu przechowuję klucz w tablicy bajtów, można go łatwo odzyskać (tak, to jest bezpieczeństwo poprzez niejasność ale wydaje się, że nie ma innego wyjścia).
  3. Rozumiem, że jeśli używa się emulatora karty SD, ktoś może zrobić kopię tego systemu, ale jest to w porządku dla mnie, ponieważ jest to dość trudne i nie każdy może to zrobić. (Również nie każdy będzie chciał poradzić sobie z emulatorami)
dimovnike
źródło
Gdzie jest przechowywane jądro i initrd?
grawitacja
Wszystkie są przechowywane na jednej karcie SD. Oba w osobnych plikach. Przechowywany jak zwykle w / boot.
dimovnike

Odpowiedzi:

7

Jak łatwo byłoby przerwać tę konfigurację (odszyfrować główny system plików i uruchomić go z dowolnej karty SD)?

To, jak trudno jest „złamać” konfigurację, zależy od liczby bitów entropii w dowolnej metodzie używanej do podpisywania / szyfrowania samego systemu plików (ponieważ określa to całkowitą liczbę unikalnych kombinacji, których można użyć do brutalnej siły hasło).

Jakie są najsłabsze części?

Bez wątpienia używa wstępnie zdefiniowanego identyfikatora CID jako hasła, a także niestandardowej funkcji generowania liczb pseudolosowych.

Identyfikator CID karty SD ma być tylko do odczytu, ale w dzisiejszych czasach nierzadko można znaleźć niezgodne urządzenia pamięci flash. Niektóre osoby wykazały nawet możliwość zastąpienia identyfikatora CID niektórymi kartami SD. Byłoby łatwiej brute-force hasło, zwłaszcza jeśli ktoś jest po prostu emulacji karty SD po klonowaniu ciebie (co jest coś jeszcze może warto rozważyć).

Wreszcie, użycie dowolnego generatora liczb pseudolosowych ma już pewne wewnętrzne wady, właśnie dlatego, że nie jest losowy - istnieje powód, który nazywa się pseudolosowym . Lepszym rozwiązaniem może być użycie wstępnie zaszyfrowanego programu ładującego (takiego jak TrueCrypt lub LUKS, które działają na Raspberry Pi) i uniknięcie konieczności ręcznych modyfikacji jądra.

Jak łatwo jest zdekompilować jądro i znaleźć niestandardowe funkcje szyfrowania?

Bardzo trudno jest dekompilować cokolwiek. I odwrotnie, dezasemblacja skompilowanej aplikacji jest często trywialna i istnieje wiele narzędzi, których można użyć do pomocy w asemblerze wstecznym z powrotem w innym języku wyższego poziomu. Jeśli osoba atakująca ma dostęp nawet do skompilowanego jądra, analiza czegoś w rodzaju generatora liczb pseudolosowych jest prawdopodobnie trywialna, chyba że kod zostanie celowo zaciemniony.


TL, DR : Nie wymyślaj na nowo koła, jeśli chodzi o szyfrowanie i bezpieczeństwo, trzymaj się sprawdzonego i prawdziwego. Istnieje kilka opcji szyfrowania całego dysku, które są już dostępne i wykazano, że działają dobrze na Raspberry Pi. Unikałbym używania CID karty SD jako „hasła” - nawet jeśli nie można go zmienić, istnieją sposoby na sfałszowanie tej wartości.

Ochrona przed kopiowaniem jest już uwzględniona w specyfikacji karty SD jako CPRM .

Przełom
źródło
Dziękuję za odpowiedź. Wiem o CPRM, ale jego specyfikacje są zamknięte przez NDA i kosztują dużo pieniędzy (z tego, co zrobiłem w Google). Jeśli chodzi o LUKS i Truecrypt, wymagają one ręcznego wpisania klucza podczas rozruchu. Jeśli zmodyfikuję program ładujący TrueCrypt, aby wygenerował klucz z CID przy użyciu funkcji hmac, czy będzie to lepsze? Rozumiem również, że można to zrobić za pomocą emulatora karty SD, ale to nie przeszkadza mi, jest to dogodny stopień trudności dla piratów. (Rozumiem, że tutaj nie ma 100% ochrony, dopóki klucz jest samowystarczalny w urządzeniu)
dimovnike
@ user2021201 rzeczywiście do tego właśnie chciałem cię doprowadzić. To prawdopodobnie być dość łatwe do modyfikacji bootloadera TrueCrypt ze źródła, choć nie jestem pewien, jak trudno byłoby uzyskać CID z bootloadera (ponieważ nie ma załadowanego systemu operacyjnego kwerendy specyfikacji kart SD z ). Jeśli jednak sobie poradzisz, prawdopodobnie będzie to akceptowalne i wystarczające rozwiązanie dla twoich potrzeb.
Przełom
1

Ktoś wykwalifikowany nie miałby większych problemów z przełamaniem tego. Względnie łatwo byłoby uruchomić kartę SD w emulatorze, a następnie po prostu odczytać klucze z pamięci RAM. Następnie publikują wersję bez ochrony przed kopiowaniem w Pirate Bay (itp.) I to wszystko.

Alternatywnie użyj emulatora, aby wstrzyknąć kod powłoki do działającego systemu emulowanego. Następnie użyj działającego systemu, aby skopiować odszyfrowane rootfy (lub odczytaj klucze za pomocą dmsetup table --showkeysitp.)

Szybkie wyszukiwanie ujawnia istnienie emulatorów Raspberry Pi , więc część pracy została już wykonana.

Masz inny problem, w szczególności:

Jądro zostało zmodyfikowane, aby miało tę samą funkcję szyfrowania, która działa jak deszyfrator.

Każdy, komu to rozpowszechniasz, ma prawo do kodu źródłowego jądra, zgodnie z warunkami GPL. Więc nie musisz go rozbierać, możesz po prostu diffznaleźć dodatkową funkcję.

(Nie to, że znalezienie go przez demontaż byłoby tak trudne, jak można np. Sprawdzić w porównaniu do podstawowego jądra)

Nie jestem do końca zaznajomiony z kodem rozruchowym Raspberry Pi, ale jeśli możesz ponownie załadować bootloader za pomocą wbudowanego klucza kryptograficznego (który jest następnie przekazywany do jądra), to przynajmniej nie będzie na karcie SD, więc „ d udaremnić próbę uruchomienia go w emulatorze.

derobert
źródło
tak, jestem świadomy problemów z licencjonowaniem, wciąż szukam sposobów na pozostawienie jądra w stanie nienaruszonym, a nawet przejście na jądro FreeBSD, ale na razie omówię tylko problemy techniczne. Pomysł bootloadera jest bardzo interesujący, ale nie mogłem znaleźć sposobu na jego wdrożenie, najwyraźniej nie ma takiego sposobu.
dimovnike