W pakiecie Cryptsetup, używanym do szyfrowania partycji dyskowych w systemie Linux, zidentyfikowano lukę (CVE-2021-4122), która umożliwia poprzez modyfikację metadanych dezaktywację szyfrowania w partycjach w formacie LUKS2 (Linux Unified Key Setup). Aby wykorzystać tę lukę, atakujący musi mieć fizyczny dostęp do zaszyfrowanego nośnika, co czyni tę metodę zasadniczo skuteczną jedynie w atakach na zaszyfrowane zewnętrzne urządzenia pamięci, takie jak dyski Flash, do których złośliwy użytkownik ma dostęp, ale nie zna hasła do odszyfrowania danych.
Atak dotyczy wyłącznie formatu LUKS2 i jest związany z manipulacją metadanymi, które odpowiadają za aktywację rozszerzenia „online reencryption”, pozwalającego w razie potrzeby zmiany klucza dostępu na uruchomienie procesu ponownego szyfrowania danych w locie, bez zatrzymywania pracy z partycją. Ponieważ proces odszyfrowywania i szyfrowania z nowym kluczem zajmuje dużo czasu, „online reencryption” umożliwia kontynuowanie pracy z partycją i wykonywanie ponownego szyfrowania w tle, stopniowo przenosząc dane z jednego klucza na drugi. Istnieje również możliwość wybrania pustego klucza docelowego, co pozwala na przekształcenie partycji w odszyfrowaną postać.
Atakujący może wprowadzić do metadanych LUKS2 zmiany, które symulują awaryjne przerwanie operacji odszyfrowywania w wyniku awarii, co pozwala na odszyfrowanie części partycji po aktywacji i użyciu zmodyfikowanego nośnika przez właściciela. Użytkownik, który podłączył zmodyfikowany nośnik i odblokował go poprawnym hasłem, nie otrzymuje żadnego ostrzeżenia o przebiegu procesu przywracania przerwanej operacji ponownego szyfrowania i może dowiedzieć się o postępie tej operacji jedynie za pomocą polecenia „luks Dump”. Ilość danych, które może odszyfrować atakujący, zależy od rozmiaru nagłówka LUKS2, ale przy domyślnym rozmiarze (16 MiB) może przekraczać 3 GB.
Problem ten wynika z tego, że mimo iż dekrypcja wymaga obliczeń i weryfikacji hashy nowych i starych kluczy, na początku dekrypcji hash nie jest wymagany, jeśli nowe ustawienie zakłada brak klucza do szyfrowania (plaintext). Ponadto, metadane LUKS2, w których określany jest algorytm szyfrowania, nie są chronione przed modyfikacją, gdy trafią w ręce osoby nieuprawnionej. Aby zablokować tę lukę, deweloperzy dodali do LUKS2 dodatkową ochronę metadanych, dla których teraz weryfikowany jest dodatkowy hash, obliczany na podstawie znanych kluczy oraz zawartości metadanych, tzn. atakujący nie może teraz bez wykrycia zmienić metadanych, nie znając hasła do dekrypcji.
Typowy scenariusz ataku wymaga, aby osoba nieuprawniona miała możliwość wielokrotnego zdobycia nośnika. Na początku atakujący, który nie zna hasła, wprowadza zmiany w obszarze metadanych, inicjując dekrypcję części danych podczas następnej aktywacji nośnika. Następnie nośnik wraca na miejsce, a atakujący czeka, aż użytkownik go podłączy, wprowadzając hasło. Podczas aktywacji urządzenia przez użytkownika uruchamiany jest proces w tle ponownego szyfrowania, w trakcie którego część zaszyfrowanych danych jest zastępowana danymi odszyfrowanymi. Jeśli atakujący ponownie zdobędzie urządzenie, część danych na nośniku będzie w formie odszyfrowanej.
Problem został wykryty przez opiekuna projektu cryptsetup i usunięty w aktualizacjach cryptsetup 2.4.3 i 2.3.7. Stan tworzenia aktualizacji rozwiązujących problem w dystrybucjach można śledzić na tych stronach: Debian, RHEL, SUSE, Fedora, Ubuntu, Arch. Luka występuje tylko od wersji cryptsetup 2.2.0, w której wprowadzono wsparcie dla operacji „online reencryption”. Jako obejście można uruchomić z opcją „--disable-luks2-reencryption”.
Źródło: opennet.ru
