[하루한줄] 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(&region_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가 두 번 해제됩니다.