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