漏洞描述:
在Google Chrome中,发现了一个影响渲染器进程的漏洞,主要涉及到AudioContext的功能。在正常情况下,AudioContext在没有用户交互的情况下不会进行音频渲染,相应的音频渲染线程也会保持非活动状态。然而,一旦触发了此漏洞,将强制在没有用户交互的情况下启用音频渲染进程。负责此行为的关键代码位于RealtimeAudioDestinationHandler
类中。
void RealtimeAudioDestinationHandler::SetChannelCount(
unsigned channel_count,
ExceptionState& exception_state) {
...
uint32_t old_channel_count = ChannelCount();
AudioHandler::SetChannelCount(channel_count, exception_state);
// 停止、重新创建并启动目标以应用新的通道数。
if (ChannelCount() != old_channel_count &&
!exception_state.HadException()) {
StopPlatformDestination();
CreatePlatformDestination();
StartPlatformDestination();
}
}
当channel_count
不等于old_channel_count
时,它会调用StartPlatformDestination
:
void RealtimeAudioDestinationHandler::StartPlatformDestination() {
...
if (platform_destination_->IsPlaying()) {
return;
}
// 启动音频渲染线程。
// ...
}
此函数是启动音频渲染线程的关键。当调用时,即使没有用户交互,也会强制处于关闭状态的AudioContext打开渲染线程。然而,漏洞的影响不仅仅是启用RCE。它还允许先前调用了close
方法的AudioContext重新启动音频渲染线程。通过按照特定的步骤序列,可以构建出一个Use-After-Free(UAF)条件。
利用步骤:
-
创建一个名为
ctx
的AudioContext。 -
创建一个名为
node
的AudioNode。 -
执行
node.connect(ctx.destination)
。 -
调用
ctx.close()
。 -
执行
node = null
并触发垃圾回收(GC)。此时,node
及其对应的AudioHandler
都将被释放。 -
再次触发漏洞以重新启动音频渲染线程。由于
node
已被释放,这将导致UAF。
漏洞利用:
利用基于AudioHandler包含了AudioNodeInput或AudioNodeOutput对象,以及AudioBus和AudioChannel对象的事实。一旦释放了AudioHandler,这些对象也会被释放。对于利用最重要的对象是AudioBus和AudioChannel,AudioBus负责对AudioChannel进行分配和管理,而AudioChannel则负责对音频缓冲区进行分配和读写。在释放AudioHandler对象后,使用一个长度较小的AudioBus占用原始的AudioBus,如果占用成功,就可以使用漏洞重新启动音频渲染线程。由于占用的AudioBus长度较小,之后将触发越界读取,只要在隔离堆中提前进行布局,就能读取出某些对象的虚表地址和一些可控制的堆地址。
一旦获得虚表地址和堆地址,就能再次触发漏洞直接占用AudioHandler对象,并伪造该对象以实现任意的虚表调用。通过虚表调用链,将shellcode写入RWX内存区域,最终跳转执行shellcode。
POC-HTML:
https://issues.chromium.org/action/issues/40075943/attachments/52912862?download=true
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里
原文始发于微信公众号(Ots安全):天府杯 2023”Chrome WebAudio 错误条目中的释放后使用漏洞 (CVE-2023-5996 [1497859])