Bug2Lab · Secure Code · Java / Logging

Утечка секретов и паролей в логах

При неуспешном логине сервис пишет в логи и логин, и пароль. Эти логи уходят в централизованное хранилище, где их видят десятки людей. Фикс — никогда не логировать пароли, токены, ключи.

1
Как выглядит атака
Атакующий просто пробует войти. Пароль (даже если неверный) попадает в логи. Потом он ищет свои попытки в /internal/logs и вытягивает пароли жертв.
GET /internal/logs?lines=20
200 OK
WARN Login failed for user alice@example.com with password "Qwerty123!"
WARN Login failed for user bob@example.com with password "Summer2024!"
2
Почему это стало возможным
Логгер пишет полный ввод, включая пароль и токены. Это часто делается «для отладки».
Проблемный код
71catch (AuthException e) {
72 log.warn("Login failed for user {} with password {}", username, password); // ❌
73 throw e;
74}
3
Как это чинится правильно
Никогда не логируем секреты. В логах только high-level факт: «неуспешный логин», без чувствительных данных.
Исправленный паттерн
71catch (AuthException e) {
72 log.warn("Login failed for user {}", username); // ✅ без пароля
73 throw e;
74}

bug2regressРегрессионный тест

После неуспешного логина скачиваем последние строки лога. Если там видно поле password или строку, похожую на секрет — билд стопаем.

#!/bin/bash
# logleak-check.sh
curl -s -X POST https://staging.example.internal/login \
  -d "username=test@example.com&password=SuperSecret123" > /dev/null

LOGS=$(curl -s "https://staging.example.internal/internal/logs?lines=20")

if echo "$LOGS" | grep -Ei "password|Secret123|Bearer|API_KEY"; then
  echo "[BLOCK] Логи содержат пароль / токен"
  exit 1
fi

echo "[OK] Чувствительные данные не логируются"
exit 0

Это защищает от утечки паролей через собственную observability-инфраструктуру.

Проверка пониманияГде косяк?

Стандарт:секреты, токены, пароли, номера карт — не попадают в логи вообще, никогда, ни при каких обстоятельствах.

Теория (по желанию) Логи — это не «только для админов». Это по факту ещё один канал утечки