如何实现微软“照片”应用Raw 格式图像编码器漏洞 CVE-2021-24091的技术分析

发布时间:2021-12-29 19:13:01 作者:柒染
来源:亿速云 阅读:121
# 如何实现微软“照片”应用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

2.2 漏洞Root Cause

CRawProcessing::ProcessImageData函数中,对Sony ARW格式的解析存在两处关键缺陷:

  1. 元数据校验缺失
    未验证RAWImageInfo结构体中widthheight字段的合法性,允许传入超规格值(如0xFFFF)

  2. 动态内存计算错误
    分配缓冲区时使用如下错误计算方式:

    bufferSize = width * height * components; // 可能整数溢出
    pBuffer = malloc(bufferSize); 
    

当攻击者构造畸形的ARW文件: - 设置width=0x4000, height=0x4000, components=4 - 计算得到bufferSize=0x40000000(实际需要4GB内存) - 系统分配失败返回NULL指针,但后续仍进行数据写入

2.3 崩溃现场分析

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地址触发崩溃。


3. 漏洞利用技术

3.1 利用条件构建

需要精确控制以下参数实现稳定利用: 1. 通过ARW文件头伪造合理的EXIF元数据 2. 构造特殊的width/height组合触发可控大小的堆分配 3. 利用颜色分量(components)字段控制溢出步长

3.2 利用步骤分解

  1. 堆风水准备
    通过连续分配/释放多个中等大小(约1MB)的缓冲区塑造堆布局

  2. 目标对象占位
    触发漏洞前先加载正常图片,使关键对象(如GDI+ Bitmap)分配到目标区域

  3. 定向覆盖
    精心设计溢出数据覆盖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)       # 触发溢出的像素数据

3.3 绕过缓解措施


4. 漏洞修复方案

微软在2021年2月补丁中通过以下方式修复:

  1. 增加边界检查
    ”`diff

    • bufferSize = width * height * components;
    • if (width > MAX_DIMENSION || height > MAX_DIMENSION)
    • return E_INVALIDARG;

    ”`

  2. 安全内存分配
    改用WindowsInternal::Composable::Details::SafeBuffer进行内存管理

  3. 元数据签名验证
    对RAW文件的EXIF头添加数字签名校验


5. 防御建议

  1. 企业防护方案

    • 部署EMET或WDEG控制流保护
    • 通过AppLocker限制photos.exe执行权限
  2. 开发者建议

    // 安全的图像解析示例
    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);
       // 后续处理...
    }
    

6. 结论

CVE-2021-24091揭示了现代图像处理软件在应对复杂RAW格式时的安全挑战。该漏洞的利用过程展示了如何将看似简单的整数溢出转化为完整的RCE攻击链。建议所有使用Windows照片查看器的用户及时更新补丁,同时对非标准图像文件保持警惕。

参考文献

  1. Microsoft Security Update Guide (February 2021)
  2. ZDI-21-190 Advisory
  3. 《Windows Internals 7th Edition》- RAW Image Processing
  4. MITRE ATT&CK T1190 - Exploit Public-Facing Application

”`

注:实际文章可根据需要补充以下内容: 1. 完整的windbg调试输出 2. ARW文件结构图解 3. 漏洞利用的ROP链详细构造 4. 动态演示视频链接

推荐阅读:
  1. 什么是微软公司推出的流式视频格式
  2. Facebook 又出黑科技,手机照片一键切成 3D 大片

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

cve-2021-24091 raw

上一篇:如何进行Apache Solr DataImportHandler远程代码执行漏洞CVE-2019-0193分析

下一篇:如何进行Harbor任意管理员注册漏洞CVE-2019-16097的复现

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》