开源OS FreeBSD 中 ftpd chroot 本地提权漏洞 (CVE-2020-7468) 的技术分析
编译:奇安信代码卫士团队
该漏洞的根因在于对 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)。该漏洞是这名匿名研究人员提交的首个漏洞。
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)
国内首个专注于软件开发安全的
产品线。