CVE-2018-1000028调试记录
内容提要
漏洞CVE-2018-10000281是Linux内核NFS子系统的访问控制错误漏洞,允许远程用户通过NFS读写权限范围外的文件。漏洞利用需要确保目标NFS服务器对外暴露的文件系统启用了rootsquash选项。漏洞的补丁非常简单,通过一个for循环将客户端传过来的所有等于root的GID替换为一个低权限GID,然后执行一次groups_sort来对收到的所有GID排序。环境配置包括服务端和客户端的设置。复现调试过程中发现问题出在服务端,解决方法是移除--manage-gids选项,并重启NFS服务。
延伸解读
漏洞成因:排序时机错误导致root GID绕过
补丁将groups_sort从for循环内移到循环外,修复了漏洞。原代码在每次迭代后排序,可能将尚未处理的root GID(0)排到前面,使其躲过后续的替换操作。例如,客户端用户主GID为1000,辅助GID包含0,处理GID 1000后排序将0提前,之后循环不再处理该位置,导致root GID未被替换为低权限GID,从而绕过root_squash限制。
复现关键:服务端需移除--manage-gids选项
调试中发现服务端内核收到的ngroups始终为1,但tcpdump显示客户端发送了所有GID,问题出在服务端。rpc.mountd的--manage-gids选项会在服务端查找并替换客户端提供的GID,导致辅助组信息丢失。移除该选项并重启NFS服务后,客户端的所有GID才能被内核正确处理,漏洞得以成功复现。
环境配置要点:客户端用户需包含root辅助组
复现要求客户端用户具有root辅助组(GID 0)。示例中创建UID 1000的user用户,并添加包括root组在内的额外三个组。服务端需在/etc/exports中配置root_squash选项,将远程root映射为匿名用户。客户端通过/etc/fstab挂载NFS,并确保用户有挂载权限。这些配置是触发漏洞的必要条件。
Q&A
CVE-2018-1000028漏洞是什么?影响哪些系统?
CVE-2018-1000028是Linux内核NFS子系统的访问控制错误漏洞,允许远程用户通过NFS读写权限范围外的文件,CVSS评分为7.4(高危)。
CVE-2018-1000028漏洞的成因是什么?
漏洞成因在于NFS服务端代码中groups_sort在每次for循环迭代中执行,导致客户端传来的root GID可能未被完全替换为低权限GID,从而绕过rootsquash限制。
如何复现CVE-2018-1000028漏洞?
复现需要搭建有漏洞的Linux内核NFS服务端和客户端环境。服务端安装nfs-kernel-server,配置共享目录并启用root_squash;客户端安装nfs-common,创建用户并添加root辅助组,挂载NFS。调试时需在服务端移除rpc.mountd的--manage-gids选项并重启NFS服务,然后客户端用户可尝试读取root创建的文件。
漏洞补丁是如何修复CVE-2018-1000028的?
补丁将groups_sort调用从for循环内部移到循环外部,确保所有GID先被替换后再排序,避免root GID因排序而躲过替换。
在复现CVE-2018-1000028时,为什么需要移除--manage-gids选项?
因为rpc.mountd的--manage-gids选项会在服务端查找GIDs并用结果替换客户端提供的GIDs,导致客户端发送的辅助组(如root组)被忽略,从而无法触发漏洞。移除该选项后,服务端会使用客户端提供的GIDs,才能成功复现。
rootsquash选项在CVE-2018-1000028漏洞利用中起什么作用?
rootsquash将远程root用户映射为本地nobody用户,限制其权限。漏洞利用需要目标NFS服务器启用rootsquash,因为漏洞正是绕过这一限制,使远程用户获得超出权限的文件访问。