Firma Kudelski Security, specjalizująca się w audycie bezpieczeństwa, opublikowała narzędzie Shufflecake, które umożliwia tworzenie ukrytych systemów plików, rozproszonych po dostępnej przestrzeni w istniejących partycjach i nieodróżnialnych od przypadkowych danych pozostałych. Partycje są tworzone w taki sposób, że nie znając klucza dostępu, istnienie ich jest problematyczne do udowodnienia nawet podczas przeprowadzania analizy kryminalistycznej. Kod narzędzi (shufflecake-userland) oraz modułu jądra Linux (dm-sflc) napisany jest w języku C i jest rozpowszechniany na licencji GPLv3, co uniemożliwia włączenie opublikowanego modułu jądra do głównej struktury jądra Linux z powodu niekompatybilności z licencją GPLv2, na której dostarczane jest jądro.
Projekt jest pozycjonowany jako bardziej zaawansowane rozwiązanie niż Truecrypt i Veracrypt do ukrywania danych wymagających ochrony, które ma natywną obsługę platformy Linux i pozwala na umieszczanie do 15 ukrytych partycji na urządzeniu, zagnieżdżonych w sobie w celu skomplikowania analizy ich istnienia. Jeśli samo stosowanie Shufflecake nie jest tajemnicą, co można wnioskować na przykład na podstawie obecności odpowiednich narzędzi w systemie, to ogólną liczbę stworzonych ukrytych partycji określić jest niemożliwe. Tworzone ukryte partycje mogą być formatowane według uznania użytkownika dla umieszczenia dowolnych systemów plików, na przykład ext4, xfs lub btrfs. Każda partycja jest traktowana jako oddzielne wirtualne urządzenie blokowe ze swoim kluczem odblokowującym.
Aby zmylić ślady, proponuje się zastosowanie modelu zachowania „prawdopodobne zaprzeczenie” (plausible deniability), którego istotą jest to, że wartościowe dane są ukrywane jako dodatkowe warstwy w zaszyfrowanych partycjach z mniej wartościowymi danymi, tworząc swoistą ukrytą hierarchię partycji. W przypadku nacisku właściciel urządzenia może ujawnić klucz do zaszyfrowanej partycji, ale w tej partycji mogą być ukryte inne partycje (aż do 15 zagnieżdżonych poziomów), a określenie ich istnienia i udowodnienie tego jest problematyczne.
Ukrywanie jest zapewnione poprzez tworzenie każdego sektora jako zestawu zaszyfrowanych kawałków, umieszczanych w losowych lokalizacjach na nośniku danych. Każdy kawałek jest tworzony dynamicznie w momencie, gdy sektor wymaga dodatkowej przestrzeni do przechowywania. Aby utrudnić analizę, kawałki różnych sektorów są mieszane, tzn. sektory Shufflecake nie są powiązane z ciągłymi obszarami, a kawałki wszystkich sektorów są wymieszane. Informacje o używanych i wolnych kawałkach są przechowywane w mapie lokalizacji przypisanej do każdego sektora, do której odnosi się zaszyfrowany nagłówek. Mapy i nagłówek są zaszyfrowane i bez znajomości klucza dostępu są nieodróżnialne od danych losowych.
Nagłówek jest podzielony na sloty, z których każdy definiuje swój sektor i powiązane z nim kawałki. Sloty w nagłówku są umieszczone w porządku stosu i są rekursywnie powiązane — bieżący slot zawiera klucz do odszyfrowania parametrów poprzedniego sektora w hierarchii (mniej ukrytego), co pozwala na użycie jednego hasła do odszyfrowania wszystkich mniej ukrytych sektorów powiązanych z wybranym sektorem. Każdy mniej ukryty sektor traktuje kawałki zagnieżdżonych sektorów jako wolne.
Domyślnie wszystkie zagnieżdżone sektory Shufflecake mają ten sam widoczny rozmiar, co sektor najwyższego poziomu. Na przykład, jeśli na urządzeniu o rozmiarze 1 GB zaangażowane są trzy sektory, każdy z nich będzie widoczny dla systemu jako sektor o rozmiarze 1 GB, a całkowita dostępna przestrzeń dyskowa będzie współdzielona we wszystkich sektorach — jeśli łączny rozmiar przechowywanych danych przekroczy rzeczywisty rozmiar urządzenia, zacznie pojawiać się błąd wejścia/wyjścia.
Nieotwarte podfoldery nie biorą udziału w przydziale miejsca, to znaczy, że próba wypełnienia folderu głównego doprowadzi do nadpisania danych w podfolderach, ale nie pozwoli na ujawnienie ich obecności poprzez analizę rozmiaru danych, które można pomieścić w folderze przed wystąpieniem błędu (zakłada się, że foldery główne zawierają niezmienne dane dla odwrócenia uwagi i nigdy nie są używane osobno, a standardowa praca zawsze odbywa się z ostatnim podfolderem; sama schemat sugeruje, że ważniejsze jest zachowanie tajemnicy istnienia danych niż ich utrata).
Faktycznie zawsze tworzy się 15 folderów Shufflecake — do używanych folderów przypisywane jest hasło użytkownika, a nieużywane foldery są zaopatrywane w losowo generowane hasło (niemożliwe jest ustalenie, ile rzeczywiście folderów jest używanych). Przy inicjalizacji folderów Shufflecake, założony na ich umiejscowienie dysk, partycja lub wirtualne urządzenie blokowe jest wypełniane losowymi danymi, co uniemożliwia określenie psedopodstawowych metadanych i danych Shufflecake.
Realizacja Shufflecake ma dość wysoką wydajność, ale z powodu dodatkowych kosztów około dwa razy odstaje pod względem przepustowości w porównaniu do szyfrowania dysków w oparciu o podsystem LUKS. Zastosowanie Shufflecake prowadzi także do dodatkowych wydatków na pamięć operacyjną i miejsce do przechowywania danych pomocniczych na dysku. Koszt pamięci oceniany jest na 60 MB na każdy folder, a miejsca na dysku — na 1% całkowitego rozmiaru. Dla porównania, podobnie zaprojektowana technika WORAM powoduje opóźnienie od 5 do 200 razy przy 75% stracie użytecznej powierzchni na dysku.
Narzędzia i moduł jądra testowane były tylko w systemach Debian i Ubuntu z jądrami 5.13 i 5.15 (wsparcie dla pracy w Ubuntu 22.04). Należy zauważyć, że projekt na razie należy traktować jako prototyp roboczy, którego nie warto używać do przechowywania ważnych danych. W przyszłości planowane jest przeprowadzenie dodatkowej optymalizacji wydajności, niezawodności i bezpieczeństwa, a także zapewnienie możliwości uruchamiania z folderów Shufflecake.
Źródło: opennet.ru
