← All issues

IndexedDB Connection Recovery After Network Process Crash

3c147a6

Source/WebCore/Modules/indexeddb/IDBFactory.cpp

+void IDBFactory::ensureConnectionProxy()
+{
+ auto* context = scriptExecutionContext();
+ if (!context)
+ return;
+ auto* contextProxy = context->idbConnectionProxy();
+ if (m_connectionProxy.get() != contextProxy)
+ m_connectionProxy = contextProxy;
+}

Source/WebKit/WebProcess/WebProcess.cpp

void WebProcess::networkProcessConnectionClosed(NetworkProcessConnection* connection)
{
...
- if (auto* idbConnection = m_idbConnection.get())
- idbConnection->connectionToServerLost();
+ page->clearIDBConnectionOnAllDocuments();
+ m_needsIDBConnectionRefreshForWorkers = true;
}

WebKit의 IndexedDB는 WebContent process와 Network process에 걸쳐 동작합니다. WebContent process는 IDBConnectionProxy를 보유하는데, 이는 Network process의 IDB 구현에 접근하기 위한 handle입니다. 이 handle은 Page, Document, WorkerGlobalScope, IDBFactory 등 여러 계층에 캐시됩니다. Network process가 crash하면 이 캐시된 proxy들은 dangling handle 상태가 됩니다. 기존에는 이를 해소하려면 페이지를 새로고침해야 했습니다.

이 commit은 "clear and lazily recreate" 신호를 전체 object graph에 걸쳐 전달합니다. Network process crash 시 각 Document의 캐시된 proxy가 null로 초기화됩니다. 이후 indexedDB.open()이 호출되면 IDBFactory::ensureConnectionProxy()가 stale proxy를 감지합니다. 감지 방식은 m_connectionProxy의 raw pointer와 Document의 현재 proxy를 비교하는 것으로, 불일치 시 새 proxy로 교체합니다. Worker proxy 갱신은 불필요한 process 생성을 방지하기 위해, 다른 이유로 Network process가 재시작될 때까지 지연됩니다.

NetworkProcess crash
        │
        ├──► Page::clearIDBConnectionOnAllDocuments()
        │         └──► Document::clearIDBConnectionProxy()   ← nulls m_idbConnectionProxy
        └──► WebProcess::m_needsIDBConnectionRefreshForWorkers = true

Next indexedDB.open() (document)
        └──► IDBFactory::ensureConnectionProxy()  ← lazily recreates from new Page connection

Network process relaunches (any reason)
        └──► drains m_needsIDBConnectionRefreshForWorkers
                  └──► WorkerGlobalScope::replaceIDBConnectionProxyOnAllWorkers()

Network process crash 이후 IndexedDB 사용을 위해 페이지를 새로고침해야 했던 요구사항이 제거되었습니다. 이로써 web app의 복원력이 향상됩니다. 이 변경은 Page, Document, Worker, IDBFactory 등 모든 캐싱 계층에서 proxy lifecycle을 다루고 있으며, 각 계층에서 올바른 순서와 lifetime 관리가 요구됩니다.

🔒

이 취약점 패턴의 변종을 찾기 위한 구체적인 탐색 방향이 포함되어 있습니다

더 확인하려면 구독해 주세요