近期,谷歌开源了一个名为PathAuditor
的安全工具,旨在帮助开发人员找出和文件访问相关的漏洞。
虽然该开源项目由谷歌主导,但是这家科技巨头表示希望软件后续的维护由安全社区进行,并强调这不是一个官方支持的谷歌产品。
根据谷歌的说法,PathAuditor会监控所有的文件访问行为,记录下潜藏的漏洞。而他们之所以编写这个工具正是为了大规模地发现和“文件访问”所相关的一系列漏洞。PathAuditor是一个共享库,可以使用LD_PRELOAD
加载到进程中,然后hook所有与libc函数相关的filesystem,检查相关访问是否安全。
而这安全检查主要是通过遍历路径并检查是否有任何组件可以被普通用户替换。例如,如果某个目录是普通用户可写的,一旦被工具探测到,就会将其记录到syslog中以进行手动分析。
文件访问一类的漏洞可以被攻击者利用来执行某些非法提升权限的恶意代码,开发人员可以用此来检测隐藏着危险的路径访问模式。
再具体一点,就是该工具可以检查普通用户是否可以用符号链接(symlink)替换文件或目录,这种情况可能潜藏漏洞。
除了PathAuditor的源代码,谷歌还分享了一个用PathAuditor检测到tmpreaper
(遍历/tmp目录,删除旧文件)中漏洞的例子(CVE-2019-3461)。
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;
}
// [...]
由于tmpreaper
通常以root身份运行,且为了防止删除tmp之外的文件,所以需要代码来检测某个目录是否为挂载点。
重点在于以上代码会调用rename("/tmp/foo", "/tmp/foo/x")
,而一旦/tmp/foo
确实是挂载点,就将返回EXDEV
。如果/tmp/foo
属于除root用户以外的任何用户,PathAuditor就会将此调用标记为潜在的漏洞。为了理解到底发生了什么,我们需要看看内核在重命名时有什么操作:
-
内核针对第一个参数遍历路径
/tmp/foo
。 -
内核针对第二个参数遍历路径
/tmp/foo/x
。 -
如果源和目标位于不同的文件系统上,则返回
EXDEV
。 -
否则,将文件从第一个目录移动到第二个目录。
因为/tmp/foo
将被解析两次,所以存在竞态条件。如果它能被普通用户所控制,则可在任何时候被不同的文件所替换。
在代码进入系统调用之前,我们先用一个文件替换它。当内核解析第一个参数时,它将看到用户所控制的文件内容。现在我们再次替换它,这一次是使用到同一文件系统上任意目录的符号链接。最后内核将第二次解析路径,遵循符号链接将文件移动到所选定的目录。
利用这种方法,我们可以把/tmp
中的文件移动到/etc/cron
,以root权限运行。
“这个项目仍处于早期阶段,我们也在积极进行下一步工作。我们期待听到你关于该工具的任何建议,以及其自身的漏洞。”
在今年早些时候,谷歌发布了名为ClusterFuzz的模糊测试工具,这主要是为发现Chrome浏览器中的内存损坏漏洞而开发的。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场:https://nosec.org/home/detail/3357.html
来源:https://securityaffairs.co/wordpress/94872/hacking/pathauditor-tool.html