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

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

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)

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

产品线。

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

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

  1. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用的iOS PEGASUS(又称Trident三叉戟)0day漏洞了.为了修复该漏洞,苹果专门发布了一个iOS 9.3.5版本. ...

  2. CVE-2014-7911 Android本地提权漏洞分析与利用

    概述 前面我们了解了Android Binder机制的基本原理,当然仅仅了解是不够的,我们要做到:Know it and hack it.这篇文章我们就来分析一个和Binder相关的漏洞:CVE-20 ...

  3. 反编译exe软件_挖洞经验 | Panda反病毒软件本地提权漏洞分析

    写在前面的话 在这篇文章中,我将跟大家讨论一个我在Panda反病毒产品中发现的一个安全漏洞(CVE-2019-12042),这是一个本地提权漏洞,该漏洞将允许攻击者在目标设备上将非特权账户提权至SYS ...

  4. 【CVE-2021-4043】Linux本地提权漏洞复现

    实验步骤 文章目录 实验步骤 CVE-2021-4043 Linux本地提权漏洞 实验背景 实验环境 漏洞复现 构造payload 用gcc编译后上传到阿里云 执行payload 漏洞修复 CVE-2 ...

  5. Linux 系统安全 - 近期发现的 polkit pkexec 本地提权漏洞(CVE-2021-4034)修复方案

    时间: 20220-1-25 事件: qualys 安全研究人员披露 CVE-2021-4034 polkit pkexec 本地提权漏洞细节. 漏洞描述: polkit pkexec 中对命令行参数 ...

  6. sqlite字段是否存在_【漏洞预警】Linux内核存在本地提权漏洞(CVE20198912)

    更多资讯和分析文章请关注启明星辰ADLab微信公众号及官方网站(adlab.venustech.com.cn) 漏洞背景 近日,Linux git中发布一个commit补丁,该补丁对应的漏洞是一个本地 ...

  7. 2019最有意思的五大 ZDI 案例之:通过调色板索引实现 Win32k.sys 本地提权漏洞 (下)...

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本文是趋势科技 ZDI 项目推出的第二届年度最有意思的五大案例系列文章之一.他们从1000多份安全公告中遴选出这些案例,奇安信代码卫士 ...

  8. 2019最有意思的五大 ZDI 案例之:通过调色板索引实现 Win32k.sys 本地提权漏洞(上)...

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 本文是趋势科技 ZDI 项目推出的第二届年度最有意思的五大案例系列文章之一.他们从1000多份安全公告中遴选出这些案例,奇安信代码卫士 ...

  9. CVE-2016-1240 Tomcat 服务本地提权漏洞

    catalogue 1. 漏洞背景 2. 影响范围 3. 漏洞原理 4. 漏洞PoC 5. 修复方案 1. 漏洞背景 Tomcat是个运行在Apache上的应用服务器,支持运行Servlet/JSP应 ...

最新文章

  1. 016-热更新之FishingJoy一
  2. 关于ARM启动的一篇文章
  3. mysql+字符串后8位_字符的一字节8位问题
  4. 佳能80d有人脸识别吗_国家地理2020年旅行者最推荐相机Top10,有你喜欢的吗?
  5. pat1049. Counting Ones (30)
  6. 最短网络 Agri-Net
  7. 大学物理质点动力学思维导图_生理学 | 思维导图
  8. Node.js读取mongoDB并输出json数据
  9. RESTful JSON Web服务最佳实践
  10. 剑指offer之 从尾到头打印链表
  11. Linux中修改PATH环境变量(只在当前窗口下生效)
  12. PCIE知识点-003:PCIE协议中的upstream概念
  13. 六西格玛绿带考试模拟试卷--多选题|优思学院
  14. 【现代卫星导航系统】之北斗卫星导航系统
  15. 找茬小游戏微信小程序源码自带流量主功能+前端+后端+教程
  16. 初中文化能学python吗_初中文化可以学Python编程吗,我想通过这个渠道进入人工智能这个大行业?...
  17. PLC远程监控与数据采集方案
  18. 计算机蓝屏代码0xc0000020,Win10运行程序提示“损坏的映像 错误0xc0000020”解决方法图文教程...
  19. AD(Altium Designer)PCB布线中的“格式刷”,助力快速布局布线
  20. 游戏开发 unity3d python_游戏研发系列 Unity3D/2D游戏开发从0到1 第2版.pdf

热门文章

  1. cocos2d-x 如何制作一个类马里奥的横版平台动作游戏续 2
  2. mysql 5.6 之 GTID 复制介绍
  3. sed 和 awk 正则表达式
  4. Spinlock 简介(转)
  5. 通过ODBC连接Oracle
  6. git log格式化日志
  7. 找回密码forget_password
  8. 如何在python3环境下的Django中使用MySQL数据库
  9. zz 鸡汤穷三代,励志毁一生
  10. I.MX6 Manufacturing Tool V2 (MFGTool2) Emmc mksdcard-android.sh hacking