针对 CVE-2026-84568 的 macOS autofs 补丁的独立逆向工程, 以及一个可用的 PoC,用于复现信任边界违规。
Apple 发布了安全公告。Mr.Gedik(@h4ck2s3c)报告了该漏洞。本 仓库记录了技术机制——被修补的函数、该检查的作用,以及补丁 阻止了哪些挂载路径——并包含一个可用的 PoC,可在存在漏洞的 系统上复现信任违规。
| 字段 | 值 |
|---|---|
| CVE | CVE-2026-84568 |
| 组件 | autofs / automountd |
| 受影响 | macOS Tahoe 26.6 及更早版本 |
| 修补于 | macOS Tahoe 26.7、macOS Golden Gate 27、macOS Sequoia 15.8 |
| 公告影响 | “控制网络目录服务器的攻击者可能能够以 root 权限执行任意代码。” |
| 报告者 | Turkish Technology 的 Mr.Gedik(@h4ck2s3c) |
Apple 针对 CVE-2026-84568 的公告记录了影响和补丁版本。它 没有记录技术机制:
在撰写本文时,未找到公开的技术分析。本仓库通过
对 automountd_26.6 和 automountd_27 的独立逆向工程
分析,以及针对底层信任边界违规的可用 PoC,填补了这一空白。
这不是发现声明。 该 CVE 由 Mr.Gedik 报告,并由 Apple 修补。此处的贡献是技术分析和复现。
automountd 从配置的目录服务(LDAP、NIS、OpenDirectory)获取
automount 映射。在存在漏洞的版本(26.6 及更早版本)中,
automountd 没有验证映射条目的主机组件是否解析到本地
机器。
因此,恶意目录服务器可以提供这样一个映射条目,其挂载源为:
localhost<hostname>.local)127.0.0.1受害者随后会在攻击者控制的挂载点上从自身挂载。
修补后的版本(26.7 / 27)在 sym.func.100005bd8 中添加了
主机名检查,会拒绝匹配上述任一情况的条目。
automountd_26.6 与 automountd_27 之间
sym.func.100005bd8 的反汇编差异——见 docs/PATCH_DIFF.md"localhost"、gethostname()、
SCDynamicStoreCopyLocalHostName + ".local" 的 strncasecmp,
以及一个枚举所有本地 IP 的 getifaddrs / getipnodebyaddr 循环fstype 字段的追踪,经过 parse_nfs →
mapline_to_mapent → ——
在构造程序路径之前,该字段未被验证完整分析见 docs/ANALYSIS.md,地址和日志样本见
docs/ARTIFACTS.md。
poc.sh——单文件攻击者侧设置。启动一个带有恶意
auto_master / auto_evil 映射的 LDAP 服务器,以及一个带有
访问证明标记的 NFS 导出。当受害者的 automountd 获取该映射时,
它会将自己的 NFS 导出挂载到攻击者控制的路径。auto_master / auto_evil 映射的恶意 LDAP 服务器automountd 通过网络获取该映射127.0.0.1Apple 公告中“以 root 权限执行任意代码”的影响无法通过本分析中
测试的路径触达。完整列表见
docs/ANALYSIS.md 中的“已测试并排除的路径”一节。
所演示的影响是信任边界违规本身:受害者从一个本应被拒绝的 源进行挂载。
poc.sh 攻击者侧设置(单文件)
docs/
ANALYSIS.md 完整逆向工程分析
PATCH_DIFF.md 26.6 与 27 之间 sym.func.100005bd8 的差异
ARTIFACTS.md 地址和日志样本
README.md 本文件
LICENSE
四个文件,两个目录。没有其他内容。
brew install openldap)slapd.conf 定义:database mdb,suffix "dc=evil,dc=local"nfsd)——macOS 自带slapd、nfsd、/etc/exports)automountd)/etc/auto_master 中存在 +auto_masternfsd,导出一个目录受害者需要运行 NFS 服务器才能使挂载成功。该 CVE 涉及的是对
本地主机条目的接受,而不是传递导出。如果受害者未运行 nfsd,
挂载会失败并显示 NFS server 127.0.0.1 not responding——这仍然
表明 automountd 接受了该条目。
./poc.sh <ATTACKER_IP>
将 <ATTACKER_IP> 替换为从受害者视角看到的攻击者 IP。
sudo automount -vc
ls /System/Volumes/Data/mnt/evil/evil/
cat /System/Volumes/Data/mnt/evil/evil/proof.txt
文件 proof.txt 可通过该挂载读取。mount 输出中的挂载源为
127.0.0.1:<export_dir>:
127.0.0.1:/tmp/nfsroot on /System/Volumes/Data/mnt/evil/evil (nfs, nodev, nosuid, automounted, nobrowse)
nodev 和 nosuid 的存在反映了内核的 NFS 挂载默认值以及
mount_nfs 自身的选项处理——它们并非来自 automountd。完整
分解见 docs/ANALYSIS.md。
在已修补的系统(26.7 / 27)上,相同的映射条目会在任何挂载尝试
之前被拒绝。sym.func.100005bd8 的反汇编比较见
docs/PATCH_DIFF.md。
要在已修补的主机上确认:
# 提供相同的映射条目,然后在已修补的受害者上:
sudo automount -vc
ls /System/Volumes/Data/mnt/evil/evil/
预期:挂载点未被创建,且 mount 输出中没有出现任何条目。
当主机为 127.0.0.1、localhost 或本地主机名时,
sym.func.100005bd8 检查会拒绝该条目。
fstype 注入(单独发现)在分析过程中,发现了一个单独的纵深防御弱点:
sym.func.1000086f4(run_mount_cmd)通过
asprintf("%s/mount_%s", "/sbin", fstype) 构造程序路径,
而没有验证来自映射条目的 fstype 字段。
fstype 中的路径遍历序列会到达 asprintf 调用:
automountd: Can't stat mount program /sbin/mount_../../../../../../tmp/evil_prog: No such file or directory
在标准 macOS 安装上,生成的路径不会解析为可执行文件,因为
/sbin/mount_.. 不存在。该注入是真实存在的,但被路径解析所
阻止。只有当 /sbin 下存在可写路径,或者创建了目录符号链接
mount_<X> 时,它才会变得可利用——而这两者在标准 macOS 上
都不成立。
这被记录为单独的观察结果,不属于 CVE-2026-84568 的一部分。
详情见 docs/ANALYSIS.md。
本仓库仅供防御性安全研究和教育使用。
MIT。见 LICENSE。
asprintf("%s/mount_%s", "/sbin", fstype)webdavfs_agent 的 XML 解析器的 SAX 回调分析——
characters 回调使用带显式长度检查的 __memcpy_chk;没有溢出od_process_record_attributes 的分析——OpenDirectory
记录解析器全程使用 CoreFoundation API;没有固定大小的缓冲区mount_nfs、mount_smbfs、mount_url
以及所有 NetFSPlugins/* bundle 是否存在 shell 执行;均未发现