[10] Use WeakHashSet::forEach to iterate over set where the iterator might be invalidated
Severity: Medium | Component: WebCore PageGroup | 42beed9
Caption-preference fan-out 과정에서 script-driven re-entrancy를 통해 도달 가능한 iterator invalidation이 관측되며, 분석가의 신뢰도는 0.85입니다. Renderer crash를 넘어선 escalation은 해제된 슬롯의 회수 타이밍에 달려 있어, 공격 체인에서 하나의 stepping-stone primitive로 활용될 가능성이 있습니다.
Source/WebCore/page/PageGroup.cpp
void PageGroup::captionPreferencesChanged()
{
- for (Ref page : m_pages)
- page->captionPreferencesChanged();
+ m_pages.forEach([](auto& page) {
+ page.captionPreferencesChanged();
+ });
BackForwardCache::singleton().markPagesForCaptionPreferencesChanged();
}
Patch Details
PageGroup::captionPreferencesChanged()는 WeakHashSet<Page> 멤버를 순회할 때 사용하던 range-based for (Ref page : m_pages) 방식을 m_pages.forEach([](auto& page) { ... }) 방식으로 변경되었습니다. Lambda는 각 Page에 대해 page.captionPreferencesChanged()를 호출합니다. 아울러 SaferCPPExpectations 파일도 함께 수정되었으며, 이 위치를 known-bad-pattern allowlist에서 제거한 것으로 보입니다.
동일 컬렉션을 변경할 수 있는 script-observable 코드로 re-enter하는 weak collection 순회에서의 iterator invalidation.
Background
WeakHashSet<T>는 T에 대한 weak reference를 보관합니다. 참조 대상이 소멸된 항목은 빈 슬롯이 되고, 이후 일괄 정리됩니다. Range-based for로 순회하면 살아있는 항목마다 Ref가 생성되지만, iterator는 내부 hash table을 직접 걸어갑니다. WeakHashSet::forEach는 순회 전 살아있는 항목을 먼저 강하게 참조(strongify)하는 helper 함수입니다. 덕분에 callback 실행 중 weak 슬롯이 추가·제거·정리되더라도 순회 상태가 훼손되지 않습니다.
PageGroup::captionPreferencesChanged는 사용자의 caption 설정이 변경되었음을 각 Page에 알리는 함수입니다. 이 알림은 HTMLMediaElement/TextTrackList listener까지 전파될 수 있으며, 동기적인 JS-observable 동작을 유발할 가능성이 있습니다.
Analysis
각 항목에 대한 callback은 동기적으로 script로 re-enter할 수 있습니다. Caption/track lifecycle, media element 알림, 동기적 event dispatch 등이 그 경로에 해당합니다. 이 re-entry 과정에서 m_pages가 변경될 수 있습니다.
변경이 발생하는 경우는 두 가지입니다. 첫째, Page가 소멸되어 weak 항목이 붕괴되는 경우입니다. 둘째, callback 중 발생한 allocation이 rehash를 유발해 WeakHashSet이 dead 항목을 일괄 제거하는 경우입니다. 어느 쪽이든 range-based-for의 iterator가 무효화됩니다.
Aaaaaa Aaaa Aaaaaaa a Aaa Aa a Aaaa Aaaa Aaaa Aaaa Aaaaa Aa Aaaaaaaaa Aaaa Aaaaaaaaa Aa Aaaaaaaa Aaa Aaaaaa Aaaa Aaa Aaaaa Aaaaaaaaaaaaaaaaaaa Aaaaaaaa Aaaa Aaa Aaaaaa Aaa Aaa Aaa a Aa Aaaa Aaaaa Aaaaaaaa Aa Aaa Aaa Aaaa a Aaaaa Aa Aaa Aaa Aaa Aaa Aaaaaa Aa Aaaaaa
a Aaaa Aaaaaaaaaa Aaaaaaa Aaa Aaaaaa Aaaaaaa Aaaaaaa Aaaa Aaaaaaaaaaa Aaaaaaaaaaaaaaaa Aaaaa Aaaaaaa Aaaaaaaaa a Aa Aaaaaaaaaaa Aaaaaaaaa Aaaa Aaaa Aaa Aaaaaaaaaaaaaaaaaaaaaaa Aaaa Aa Aaa Aaaaaa Aaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaa Aaaa Aa Aaaaaaaaaaa Aa Aa Aaa a Aa Aaaa Aaaaa
🔒The re-entrancy and lifetime implications of weak-collection iteration during script-observable callbacks are explored, along with the practical reach of the resulting primitive.
더 확인하려면 구독해 주세요
Audit directions
a Aaaaaaaaaaaaaaa Aaa Aaaa Aaaa Aaa Aaaaaaaaa a Aa Aaaaaaaaa Aa Aaa Aaaa Aaaaaaaaaaa Aaaaaaaaaaaaaaaa Aaaa Aaaaa Aaaa Aaaa a a Aaaa Aaaaaa a Aaa Aaaaa Aaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaa Aaaaaa a Aaaa Aaa Aaaaaaaaa Aaaaa Aa Aaaaaaaaaa Aaaaaaaaaaaaa Aaaa Aaaa
a Aaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaa Aaaaaaaaa Aaa Aaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaa Aaa a Aaa Aaa Aaaaaaaaa Aaaa Aaaa Aaaa
a Aaaaaaaaaaaa Aaaaaaaa Aaaaaaa Aaaaa Aaaaaaaaaaaaaaaaaaaa Aaaa Aa Aaaaaaaaaaaaaa Aaa a Aaa Aa Aaaaa Aaaaaaaa Aaaaaaaaa Aaaaaaaaaaaaaaaaaaa Aaaaa Aaaaaaaaa Aa Aaa Aaaaa Aaaaaaaaa Aaaaa Aaaa Aaaa
a Aaaaaaaaaaaaaaaaaaaaaa Aaa Aaaaaaaa Aa a Aaaaaaaaaaa Aaaaaaaaaaaaaaaaaa Aaa Aaaa Aaaa Aaaa Aaaa Aaaa Aa Aaa Aaa a Aaaa Aaaa Aaaaa Aaa Aaaaaa
🔒Multiple reusable audit patterns identified for iterator-invalidation bugs across WebCore, including a concrete worklist source for variant discovery.
더 확인하려면 구독해 주세요