Jailbreak #003:Safari 0-day 漏洞,请尽快升级系统

共 1721字,需浏览 4分钟

 ·

2021-10-24 11:15

最近,谷歌零计划披露了 iOS 系统中 Safari 的一个 0-day 漏洞,该漏洞由某位匿名人士发现,编号 CVE-2021-30858,允许 Web 执行任意代码,存在被利用的风险,可开发基于 web 的越狱,所以受影响的用户请尽快升级系统。以下是详细说明

基本信息

披露时间:2021 年 9 月 13 日

披露者:匿名

目标产品:Apple WebKit

受影响版本:Safari 14.1.2、iOS 14.8

苹果官方信息:https://support.apple.com/en-us/HT212808

验证代码

var fontFace1 = new FontFace("font1", "", {});
var fontFaceSet = new FontFaceSet([fontFace1]);
fontFace1.family = "font2";

漏洞详情

Bug 类型:UAF(Use-after-free)

详情:漏洞源于以下这段代码

void CSSFontFaceSet::removeFromFacesLookupTable(const CSSFontFace& face, const CSSValueList& familiesToSearchFor)
{
for (auto& item : familiesToSearchFor) {
String familyName = CSSFontFaceSet::familyNameFromPrimitive(downcast<CSSPrimitiveValue>(item.get()));
if (familyName.isEmpty())
continue;

auto iterator = m_facesLookupTable.find(familyName);
ASSERT(iterator != m_facesLookupTable.end());
bool found = false;
for (size_t i = 0; i < iterator->value.size(); ++i) {
if (iterator->value[i].ptr() == &face) {
found = true;
iterator->value.remove(i);
break;
}
}
ASSERT_UNUSED(found, found);
if (!iterator->value.size())
m_facesLookupTable.remove(iterator);
}
}

迭代器未检测 end(),虽然其中有一个断言 ASSERT(iterator != m_facesLookupTable.end());,但除此之外,在发布版本中没有做任何事情。因此,即使 iterator == m_facesLookupTable.end() 在发布版本中,也不会发生任何事情并且仍然会使用迭代器。

在 FontFaceSet 中,如果字体已被视为无效,则不会将 FontFace 添加到 addToFacesLookupTable 中的面查找表中。但是,removeFromFacesLookupTable 仍然会尝试删除字体,从而导致 use-after-free。

补丁分析

补丁将 ASSERT 更改为 if 子句。如果 iterator == m_facesLookupTable.end() 函数将返回,因为在表中找不到它希望删除的项目。


浏览 39
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报