首页 > 解决方案 > JVM 调试连接器内部结构和安全性

问题描述

我最近遇到了一个问题:Debug a java application without started the JVM with debug arguments

在https://docs.oracle.com/javase/7/docs/technotes/guides/jpda/conninv.html阅读有关 JVM 提供的各种连接器和传输的更多信息,我现在正试图找到以下问题的答案:

文档说对于SADebugServerAttachingConnectorSAPIDAttachingConnector

要调试的进程不必在调试模式下启动(即,使用 -agentlib:jdwp 或 -Xrunjdwp)

所以:

1)为什么Xrunjdwp首先存在调试选项呢?

2) SADebugServerAttachingConnector如何在参数中不使用端口号的情况下工作?

3) 文档没有说明需要 root 权限。允许非特权用户对未在调试模式下启动的 jvm 实例进行任意调试,这不是一个严重的权限提升漏洞吗?

标签: javasecuritydebuggingnetworkingoperating-system

解决方案


我会专注于这个SADebugServerAttachingConnector案子。

以下是您链接到的文档的Java 11 版本的更多引用:

SA 调试服务器附加连接器

调试器应用程序可以使用此连接器来调试运行调试器的机器以外的机器上的进程或核心文件。

此连接器使用 RMI 与远程机器上运行的“调试服务器”通信。在调用此连接器上的 attach() 方法之前,必须在远程机器上启动调试服务器并告知要调试的进程或核心文件。

要调试的进程不必在调试模式下启动(即,使用 -agentlib:jdwp 或 -Xrunjdwp)。


1)为什么像 Xrunjdwp 这样的调试选项首先存在呢?

SA 调试服务器方法允许您在您不想使用代理启动(例如出于安全原因)或您没有远见的情况下调试 Java 进程。

相反,代理方法适用于您不想麻烦设置 SA 调试服务器来调试 Java 应用程序的情况。

正如他们所说,这是“课程的马”。

2) SADebugServerAttachingConnector 如何在参数中不使用端口号的情况下工作?

您的调试器正在使用 RMI 默认端口与 SA 调试服务器通信。SA 调试服务器使用服务器和目标已知的机制连接到目标 JVM。它很可能是一种特定于操作系统的机制。例如,在 Linux 上它可以使用ptrace(2)API。不需要涉及网络套接字和端口。

3) 文档没有说明需要 root 权限。允许非特权用户对未在调试模式下启动的 jvm 实例进行任意调试,这不是一个严重的权限提升漏洞吗?

该文档指出您需要专门设置 SA 调试服务器和目标 VM 之间的链接。这在您启动 SA 调试服务器时完成。

操作系统级别的访问控制不允许非根 SA 调试服务器使用(例如)ptrace系统调用访问属于另一个用户/用户 ID 的 Java 进程。除非您已经拥有 root 权限,否则操作系统不会让您启动 root SA 调试服务器。因此,无论是在 root 还是非 root 情况下,都没有权限升级。

(模任何未公开或未修补的操作系统级根升级错误......当然。)


推荐阅读