[英]JVM debug connector internals and security
我最近遇到了一个问题: 在没有使用调试参数启动JVM的情况下调试java应用程序
通过https://docs.oracle.com/javase/7/docs/technotes/guides/jpda/conninv.html阅读有关JVM提供的各种连接器和传输的更多信息,我现在正在尝试找到以下问题的答案:
Docs说对于SADebugServerAttachingConnector和SAPIDAttachingConnector :
无需在调试模式下启动要调试的进程(即使用-agentlib:jdwp或-Xrunjdwp)
所以:
1)为什么Xrunjdwp
存在像Xrunjdwp
这样的调试选项呢?
2) SADebugServerAttachingConnector如何在不在参数中使用端口号的情况下工作?
3)文档没有说明要求root权限。 是不是一个严重的权限升级漏洞,允许任意调试未在调试模式下启动的jvm实例,由非特权用户?
我将重点关注SADebugServerAttachingConnector
案例。
以下是您链接到的文档的Java 11版本的更多引用:
SA调试服务器连接连接器
调试器应用程序可以使用此连接器来调试运行调试器的计算机以外的计算机上的进程或核心文件。
此连接器使用RMI与远程计算机上运行的“调试服务器”进行通信。 在调用此连接器上的attach()方法之前,必须在远程计算机上启动调试服务器,并告知要调试哪个进程或核心文件。
无需在调试模式下启动要调试的进程(即使用-agentlib:jdwp或-Xrunjdwp)。
1)为什么首先存在像Xrunjdwp这样的调试选项呢?
SA Debug Server方法允许您调试您不想与代理一起启动的Java进程(例如出于安全原因),或者您没有先见之明。
相反,代理方法适用于您不希望设置SA调试服务器以调试Java应用程序的麻烦。
正如他们所说,这是“马匹的课程”。
2)SADebugServerAttachingConnector如何在不在参数中使用端口号的情况下工作?
您的调试器使用RMI默认端口与SA调试服务器通信。 SA调试服务器使用服务器和目标已知的机制附加到目标JVM。 它很可能是一个特定于操作系统的机制。 例如,在Linux上它可以使用ptrace(2)
API。 不需要涉及网络套接字和端口。
3)文档没有说明要求root权限。 是不是一个严重的权限升级漏洞,允许任意调试未在调试模式下启动的jvm实例,由非特权用户?
该文档指出您需要专门设置SA Debug Server和目标VM之间的链接。 这是在启动SA调试服务器时完成的。
操作系统级访问控制将不允许非根SA调试服务器使用(例如) ptrace
syscalls访问属于另一个用户/用户标识的Java进程。 除非您已拥有root权限,否则操作系统不会让您启动根SA调试服务器。 因此,无论是在根情况还是非根情况下,都没有特权升级 。
(模块化任何未公开或未修补的操作系统级别的根升级错误......当然。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.