JDWP (Java Debug Wire Protocol): что это и как защитить прод

JDWP — это протокол удалённой отладки для виртуальной машины Java (JVM). Он позволяет отладчику подключаться к запущенному процессу Java, ставить брейкпоинты, читать/менять состояние, вызывать методы. Удобен в разработке и тестировании, но при неправильной конфигурации в продакшене несёт серьёзные риски безопасности.

Базовые моменты

  1. JDWP включается параметром JVM «agentlib» (удалённая отладка) и обычно слушает TCP-порт (часто 5005).
  2. Два режима: server=y (JVM слушает входящие) и server=n (JVM сама подключается к отладчику).
  3. Аутентификации на уровне протокола нет: защита достигается только сетевыми мерами (белые списки, туннели, VPN, firewall).
  4. На Android JDWP активируется для приложений со флагом debuggable; в продакшене он должен быть выключен.

Как это работает / ключевые опции

Типичное включение (обобщённо):

  • transport=dt_socket — сокетный транспорт;
  • address=HOST:PORT (или просто PORT) — куда слушать/подключаться;
  • server=y|n — кто инициирует соединение;
  • suspend=y|n — «заморозить» приложение до подключения отладчика.

Пример безопаснее по умолчанию: привязка к 127.0.0.1 и отсутствие «suspend» в проде (чтобы сервис не завис при рестарте): transport=dt_socket,server=y,address=127.0.0.1:5005,suspend=n Доступ разработчиков организуется через SSH-туннель/VPN.

Риски и векторы атак

Открытый порт во внешнюю сеть. При address=*:5005 или привязке к 0.0.0.0 злоумышленник может подключиться к JDWP без пароля.

Удалённое исполнение кода. Через JDWP возможны вызовы методов приложения/стандартной библиотеки, что при неосторожной конфигурации эквивалентно RCE.

Остановка и инспекция. Брейкпоинты, дампы памяти, чтение секретов (токены, пароли, ключи) из heap/переменных.

Цепочки атак. JDWP нередко комбинируют с фишингом/сканированием сети и уязвимостями CI/CD (см. Supply-chain атаки — как защитить криптопроекты), а также эксплойтами нулевого дня в окружении (см. Zero-day уязвимости: что это и как защититься (чек-лист)).

Практика / чек-лист защиты

  • Политика: запрет JDWP в продакшене по умолчанию. Разрешать точечно и временно по регламенту инцидент-респонса.
  • Сеть: привязывать к 127.0.0.1; закрыть порт на периметре; доступ только через VPN/SSH-туннели и список доверенных IP.
  • Режим server. Предпочитать server=n (JVM инициирует исходящее соединение) в средах с жёстким периметром.
  • Секреты: не хранить чувствительные данные в переменных дольше необходимого; использовать отдельные учётки/минимальные привилегии.
  • Мониторинг: алерты на появление процесса с включённым JDWP, скан портов при деплое, инвентаризация флагов JVM.
  • Android: убедиться, что релизные сборки не debuggable; отключить отладку в манифесте/gradle-профилях.
  • Документация: зафиксировать процедуру включения/отключения JDWP, окна времени, ответственных.

Плюсы и ограничения

Аспект Плюсы Минусы/риски
Отладка Удобная диагностика сложных ошибок «на живой системе». Риск RCE и утечки секретов при сетевой доступности.
Время реакции Быстрый анализ без ребилда и логов уровня TRACE. Возможна пауза/деградация сервиса при неверном suspend.
Инфраструктура Простая настройка на JVM, стандартные инструменты. Нет встроенной аутентификации; защита только сетевым периметром.

Мини-таблица режимов

Режим Что делает Риск по умолчанию
server=y JVM слушает входящие соединения от отладчика. Высокий при привязке к внешнему интерфейсу.
server=n JVM сама подключается к отладчику по адресу. Ниже (нет открытого порта), но важна защита канала.
suspend=y Останавливает приложение до подключения. Риск простоя сервиса при рестарте.
suspend=n Не останавливает выполнение. Безопаснее для продакшена по доступности.

Частые вопросы (FAQ)

Опасен ли JDWP сам по себе? Нет, если он выключен. Опасен, когда включён и доступен извне: аутентификации нет, подключение даёт глубокий контроль.

Можно ли «запаролить» JDWP? Встроенного пароля в протоколе нет. Используйте VPN/SSH-туннели, mTLS на уровне канала, сетевые ACL и сегментацию.

Как понять, включён ли JDWP? Проверьте флаги запуска JVM (agentlib/jdwp), открытые порты процесса, логи приложений/оркестратора.

Что делать, если JDWP нужен в проде? Включать временно, на localhost, через туннель, с журналированием сеанса и ограничением времени/доступа.

Связан ли JDWP с кражей криптоактивов? Напрямую — нет, это отладочный канал JVM. Но через него можно читать секреты и вызывать код в сервисах, работающих с кошельками/ключами, что повышает риск. Уменьшайте воздействие с помощью управления рисками и минимизации секретов в памяти.

См. также

Zero-day: уязвимости нулевого дня

Supply-chain атаки

Управление рисками

Двухфакторная аутентификация

Криптокошелёк

Seed-фраза

Self-custody

Смарт-контракт

Task Runner