Skrypty z domen wygasłych
ważność wysokazaplanowany
Zewnętrzny script src z domeny, która wygasła. Kto ją odkupi, wstrzykuje dowolny kod na stronę klienta.
Zaplanowany: wymaga zestawienia adresów skryptów z rejestrem domen (RDAP) i własnej kadencji.
WIKI
artykuł z 16.09.2026 · źródeł 7Skrypty z domen wygasłych to parametr monitoringu stron internetowych, który zestawia adresy skryptów JavaScript ładowanych z cudzych domen ze stanem rejestracji tych domen. Pomiar kończy się jednym z trzech wyników: wszystkie domeny są zarejestrowane, co najmniej jedna wygasła, jest wolna albo ma świeżą rejestrację, lub stanu nie dało się ustalić. Strona, która dołącza skrypt z zewnętrznego serwera, zwykle nie ma gwarancji, że kod pod tym adresem pozostanie taki, jaki widzieli jej twórcy i testerzy [1].
Jak działa
Bibliotekę można skopiować na własny serwer albo kazać przeglądarce pobierać ją bezpośrednio od dostawcy. W drugim wariancie dostawca ma pełną kontrolę nad kodem, który trafia do użytkownika, i może na przykład podmienić wygląd strony albo przechwycić dane logowania przez modyfikację DOM lub odczyt ciasteczek [2]. Gdy domena dostawcy wygaśnie, a właściciel strony tego nie zauważy, dołączenie staje się „nieaktualne”: ktoś może zarejestrować zwolnioną nazwę i odsyłać złośliwy kod na każde żądanie. Atak nie wymaga kontaktu z ofiarą, więc autorzy badania porównują go do trwałego XSS [2].
Pomiar składa się z czterech kroków, a każdy wymaga innych danych. Pierwszy to lista skryptów: atrybuty src wskazujące inny host, zebrane z HTML strony głównej i podstron. Ta lista jest niepełna, bo biblioteka może w czasie działania doładowywać kolejny kod z innych serwerów [2]. Drugi krok sprowadza nazwę hosta do domeny, którą da się zarejestrować. Służy do tego Public Suffix List, spis sufiksów, pod którymi użytkownicy mogą rejestrować nazwy [7]. Trzeci krok to DNS: w badaniu z 2012 roku sprawdzano, które domeny nie rozwiązują się na adres IP, potem szukano ich w bazie WHOIS, a przy braku wyniku próbowano je zarejestrować [2]. Czwarty to RDAP, w którym tablica events zawiera zdarzenia registration, last changed i expiration [6]. Data rejestracji późniejsza niż dzień dodania skryptu do strony wskazuje nowego właściciela, dlatego pomiar potrzebuje też historii: od kiedy dany skrypt jest na stronie. Szczegóły RDAP opisuje artykuł Wygaśnięcie domeny.
Standardy i specyfikacje
- Subresource Integrity (W3C) pozwala przeglądarce sprawdzić, czy pobrany zasób dotarł bez nieoczekiwanej modyfikacji [4]. Atrybut
integrityzawiera skrót pliku; przeglądarka musi obsługiwać SHA-256, SHA-384 i SHA-512 [4]. Odpowiedź niezgodna ze skrótem nie zostanie wykonana, a żądanie kończy się błędem sieci [4]. Zasoby z innej domeny wymagają przy tym CORS [4]. - Content Security Policy Level 3 kontroluje, jakie zasoby strona może pobrać lub wykonać, i jest pomyślana jako obrona w głąb, a nie pierwsza linia [5]. Lista dozwolonych hostów nie pomoże, gdy zmienił się właściciel samego hosta. CSP3 pozwala jednak dopuszczać skrypty zewnętrzne po skrócie, jeśli element
scriptma metadane integralności wymienione w polityce [5]. Więcej w artykule Content Security Policy. - RFC 9083 definiuje zdarzenia obiektu RDAP;
expirationoznacza, że obiekt został albo zostanie usunięty z rejestru w ustalonym terminie [6]. - OWASP zaleca Subresource Integrity, kopię skryptu na własnym serwerze oraz umieszczanie kodu dostawcy w ramce
iframez innej domeny, która odcina go od DOM i ciasteczek strony [1].
Zagrożenia i skutki
Przejęcie wygasłej domeny. Badacze przeszukali ponad 3,3 mln stron z 10 000 najpopularniejszych serwisów. Znaleźli 56 domen dostarczających skrypty, wolnych do rejestracji i dołączanych przez 47 z tych serwisów; 6 z nich było literówkami w nazwie [2]. Zarejestrowali dwie takie domeny i przez 15 dni odpowiadali stroną błędu 404. Jedna z nich odebrała 80 466 wizyt z 84 podstron w 24 domenach [2].
Zmiana właściciela bez wygaśnięcia. W lutym 2024 roku firma kupiła domenę polyfill.io wraz z kontem projektu w GitHub. Skrypt osadzało ponad 100 000 stron, a nowy kod przekierowywał użytkowników urządzeń mobilnych na strony hazardowe [3]. Nie uruchamiał się przy wykryciu administratora i opóźniał działanie, gdy znalazł usługę analityki [3]. Domena nie wygasła, więc sama data expiration takiej zmiany nie pokaże.
Kompromitacja serwera dostawcy. OWASP wskazuje przejęcie serwera z kodem zewnętrznym jako największe ryzyko [1]. W 2011 roku przez lukę w WordPressie przejęto domenę popularnej wtyczki jQuery, a zmodyfikowana biblioteka była rozpowszechniana przez 33 dni [2]. Pokrewne zjawiska opisuje artykuł Infekcja.
Przykłady
| Sytuacja | Co widać w danych | Czy SRI zatrzyma obcy kod |
|---|---|---|
| Domena skryptu wygasła, nikt jej nie kupił [2] | nazwa nie rozwiązuje się w DNS | nie ma obcego kodu, skrypt nie działa |
| Wolną domenę zarejestrował ktoś inny [2] | nowa data registration w RDAP [6] | tak, gdy jest integrity [4] |
| Domenę sprzedano razem z projektem [3] | rejestracja ciągła, bez wygaśnięcia | tak, jeśli plik ma stały skrót [4] |
| Literówka w nazwie domeny [2] | domena wolna albo cudza | tak, gdy jest integrity [4] |
| Przejęty serwer dostawcy [1] | brak zmian w rejestrze | tak, gdy jest integrity [4] |
| Kod doładowany w czasie działania [2] | adresu nie ma w HTML | zależy od skryptu ładującego |
- [1] Third Party JavaScript Management Cheat Sheet · OWASP
- [2] Nikiforakis i in. — You Are What You Include: Large-scale Evaluation of Remote JavaScript Inclusions (ACM CCS 2012) · ACM CCS 2012
- [3] Polyfill supply chain attack hits 100K+ sites · Sansec
- [4] Subresource Integrity · W3C
- [5] Content Security Policy Level 3 · W3C
- [6] RFC 9083 — JSON Responses for the Registration Data Access Protocol (RDAP) · IETF
- [7] Public Suffix List · Mozilla / Public Suffix List
STATS
wyniki z systemu · tylko liczby zbiorczeParametr zaplanowany: sondy jeszcze nie ma w CREATO_PING, więc system nie ma czego liczyć. Liczby pojawią się po pierwszym przebiegu z tą sondą.
CARD
karta do opracowaniaParametr zaplanowany: nie ma jeszcze sondy, helpera ani workflowu, więc nie ma drogi przez system do narysowania.
| Obszar i ważność | Bezpieczeństwo · wysoka (B34) |
|---|---|
| Workflow i częstotliwość | brak — parametr zaplanowany |
| Sonda i helper | brak |
| Testy | do opracowania |
| Typ wyniku | do opracowania |
| Jednostka | do opracowania |
| Próg i reguła | do opracowania |
| Gdzie leżą pokrętła | do opracowania |
| Retencja odczytów | do opracowania |
| Karta przepisana z | karta tego parametru nie została jeszcze przepisana z kodu CREATO_PING |
Parametr nie otwiera osobnego ustalenia — sondy jeszcze nie ma.
LOOP
bez pętliTrafności jeszcze nie liczymy: zamknięcie subtaska nie niesie dziś werdyktu (prawdziwy / fałszywy / nie dało się sprawdzić). Cztery liczby pojawią się, gdy każde zamknięcie dostanie werdykt — to warunek startu pętli 1.
Ten parametr nie przeszedł jeszcze żadnej pętli. Kolejność po pierwszych pięciu grupach ustali miara trafności.