Blog 24/7
ARK. B27Parametr monitoringuBezpieczeństwo · lista 87 parametrów

Ekspozycja kopii zapasowych

ważność krytycznamierzonysposób exposure

Pliki backup.zip i backup.tar.gz w katalogu głównym. Cała strona i baza do pobrania jednym kliknięciem — typowa pamiątka po migracji w pośpiechu.

Rozstrzyga sygnatura pliku (ZIP, gzip, 7z, RAR, xz), nie sam kod 200 — strona błędu nie jest archiwum.

ARK. 1

WIKI

artykuł z 16.09.2026 · źródeł 9

Ekspozycja kopii zapasowych to parametr monitoringu stron internetowych, który sprawdza, czy pod przewidywalnymi adresami w katalogu głównym witryny, takimi jak /backup.zip i /backup.tar.gz, serwer oddaje archiwum kopii zapasowej. Pomiar kończy się jednym z trzech wyników: archiwum dostępne publicznie, archiwum niedostępne albo nie udało się uzyskać odpowiedzi. MITRE opisuje to zjawisko jako słabość CWE-530: plik kopii zapasowej przechowywany w katalogu lub archiwum, do którego mają dostęp nieuprawnione podmioty [1].

Jak działa

Kopia strony powstaje zwykle na tym samym serwerze, który stronę podaje. Wtyczka UpdraftPlus domyślnie zapisuje kopie na serwerze hostingu, w folderze wewnątrz katalogu wp-content, a jej dokumentacja zaleca przechowywanie ich poza serwerem [7]. Duplicator dzieli każdą kopię na dwa pliki: archiwum archive.zip albo archive.daf z bazą danych i plikami strony oraz skrypt installer.php [5]. Przy klasycznej instalacji oba pliki trafiają do katalogu głównego docelowej witryny, skąd instalator jest dostępny pod adresem w rodzaju https://domena/installer.php [5]. Po udanej migracji dokumentacja każe usunąć instalator i archiwum, bo ich pozostawienie jest ryzykiem [5]. Lista plików do usunięcia obejmuje archiwum z identyfikatorem w nazwie, leżące w katalogu z plikiem wp-config.php, a w starszych wersjach wtyczki także pliki .sql ze zrzutem bazy [6].

Skaner nie zna nazwy pliku, więc ją zgaduje. Przewodnik OWASP opisuje najprostszą postać tej metody jako przepuszczanie listy typowych nazw plików przez mechanizm wysyłający żądania, żeby odgadnąć istniejące pliki i katalogi [4]. Wśród plików pozostawionych na serwerze wymienia kopie tworzone ręcznie albo automatycznie w postaci skompresowanych archiwów [4]. Nazwa stała, taka jak backup.zip, jest łatwiejsza do odgadnięcia niż nazwa z losowym identyfikatorem.

Sam kod 200 nie dowodzi, że archiwum istnieje, bo serwer może pod dowolnym adresem podać stronę HTML. Rozstrzyga początek treści. Według specyfikacji ZIP firmy PKWARE nagłówek lokalny pliku zaczyna się od sygnatury 0x04034b50 [2], a pola są zapisywane w kolejności od najmłodszego bajtu [2], więc w pliku są to bajty 50 4B 03 04, czyli znaki PK i dwa bajty sterujące. Rekord końca katalogu centralnego ma sygnaturę 0x06054b50 [2]. Plik gzip według RFC 1952 składa się z serii członów, a każdy zaczyna się od stałych bajtów ID1 = 31 (0x1f) i ID2 = 139 (0x8b), które identyfikują format [3].

RYS. 1.1Kod 200 a prawdziwe archiwum

Pierwsza odpowiedź to strona błędu podana z kodem 200, druga zaczyna się sygnaturą ZIP, trzecia sygnaturą gzip. Odczyt sygnatury komplikuje kodowanie treści. Dyrektywa AddEncoding serwera Apache, np. AddEncoding x-gzip .gz, oznacza pliki o danym rozszerzeniu jako zakodowane i dopisuje kodowanie do nagłówka Content-Encoding [9]. Nagłówek ten mówi klientowi, że treść trzeba zdekodować, żeby dostać właściwy typ danych [9]. Klient, który rozpakowuje taką odpowiedź automatycznie, widzi już treść po dekompresji, bez bajtów 1F 8B na początku [9].

Standardy i specyfikacje

  • PKWARE APPNOTE 6.3.10 opisuje strukturę ZIP: nagłówki lokalne z danymi plików, katalog centralny i rekord końca katalogu centralnego, każdy z własną sygnaturą [2].
  • RFC 1952 definiuje format gzip: bajty identyfikujące ID1 i ID2, metodę kompresji CM = 8 (deflate) oraz pole FNAME z oryginalną nazwą pliku zakończoną bajtem zerowym [3].
  • OWASP WSTG-CONF-04 zauważa, że kopie mogą ujawnić kod źródłowy stron wykonywanych na serwerze [4], a pliki bez odnośników mogą zawierać pliki dołączane z danymi dostępowymi do bazy [4]. Do zgadywania poleca własne listy z rozszerzeniami kopii, m.in. bak, old, orig, copy i tmp [4].
  • CWE-530 w rozszerzonym opisie wskazuje stare kopie pozostawione w katalogu WWW pod zmienioną nazwą, z których da się pobrać kod źródłowy [1]. Jako zabezpieczenie podaje politykę organizacji zakazującą trzymania kopii kodu aplikacji w katalogu WWW [1]. Słabość jest potomkiem CWE-552, „Files or Directories Accessible to External Parties” [1].

Zagrożenia i skutki

Cała strona w jednym pliku. Archiwum Duplicatora zawiera bazę danych i pliki strony [5]. Wśród plików jest wp-config.php, który leży w katalogu głównym instalacji i przechowuje dane połączenia z bazą: nazwę bazy, użytkownika, hasło i host [8]. Zawiera też unikalne klucze i sole, którymi WordPress zabezpiecza sesje użytkowników [8]. Według CWE-530 kto pobierze kopię, ma wszystkie zapisane w niej informacje, od zapytań do bazy po strukturę serwisu [1].

Pozostawiony instalator. Dokumentacja Duplicatora ostrzega, że każdy, kto znajdzie adres instalatora, może go uruchomić ponownie [5]. Instalator i archiwum leżą obok siebie, więc znalezienie jednego ułatwia znalezienie drugiego.

RYS. 1.2Od archiwum do przejęcia

Usunięcie pliku nie cofa pobrania. Skasowanie archiwum zamyka dostęp do niego, ale nie odbiera kopii temu, kto już ją ściągnął. Dane z wp-config.php [8] trzeba wtedy traktować jak ujawnione.

Fałszywe trafienia. Serwer, który pod każdym adresem podaje stronę HTML z kodem 200, wygląda w samym kodzie odpowiedzi jak serwer z archiwum. Sygnatura ZIP [2] albo gzip [3] odróżnia plik od takiej strony.

Przykłady

SytuacjaCo zobaczy sondaZnaczenie
Archiwum ZIP po migracji w katalogu głównym [5]200, treść od bajtów 50 4B 03 04 [2]kopia do pobrania
Archiwum .tar.gz w katalogu głównym200, treść od bajtów 1F 8B [3]kopia do pobrania
Strona błędu podawana z kodem 200200, dokument HTMLbrak archiwum, fałszywy kod
Archiwum z losowym identyfikatorem w nazwie [6]404 pod adresem /backup.zipplik istnieje, ale nazwa jest nieprzewidywalna
Kopie wtyczki w podkatalogu wp-content [7]404 pod adresem w katalogu głównymlokalizacja poza zakresem sondy
Plik .gz z nagłówkiem Content-Encoding [9]treść po dekompresji, bez 1F 8Bklient dekodujący automatycznie nie widzi sygnatury gzip
TAB. 1.1Przypisy9
  1. [1] CWE-530: Exposure of Backup File to an Unauthorized Control Sphere · MITRE
  2. [2] APPNOTE.TXT — .ZIP File Format Specification, wersja 6.3.10 · PKWARE
  3. [3] RFC 1952 — GZIP file format specification version 4.3 · IETF
  4. [4] WSTG-CONF-04 — Review Old Backup and Unreferenced Files for Sensitive Information · OWASP Web Security Testing Guide
  5. [5] Classic Installation · Duplicator
  6. [6] Removing Duplicator Files After Installation · Duplicator
  7. [7] Where are my UpdraftPlus backups stored? · TeamUpdraft
  8. [8] wp-config.php — Advanced Administration Handbook · WordPress.org
  9. [9] Apache Module mod_mime — AddEncoding · Apache Software Foundation
ARK. 2

STATS

wyniki z systemu · tylko liczby zbiorcze
TAB. 2.1Odczyty per strona—

Ten parametr nie zapisuje odczytu per strona — przebieg zostawia tylko ustalenia, więc liczby sprawdzonych stron i wyników „ok” system nie ma. Pojawią się po wdrożeniu zapisu przebiegów per strona per parametr.

TAB. 2.3Ustalenia—

Ten parametr nie otworzył jeszcze żadnego ustalenia w bazie LAB247. Pusto nie znaczy „czysto” — znaczy, że nic nie przekroczyło reguły.

TAB. 2.4Przebiegi z tym sposobem sprawdzeniaod 09.09.2026
Przebiegów
33sposób exposure
W 30 dni
0przebiegów
Ostatni
19.09.2026start przebiegu
Stron w przebiegach
—33 przebiegów bez liczby stron
ARK. 3

CARD

karta z kodu CREATO_PING, odczyt 22.09.2026

Jak ten parametr trafia do ClickUpa: wynik sondy to linia w subtasku 2. Pomiar, a usterka, którą otwiera — linia w subtasku 1. Podsumowanie (z identyfikatorem CWE i kategorią OWASP), skąd liczy się wskaźnik zagrożenia i status strony. Projekcja z bazy skanera odświeża oba subtaski co godzinę. Do 22.09 każde ustalenie dostawało własny subtask i status ze starego słownika (PODATNA, WARNING…) — te słowa zostały jeszcze w części opisów pomiaru niżej jako język wewnętrzny sond.

RYS. 3.1Droga parametru przez system: Ekspozycja kopii zapasowych
TAB. 3.1Pomiarpliki: 7
Obszar i ważnośćBezpieczeństwo · krytyczna (B27)
Workflow i częstotliwośćcreato_ping_security_v2 · P3 działa na LAB247Skaner 2.0, rytm „p3” / „bezpieczenstwo”: premium co 6 h, reszta co 24 h (tier 1–3), co 9 dni (tier 4) · Dokładny skan. dns_integrity porównuje NS, MX, SPF i DMARC z wzorcem z poprzedniego przebiegu.
Sonda i helpersposób exposure · CREATO_PING/helpers/exposure_check.py
Testy
  1. Tylko przebieg P3; przed sondami strażnik losowej ścieżki (200 z treścią = sondy pominięte).
  2. GET https://domena/backup.zip i /backup.tar.gz bez podążania za przekierowaniami; oceniane surowe bajty z pierwszych 64 KB.
  3. Reguła: kod 200 i bajty zaczynają się od sygnatury archiwum: ZIP (także pusty), gzip, bzip2, 7z, RAR albo xz. Strona HTML z kodem 200 nie spełnia reguły.
  4. Obie ścieżki dają ten sam typ ustalenia; gdy trafią obie, w dowodzie zostaje /backup.zip.
Typ wyniku0 albo 1 ustalenie exposure_backup_archive (dwie ścieżki sklejone w jedno)
Jednostkabrak — wynik jakościowy; w dowodzie ścieżka, długość treści i rozmiar z nagłówka, bez samej treści pliku
Próg i regułaTimeout odpowiedzi 15 s, połączenia 5 s. Reguła: kod 200 + sygnatura archiwum na początku surowych bajtów.
Gdzie leżą pokrętłaCREATO_PING/helpers/exposure_check.py → PROBES (reguła archive_magic), _ARCHIVE_MAGIC, _soft_200CREATO_PING/helpers/config.py → TIMEOUTS["exposure"], TIMEOUTS["security_connect"]CREATO_PING/helpers/security_runner.py → do_writera (bramka gate z polityki; sito powagi zniknęło 18.09)CREATO_PING/config/incident_policy.toml → [finding] exposure_backup_archive
Retencja odczytówSurowy pomiar jako NIEZMIENNY wiersz tabeli `odczyty` w bazie skanera (wejście, wyjście, dowody, sha karty sondy i helpera, commit kodu) — trigger odrzuca każdą zmianę. Okno retencji z kohorty: 90 dni premium, 30 dni reszta; poza oknem zostają odczyty z werdyktem problemu, akcją albo etykietą, bo replay reguł ich potrzebuje (`skaner/retencja.py`). Do LAB247 ten kanał nie idzie (do bazy serwisu jadą dziś tylko sprawdzenia dostępności), więc poza odczytem zostaje werdykt w tabeli `werdykty` i sprawa w tabeli `sprawy`.
Znane rozbieżności
  1. Archiwum .tar.gz podane z nagłówkiem Content-Encoding: gzip nie daje ustalenia — klient HTTP rozpakowuje strumień i sygnatura znika (sprawdzone na symulowanym serwerze). Fałszywy negatyw na ustaleniu pilnym.
  2. Pusty ZIP bez żadnego pliku daje ustalenie pilne.
  3. Sprawdzane są tylko dwie stałe nazwy w katalogu głównym; archiwa wtyczek kopii mają losowy identyfikator w nazwie albo leżą w wp-content, a .tgz, .7z i nazwy z datą nie są sondowane, choć lista sygnatur je obejmuje.
  4. alert=true w polityce nie jest czytane, brak trzeciego stanu, brak śledzenia przekierowań i brak sygnału zamknięcia — wspólne dla sond ekspozycji.
kandydaci do pętli: kod a opis parametru albo specyfikacja
Karta przepisana zCREATO_PING/helpers/exposure_check.py · CREATO_PING/helpers/config.py · CREATO_PING/config/incident_policy.toml · CREATO_PING/helpers/security_runner.py · CREATO_PING/helpers/tests/test_exposure_check.py · CREATO_PING/skaner/usterki.toml · CREATO_PING/skaner/ocena.py · odczyt 22.09.2026
TAB. 3.2Co oznacza failtypów Findingów: 1

exposure_backup_archive: bramka polityki otwarta (gate=true) → sprawa w skanerze → Archiwum kopii zapasowej do pobrania — waga 3 → ocena 5–6 (żółty), status strony „sredni”, dopóki sprawa jest otwarta. Kolejne przebiegi odświeżają opis i datę; helper nie wysyła sygnału zamknięcia.

KodFindingSeverityPewnośćSkutekFinding / alarmWaga → ocenaCo zrobić
B27.01Publiczna kopia zapasowaexposure_backup_archiveKrytycznaEwidentneotwarta podatnośćtak / takwaga 3 → ocena 5–6 (żółty)Usuń archiwum z serwera, zmień hasła do bazy i konta administratorów.
TAB. 3.3B27.01 · Publiczna kopia zapasowawersja 1 · 01.10.2026
Kod i kluczB27.01 · exposure_backup_archive · w tabeli typów
Co znaczybackup.zip albo backup.tar.gz leży w katalogu głównym — cała strona i baza do pobrania jednym kliknięciem.
Kiedy powstajeGET /backup.zip oraz GET /backup.tar.gz: status == 200, a surowe bajty zaczynają się od jednej z sygnatur: 504b0304, 504b0506 (ZIP), 1f8b (gzip), 'BZh', 377abcaf271c (7z), 526172211a07 (RAR), fd377a585a00 (xz).Sygnatury :158-162, ocena :189-190. Dedup do jednego findingu na domenę. W evidence size=<Content-Length>. Dowód tylko skrót.
Severity · pewnośćKrytyczna · Ewidentne
Skutek dla stronyotwarta podatność · zakłada Finding · alarm tak
Waga → ocenawaga 3 → ocena 5–6 (żółty)
KlasyfikacjaCWE: CWE-530 (Exposure of Backup File to an Unauthorized Control Sphere)OWASP Top 10:2025: A01:2025 Broken Access ControlOWASP ASVS 5.0.0: 13.4.7OCSF 1.9.0: Vulnerability Finding (class_uid 2002)
Rekord OCSFfinding_info.analytic.uid = "B27.01" · analytic.name = "exposure_backup_archive" · finding_info.types = ["B27 Ekspozycja kopii zapasowych"]
Co zrobićUsuń archiwum z serwera, zmień hasła do bazy i konta administratorów.
Wersje typu
  1. v1 · 01.10.2026 — kod B27.01 nadany (finding-codes.ts)
ARK. 4

LOOP

pętli: 2
RYS. 4.1Pętla parametru — sześć etapów
TAB. 4.1Trafność, 30 dnialarmy · prawdziwe · fałszywe · bez rozstrzygnięcia

Trafnoś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.

TAB. 4.2Pętle2 · zmian: 3 · wpływających na cały system: 3
Strażnik losowej ścieżki i dłuższy limit czasu dla sond ekspozycjizamknięta historyczna 2026-09-05

Sygnał: Tarcze antybotowe hostingu, strony parkingowe i serwery catch-all odpowiadają 200 na każdą ścieżkę, więc sondy oparte na kodzie 200 dawały „wystawiony” wszędzie. Równocześnie sondy na wolnych hostingach odpowiadały po około 15 s, a limit 5 s ucinał je bez śladu. · dotyczy też: Ekspozycja .env, Kopie wp-config.php, Ekspozycja .htaccess.bak, Dostępność xmlrpc.php, REST API: enumeracja użytkowników, Ekspozycja .git/HEAD, Dostępność readme.html, Dostępność wp-cron.php, Ekspozycja zrzutu bazy, Ekspozycja manifestów dev, Ekspozycja .DS_Store

  1. 1. Zbiórkaręcznieodczyt z nocnego skanu, bez zapisu per strona
  2. 2. Werdyktręcznieprzegląd skanera: 200 na wszystko i ciche timeouty to fałszywe wyniki
  3. 3. Miarabrakliczników trafności wtedy nie było
  4. 4. Kartabrakkarta parametru powstała 2026-09-16
  5. 5. Zmianazrobionestrażnik ścieżki, 15 s, logowanie błędów
  6. 6. Replaybrakbrak zapisanych odczytów do replayu
DataZmianaPowódWpływ na systemCommit · replay
2026-09-05Przed sondami GET losowej, nieistniejącej ścieżki; odpowiedź 200 z treścią = zero sond i jedno ustalenie exposure_scan_unreliable (niska powaga, bez subtaska).helpers/exposure_check.py · config/incident_policy.tomlOdpowiedź 200 na losową ścieżkę dowodzi, że kod 200 na tym serwerze nic nie znaczy; dalsze sondowanie tarczy grozi banem IP monitoringu.cały system Obejmuje wszystkie sondy ekspozycji naraz i wprowadza typ „nie dało się sprawdzić”; tę samą konwencję dostało wykrywanie wtyczek. Ustalenie ma niską powagę, więc filtr przebiegu je odrzuca i w produkcji nie zostawia śladu.b0fc77cbez replayubez zapisu zatwierdzenia
2026-09-05Limit odpowiedzi z 5 s na 15 s i połączenia z 2 s na 5 s, przeniesione do config.py; błąd sieci sondy logowany zamiast cichego pustego wyniku; do 4 sond naraz na stronę.helpers/config.py · helpers/exposure_check.py · helpers/html_fetch.py · helpers/wp_fingerprint.pyWolne hostingi odpowiadały po około 15 s, a pusty wynik po timeoucie był nieodróżnialny od „sprawdzone, czysto”.cały system Limit połączenia 5 s przejęło wspólne pobieranie HTML całego skanu bezpieczeństwa i wykrywanie wersji — strony z wolnym TLS przestały wypadać z całego skanu.b0fc77cbez replayubez zapisu zatwierdzenia
Limit 64 KB czytanej odpowiedzi po awarii pamięcizamknięta historyczna 2026-07-19

Sygnał: Brak pamięci podczas skanu: publiczny debug.log jednej ze stron był bardzo duży, a klient HTTP buforował całą odpowiedź. · dotyczy też: Sitemap.xml, Kopie wp-config.php, Ekspozycja .env, Ekspozycja .htaccess.bak, Dostępność xmlrpc.php, REST API: enumeracja użytkowników, Ekspozycja .git/HEAD, Dostępność readme.html, Dostępność wp-cron.php, Ekspozycja zrzutu bazy, Ekspozycja manifestów dev, Ekspozycja .DS_Store

  1. 1. Zbiórkaręcznieodczyt z nocnego skanu, bez zapisu per strona
  2. 2. Werdyktręcznieawaria procesu przypisana ścieżce debug.log
  3. 3. Miarabrakliczników trafności wtedy nie było
  4. 4. Kartabrakkarta parametru powstała 2026-09-16
  5. 5. Zmianazrobionestrumień z limitem 64 KB
  6. 6. Replaybrakbrak zapisanych odczytów do replayu
DataZmianaPowódWpływ na systemCommit · replay
2026-07-19Odpowiedź sondy czytana strumieniem do 64 KB; do oceny idzie pierwsze 5000 znaków.helpers/exposure_check.py · helpers/html_fetch.py · helpers/sitemap_check.pyDo rozpoznania ekspozycji wystarcza początek pliku; zmiana dotyczy sposobu czytania, nie werdyktu.cały system Brak pamięci w helperze zatrzymywał cały proces skanu bezpieczeństwa partii stron; ten sam limit dostało sprawdzenie sitemap.343b699bez replayubez zapisu zatwierdzenia
Blog 24/7
05.11CISA i FBI wzywają do zabezpieczenia sterowników chłodzenia po atakach w Europietherecord.media05.11Midnight Blizzard atakowała iPhone'y i Androidy przez zainfekowane strony w Europie i USAsecurityweek.com05.11APT29 kradła dane z iPhone'ów i Androidów przez przejęte i podrobione stronytherecord.media05.11Grupa APT29 przejęła skrypt Plerdy i atakowała niezałatane iPhone'y i Androidythehackernews.com05.11Microsoft wykrył 7,3 mld wiadomości phishingowych w III kwartale 2026microsoft.com05.11DigiCert ujawnia wyciek danych klientów i skanów dokumentów tożsamościbleepingcomputer.com05.11CWPdoor podmienia serwer cwpsrv w Control Web Panel i otwiera tylne wejście do Linuksableepingcomputer.com05.11Brytyjskie NCSC ostrzega, że narzędzia AI zwiększyły liczbę wykrywanych luk zero-daythehackernews.com05.11Skaner RootEvidence sprawdza starą lukę w Cisco IOS i dodaje nagłówki Opt-Outisc.sans.edu05.11Włamanie do portalu grantowego Norad, zagrożone dane 20 614 użytkownikówhelpnetsecurity.com