[11] [WebCore] Defer Safe Browsing download decision until lookup completes
Medium으로 평가한 이유는, 이 diff가 PolicyAction::Download 결정을 safeBrowsingCheckOngoing()이 false가 될 때까지 지연시키기 때문입니다. 패치 이전에는 download 정책이 적용된 URL 중 Safe Browsing 조회가 완료되지 않은 경우, 경고가 완전히 생략되었습니다. 다만 영향 범위는 사용자가 이미 download를 선택한 URL에 한정됩니다.
decidePolicyForNavigationAction와 decidePolicyForResponseShared는 safeBrowsingCheckOngoing() 상태에서 Download를 더 이상 동기적으로 적용하지 않습니다. navigation별 completion-callback queue가 조회 완료 시점까지 결정을 보류합니다. 조회가 완료되면 callback이 safeBrowsingWarning()을 재확인하여 차단 또는 진행 여부를 결정합니다.
Source/WebKit/UIProcess/WebPageProxy.cpp
Download 경로에서의 Safe Browsing TOCTOU: 느린 remote 조회 결과가 도착하기 전에 download가 WKDownload로 넘겨져 경고가 우회되는 문제입니다.
Patch Details
API::Navigation에 새로운 completion-callback queue가 추가되었습니다. safeBrowsingCheckOngoing()이 해제되는 시점에 이 queue가 처리됩니다. subframe 차단은 provisional-load error를 발생시키고, main-frame 차단은 interstitial을 표시합니다. *PostTimeout regression test는 약 250ms의 listener timeout window를 검증하며, 이 구간에서 취약점이 안정적으로 재현 가능했습니다.
Background
WebKit의 Safe Browsing 조회는 remote 서비스를 대상으로 비동기적으로 실행됩니다. 일반 페이지 로드는 navigation 시작 이후에도 늦게 interstitial을 표시할 수 있습니다. 그러나 download는 WKDownload에 일단 넘겨지면, 이후 도착한 경고로는 취소할 수 없습니다.
Analysis
패치 이전에는 policy handler가 Download를 적용할 때 safeBrowsingWarning()을 동기적으로 평가했습니다. 조회가 미완료된 상태에서는 safeBrowsingWarning()이 null을 반환하므로 download가 진행됩니다. 느리거나 remote 조회라면 이 상황은 흔히 발생하며, TOCTOU window는 결과적으로 조회 지연 시간 전체를 아우르는 셈입니다.
수정 후에는 continuation이 navigation의 ongoing-check 상태에 연결되어 queue에 보관됩니다. 조회가 완료되는 시점에 queue의 결정이 실행되고, safeBrowsingWarning()을 재확인하여 늦게 도착한 판정을 반영합니다. subframe과 main-frame 경로는 queue를 공유하되, 차단 표시 방식은 서로 다릅니다.
download 경로에서의 Safe Browsing 적용이 약화되어 있었으며, 이번 수정으로 page-load 경로와 동등한 수준의 적용이 복원되었습니다.
Audit directions
- Other PolicyAction paths (
Ignore,Use,Open) —safeBrowsingCheckOngoing()을 확인하지 않고safeBrowsingWarning()을 동기적으로 평가하는 경로를 점검해야 합니다. - API::Navigation lifetime around the queued continuation. Queue에 보관된 callback의 reference가 weak/strong으로 적절히 관리되는지, 그리고 navigation 취소 시 queue가 정상적으로 비워지는지 확인해야 합니다.
WKDownloadretraction. 향후 retraction이 가능해진다면 queue를 더 좁힐 수 있습니다. 현재로서는 이 방식이 유일한 mitigation입니다.