这是A guided tour through Chrome’s javascript compiler上的第二个漏洞,下面是对应的commit
环境搭建
用v8-action
env:
PATCH_FLAG: true
COMMIT: d2da19c78005c75e0f658be23c28b473dd76b93b #这里
DEPOT_UPLOAD: false
SRC_UPLOAD: true
BINARY_UPLOAD: false
编译
cd v8
tools/dev/v8gen.py x64.debug
ninja -C out.gn/x64.debug d8
tools/dev/v8gen.py x64.release
ninja -C out.gn/x64.release d8
cd ..
漏洞分析
diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc
index e04b1fb..251a946 100644
--- a/src/compiler/typer.cc
+++ b/src/compiler/typer.cc
@@ -1453,7 +1453,7 @@
return Type::String();
case kStringIndexOf:
case kStringLastIndexOf:
- return Type::Range(-1.0, String::kMaxLength - 1.0, t->zone());
+ return Type::Range(-1.0, String::kMaxLength, t->zone());
case kStringEndsWith:
case kStringIncludes:
return Type::Boolean();
可以看到原本的String
的最大下标是Range(-1.0, kMaxLength - 1.0)
,因为很显然,当只有一个元素时,最大下标就是1-1->0