使用JAVA远程调用导致程序自动down掉,jdk1.5的debug模式系统漏洞
2012-09-14 10:46
423 查看
在项目上遇到一个系统会突然down掉的问题,因为并没有详细的日志信息,百思不得其解,终于有一天这个问题再次出现,捕获的日志信息为:
ERROR: transport error 202: handshake failed - connection prematurally closed ["transport.c",L41]
JDWP exit error JVMTI_ERROR_NONE(0): could not connect, timeout or fatal error
在网上一查,真相大白,原来是jkd1.5的一个关于debug运行方式的一个bug,原因是由于接收到不符合JDWP协议的数据包,导致JVM崩溃.
要确认系统中是否存在该漏洞,可以检查java启动参数中是否有如下相关配置:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9001
或者-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9001
若存在相关配置,那就说明java启动了远程调试端口,就会存在该漏洞;此时JVM虚拟机作为调试的服务提供端,通过8787端口监听一个连接,而调试器通过该连接与虚拟机进行交互。
从官方文档中摘录几个配置事例:
-Xrunjdwp:transport=dt_socket,server=y,address=8000
在8000端口监听Socket连接,挂起VM(suspend默认为y)并且不加载运行主函数直到调试请求到达
-Xrunjdwp:transport=dt_shmem,server=y,suspend=n
选择一个可用的共享内存(因为没有指定address)并监听该内存连接,同时加载运行主函数,不挂起VM
-Xrunjdwp:transport=dt_socket,address=myhost:8000
连接到myhost:8000提供的调试服务(server=n,以调试客户端存在),挂起VM并且不加载运行主函数
-Xrunjdwp:transport=dt_shmem,address=mysharedmemory
通过共享内存的方式连接到调试服务,挂起VM并且不加载运行主函数
-Xrunjdwp:transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
等待java.io.IOException被抛出,然后挂起VM并监听8000端口连接,在接到调试请求后以命令/usr/local/bin/debugstub dt_socket myhost:8000执行
-Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:/bin/debugstub.exe
等待一个RuntimeException被抛出,然后挂起VM并监听一个可用的共享内存,在接到调试请求后以命令d:/bin/debugstub.exe dt_shmem <address>执行,<address>是可用的共享内存
解决该问题的方法有两种,任选其一即可:
1、在JDK1.5环境下关闭远程调试模式,但线上环境的部署脚本一定要仔细review才行;
2、升级JDK到1.6b49以上版本,这就要看应用的兼容性了,一般来说不会有什么问题;
3、笨方法:不在使用这个方法,哈哈:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9001
4、或者使用如下配置临时代替:-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
ERROR: transport error 202: handshake failed - connection prematurally closed ["transport.c",L41]
JDWP exit error JVMTI_ERROR_NONE(0): could not connect, timeout or fatal error
在网上一查,真相大白,原来是jkd1.5的一个关于debug运行方式的一个bug,原因是由于接收到不符合JDWP协议的数据包,导致JVM崩溃.
问题原因:
该故障是JVM远程debug存在的缺陷,只有在开启远程debug端口时才会出现;原因是由于接收到不符合JDWP协议的数据包,导致JVM崩溃。要确认系统中是否存在该漏洞,可以检查java启动参数中是否有如下相关配置:
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9001
或者-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=9001
若存在相关配置,那就说明java启动了远程调试端口,就会存在该漏洞;此时JVM虚拟机作为调试的服务提供端,通过8787端口监听一个连接,而调试器通过该连接与虚拟机进行交互。
从官方文档中摘录几个配置事例:
-Xrunjdwp:transport=dt_socket,server=y,address=8000
在8000端口监听Socket连接,挂起VM(suspend默认为y)并且不加载运行主函数直到调试请求到达
-Xrunjdwp:transport=dt_shmem,server=y,suspend=n
选择一个可用的共享内存(因为没有指定address)并监听该内存连接,同时加载运行主函数,不挂起VM
-Xrunjdwp:transport=dt_socket,address=myhost:8000
连接到myhost:8000提供的调试服务(server=n,以调试客户端存在),挂起VM并且不加载运行主函数
-Xrunjdwp:transport=dt_shmem,address=mysharedmemory
通过共享内存的方式连接到调试服务,挂起VM并且不加载运行主函数
-Xrunjdwp:transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
等待java.io.IOException被抛出,然后挂起VM并监听8000端口连接,在接到调试请求后以命令/usr/local/bin/debugstub dt_socket myhost:8000执行
-Xrunjdwp:transport=dt_shmem,server=y,onuncaught=y,launch=d:/bin/debugstub.exe
等待一个RuntimeException被抛出,然后挂起VM并监听一个可用的共享内存,在接到调试请求后以命令d:/bin/debugstub.exe dt_shmem <address>执行,<address>是可用的共享内存
问题解决:
一般线上运行的应用都不会开启远程Debug模式,各应用服务器的默认配置也是不开启的,就算开启了该debug端口也会有防火墙保护。解决该问题的方法有两种,任选其一即可:
1、在JDK1.5环境下关闭远程调试模式,但线上环境的部署脚本一定要仔细review才行;
2、升级JDK到1.6b49以上版本,这就要看应用的兼容性了,一般来说不会有什么问题;
3、笨方法:不在使用这个方法,哈哈:-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9001
4、或者使用如下配置临时代替:-Dcom.sun.management.jmxremote.port=8999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
相关文章推荐
- java学习之旅15、16--eclipse开发环境的使用_建立java项目_运行java项目,eclipse运行程序的问题(src和bin问题)_debug模式
- 关于java程序实现自动选人系统 使用I/O流完成
- 使用PB调用API自动更新(非FTP模式)(六、AUTODOWN.INI文件)
- 使用JAVA调用中科院ICTCLAS2015分词系统
- Java的JNI:使用Java调用C程序(入门)
- 使用bat命令或shell脚本调用java程序
- RedHat系统下的网络配置,主机名的修改,进入单用户模式修改root密码和使用SSH远程连接工具
- 在Emacs调试JAVA程序,使用GUD模式
- VB 调用打开各种文件(自动查找使用默认的程序)
- 使用java的HttpClient调用远程接口
- Java 调用系统默认程序打开
- 使用java代码调用exe程序 (包括参数传递)
- Python版课堂管理系统中使用UDP广播远程关闭客户端程序思路与源码
- VC程序调用MATCOM导致进程不自动结束的解决办法
- 3.第三单元任务二实训:使用作业提交系统提交Java作业时 ,需要输入Java源代码文件名和自己的邮箱,提交前对Java文件名以及邮箱进行有效检查。编写程序实现对输入的Java源文件名以及邮箱有效性的
- 使用jvisualvm来远程观察Java程序及jvisualvm插件[转]
- 使用Java Service Wrapper 把Java程序作为Windows系统服务
- JAVA调用系统命令或可执行程序
- 使用自动生成java文件和自动编译的静态代理模式-马士兵设计模式教程
- 使用PB调用API自动更新(非FTP模式)(七、下载代码)