Jailbreak #003:Safari 0-day 漏洞,請盡快升級系統(tǒng)
最近,谷歌零計(jì)劃披露了 iOS 系統(tǒng)中 Safari 的一個(gè) 0-day 漏洞,該漏洞由某位匿名人士發(fā)現(xiàn),編號 CVE-2021-30858,允許 Web 執(zhí)行任意代碼,存在被利用的風(fēng)險(xiǎn),可開發(fā)基于 web 的越獄,所以受影響的用戶請盡快升級系統(tǒng)。以下是詳細(xì)說明
基本信息
披露時(shí)間:2021 年 9 月 13 日
披露者:匿名
目標(biāo)產(chǎn)品:Apple WebKit
受影響版本:Safari 14.1.2、iOS 14.8
蘋果官方信息:https://support.apple.com/en-us/HT212808
驗(yàn)證代碼
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(),雖然其中有一個(gè)斷言?ASSERT(iterator != m_facesLookupTable.end());,但除此之外,在發(fā)布版本中沒有做任何事情。因此,即使?iterator == m_facesLookupTable.end()?在發(fā)布版本中,也不會(huì)發(fā)生任何事情并且仍然會(huì)使用迭代器。
在 FontFaceSet 中,如果字體已被視為無效,則不會(huì)將 FontFace 添加到 addToFacesLookupTable 中的面查找表中。但是,removeFromFacesLookupTable 仍然會(huì)嘗試刪除字體,從而導(dǎo)致 use-after-free。
補(bǔ)丁分析
補(bǔ)丁將 ASSERT 更改為 if 子句。如果?iterator == m_facesLookupTable.end()?函數(shù)將返回,因?yàn)樵诒碇姓也坏剿M麆h除的項(xiàng)目。
