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() 函数将返回,因为在表中找不到它希望删除的项目。
评论
