Chrome的报告了一个的漏洞,本文将简单对此进行分析。
issue-1793
整数溢出
issue
漏洞分析
在文件的函数中可以发现开发人员对进行了长度的检查,即。但由于只在中起作用,而在中并不起作用,则该检查对正式版本并没有什么作用。如果为负数,则会绕过的检查,而由于会使用来计算出,如果我们合理控制,则可以让计算出来为正数。
v8/src/heap/factory.cc
NewFixedDoubleArray
length
DCHECK_LE(0, length)
DCHECK
debug
release
length
if (length > FixedDoubleArray::kMaxLength)
int size = FixedDoubleArray::SizeFor(length)
length
size
length
size
// v8/src/heap/factory.ccHandle
Factory::NewFixedDoubleArray(int length,PretenureFlag pretenure) { DCHECK_LE(0, length); // ***here*** if (length == 0) return empty_fixed_array(); if (length > FixedDoubleArray::kMaxLength) { // ***here*** isolate()->heap()->FatalProcessOutOfMemory("invalid array length"); } int size = FixedDoubleArray::SizeFor(length); // ***here*** Map map = *fixed_double_array_map(); HeapObject result = AllocateRawWithImmortalMap(size, pretenure, map, kDoubleAligned); Handle
array(FixedDoubleArray::cast(result), isolate()); array->set_length(length); return array;}
那么我们该如何将负数传递给呢?我们可以使用。在文件中,其首先会获取最初的数组长度,并使用该长度来对和进行限制。但是在调用方法的时候可能会触发用户自定义的JS函数,该自定义函数可能会修改长度,这个行为通常来说可能会导致。
NewFixedDoubleArray
ArrayPrototypeFill
ArrayPrototypeFill
v8/src/builtins/builtins-array.cc
start
end
GetRelativeIndex
OOB
// v8/src/builtins/builtins-array.ccBUILTIN(ArrayPrototypeFill) {[...] // 2. Let len be ? ToLength(? Get(O, "length")). double length; MAYBE_ASSIGN_RETURN_FAILURE_ON_EXCEPTION( isolate, length, GetLengthProperty(isolate, receiver)); // **here** // 3. Let relativeStart be ? ToInteger(start). // 4. If relativeStart < 0, let k be max((len + relativeStart), 0); // else let k be min(relativeStart, len). Handle
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.