0Pricing
Cryptology Academy · Lekcja

Zasady projektowania bezpiecznych protokołów

Proszę zastosować zasady Abadiego–Needhama, świeżość i cele uwierzytelniania do projektowania protokołów odpornych na znane ataki.

Zasady projektowania bezpiecznych protokołów to bezpłatna lekcja Cryptology Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cryptology Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cryptology Academy zawiera 4 lekcji w sumie.

Model przeciwnika Doleva-Yao

Projektowanie bezpiecznych protokołów zakłada istnienie przeciwnika, który całkowicie kontroluje sieć. Model Doleva-Yao (1983) określa, że przeciwnik może przechwytywać, odczytywać, opóźniać, powtarzać, usuwać i modyfikować dowolne wiadomości przesyłane w sieci. Może również tworzyć wiadomości nieodróżnialne od wiadomości uczciwych stron. Może komponować nowe wiadomości ze znanych składników wiadomości. Nie może łamać prymitywów kryptograficznych (odszyfrowywać bez klucza ani fałszować podpisów). Co najważniejsze, przeciwnik jest ograniczony obliczeniowo — działa w czasie wielomianowym — ale kontroluje wszystkie kanały komunikacyjne. Bezpieczeństwo protokołu oznacza osiągnięcie celów uwierzytelniania i poufności nawet wobec tak potężnego przeciwnika, przy założeniu wyłącznie trudności obliczeniowej leżącej u podstaw użytych prymitywów.

Zasady Abadiego i Needhama

Abadi i Needham (1994) zebrali praktyczne wnioski dotyczące projektowania protokołów w postaci zestawu zasad. (1) Każda wiadomość powinna jasno określać swoje znaczenie: interpretacja wiadomości powinna być samodzielna i nie może zależeć od kontekstu. (2) Warunki, które muszą zostać spełnione, aby podmiot podjął działanie, powinny być wyraźnie określone w protokole. (3) Jeśli tożsamość podmiotu ma znaczenie, powinna być wyraźnie podana w wiadomości. (4) Należy jasno określić, dlaczego używane jest szyfrowanie: szyfrowanie zapewnia poufność, a podpisy zapewniają uwierzytelnianie — nie należy używać szyfrowania zamiast podpisu. (5) Wiadomość powinna być szyfrowana na tej warstwie protokołu, na której potrzebna jest jej poufność. Zasady te zapobiegły wielu lukom typu NS.

Świeżość: nonces i znaczniki czasu

Ataki polegające na powtórzeniu należą do najczęstszych luk w protokołach. Mechanizmy świeżości zapewniają, że odebrana wiadomość została wygenerowana niedawno, a nie odtworzona ze starej sesji. Stosuje się dwa podejścia: (1) Nonces (Number used ONCE, czyli wartości używane tylko raz) — mechanizm challenge-response, w którym odbiorca wysyła losową wartość i oczekuje jej powtórzenia w odpowiedzi. Odpowiedź musi zawierać nonce zaszyfrowany lub podpisany, co uniemożliwia wykorzystanie wcześniej zarejestrowanej wiadomości do spełnienia nowego wyzwania. (2) Znaczniki czasu — obie strony dołączają bieżący czas, a wiadomość z nieaktualnym znacznikiem czasu jest odrzucana. Znaczniki czasu wymagają zsynchronizowanych zegarów (Kerberos dopuszcza 5-minutowe odchylenie). Nonce są preferowane, gdy synchronizacja zegarów jest niedostępna, natomiast znaczniki czasu upraszczają bezstanową weryfikację.

Rozdzielenie kluczy: różne klucze do różnych celów

Używanie tego samego klucza kryptograficznego do wielu celów prowadzi do niebezpiecznych interakcji. Jeśli klucz K jest używany zarówno do szyfrowania, jak i uwierzytelniania, przeciwnik może podawać spreparowane szyfrogramy mechanizmowi uwierzytelniania, aby wydobywać informacje. TLS 1.3 rygorystycznie unika tego problemu dzięki HKDF-Expand-Label, używając odrębnych etykiet dla każdego wyprowadzanego klucza: „c hs traffic” (uzgadnianie klienta), „s hs traffic” (uzgadnianie serwera), „c ap traffic” (ruch aplikacji klienta). Nawet jeśli klucz uzgadniania zostanie ujawniony, klucze aplikacji wyprowadzone z innej gałęzi HKDF pozostają bezpieczne. Projekty protokołów muszą obejmować kontrolą każdy klucz pod kątem ryzyka wielokrotnego użycia i wyprowadzać osobne klucze do osobnych celów.

Powiązanie uwierzytelniania z sesjami

Dane uwierzytelniające muszą być powiązane z konkretną sesją, w której są używane. Bez takiego powiązania dane uwierzytelniające uzyskane w jednej sesji można ponownie wykorzystać w innej. Techniki: (1) Uwzględnienie identyfikatorów sesji w danych podpisanych lub uwierzytelnionych kodem MAC. (2) Uwzględnienie transkryptu DH w podpisie (podejście STS). (3) Użycie klucza sesji wyprowadzonego przez HKDF do obliczenia kodu MAC dla tożsamości (podejście SIGMA). Komunikat Finished w TLS 1.3: MAC(server_finished_key, transcript_hash) — kod MAC obejmuje kompletny transkrypt, dlatego ponowne wykorzystanie komunikatu Finished z innej sesji kończy się niepowodzeniem. To powiązanie zapobiega atakom między sesjami, które występowały we wczesnych wersjach Kerberos i NS.

Zasada najmniejszych uprawnień i minimalnego ujawniania informacji

Protokoły powinny ujawniać wyłącznie minimum informacji niezbędne do ich działania. Tożsamości należy ujawniać wyłącznie podmiotom, które ich potrzebują. Nie należy dołączać numerów seryjnych certyfikatów ani identyfikatorów umożliwiających powiązanie sesji z tożsamościami, chyba że jest to wymagane. TLS 1.3 szyfruje certyfikat serwera (w przeciwieństwie do TLS 1.2, w którym jest on przesyłany jawnym tekstem), ograniczając ilość informacji dostępnych pasywnemu podsłuchującemu. ESNI (Encrypted SNI, obecnie ECH — Encrypted Client Hello) szyfruje wskazanie nazwy serwera, aby ukryć, z którym serwerem łączy się klient. Minimalne ujawnianie informacji jest także zasadą projektowania tokenów: roszczenia JWT powinny zawierać tylko informacje potrzebne do autoryzacji, a nie pełne rekordy tożsamości.

Ochrona przed atakami obniżenia wersji

Negocjowanie wersji jest częstym obszarem ataków: przeciwnik usuwa lub modyfikuje ClientHello, aby zmusić obie strony do użycia starszej, słabszej wersji protokołu. Mechanizmy ochrony: (1) Uwierzytelnione negocjowanie wersji — wynegocjowaną wersję należy zawrzeć w podpisanym transkrypcie (TLS Finished obejmuje ClientHello wraz z wersją). (2) Znaczniki obniżenia wersji — TLS 1.3 umieszcza specjalne bajty w ServerHello.Random podczas przechodzenia na TLS 1.2, aby klient mógł wykryć obniżenie wersji. (3) Zapobieganie niezgodności wersji — serwery muszą odrzucać niepoprawne ClientHello, zamiast po cichu przechodzić na starszą wersję. (4) SCSV — TLS_FALLBACK_SCSV sygnalizuje serwerowi, że klient ponawia próbę z niższą wersją, dzięki czemu serwer może odrzucić nieuprawnione przejście na starszą wersję.

Zobowiązanie do transkryptu i niemodyfikowalność

Komunikaty protokołu powinny być objęte zobowiązaniem już od pierwszej wymiany. Niemodyfikowalność oznacza, że przeciwnik nie może zmodyfikować szyfrogramu ani podpisu tak, aby weryfikacja powiodła się w innym kontekście. AEAD zapewnia niemodyfikowalność szyfrogramu — każda modyfikacja unieważnia znacznik uwierzytelniający. Na poziomie protokołu haszowanie transkryptu sprawia, że wymiana Finished na końcu uzgadniania obejmuje zobowiązaniem każdy wysłany komunikat. Zapobiega to atakom typu wytnij i wklej: połączenie komunikatów z dwóch różnych sesji nie może utworzyć prawidłowej wartości Finished dla żadnej z tych sesji. Schematy zobowiązań (zobowiązania oparte na skrótach) rozszerzają tę ochronę na przebiegi protokołów wymagające wcześniejszego zobowiązania przed ujawnieniem.

Jasno zdefiniowana maszyna stanów

Złożone protokoły często zawodzą na granicach stanów. Jeśli przejście między stanami jest niejednoznaczne — co się dzieje, gdy komunikat 3 nadejdzie przed komunikatem 2? co się dzieje, gdy nadejdzie komunikat nieoczekiwanego typu? — implementacje mogą zachowywać się odmiennie, tworząc niespójności możliwe do wykorzystania przez przeciwnika. Specyfikacje protokołów muszą definiować: kompletną maszynę stanów (wszystkie stany i prawidłowe przejścia), zachowanie w przypadku nieoczekiwanych danych wejściowych (odrzucenie z określonym błędem lub ciche zignorowanie), limity czasu i retransmisji oraz czyszczenie stanu sesji. SSL/TLS historycznie borykał się z rozbieżnościami implementacji maszyn stanów — CVE-2014-0160 (Heartbleed) było w istocie awarią maszyny stanów, w której żądanie heartbeat zostało przetworzone w stanie, gdzie pamięć nie była odpowiednio ograniczona.

Kompozycyjność i modułowe projektowanie protokołów

Protokoły kryptograficzne rzadko są używane samodzielnie. Protokół AKE ustanawia klucz sesji, który następnie wykorzystuje protokół warstwy aplikacji. Jeśli protokół AKE i protokół aplikacji zostaną zaprojektowane niezależnie, bez uwzględnienia kompozycyjności, ich wzajemne oddziaływanie może naruszyć bezpieczeństwo. Model Universal Composability (UC) (Canetti, 2001) zapewnia ścisły model kompozycji protokołów: protokół jest bezpieczny w modelu UC, jeśli zachowuje bezpieczeństwo przy dowolnym łączeniu z innymi protokołami bezpiecznymi w modelu UC. TLS 1.3, Signal i Noise dążą do zapewnienia bezpieczeństwa kompozycyjnego. W praktyce należy używać powiązania kanału (eksportować skrót transkryptu), aby powiązać sesję AKE z późniejszym uwierzytelnianiem w warstwie aplikacji i zapobiec przekazywaniu danych uwierzytelniających między sesjami ustanowionymi przez ten sam protokół AKE.

Typowe antywzorce projektowania protokołów

Projektanci protokołów wielokrotnie popełniają te same typy błędów. (1) Samodzielne tworzenie kryptografii: implementowanie własnych szyfrów blokowych, kodów MAC lub mechanizmów wyprowadzania kluczy bez weryfikacji przez niezależnych ekspertów. (2) Niejawne zaufanie: uznawanie źródła komunikatu na podstawie kontekstu sieciowego zamiast dowodu kryptograficznego. (3) Opcjonalne zabezpieczenia: umożliwienie konfigurowania szyfrowania lub uwierzytelniania, co nieuchronnie prowadzi do obniżenia poziomu bezpieczeństwa. (4) Długowieczne tokeny bez możliwości unieważnienia: wydawanie JWT lub kluczy sesji z długim okresem ważności i bez mechanizmu unieważniania. (5) Ignorowanie kanału błędów: brak uwierzytelniania komunikatów o błędach pozwala przeciwnikowi wstrzykiwać błędy i wpływać na działanie protokołu. (6) Używanie szyfrowania do uwierzytelniania: szyfrowanie danych nie uwierzytelnia ich źródła bez kodu MAC lub podpisu.

Quiz z zasad projektowania protokołów

Zgodnie z zasadami Abadi-Needham, dlaczego komunikat powinien jawnie zawierać tożsamość nadawcy, gdy tożsamość ma znaczenie?

Podsumowanie bezpiecznego projektowania protokołów

Bezpieczne projektowanie protokołów opiera się na uznanych zasadach: modelu przeciwnika Dolev-Yao (przeciwnik kontrolujący sieć), zasadach Abadi-Needham (jawna tożsamość, samowystarczalne komunikaty), zapewnianiu świeżości za pomocą wartości nonce lub znaczników czasu, separacji kluczy za pomocą HKDF z odrębnymi etykietami, powiązaniu danych uwierzytelniających z sesją, minimalnym ujawnianiu informacji, zapobieganiu obniżeniu wersji dzięki uwierzytelnianiu transkryptu, niemodyfikowalności zapewnianej przez AEAD i haszowanie transkryptu, jasno zdefiniowanym maszynom stanów z określoną obsługą błędów oraz kompozycyjności potwierdzonej dowodami bezpieczeństwa w modelu UC. Naruszenia tych zasad są źródłem niemal każdej znanej podatności kryptograficznej na poziomie protokołu.

Często zadawane pytania

Czy lekcja „Zasady projektowania bezpiecznych protokołów” jest bezpłatna?

Tak — pełny tekst „Zasady projektowania bezpiecznych protokołów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cryptology Academy, przejdź na CoddyKit PRO. Kurs Cryptology Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Zasady projektowania bezpiecznych protokołów”?

Proszę zastosować zasady Abadiego–Needhama, świeżość i cele uwierzytelniania do projektowania protokołów odpornych na znane ataki. Ćwiczysz Cryptology Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Cryptology Academy?

Nie wymagamy żadnego doświadczenia. Cryptology Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Zasady projektowania bezpiecznych protokołów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Cryptology Academy?

Tak. Każda lekcja Cryptology Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Protokół Needhama-Schroedera i ataki
  2. Protokół Station-to-Station (STS)
  3. Framework protokołu Noise
  4. Zasady projektowania bezpiecznych protokołów
← Powrót do Cryptology Academy