查看原文
其他

开源OS FreeBSD 中 ftpd chroot 本地提权漏洞 (CVE-2020-7468) 的技术分析

ZDI 代码卫士 2022-04-06

 聚焦源代码安全,网罗国内外最新资讯!

编译:奇安信代码卫士团队

7月份,一名匿名研究员向 ZDI 报告了 FreeBSD 中的一个本地提权漏洞。它位于 FreeBSD 的文件传输协议守护进程 (ftpd) 中,后者提供ftpchroot 功能,旨在限制认证用户的文件系统访问权限。该功能使用 “chroot” 系统调用实现,这种技术常被称为 “chroot jail(Chroot 监狱)”。Chroot jail 通过将进程限制到文件系统受限部分而起作用。然而,通过利用该实现中的一个漏洞,攻击者实际上可利用该受限状态获得巨大优势,将权限从受限的 FTP 账户提升至 “root” 权限,从而使攻击者在系统上执行任意代码。该漏洞在 FreeBSD FTP 守护进程中已经存在很长的时间,可追溯至 FreeBSD 6.3 发布版本。该漏洞的编号是 CVE-2020-7468/ZDI-20-1431,补丁已于9月份发布。


漏洞


该漏洞的根因在于对 freebsd/libexec/ftpd/ftpd.c 中的 chroot() 函数处理存在缺陷。如下是易受攻击函数的简化版本:

void pass(char *passwd) { // ... if (guest || dochroot) { // ... /* * Finally, do chroot() */ if (chroot(chrootdir) < 0) { reply(550, "Can't change root."); goto bad; } __FreeBSD_libc_enter_restricted_mode(); } else /* real user w/o chroot */ homedir = pw->pw_dir; // ... if (chdir(homedir) < 0) { if (guest || dochroot) { reply(550, "Can't change to base directory."); goto bad; } else { // ... } // ... bad: /* Forget all about it... */ #ifdef LOGIN_CAP login_close(lc); #endif if (residue) free(residue); end_login(); }


如果 FTP 用户试图登录并被配置为在 /etc/ftpchroot 中的 chroot jail 被限制,则 ftpd 将调用 chroot 和 chdir 系统调用(如上)。如果 chdir 系统调用失败,则代码跳至标签 bad。在这种情况下,ftpd 仍然等待新的登录,但连接已锁定在 chroot jail 内。这样在该连接上的下次登录尝试会引发不正确的行为。


利用


为了强制 chdir 系统调用在登录过程中失败,攻击者可使用命令 chmod 0 在主页目录上更改权限。另外,攻击者将会上传和主页目录相关的特别准备的文件 “etc/spwd.db”。该文件是修改过的常规 FreeBSD 系统(包含root用户的已知密码)的密码数据库。Chdir 失败后,ftpd被锁定在 chroot jail 中,以便所有后续的文件系统访问权限创建和用户主页文件夹相关,而不是和文件系统真正的root 相关。结果,当对后续登录进行认证时,ftpd 读取攻击者的 spwd.db 而不是合法的和该文件系统真正 root 相关的 /etc/spwd.db。这时,攻击者可通过已知密码以 root 身份登录。下一步,上传 /etc/pam.d/ftpd 和 /usr/lib/pam_opie.so.5。第一个文件强制 ftpd 在登录过程中加载多个动态库,包括第二个文件在内。第二个文件旨在通过已获得的 root 权限打破 chroot jail 并执行反向 shell。接着,攻击者可以 root 权限执行任意代码。Exploit 步骤概述如下:

1、通过受限的 FTP 账户登录。

2、上传包含已知 root 密码的 etc/spwd.db。

3、 执行 chmod 0。

4、再次以受限的 FTP 账户登录。在登录过程中,chdir 失败,导致 ftpd 进程在 chroot jail 中锁定。

5、通过已知密码以 root 身份登录。

6、上传 /etc/pam.d/ftpd 和 /usr/lib/pam_opie.so.5,后者包含一个反向 shell。

7、再次以受限 FTP 账户身份登录。和之前一样,chdir 失败,导致 ftpd 进程在 chroot jail 中锁定。

8、通过已知密码以 root 身份登录。Ftpd 执行该反向 shell。


补丁


为解决这个问题,FreeBSD 做了稍微修改。如 chdir 系统调用失败,则 ftpd 将立即断开连接。

void fatalerror(char *s) { reply(451, "Error in server: %s", s); reply(221, "Closing connection due to server error."); dologout(0); /* NOTREACHED */ } void pass(char *passwd) { // ... if (chdir(homedir) < 0) { if (guest || dochroot) { fatalerror("Can't change to base directory."); } else { //... }


结论


该漏洞是一个逻辑提权漏洞,因此它的稳定性非常强,而不同于9月份说明的FreeBSD 内核提权漏洞 (CVE-2020-7460)。该漏洞是这名匿名研究人员提交的首个漏洞。





推荐阅读
FreeBSD BSDiff 被曝高危内存损坏漏洞,时隔4年终修复
Linux 和 FreeBSD 被曝多个 DoS 漏洞



原文链接

https://www.zerodayinitiative.com/blog/2020/12/21/cve-2020-7468-turning-imprisonment-to-advantage-in-the-freebsd-ftpd-chroot-jail


题图:Pixabay License


本文由奇安信代码卫士编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。


奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

    觉得不错,就点个 “在看” 或 "” 吧~


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存