Padding Oracle Attack
Padding Oracle Attack (atak typu „oracle” na wypełnienie) – metoda kryptograficzna pozwalająca na odszyfrowanie zaszyfrowanego komunikatu lub wstrzyknięcie własnych danych, wykorzystująca informacje zwrotne (tzw. „oracle”) o poprawności wypełnienia przy użyciu trybu szyfrowania blokowego, najczęściej trybu CBC oraz schematu wypełniania PKCS#7 (również zwany PKCS#5). Atak został po raz pierwszy opisany w 2002 roku przez Sergei’ego Bleichenbachera w kontekście protokołu PKCS#1, a później szczegółowo opracowany w 2003 roku przez Daniego Bailey’a, Keitha Robbie’ego i Nielsa Fergusona.
Opis ataku
Atak polega na wielokrotnym wysyłaniu zmodyfikowanych wersji tego samego szyfrogramu do systemu, który analizuje przychodzące dane i w odpowiedzi informuje, czy wypełnienie (padding) jest prawidłowe. Nawet bardzo ogólne odpowiedzi („poprawne wypełnienie”, „błąd w wypełnieniu”) dostarczają atakującemu wystarczającej wiedzy do systematycznego odtwarzania oryginalnego tekstu jawnego.
Warunki konieczne
- Szyfrowanie w trybie blokowym, najczęściej CBC, CFB lub OFB, przy założeniu, że każdy blok jest szyfrowany niezależnie.
- Użycie schematu wypełniania, najpowszechniejszy PKCS#7/PKCS#5.
- Obecność mechanizmu (oracle), który zwraca informację o poprawności wypełnienia, np. różne kody HTTP (404 vs 500), różne czasy odpowiedzi lub komunikaty w aplikacji.
- Brak dodatkowego uwierzytelnienia integralności (MAC) lub szyfrowania uwierzytelniającego (AEAD) przed sprawdzeniem wypełnienia.
Przebieg ataku
- Atakujący przechwytuje szyfrogram
C = C₀‖C₁‖...‖Cₙ, gdzieC₀jest wektorem inicjalizującym (IV). - Modyfikuje ostatni bajt jednego z bloków (zwykle
Cₙ₋₁) i wysyła zmieniony szyfrogram do serwera. - Na podstawie odpowiedzi oracle (np. „błąd wypełnienia” vs „poprawny szyfr”) atakujący wywnioskuje, czy zmiana spowodowała prawidłowe wypełnienie.
- Poprzez systematyczne próby (255 możliwych wartości) atakujący odzyskuje bajt po bajcie oryginalnego bloku jawnego
Pₙ. - Proces jest powtarzany dla kolejnych bloków, aż do odszyfrowania całego komunikatu.
Historia i znaczące przypadki
Po publikacji pierwszych opisów ataku, luka została wykryta w wielu protokołach i implementacjach, w tym w:
- TLS/SSL (wersje przed 1.2, w których używano trybu CBC i nieodpowiedniego sprawdzania wypełnienia).
- Systemach płatności internetowych opartych na 3DES oraz AES w trybie CBC.
- Oprogramowaniu do szyfrowania plików, takim jak PKZIP oraz starsze wersje WinZip.
- Niektórych implementacjach XML Encryption i JWT.
Środki zaradcze i najlepsze praktyki
Aby zabezpieczyć systemy przed atakiem typu padding oracle, zaleca się:
- Używanie trybów AEAD (np. GCM, CCM), które łączą szyfrowanie i uwierzytelnianie oraz nie sprawdzają wypełnienia przed weryfikacją MAC.
- Odciąganie czasu odpowiedzi (constant‑time) i unifikację komunikatów błędowych, tak aby nie było możliwe odróżnienie błędów wypełnienia od innych błędów.
- Stosowanie losowego IV przy każdym szyfrowaniu oraz jego weryfikacji przed odszyfrowaniem.
- Wprowadzenie dodatkowego szyfrowania uwierzytelniającego (MAC) przed sprawdzeniem wypełnienia – schemat Encrypt‑then‑MAC jest najbezpieczniejszy.
- Aktualizowanie bibliotek kryptograficznych do wersji, które już nie zezwalają na oddzielne zwracanie informacji o wypełnieniu.
Związane pojęcia
- Szyfrowanie blokowe
- Tryb CBC
- PKCS#7 (PKCS#5) Padding
- AEAD (Authenticated Encryption with Associated Data)
- Kryptograficzny Oracle
- Atak czasowy (Timing Attack)
Bibliografia (linki wewnętrzne)
Więcej informacji można znaleźć w następujących artykułach:
- Tryb CBC
- AEAD
- PKCS#7 Padding
- Transport Layer Security (TLS)
- Padding Oracle Attack – szczegółowy opis techniczny (niniejszy artykuł).