Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
工具/GitHubGitHub/google/path-auditor
权限提升漏洞分析动态代码分析 (DAST)漏洞利用模糊测试二进制分析Archived
GitHubgoogle/path-auditor

path-auditor

运行时libc函数审计器,通过LD_PRELOAD挂钩文件系统系统调用,检测文件访问竞态条件和符号链接漏洞,记录潜在的权限提升路径。

查看仓库
2503865年前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

PathAuditor

PathAuditor 是一个通过审计 libc 函数来发现文件访问相关漏洞的工具。

其思路大致如下:

  • 审计二进制程序执行的每个与文件系统相关的 libc 函数调用。
  • 检查系统调用中使用的路径是否为用户可写。如果是,非特权用户可能已用符号链接替换了目录或文件。
  • 将所有违规记录为潜在漏洞。

我们使用 LD_PRELOAD 来钩住所有与文件系统相关的库调用,并将遇到的任何违规记录到 syslog。

这不是谷歌官方支持的产品。

漏洞示例

让我们看看这个工具可以检测的一种漏洞示例。CVE-2019-3461 是 tmpreaper 中的一个 bug,tmpreaper 是一个遍历 /tmp 并删除旧文件的工具。它通常作为 root 用户的 cron 任务运行。由于它不想删除 /tmp 之外的文件,它使用以下代码来检查一个目录是否为挂载点:

root@kitploit:~
if (S_ISDIR (sb.st_mode)) {
    char *dst;

    if ((dst = malloc(strlen(ent->d_name) + 3)) == NULL)
        message (LOG_FATAL, "malloc failed.\n");
    strcpy(dst, ent->d_name);
    strcat(dst, "/X");
    rename(ent->d_name, dst);
    if (errno == EXDEV) {
        free(dst);
        message (LOG_VERBOSE,
                 "File on different device skipped: `%s/%s'\n",
                 dirname, ent->d_name);
        continue;
    }
    // [...]

简而言之,此代码调用 rename("/tmp/foo", "/tmp/foo/x"),如果 "/tmp/foo" 是一个挂载点,它将返回 EXDEV。如果 "/tmp/foo" 由除 root 之外的任何用户拥有,PathAuditor 会将此调用标记为潜在漏洞。要理解原因,我们必须考虑内核在执行 rename 系统调用时发生了什么(简化版):

  1. 内核为第一个参数遍历路径 "/tmp/foo"。
  2. 内核为第二个参数遍历路径 "/tmp/foo/x"。
  3. 如果源和目标位于不同的文件系统,则返回 EXDEV。
  4. 否则,将文件从第一个目录移动到第二个目录。

这里存在一个竞争条件,因为 "/tmp/foo" 将被解析两次。如果它由用户控制,用户可以在任何时候用不同的文件替换它。 特别地,我们希望 "/tmp/foo" 首先是一个目录,以通过 tmpreaper 代码中的 if(S_ISDIR) 检查。然后我们在代码进入系统调用之前将其替换为一个文件。当内核解析第一个参数时,它将看到一个带有用户控制内容的文件。 现在我们再次替换它,这次用指向同一文件系统上任意目录的符号链接替换。内核将第二次解析路径,跟随符号链接,并将受控文件移动到选定的目录。

相同文件系统的限制是因为 rename 不能在文件系统之间工作。但在某些 Linux 发行版上,/tmp 默认只是根文件系统上的一个文件夹,你可以利用这个 bug 将文件移动到 /etc/cron,该文件将以 root 身份执行。

如何运行

要试用它,你需要使用 bazel 构建 libpath_auditor.so,并使用 LD_PRELOAD 将其加载到二进制程序中。任何违规都会被记录到 syslog,因此请确保 syslog 正在运行。

root@kitploit:~
bazel build //pathauditor/libc:libpath_auditor.so
LD_PRELOAD=/path/to/bazel-bin/pathauditor/libc/libpath_auditor.so cat /tmp/foo/bar
tail /var/log/syslog

也可以通过将其添加到 /etc/ld.so.preload 来在所有系统进程上运行。但请注意,仅建议在测试系统上这样做,因为它可能导致不稳定。

作为快速入门,你可以尝试本项目附带的 Docker 容器:

root@kitploit:~
docker build -t pathauditor-example .
docker run -it pathauditor-example
# LD_PRELOAD=/pathauditor/bazel-bin/pathauditor/libc/libpath_auditor.so cat /tmp/foo/bar
# cat /var/log/syslog
下载工具