nonce
| Po angielsku | nonce |
|---|---|
| Którą formą pisać | po angielsku Polski odpowiednik istnieje, ale w praktyce nikt tak nie pisze. Zostaw angielski, polski trzymaj jako synonim. |
| Inne formy | token akcji WordPressa (mimo nazwy nie jednorazowy) · token chroniący przed CSRF · wartość używana raz w danym kontekście (znaczenie kryptograficzne) |
| Kategoria | Strony WWW, WordPress i hosting |
Nonce (od ang. „number used once”) to w WordPressie token bezpieczeństwa dołączany do formularzy, linków i żądań AJAX, który potwierdza, że żądanie pochodzi ze strony witryny, a nie z obcego serwisu [1]. Mimo nazwy nonce WordPressa nie jest liczbą ani wartością jednorazową: to skrót złożony z liter i cyfr, ważny wielokrotnie w swoim oknie czasowym [1]. Jego głównym zadaniem jest obrona przed atakami CSRF (Cross-Site Request Forgery) [1]. Poza WordPressem to samo słowo oznacza w kryptografii wartość, która w danym kontekście nie może się powtórzyć.
Jak działa
Atak CSRF polega na tym, że złośliwa strona, e-mail albo program nakłania przeglądarkę zalogowanego użytkownika do wykonania niechcianej akcji w zaufanym serwisie [3]. Przeglądarka dołącza do takiego żądania ciasteczka sesji, więc serwer bez dodatkowego sprawdzenia uzna je za działanie użytkownika. MITRE opisuje tę słabość jako brak wystarczającej weryfikacji, czy żądanie zostało wysłane przez użytkownika celowo [4].
Nonce rozwiązuje ten problem wzorcem tokenu synchronizującego: serwer wstawia do formularza wartość, której obca strona nie zna, i odrzuca żądanie bez niej [3]. MITRE zaleca generowanie osobnej, nieprzewidywalnej wartości dla formularza i sprawdzanie jej po odebraniu [4]. Przebieg w WordPressie pokazuje schemat poniżej.
WordPress wylicza nonce z identyfikatora użytkownika, tokenu jego sesji i nazwy akcji [2]. Ta sama akcja daje temu samemu użytkownikowi identyczny nonce w obrębie jednego okresu ważności [1]. Nazwa akcji powinna być konkretna, na przykład obejmować identyfikator usuwanego wpisu, bo wtedy token z jednego formularza nie zadziała w innym.
W WordPressie
Rdzeń udostępnia komplet funkcji do tworzenia i sprawdzania tokenów [1].
| Funkcja | Rola |
|---|---|
wp_create_nonce() | zwraca nonce dla akcji [1] |
wp_nonce_field() | dodaje ukryte pole do formularza [1] |
wp_nonce_url() | dopisuje nonce do adresu URL [1] |
wp_verify_nonce() | sprawdza nonce; zwraca 1, 2 albo false [2] |
check_admin_referer() | sprawdza nonce z formularza panelu [1] |
check_ajax_referer() | sprawdza nonce w żądaniu AJAX [1] |
Czas życia. Domyślny okres ważności wynosi 24 godziny i dzieli się na dwa „tiki” po 12 godzin [1]. Funkcja wp_verify_nonce() zwraca 1 dla tokenu wygenerowanego w ciągu ostatnich 12 godzin, 2 dla tokenu sprzed 12–24 godzin i false dla nieprawidłowego [2]. W praktyce nonce traci ważność po 12–24 godzinach, zależnie od tego, kiedy powstał względem granicy tiku [1]. Okres można zmienić filtrem nonce_life, podając liczbę sekund [1].
Użytkownicy niezalogowani. Token zależy od identyfikatora użytkownika i jego sesji [2], a gość nie ma ani jednego, ani drugiego. Do ochrony formularzy dla gości dokumentacja wskazuje filtr nonce_user_logged_out, którym można powiązać weryfikację z własną sesją [1].
Typowe użycie w kodzie wtyczki wygląda tak:
wp_nonce_field( 'usun_wpis_' . $post_id );
// ...po wysłaniu formularza:
check_admin_referer( 'usun_wpis_' . $post_id );
if ( ! current_user_can( 'delete_post', $post_id ) ) {
wp_die( 'Brak uprawnień' );
}
Dokumentacja dla twórców motywów zaleca nonce przy każdym formularzu HTML i każdym żądaniu HTTP, które coś zmienia [5].
Czego nonce nie zapewnia
Dokumentacja WordPressa stwierdza wprost, że na nonce nigdy nie wolno polegać przy uwierzytelnianiu, autoryzacji ani kontroli dostępu [1]. Każdy nonce trzeba łączyć z weryfikacją uprawnień przez current_user_can() i zakładać, że token może zostać ujawniony [2]. Nonce odpowiada na pytanie, czy użytkownik chciał wykonać akcję, a nie, czy wolno mu ją wykonać. Wtyczka, która sprawdza tylko nonce, ma brak kontroli uprawnień (missing authorization): każdy zalogowany użytkownik, także subskrybent, może pobrać token ze strony i wywołać akcję.
Drugą granicą jest XSS (Cross-Site Scripting). OWASP zaznacza, że podatności XSS pozwalają obejść zabezpieczenia przed CSRF [3], a MITRE dodaje, że większość takich zabezpieczeń da się ominąć skryptem kontrolowanym przez atakującego [4]. Skrypt działający na stronie odczyta nonce tak samo jak przeglądarka użytkownika.
OWASP wymienia też zasady przekazywania tokenów: nie w ciasteczkach i nie w parametrach adresu, a zmiany stanu nie przez żądania GET [3]. Funkcja wp_nonce_url() umieszcza nonce właśnie w adresie [1], dlatego lepiej używać jej do linków, które tylko potwierdzają akcję, a dane zmieniać formularzem POST. Uzupełnieniem jest atrybut SameSite, opisany przy flagach ciasteczek (cookie flags) [3].
Znaczenie kryptograficzne
W kryptografii nonce to wartość użyta dokładnie raz z danym kluczem. Jej powtórzenie może złamać poufność szyfrowania. Przykładem jest atak KRACK na protokół WPA2, opisany przez CERT Polska 17 października 2017 roku pod tytułem „Key Reinstallation Attacks: Forcing Nonce Reuse in WPA2” [8]. Podatne urządzenia po ponownym odebraniu trzeciej wiadomości uzgadniania czterostronnego przywracały klucz do wartości początkowej i ponownie używały nonce [8]. CERT Polska sklasyfikował ten błąd jako CWE-323, ponowne użycie nonce i pary kluczy w szyfrowaniu [8]. To znaczenie nie ma związku z tokenami WordPressa poza nazwą.
Historia i przykłady
Błędne użycie nonce bywa przyczyną poważnych podatności we wtyczkach. W listopadzie 2024 roku Sekurak opisał podatność CVE-2024-10924 we wtyczce Really Simple Security, używanej na około 4 milionach witryn i wykrytej przez zespół Wordfence [6]. Funkcja check_login_and_get_user() w interfejsie REST sprawdzała nonce, ale ignorowała wynik tego sprawdzenia [6]. Przy włączonym uwierzytelnianiu dwuskładnikowym (2FA) kod logował użytkownika wskazanego samym identyfikatorem w żądaniu, bez znajomości hasła, także administratora [6]. Było to obejście uwierzytelniania prowadzące do przejęcia konta. W dzienniku zmian wtyczki wersja 9.1.2 ma wpis o poprawce obejścia uwierzytelniania [7].
Przypadek pokazuje, że wywołanie funkcji sprawdzającej nie jest zabezpieczeniem, jeśli kod nie przerywa działania po negatywnym wyniku. Przy przeglądzie wtyczki warto więc sprawdzać, co dzieje się z wartością zwróconą przez wp_verify_nonce(), a nie tylko, czy funkcja jest wywołana. Ten rodzaj błędu zalicza się do kategorii podatności we wtyczkach.
Przypisy
8- [1] Nonces — Common APIs Handbook · WordPress.org
- [2] wp_verify_nonce() — Code Reference · WordPress.org
- [3] Cross-Site Request Forgery Prevention Cheat Sheet · OWASP
- [4] CWE-352: Cross-Site Request Forgery (CSRF) · MITRE
- [5] Common Vulnerabilities — Common APIs Handbook · WordPress.org
- [6] Jak przy włączonym 2FA można się zalogować na dowolnego użytkownika (podatność w popularnym pluginie do WordPressa) · Sekurak
- [7] Really Simple Security – Simple and Performant Security (changelog) · WordPress.org
- [8] Podatność w protokole WPA2: Key Reinstallation Attacks: Forcing Nonce Reuse in WPA2 · CERT Polska
Hasła w tym artykule
12Linkują tutaj
29- XSS (Cross-Site Scripting)
- autoryzacja
- OWASP Top 10
- CWE
- CSRF (Cross-Site Request Forgery)
- wtyczka bezpieczeństwa
- podatność we wtyczce
- weryfikacja uprawnień
- Broken Access Control
- brak kontroli uprawnień (missing authorization)
- sanityzacja danych wejściowych
- niezabezpieczony endpoint REST API
- podatność wykorzystywana bez uwierzytelnienia
- CSP (Content Security Policy)
- flagi ciasteczek
- hasła aplikacji
- klucze bezpieczeństwa i sole
- nagłówki bezpieczeństwa HTTP
- CORS misconfiguration
- eskalacja uprawnień
- open redirect
- dane uwierzytelniające
- Zero Trust
- atak bocznym kanałem
- clickjacking
- JWT (JSON Web Token)
- vibe coding
- EUVD
- WPCS