前陣子看到跟 Maglev Function Inline 有關的漏洞 CVE-2025-8011,所以順便追一下 Maglev 是怎麼處理 Function Inline 的
Maglev Function Inline
MaglevGraphBuilder::TryBuildInlineCall()
[1] -> 要有 feedback vector
[2] -> 看可不可以 Inline
[3] -> 根據 SharedFunctionInfo / CallArgument 決定要不要用 Eager Inline
[4] -> 看起來跟 user 自訂的選項有關
[5] -> 如果 Maglev 判斷這個 Function 不值得馬上 Inline,會把它放進 inlineable_call_ 裡面
後續會由 MaglevInliner 判斷要不要做 Inline
可能是這些較小、值得被展開的 Function 有助於建立 Maglev IR Graph 時的優化
1 | MaybeReduceResult MaglevGraphBuilder::TryBuildInlineCall( |
ShouldEagerInlineCall()
- 看 bytecode 長度夠不夠短 (len < 27)
- 如果有開 –turbolev 的話看 len < 75 和一些 flag,接著檢查參數的 type,如果有的話就 return true
1 | bool MaglevGraphBuilder::ShouldEagerInlineCall( |
CVE-2025-8011 Infomation
(CVE-2025-8011)[430572435][maglev]Type Confusion
https://chromium-review.googlesource.com/c/v8/v8/+/6732846
https://chromereleases.googleblog.com/2025/07/stable-channel-update-for-desktop_22.html
Reported by Shaheen Fazim(@shaheenfazim)
Issue 目前不公開,但有 Patch 可以看
Patch
1 | From f22ca7b61a92d3cd2b856485a55a1519cb11b627 Mon Sep 17 00:00:00 2001 |
看到這裡我想到 CVE-2024-2887,它是一個 WasmType ID 超出最大值導致使用了 general Type 來表示 Wasm Struct 的 Type Confusion 漏洞
但 Maglev Inline ID 沒找到類似的情境
所以猜測可能是 integer overflow 導致這裡拿到了錯的 SharedFunctionInfo
等 Issue 或 PoC 公開後會拿 gdb 追一遍,順便研究怎麼打
1 | std::vector<SourcePositionInfo> SourcePosition::InliningStack( |