[하루한줄] CVE-2021-21106: Double free/UAF Issue in Google Chrome
URL
Issue 1148749: Double free/UAF in RegionDataLoaderImpl::DeleteThis
Target
Google Chrome < 87.0.4280.141
Explain
Google Chrome 87.0.4280.141 이전 버전에서 발생하는 Use after free 취약점(CVE-2021-21106)입니다. 해커는 악성 HTML 페이지를 사용해 Chrome의 renderer process에 접근 및 취약점을 트리거할 수 있고 원격 코드 실행을 통한 sandbox escape를 할 수 있습니다.
46 void RegionDataLoaderImpl::OnRegionDataLoaded(bool success,
47 const std::string& country_code,
48 int unused_rule_count) {
49 timer_.Stop();
50 if (!callback_.is_null()) {
51 if (success) {
52 std::string best_region_tree_language_tag;
53 ::i18n::addressinput::RegionDataBuilder builder(®ion_data_supplier_);
54 callback_.Run(
55 builder
56 .Build(country_code, app_locale_, &best_region_tree_language_tag)
57 .sub_regions());
58 } else {
59 callback_.Run(std::vector<const ::i18n::addressinput::RegionData*>());
60 }
61 }
62 // The deletion must be asynchronous since the caller is not quite done with
63 // the preload supplier.
64 base::ThreadTaskRunnerHandle::Get()->PostTask(
65 FROM_HERE, base::BindOnce(&RegionDataLoaderImpl::DeleteThis,
66 base::Unretained(this)));
67 }
68
69 void RegionDataLoaderImpl::DeleteThis() {
70 delete this;
71 }
파일 components/autofill/core/browser/geo/region_data_loader_impl.cc
속 코드 일부입니다. RegionDataLoaderImpl
을 구성할 때 함수 OnRegionDataLoaded
가 호출되며 PostTask가 함수 DeleteThis
를 호출해(line #64) 포인터 this
를 해제합니다.
만약 한 번에 많은 RegionDataLoaderImpl
을 구성할 때 동일한 PostTask를 두 번 호출하게 되면 위 작업을 두 번 수행하게되고 포인터this
가 두 번 해제됩니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.