Bug2Lab · Secure Code · Infrastructure / Message Queue

Открытая панель очереди сообщений (RabbitMQ Management)

RabbitMQ Management UI доступен из интернета со стандартными креденшалами (guest/guest) или без авторизации. Атакующий может читать сообщения, изменять конфигурацию очередей, создавать пользователей или вызвать DoS. Фикс — закрыть порт 15672 от внешнего доступа, изменить дефолтные креды, настроить firewall и использовать TLS.

1
Как выглядит атака
Утекла таблица пользователей:
users table dump
{
 "email":"alice@example.com",
 "passHash":"5f4dcc3b5aa765d61d8327deb882cf99"
}
(это MD5 от "password")
2
Почему это стало возможным
В коде используется простое хеширование без соли и без замедления. Это легко брутфорсится радужными таблицами.
Проблемный код
33String hashPassword(String raw) {
34 return DigestUtils.md5DigestAsHex(raw.getBytes()); // ❌ MD5 без соли
35}
3
Как это чинится правильно
Используем проверенный адаптивный алгоритм с солью и cost factor. В Spring Security — это BCryptPasswordEncoder.
Исправленный паттерн
33@Bean
34public PasswordEncoder passwordEncoder() {
35 return new BCryptPasswordEncoder(); // ✅ соль + cost
36}
37String hashPassword(String raw){
38 return passwordEncoder().encode(raw);
39}

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

Тест вызывает регистрацию пользователя с паролем "Test123!" и проверяет, что в БД сохранился bcrypt-хеш (он должен начинаться с $2). Если это md5/sha1 — билд стопаем.

#!/bin/bash
# password-hash-check.sh
curl -s -X POST https://staging.example.internal/register \
  -d "email=test@example.com&password=Test123!" > /dev/null

HASH=$(curl -s "https://staging.example.internal/debug/userhash?email=test@example.com")

if echo "$HASH" | grep -Eq '^"\\$2'; then
  echo "[OK] Пароль хранится через bcrypt/адаптивный хеш"
  exit 0
fi

echo "[BLOCK] Слабое хеширование паролей (не bcrypt/PBKDF2/Argon2)"
exit 1

Это защищает от массового взлома всех паролей при утечке базы.

Проверка пониманияПочему это критично?

Стандарт:никаких самописных хеш-функций паролей. Только проверенный адаптивный алгоритм через стандартный PasswordEncoder.

Теория (по желанию) «Но мы же не храним в открытом виде» — это не аргумент