# 如何實現微軟“照片”應用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)字段控制溢出步長
堆風水準備
通過連續分配/釋放多個中等大?。s1MB)的緩沖區塑造堆布局
目標對象占位
觸發漏洞前先加載正常圖片,使關鍵對象(如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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。