[하루한줄] CVE-2021-30517: Chrome V8 엔진의 Type Confusion 취약점

URL

Issue 1203122: Security: Type confusion bug in LoadSuperIC

Target

  • Chrome V8

Explain

Chrome V8엔진의 인라인 캐시(IC) 시스템에서 type confusion 취약점이 발견되었습니다.

취약점은 AccessorAssembler::LoadSuperICAccessorAssembler::HandleLoadICHandlerCase 에 존재합니다.

void AccessorAssembler::LoadSuperIC(const LoadICParameters* p) {
...
BIND(&non_inlined);
  {
    // LoadIC_Noninlined can be used here, since it handles the
    // lookup_start_object != receiver case gracefully.
    LoadIC_Noninlined(p, lookup_start_object_map, strong_feedback, &var_handler,
                      &if_handler, &miss, &direct_exit);
  }
...
}

LoadSuperIC 메소드에서 LoadIC_Noninlinedlookup_start_object != receiver 의 경우를 처리합니다.

void AccessorAssembler::HandleLoadICHandlerCase(
...
  BIND(&call_handler); <------- [6]
  {
    exit_point->ReturnCallStub(LoadWithVectorDescriptor{}, CAST(handler),
                               p->context(), p->receiver(), p->name(),
                               p->slot(), p->vector());
  }
}

그러나 HandleLoadICHandlerCase 메소드에서 lookup_start_object != receiver인지 확인하지 않고 p→lookup_start_object() 대신 p→receiver()를 전달해 핸들러를 호출하고 type confusion이 발생합니다. 따라서 해커가 Object를 StringWrapper로 type confusion해 객체의 요소 주소를 leak하거나 배열을 함수로 생각하게끔 객체를 속여 arbitrary read/write primitive를 얻을 수 있습니다.