ARK. B30Parametr monitoringuBezpieczeństwo · lista 50 parametrów

Ekspozycja .DS_Store

ważność niskamierzonysposób exposure

Indeks katalogu zostawiony przez macOS. Ujawnia nazwy plików, których nie widać w listingu.

ARK. 1

WIKI

artykuł z 16.09.2026 · źródeł 7

Ekspozycja .DS_Store to parametr monitoringu stron internetowych, który sprawdza, czy pod adresem /.DS_Store w katalogu głównym witryny serwer oddaje plik metadanych katalogu tworzony przez system macOS. Pomiar kończy się jednym z trzech wyników: plik dostępny, plik niedostępny albo nie udało się uzyskać odpowiedzi. System Apple tworzy .DS_Store w praktycznie każdym katalogu, żeby przechowywać informacje o jego zawartości, w tym nazwy wszystkich plików i podkatalogów [1].

Jak działa

Finder, wyświetlając folder, zbiera metadane jego plików; administratorzy mogą wyłączyć odczyt plików .DS_Store na udziałach sieciowych SMB, żeby przyspieszyć przeglądanie [7]. Notatki Marka Mentovaia, który odtworzył format metodą inżynierii wstecznej, opisują struktury z położeniem okna Findera, rozmiarem etykiet i położeniem ikony pliku [2]. Każdy wpis zawiera nazwę pliku, którego dotyczy, zapisaną w UTF-16 [2]. Nazwa zaczyna się od kropki, więc Finder domyślnie jej nie pokazuje i użytkownik może nie wiedzieć o istnieniu pliku [1].

Format jest zastrzeżony i słabo udokumentowany [1]. Według analizy Sebastiana Neefa plik jest zapisany w kolejności big-endian i zaczyna się od liczby 0x00000001 oraz czterech bajtów magicznych Bud1 [1]. Nazwy plików leżą w drzewie bloków: parser odczytuje blok główny ze spisem DSDB, a potem przechodzi rekurencyjnie po blokach z rekordami [1]. Rekord zaczyna się od długości i nazwy pliku, po których następuje identyfikator i typ struktury [1].

RYS. 1.1Od indeksu do plików

Standardy i specyfikacje

  • Brak publicznej specyfikacji. Opisy formatu powstały przez inżynierię wsteczną [1] [2], a Neef zaznacza, że części struktury nadal nie rozpoznano [1].
  • Szablon macOS.gitignore z repozytorium szablonów GitHub wymienia .DS_Store jako pierwszy wzorzec w sekcji ogólnej [4].
  • Apache HTTP Server: dyrektywa Files ogranicza zasięg zawartych w niej dyrektyw do obiektów, których nazwa bazowa pasuje do podanej nazwy [5].
  • nginx: blok location może być zdefiniowany wyrażeniem regularnym z modyfikatorem ~, rozróżniającym wielkość liter [6].

Zagrożenia i skutki

Ujawnienie nazw plików. Neef opisuje skan katalogów głównych domen z listy Alexa Top 1M, wykonany w projekcie Internetwache.org. W znalezionych plikach były nazwy wskazujące na pełne kopie katalogu WWW, bazy danych, pliki konfiguracyjne, pliki wymiany i tymczasowe, a nawet klucze prywatne [1].

Automatyczne pobieranie. Narzędzie ds_store_exp parsuje .DS_Store i rekurencyjnie pobiera wymienione w nim pliki [3]. Dla każdej nazwy wysyła żądanie o plik, a dla nazw bez rozszerzenia próbuje też nazwa/.DS_Store, czyli schodzi do podkatalogów [3]. Przykład z dokumentacji zaczyna się od pliku w katalogu motywu, nie w katalogu głównym [3].

Nazwy nie zawsze istnieją. Plik opisuje zawartość katalogu na komputerze z macOS, więc nie każda nazwa musi istnieć na serwerze [1]. Na serwer trafia zwykle razem z repozytorium albo przy wysyłce przez rsync lub SFTP bez wykluczenia [1].

RYS. 1.2Jak .DS_Store trafia na serwer

Przykłady

SytuacjaOdpowiedź na GET /.DS_StoreZnaczenie
Plik wgrany z repozytorium albo przez rsync [1]200, bajty Bud1 po pierwszych czterechnazwy plików z katalogu autora
.DS_Store wykluczony szablonem .gitignore [4]brak plikuplik nie trafia do repozytorium
Apache z blokiem Files odmawiającym dostępu [1] [5]odmowa dostępuplik istnieje, ale nie jest podawany
nginx z location ~ \.DS_Store$ { deny all; } [1] [6]odmowa dostępujak wyżej
Plik tylko w podkatalogu motywu [3]brak w katalogu głównymlista nazw dostępna pod ścieżką podkatalogu
TAB. 1.1Przypisy7
  1. [1] Parsing the .DS_Store file format · Sebastian Neef, 0day.work
  2. [2] DS Store File Format (notatki Marka Mentovaia) · MozillaWiki
  3. [3] ds_store_exp — .DS_Store file disclosure exploit · lijiejie
  4. [4] macOS.gitignore · GitHub
  5. [5] Apache Core Features — dyrektywa Files · Apache Software Foundation
  6. [6] Module ngx_http_core_module — dyrektywa location · nginx
  7. [7] Adjust SMB browsing behavior in macOS · Apple Support
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
33przebiegów
Ostatni
19.09.2026start przebiegu
Stron w przebiegach
33 przebiegów bez liczby stron
ARK. 3

CARD

karta z kodu CREATO_PING, odczyt 16.09.2026
RYS. 3.1Droga parametru przez system: Ekspozycja .DS_Store
TAB. 3.1Pomiarpliki: 4
Obszar i ważnośćBezpieczeństwo · niska (B30)
Workflow i częstotliwośćcreato_ping_security_v2 · P3 działa na LAB247cron co 24 h, T1–T3; T4 raz po anomalii · 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/.DS_Store bez podążania za przekierowaniami; oceniane surowe bajty.
  3. Reguła: kod 200 i bajty zaczynają się od nagłówka pliku (00 00 00 01 Bud1); nazwy plików nie są odczytywane.
Typ wyniku0 albo 1 ustalenie exposure_ds_store (powaga niska) — dziś odrzucane przed zapisem
Jednostkabrak — wynik jakościowy
Próg i regułaTimeout odpowiedzi 15 s, połączenia 5 s. Reguła: kod 200 + nagłówek pliku .DS_Store na początku surowych bajtów.
Gdzie leżą pokrętłaCREATO_PING/helpers/exposure_check.py → PROBES (/.DS_Store, reguła ds_store_magic), _DS_STORE_MAGICCREATO_PING/helpers/config.py → TIMEOUTS["exposure"], TIMEOUTS["security_connect"]CREATO_PING/helpers/security_runner.py → _TASK_SEVERITIESCREATO_PING/config/incident_policy.toml → [finding] exposure_ds_store
Retencja odczytówNic: helper nadaje powagę poniżej wysokiej, filtr przebiegu odrzuca ustalenie przed zapisem, a produkcja idzie z --no-stats. Nie ma ani odczytu per strona, ani ustalenia, ani licznika — statystyki i replay niemożliwe.
Znane rozbieżności
  1. Parametr nie ma dziś żadnego wyniku: powaga niska w helperze, filtr przebiegu (tylko pilna i wysoka), --no-stats i gate=false. STATS zostaje puste, choć katalog pokazuje parametr jako mierzony.
  2. Sondowany jest tylko plik w katalogu głównym; .DS_Store w wp-content i uploads nie jest sprawdzany, a narzędzia do jego odczytu schodzą właśnie do podkatalogów.
  3. Ustalenie nie mówi, co wyciekło: nazwy z pliku nie są parsowane.
  4. Nota polityki obiecuje statystyki, których nie ma.
  5. 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/security_runner.py · CREATO_PING/config/incident_policy.toml · CREATO_PING/workflows/_prod/creato_ping_security_v2.json · odczyt 16.09.2026
TAB. 3.2Co oznacza failtypów ustaleń: 1

Brak skutku w produkcji: helper nadaje powagę niską, a filtr przebiegu przepuszcza do zapisu tylko pilną i wysoką, więc ustalenie odpada, zanim przeczyta je polityka incydentów. Przebieg idzie z --no-stats, więc nie zostaje nawet licznik. Nie powstaje subtask, zmiana statusu strony ani ustalenie w bazie.

UstaleniePowagaPewnośćSkutekSubtask / alarmCo zrobić
Publiczny .DS_Storeexposure_ds_storeNiskieEwidentnebez wpływunie / nieUsuń plik i dodaj .DS_Store do reguł wykluczeń przy wysyłce.
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, Ekspozycja plików wrażliwych, 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 kopii zapasowych, Ekspozycja zrzutu bazy, Ekspozycja manifestów dev

  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, Ekspozycja plików wrażliwych, 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 kopii zapasowych, Ekspozycja zrzutu bazy, Ekspozycja manifestów dev

  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
20.09Zastrzeżony PESEL: zmiana raz na 30 minut, blokada przy wypłaciedobreprogramy.pl20.09Fałszywe SMS-y od GITD o mandacie za autostradę wyłudzają dane kartyinstalki.pl20.09Pakiet npm indexed-btree omija blokadę skryptów instalacyjnychbleepingcomputer.com19.09SolarWinds łata CVE-2026-28326 w Access Rights Manager, zdalny kod bez logowaniathehackernews.com19.09Orkes Conductor: luka CVE-2026-58138 atakowana w sieci, poprawka w wersji 3.30.2thehackernews.com19.09Trzy luki jądra Linux w katalogu CISA KEV, Red Hat potwierdza aktywne atakithehackernews.com18.09Publiczne exploity na cztery luki jądra Linux dają lokalnie uprawnienia rootthehackernews.com18.09Brevo: skradziony klucz API Cloudflare i skrypty ClickFix na stronach klientówbleepingcomputer.com18.09WaterPlum z Korei Północnej zainfekowała 30 000 urządzeń w 100 krajachtherecord.media18.09Jedna zgoda OAuth daje napastnikowi dostęp do poczty i plików mimo MFAdarkreading.com