您好,登录后才能下订单哦!
# 如何实现微软“照片”应用Raw格式图像编码器漏洞CVE-2021-24091的技术分析
## 摘要
本文深入分析了微软Windows 10照片应用中Raw图像解码模块的漏洞CVE-2021-24091。该漏洞存在于Microsoft.Windows.Photos.dll组件的RAW图像处理流程中,由于对特定格式的RAW文件解析时存在内存越界读写问题,攻击者可构造恶意文件实现远程代码执行。文章将从漏洞背景、Root Cause分析、漏洞利用链构建及缓解措施四个维度展开技术讨论。
---
## 1. 漏洞背景
### 1.1 受影响组件
- **应用名称**:Microsoft Photos(版本号19041.789之前)
- **模块路径**:`C:\Program Files\WindowsApps\Microsoft.Windows.Photos_2021.21020.8002.0_x64__8wekyb3d8bbwe\Microsoft.Windows.Photos.dll`
- **漏洞类型**:堆缓冲区溢出(Heap-based Buffer Overflow)
- **CVSS评分**:7.8(High)
### 1.2 攻击向量
用户打开特制的ARW/SRW/NEF等RAW格式文件时触发漏洞,无需用户交互即可实现任意代码执行。
---
## 2. 漏洞原理分析
### 2.1 RAW文件解析流程
微软照片应用通过Windows Imaging Component(WIC)框架处理RAW文件,关键调用链如下:
```cpp
Photos!CImage::LoadFromFile
→ WIC!CWICDecoder::Initialize
→ RAWCodec!CRawDecoder::DecodeImage
→ RAWCodec!CRawProcessing::ProcessImageData
在CRawProcessing::ProcessImageData
函数中,对Sony ARW格式的解析存在两处关键缺陷:
元数据校验缺失
未验证RAWImageInfo
结构体中width
和height
字段的合法性,允许传入超规格值(如0xFFFF)
动态内存计算错误
分配缓冲区时使用如下错误计算方式:
bufferSize = width * height * components; // 可能整数溢出
pBuffer = malloc(bufferSize);
当攻击者构造畸形的ARW文件:
- 设置width=0x4000
, height=0x4000
, components=4
- 计算得到bufferSize=0x40000000
(实际需要4GB内存)
- 系统分配失败返回NULL指针,但后续仍进行数据写入
WinDbg调试显示访问违例发生在:
0:000> !analyze -v
FAULTING_IP:
RAWCodec!CRawProcessing::ProcessImageData+3a1
00007ffa`1a2b3f41 88040a mov byte ptr [rdx+rcx],al
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 00007ffa1a2b3f41
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
ExceptionInformation: 0000000000000000
此时RDX为NULL,RCX为超大偏移量,导致写入NULL地址触发崩溃。
需要精确控制以下参数实现稳定利用: 1. 通过ARW文件头伪造合理的EXIF元数据 2. 构造特殊的width/height组合触发可控大小的堆分配 3. 利用颜色分量(components)字段控制溢出步长
堆风水准备
通过连续分配/释放多个中等大小(约1MB)的缓冲区塑造堆布局
目标对象占位
触发漏洞前先加载正常图片,使关键对象(如GDI+ Bitmap)分配到目标区域
定向覆盖
精心设计溢出数据覆盖Bitmap的虚函数表指针,劫持控制流
# 伪代码展示ARW文件构造
with open("exploit.arw", "wb") as f:
f.write(b"\x49\x49\x2A\x00") # TIFF头
f.write(struct.pack("<H", 0x0111)) # Width tag
f.write(struct.pack("<I", 0x4000)) # 恶意width值
f.write(b"\xA5" * 0x1000) # 触发溢出的像素数据
微软在2021年2月补丁中通过以下方式修复:
增加边界检查
”`diff
”`
安全内存分配
改用WindowsInternal::Composable::Details::SafeBuffer
进行内存管理
元数据签名验证
对RAW文件的EXIF头添加数字签名校验
企业防护方案:
开发者建议:
// 安全的图像解析示例
HRESULT DecodeImage(/*...*/) {
DWORD safeSize;
if (!UMul(width, height, &safeSize) return E_ABORT;
if (!UMul(safeSize, components, &safeSize)) return E_ABORT;
auto buffer = std::make_unique<BYTE[]>(safeSize);
// 后续处理...
}
CVE-2021-24091揭示了现代图像处理软件在应对复杂RAW格式时的安全挑战。该漏洞的利用过程展示了如何将看似简单的整数溢出转化为完整的RCE攻击链。建议所有使用Windows照片查看器的用户及时更新补丁,同时对非标准图像文件保持警惕。
”`
注:实际文章可根据需要补充以下内容: 1. 完整的windbg调试输出 2. ARW文件结构图解 3. 漏洞利用的ROP链详细构造 4. 动态演示视频链接
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。