根因分析
S/MIME允许签名消息的嵌套处理。当Outlook遇到特定嵌套配置的S/MIME证书时,由于对已释放的类实例指针pPrivBody进行重复释放,导致程序崩溃:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
HRESULT CSMime::SMIMEINFOToOptions(
IMimeMessageTree * const pTree,
const SMIMEINFO * psi,
HBODY hBody)
{
CMessageBody * pPrivBody = NULL;
for(iLayer = 0, psldLoop = psi->psldLayers; psldLoop != NULL;
psldLoop = psldLoop->m_psldInner, iLayer++) {
pPrivBody->Release(); // 首次释放
}
if (pPrivBody != NULL) pPrivBody->Release(); // 双重释放
return hr;
}
|
远程代码执行可利用性
双重释放漏洞需满足两个条件才可能被利用:
- 堆分配器行为:首次释放的内存块需保持未使用状态且未合并,直到第二次释放时才被重新分配
- 写控制能力:攻击者需能实现任意地址写操作(write-what-where)
本漏洞中,第一个条件因堆块可能在两次释放间被重用而不总是成立。第二个条件同样不满足,典型崩溃指令显示:
1
2
|
eax=00000000
inc dword ptr [eax+14h] // 仅对固定地址进行值递增,无攻击者可控参数
|
由于eax寄存器不受攻击者控制,且操作仅限于递增内存值,实际利用难度极高。
综合评估
基于现有数据分析,该漏洞因可靠性利用构建困难,短期内被大规模利用的可能性较低。微软出于谨慎原则发布安全更新,以防范未来攻击技术的发展。
——Jinwook Shin, MSRC工程团队