VulCode
Blog

Monolog: RedactingFormatter ukrywa też sekrety zagnieżdżone w tablicach

Hasło schowane w tablicy pod wrażliwym kluczem wyciekało do logu, gdy PsrLogMessageProcessor wstawiał je wcześniej do treści komunikatu. Formatter zbiera teraz każdy tekst z takiej tablicy.

DualFroz - VulCode CEODualFroz - VulCode CEO1 min czytania
Monolog: RedactingFormatter ukrywa też sekrety zagnieżdżone w tablicach - DualFroz - VulCode CEO
Tytuł zmiany w repozytorium
Fix RedactingFormatter missing secrets nested inside array-valued sensitive keys
Scalono
9.09.2026
Opisano tutaj
6.10.2026

Wpis powstał 27 dni po scaleniu zmiany.

Monolog
Technologie:PHPlogowanie

Co nie działało

RedactingFormatter w Monologu ukrywa wartości pod wrażliwymi kluczami, takimi jak password. Robi to na dwa sposoby: zamienia wartość klucza w kontekście na maskę, a potem przeszukuje gotowy tekst logu i usuwa z niego oryginalne sekrety. To drugie przejście łapie kopie, które przeciekły innymi drogami, na przykład przez PsrLogMessageProcessor, który wstawia wartości z kontekstu do treści komunikatu.

Przejście działa tylko dla sekretów, które formatter wcześniej zebrał. A metoda zbierająca przyjmowała jedynie teksty. Gdy pod kluczem password leżała tablica, nic z niej nie trafiało na listę sekretów. Wywołanie:

php
$log->info('password reset payload: {password}', ['password' => ['new' => 'CorrectHorseBatteryStaple42']]);

kończyło się poprawnie zamaskowanym kontekstem i hasłem zapisanym otwartym tekstem w treści komunikatu, bo procesor zakodował tablicę do JSON i wstawił ją w miejsce {password}.

Co zmieniliśmy

Doszła mała metoda pomocnicza collectSensitiveValue(), która przechodzi po wartości spod wrażliwego klucza i zbiera każdy tekst, jaki w niej znajdzie, na dowolnej głębokości. Respektuje ten sam limit głębokości MAX_DEPTH, którego klasa używa już przy strukturach odwołujących się do samych siebie.

Jak to sprawdziliśmy

Nowy test przepuszcza rekord przez PsrLogMessageProcessor, a potem przez RedactingFormatter, i sprawdza, że sekret zagnieżdżony w tablicy nie występuje w wyniku, a w jego miejscu jest [REDACTED].

Efekt

Zmianę scalił autor biblioteki 9 września 2026. Logi z aplikacji, które przekazują do Monologa tablice z danymi formularzy, nie zdradzają już haseł przez treść komunikatu.

Najpopularniejsza biblioteka logów w PHP, używana między innymi przez Symfony i Laravela.

Język
PHP
Gwiazdki na GitHubie
21 399

Ten sam przypadek przed zmianą i po niej

Na przykładzie z wpisu: co wychodziło przed poprawką i co wychodzi teraz.

Wywołanie z opisu błędu
$log->info('password reset payload: {password}', ['password' => ['new' => 'CorrectHorseBatteryStaple42']]);

Rekord przechodzi przez PsrLogMessageProcessor, a potem przez RedactingFormatter.

Przed zmianą
CorrectHorseBatteryStaple42

Kontekst był zamaskowany, ale hasło trafiało otwartym tekstem do treści komunikatu, bo procesor wstawił tam tablicę jako JSON.

Po zmianie
[REDACTED]

Formatter zbiera każdy tekst z tablicy pod wrażliwym kluczem, więc sekret nie występuje w wyniku.

Czego nas to nauczyło

Ukrywanie sekretów w logach musi schodzić w głąb struktur danych. Klucz oznaczony jako wrażliwy jest wrażliwy także wtedy, gdy jego wartością jest tablica.

Z opisu zmiany i nowego testu w pull requeście #2067.

Pytania o zmianę #2067

Gdzie jest zmiana, jak ją sprawdziliśmy i kto ją przyjął.