這期內容當中小編將會給大家帶來有關Chrome FreeType字體庫堆溢出漏洞CVE-2020-15999的原理分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Google發布公告,舊版本的 chrome 瀏覽器的 FreeType字體庫中存在堆溢出,被利用可能導致 RCE(遠程代碼執行)。
安全專家建議用戶盡快升級到86.0.4240.111 之后的版本,以解決風險。
一、TTF 嵌入圖片
TTF 字體支持嵌入 PNG 格式的圖片作為字形數據,在嵌入時圖片數據會被保存在字體文件的 SBIX 表格中,在處理時會通過提取 SBIX 表中的 PNG 中存取的信息來實現字體渲染。SBIX 表中的格式如下圖:
SBIX 中的 strikeOffset 存儲了 Strikes 的數據信息的偏移,Strikes 中的 glyphDataOffset 存儲了具體的字形信息的偏移,Strikes 格式和字形信息的格式如下圖:
字形信息中的 data 存儲了被嵌入的圖片信息。下面是樣本中的 SBIX 和存儲的圖片信息。
PNG 圖片信息被保存在了 hex(0x1a30 + 0x5aaec + 0x8) = 0x5c524 處。通過 IHDR 可以看到圖片的一些基本信息,具體信息如下圖:
二、Load_SBit_Png 函數實現
FreeType 庫中 PNG 圖片信息的提取是通過 Load_SBit_Png 函數實現的。Load_SBit_Png 函數的處理流程如下:
1. 將字形信息中 data 指向的內存解析為 PNG
2. 提取被解析后圖片的 IHDR 存儲的信息(圖像寬度和高度,深度及顏色類型等)
3. 將解析后的信息提取到字形信息中
4. 按照之前解析到信息開辟內存用于保存圖片信息
三、漏洞原理
漏洞發生在將解析到的圖片信息提取到字形信息過程中,PNG 圖片中的 IHDR 存儲的寬度和高度的數據類型為 uint32,在存儲到字形信息時,會被轉換為 unsigned short 類型,此時如果圖片的寬度和高度信息大于 0x7FFF 則會發生截斷。
之后字形信息中存儲的相應數據會被傳遞到用于存儲 PNG 圖片的字形信息的 bitmap 里,bitmap 中的 rows 對應圖片的高度,width 對應圖片的寬度,pitch 對應 bitmap 每行占據的字節數,即 寬度 * 4。之后會調用 ft_glyphslot_alloc_bitmap 函數完成 bitmap 中用于存儲圖片信息的內存的分配。如下圖,分配的內存大小是 map->rows * (FT_ULong)map->pitch,即高度 * 每行占據的字節數。之后調用 png_read_image 讀取圖片信息到 bitmap->buffer。如果 PNG 圖片的高度被截斷,則會導致分配的內存不足,在讀取圖片信息時發生堆溢出。
溢出后 bitmap 信息如下圖,buffer 的長度即為 0xa3 * 0xc ,查看 buffer 之后的數據可以看到已經被覆蓋。
一、在87.0.4247.0(開發者內部版本)驗證
二、86.0.4240.111 版本修復分析
比較 imgWidth 和 imgHeight 是否大于 0x7FFF, 大于則退出。
上述就是小編為大家分享的Chrome FreeType字體庫堆溢出漏洞CVE-2020-15999的原理分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。