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:
- Podejście wykorzystuje initrd do zamontowania zaszyfrowanego głównego systemu plików.
- 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.
- 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.
- 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:
- 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.
- 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).
- 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)
linux
encryption
sd-card
initrd
dimovnike
źródło
źródło
Odpowiedzi:
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).
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.
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 .
źródło
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 --showkeys
itp.)Szybkie wyszukiwanie ujawnia istnienie emulatorów Raspberry Pi , więc część pracy została już wykonana.
Masz inny problem, w szczególności:
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
diff
znaleźć 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.
źródło