java - 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 提供的各种连接器和传输的更多信息,我现在正试图找到以下问题的答案:
文档说对于SADebugServerAttachingConnector和SAPIDAttachingConnector:
要调试的进程不必在调试模式下启动(即,使用 -agentlib:jdwp 或 -Xrunjdwp)
所以:
1)为什么Xrunjdwp
首先存在调试选项呢?
2) SADebugServerAttachingConnector如何在参数中不使用端口号的情况下工作?
3) 文档没有说明需要 root 权限。允许非特权用户对未在调试模式下启动的 jvm 实例进行任意调试,这不是一个严重的权限提升漏洞吗?
解决方案
我会专注于这个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 情况下,都没有权限升级。
(模任何未公开或未修补的操作系统级根升级错误......当然。)
推荐阅读
- html - 上方标题背景上的图像旋转,在多设备中响应大小
- c# - 在 Asp.net MVC 列表中获取 SQL 游标获取的数据
- javascript - 如何使用 setValue 预填充 React Hook 表单?
- math - 浮点指数的偏差值和范围
- javascript - 在 Laravel 中添加更改 [任务颜色] 函数 dhtmlx Gantt
- git - WebStorm 在更新 changelist 时会占用大量 CPU 资源。有什么办法可以改善吗?
- javascript - 如何添加 5 个小于 10 的随机数?
- ios - 为什么 UIDatePickerView 在 Xcode 12 中的 iOS14 之后打破了自动布局?
- arrays - 如何使用 where 集合 laravel 在数组中进行搜索
- arrays - 查找数组中条目的平均值时出现 Java 代码错误