Akademia NIS2/KSC2 od sekuraka. 19 października start drugiej edycji!
Zobacz nasz aktualny kalendarz szkoleń!
Akademia NIS2/KSC2 od sekuraka. 19 października start drugiej edycji!
Zobacz nasz aktualny kalendarz szkoleń!
Czy rzut kostką jest losowy? W dużym przybliżeniu ludzkość uznała ten deterministyczny układ chaotyczny za wystarczająco nieprzewidywalny, aby wykorzystać go w różnego rodzaju grach “losowych”. Jednak na poziomie mechaniki klasycznej, ciężko upatrywać tam prawdziwej losowości. Raczej dużą czułość na warunki początkowe i błąd pomiaru. W przypadku kryptografii, jeden rzut zwykłą sześcienną kostką, to może być za mało (gdybyście zgadywali ile nam teraz wyszło, to 4 oczka), dlatego inwestujcie w lava lampy. Jedna z firm wystawiających certyfikaty miała jeden z kluczy prywatnych będący liczbą 4. Tak, 4 jak na XKCD, nie że rozpoczynające się od 4, czy mający 4 bity/bajty. Po prostu “4” (słownie: cztery). Inne też nie były wygenerowane lepiej.
Gdy klient HTTP łączy się z serwerem zabezpieczającym komunikację przy pomocy TLS, zostaje mu przedstawiony certyfikat czyli dokument wiążący nazwę domeny z kluczem publicznym serwera. Generalnie przyjmuje się, że bardzo dobrze by było, gdyby tylko właściciel serwera oraz domeny, która na niego pokazuje mógł mieć taki certyfikat. W innym przypadku podszywanie się pod dowolne domeny byłoby bardzo ułatwione (z dokładnością do cert pinningu i HSTS). Skąd więc wiadomo, że certyfikat jest poprawny i dlaczego nie generuje ostrzeżenia o tym, że mógł zostać wygenerowany przez każdego? No bo jego ważność została potwierdzona przez urząd certyfikacji (CA, Certificate Authority) – podmiot, któremu przeglądarka i system operacyjny ufają z góry. Zaufanie to ma strukturę łańcucha. Na samym jego początku (w korzeniu) znajduje się root CA, którego certyfikat (zawierający klucz publiczny, okres ważności oraz podpis komplementarnym kluczem prywatnym) jest przechowywany w zaufanym miejscu tzw. trust store. Jest to certyfikat wykorzystywany tylko do weryfikacji podpisów. Klucz prywatny jest trzymany w bezpieczny sposób (np. na HSM), offline przez urząd certyfikacji. Używa się go rzadko, tylko do podpisywania pośrednich CA i CRL (czyli listy unieważnionych certyfikatów).
Dalej w łańcuchu zaufania znajdują się pośredniczące CA (intermediate CA) i to właśnie one na co dzień wystawiają certyfikaty końcowe, np. dla stron WWW czy wydawców oprogramowania. Klient (czyli np. przeglądarka) weryfikuje łańcuch od liścia w górę, sprawdzając podpis certyfikatu z kluczem publicznym pośredniczącego CA, podpis intermediate CA przy pomocy klucza publicznego roota, a ten ostatni jest potwierdzony w trust store. Widać zatem, jak ważną rolę pełnią główne certyfikaty – stanowią podstawę całego łańcucha zaufania. Ale klucz pośredniego CA wystarczy, żeby wystawić certyfikat na dowolną domenę – i żaden klient tego nie odróżni.
eMudhra to indyjska firma, która działa jako urząd certyfikacji (CA) i dostawca usług zaufania cyfrowego. Otrzymała licencję w 2008 roku i jest największym licencjonowanym CA w Indiach. Według internetowych źródeł wydała ponad 100 mln certyfikatów podpisu cyfrowego. W kontekście WebPKI to dużo mniejszy gracz, ale największy w Indiach.
17 października, badacz podpisujący się jako Wayne, zgłosił do programów root (Chrome, Mozilla, eMudhra, Apple, Microsoft) przejęcie kluczy prywatnych ośmiu pośrednich CA tego dostawcy. Jako dowód podpisał każdym z ośmiu kluczy komunikat “We have a problem here – Wayne” – w rzeczy samej, mamy problem (i to akurat równolegle z wyciekniętą informacją o krytycznej luce dotykającej PHP, prawo Murphiego znów daje o sobie znać). Wiadomość i status naprawy można śledzić tutaj.
No i teraz najważniejsze, według Bugzilli, 30 kwietnia 2025 miała miejsce ceremonia generowania 24 par kluczy. Klucze zostały podzielone na trzy serie A, B, C, a każda seria obejmowała CA z kluczami generowanymi algorytmem RSA-4096 (większa kompatybilność) jak i ECDSA (krzywa eliptyczna P-384, szybsze podpisy, mniejsze klucze) – jeśli CA ma wystawione równolegle dwa (lub więcej) rodzaje kluczy to klienci mogą sobie wybrać ten, który spełnia ich wymagania. Klucze były przeznaczone dla pośrednich CA wystawiających certyfikaty TLS trzech typów (DV, OV, EV) oraz certyfikaty do podpisywania kodu (CS). Trzy serie × dwa algorytmy × cztery zastosowania dają 24 klucze.
Przeznaczenie serii było następujące:
Opisywanym problemem dotknięte są tylko klucze P-384 serii B i C. Klucze RSA i seria A (została zastąpiona przez A-1 w maju 2025) według obecnej wiedzy są poprawne.
Według wstępnej analizy coś poszło nie tak i dla kluczy przeznaczonych na rynek zagraniczny do ceremonii generowania dodano test – dokonano dwóch operacji – wrap/unwrap, czyli bezpiecznego eksportu i importu klucza między sprzętowymi modułami bezpieczeństwa. Za sprawą nieustalonego jeszcze dokładnie błędu w skryptach obsługujących urządzenia HSM, doszło do wygenerowania słabszych kluczy (nazywanie liczby 4 jako “weaker” key brzmi trochę zabawnie, czy to znaczy że “stronger” był liczbą dwucyfrową?) i to one zostały przez przypadek wykorzystane do wygenerowania CSR i podpisane przez root CA. Te słabsze CSR zostały też przesłane do Sectigo do krzyżowego podpisania.
W przypadku ECDSA na krzywej NIST P-384 klucz prywatny to po prostu skalar oznaczony jako d. Klucz publiczny to punkt Q na krzywej uzyskany przez d-krotne “dodanie” punktu bazowego G (z którego każdy korzysta). Bezpieczeństwo ECDSA opiera się na problemie logarytmu dyskretnego na krzywej eliptycznej (ECDLP). Znając G i Q nie powinno się dać wyznaczyć d. Najlepszy znany atak wymaga około √n operacji (Metoda rho Pollarda dla logarytmu dyskretnego, który wykorzystuje znany i lubiany paradoks urodzin). Poziom bezpieczeństwa określa się na 192 bity, co jest na razie daleko poza zasięgiem jakiejkolwiek mocy obliczeniowej – ale z jednym warunkiem. Skalar d musi być wylosowany z przedziału [1, n-1], gdzie n jest rzędem punktu bazowego G (dla P-384 to duża liczba na poziomie 2^384). Klucze wygenerowane przez eMudhra były w praktyce samymi zerami, poza ostatnim bajtem (d < 256). Efektywnie entropia wyniosła więc 8 bitów. Dla jednego z pośrednich CA wartość tego ostatniego bajtu wyniosła 4 (d=4). Przy takim zakresie nie trzeba żadnej analizy, ba, nie jest wymagana nawet gumowa pałka. Podkreślamy – to nie jest “hasło do certyfikatu”, atakujący nie potrzebował żadnego wycieku czy dostępu do infrastruktury CA. Do odzyskania wystarczył sam publiczny certyfikat. Nie trzeba było szukać żadnego “ataku kryptograficznego”, żadnej kryptoanalizy. Odtworzenie klucza prywatnego certyfikatu to milisekundy na najtańszym (AD 2026 przy niedoborach i kosmicznych cenach wszystkiego z powodu bańki AI) laptopie. To oczywiście nie pierwsza tego typu wpadka. Ale te poprzednie (jak np. OpenSSL z 2008 roku) nie były tak spektakularne.
Inną rozpatrywaną hipotezą (na HN, co jest sprzeczne z dyskusją na Bugzilli oraz komunikatem CA) w kontekście przyczyn wystąpienia problemu jest wygenerowanie słabych kluczy poza HSM i ich przypadkowe zaimportowanie.
Niezależnie od przyczyny – w wyniku tego zdarzenia, możliwe było np. podszycie się pod dowolną stronę serwowaną po HTTPS. Chcecie api.github.com? Albo https://sekurak.pl? Proszę bardzo. Wskazano na następujące certyfikaty (dla których odzyskano klucz prywatny):
| Intermediate CA | Podmiot | Seria | Zastosowanie | Klucz prywatny d |
| EM DV TLS CA – G3B | eMudhra BV (NL) | B | TLS | 156 |
| EM OV TLS CA – G3B | eMudhra BV (NL) | B | TLS | 155 |
| EM EV TLS CA – G3B | eMudhra BV (NL) | B | TLS | 115 |
| EM OV CS CA – G3B | eMudhra BV (NL) | B | Code signing | 66 |
| EM DV TLS CA – G3C | eMudhra Inc (US) | C | TLS | 230 |
| EM OV TLS CA – G3C | eMudhra Inc (US) | C | TLS | 4 |
| EM EV TLS CA – G3C | eMudhra Inc (US) | C | TLS | 56 |
| EM OV CS CA – G3C | eMudhra Inc (US) | C | Code signing | 237 |
Wartości d sprawdziliśmy samodzielnie: dla d = 1…255 policzyliśmy d·G na krzywej P-384 i porównaliśmy SHA-256 z SPKI z opublikowanymi hashami. Wszystkie osiem się zgadza.
Każdy z nich istnieje w dwóch wersjach: wystawionej przez root emSign oraz jako cross-sign pod rootem Sectigo AAA Certificate Services – oba warianty mają ten sam SPKI, czyli ten sam klucz. Pełna lista odcisków SHA-256, hashy SPKI i numerów seryjnych jest w affected-certificates.json. Ten cross-sign komplikuje blokadę, bo każdy pośredniczący CA ma bliźniaka z tym samym kluczem pod rootem Sectigo. Na czas pisania tego artykułu Sectigo twierdzi, że root był usunięty z magazynów Chrome i Mozilli ale wciąż dostępny w M$ oraz Apple. Skuteczna blokada musi działać na poziomie SPKI a nie pojedynczego certyfikatu czy roota firmy eMudhra. (aktualizacja 21.10.2026 19:39 CEST – już Sectigo unieważniło cross-signy według komentarza na Bugzilli)
Jak zwykle od katastrofy było o włos, ale jednak “nic” się nie wydarzyło w kontekście bezpieczeństwa przeglądarek, czego dowodzi Certificate Transparency. Wszystkie większe przeglądarki wymagają, żeby certyfikat TLS trafił do CT. Zatem trafiłyby tam też podrobione certyfikaty. Wedle Chrome Root Program, przed blokadą w CT, nie pojawił się żaden certyfikat wystawiony przez sześć dotkniętych CA dla TLS. Pozostałe dwa CA są wykorzystywane do podpisywania kodu i w ich przypadku nie ma publicznego rejestru, czy ktoś się nie pokusił o ich wykorzystanie. Niestety nie wszystkie klienty HTTP wymuszają CT, nie robi tego curl ani inne biblioteki programistyczne. Próżno też szukać tego typu zabezpieczenia w urządzeniach IoT.

Co robić jak żyć? Najlepiej przetestować swoje przeglądarki i wykorzystywane klienty a następnie wykonać ich aktualizację. Większość dostawców zdążyła już zablokować dotknięte pośrednie CA, przy pomocy hashy SPKI. Mozilla i Chrome usunęły cały root emSign ECC Root CA – G3, co ma to też swoje wady, część poprawnie działających certyfikatów przestanie działać do momentu podmiany certyfikatów przez administratorów.
Lista poprawek w zależności od wersji:
| Oprogramowanie | Wersja z poprawką |
|---|---|
| Go | 1.27.3, 1.26.10 |
| Python certifi | 2026.10.19 |
| Rust webpki-roots / webpki-root-certs | 1.0.10 |
| NSS | 3.131.1 |
| Electron | 44.9.1, 43.8.1, 42.11.16 |
| Homebrew ca-certificates | 2026-09-25_1 |
| Node.js | w przygotowaniu |
| Composer ca-bundle | w przygotowaniu |
Nie należy zapominać o magazynach certyfikatów wewnątrz kontenerów i aplikacji z własnymi bundle. Uwadze polecamy tez użytkownikom macOS plik /etc/ssl/cert.pem.
~BLH
Edycja 21.10.2026 20:00 CET
Chcielibyśmy zagrać z Wami w grę…
Edycja 22.10.2026 16:40 CET
Wygląda na to, że została podjęta decyzja o wycofaniu się firmy eMudhra ze świadczenia usług jako CA. Oficjalnie powodem jest niewielkie znaczenie biznesowe tego rodzaju usług w portfolio firmy.
Chciałbym to wszystko rozumieć na tym poziomie.
AI właśnie patchuje mi laptopa (#yolo), jestem zaskoczony w ilu miejscach znalazł te wadliwe certyfikaty (Git, Visual Studio, czytnik ekranu, Libre Office), nie szukałbym w takich miejscach.
Może a) były tanie, lub b) połapali się i sami sobie generowali za darmo.
Pss… git to tylko jak używasz HTTPS (a nie SSH).
Ale domyślam się że jak git-a ogarnął to i curla masz już okey.
No ale narobili bigosu niesamowitego. 12 godzin patchowania softów nam zafundowali (a to tylko te istotne kwestie). Niewiarygodne w ilu miejscach te certyfikaty są embeded.
Czy tylko mnie “dziwi” ze to firma z Indii? ;-)
Chcesz jednej czy czterech odpowiedzi? ;)
Przenieśmy oprogramowanie do Indii, co może się stać? :D
No dobra, ale sama długość klucza (czy tam wartości początkowej) była poprawna? Przecież takie losowe 4 na np 64 bitach jest równie prawdopodobne co 18 446 744 073 709 551 611 (bitowo same 1 z zerem na 3 pozycji od końca). Kto zagwarantuje, że ktoś takiej wartości nie używa i jest równie łatwa wówczas? Tak samo łatwe może być d=n/2 – dla kogoś, kto szuka od początku lub od końca – wartość, do której się nie dotrze. Ale jak ktoś szuka od środka, to przecież też złamie. A w czym jest bardziej lub mniej losowe od każdej innej liczby?
Problemem samym w sobie nie jest d=4, tylko wiedza, że ktoś używał takich liczb.
Ja to obstawiam, ze ktos ze sluzb albo podlozyli taka bombe, bo nie chce mi sie wierzyc ze z tego nie korzystano, albo po prostu to byla zalozona dzialalnosc stricte pod takie rzeczy… bo byc takim tlukiem to nawet jak na zasrancow to jest sztuka… no ale moze nie mam tak rozwinietej wyobrazni. Przeciez to jest raj dla MITM , kurde, czlowiek by wiedział to na routerze by zaimplementował i kurde by nie trzebabylo by po klientach klikac i certyfikaty instalowac sic! ale wg mnie to mobilki to wektor wejscia…
Ten incydent to absolutny pomnik iluzji bezpieczeństwa w ekosystemie WebPKI. W świecie, gdzie urzędy certyfikacji organizują wielogodzinne ceremonie generowania kluczy w klatkach Faradaya, w obecności niezależnych audytorów i pod rygorem procedur WebTrust, indyjskie eMudhra wypuściło w świat osiem pośrednich CA z kluczami ECDSA P-384 o entropii rzędu 8 bitów. Klucz prywatny o wartości d = 4 to dosłowna realizacja żartu z XKCD 221 w krytycznej infrastrukturze zaufania.
Z perspektywy inżynierskiej nasuwają się trzy fundamentalne wnioski:
Kompromitacja procedur audytowych i testów FIPS: Jak to w ogóle opuściło sprzętowy moduł bezpieczeństwa (HSM)? Każdy moduł certyfikowany choćby na poziomie FIPS 140-2 Level 3 posiada wbudowane testy ciągłości generatora liczb losowych (CRNGT) oraz testy statystyczne odrzucające ciągi o zerowej entropii. Fakt, że klucz zeスカlarem składającym się z samych zer i jednego bajtu na końcu przeszedł ceremonię, dowodzi jednego: klucze albo generowano na kolanie w nieskonfigurowanym środowisku software’owym i dopiero potem wgrywano do HSM-a, albo audytorzy podczas ceremonii pełnili rolę wyłącznie dekoracyjną.
Certificate Transparency uratowało przeglądarki, ale obnażyło resztę świata: Ekosystem desktopowy przetrwał bez incydentów masowego podszywania wyłącznie dlatego, że Chrome i Firefox odrzucają certyfikaty TLS bez ważnych logów SCT. Prawdziwy dramat rozegrał się na zapleczu. Skrypty w Pythonie, backendowe mikroserwisy, wywołania z curl oraz setki milionów urządzeń IoT w ogóle nie sprawdzają logów CT. Posiadając klucz prywatny intermediate CA, napastnik mógł w ułamku sekundy wystawić ważny certyfikat dla dowolnego API czy serwera aktualizacji i zrealizować atak MitM w sieci lokalnej bez wzbudzania podejrzeń bibliotek systemowych.
Patologia cross-signingu jako wektor omijania blokad: Związanie tych samych kluczy pod rootem Sectigo (identyczny SPKI) pokazało, jak trudno szybko wyciąć skompromitowany podmiot z globalnego obiegu. Usunięcie roota eMudhra z magazynów Mozilli czy Google nie neutralizowało zagrożenia na maszynach z systemami Windows czy macOS, dopóki dostawcy nie wdrożyli czarnych list na poziomie hasha klucza publicznego (CRLSet, OneCRL).
Decyzja eMudhra o całkowitym wycofaniu się z roli publicznego CA to jedyny przyzwoity finał tej kompromitacji. Jeśli klucz prywatny o wartości 4 może trafić na szczyt łańcucha zaufania internetu, cały model komercyjnych CA bez twardego bata w postaci Certificate Transparency i monitoringu zewnętrznych badaczy jest po prostu domkiem z kart.