[하루한줄] 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::LoadSuperIC
와 AccessorAssembler::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_Noninlined
는 lookup_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를 얻을 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.