Jailbreak #003:Safari 0-day 漏洞,请尽快升级系统
最近,谷歌零计划披露了 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()
函数将返回,因为在表中找不到它希望删除的项目。
评论