← All issues

[5] NetworkProcess null-deref on a BroadcastChannel message with a null name

Severity: Low | Component: WebKit NetworkProcess IPC surface | e85a1ea

diff가 수정하는 대상은 위조된 IPC 메시지로 유발되는 NetworkProcess의 null-StringImpl dereference입니다. fault 주소에 공격자가 제어하는 데이터는 포함되지 않으므로, 관찰되는 영향은 crash(가용성)에 한정됩니다. memory corruption으로 이어지는 경로는 존재하지 않으며, 이 취약점에 도달하려면 WebProcess가 이미 침해된 상태여야 합니다. 이러한 점들을 종합해 Low로 평가됩니다.

NetworkBroadcastChannelRegistry는 IPC로 전달받은 채널 이름을 HashMap<String, ...>의 key로 사용합니다. registerChannel()에서는 ensure()를 통해, unregisterChannel()postMessage()에서는 find()를 통해 각각 조회합니다. 침해되었거나 비정상적인 WebProcess는 name으로 null String을 전송할 수 있습니다. null String을 key로 조회하면 hashing 과정에서 null StringImpl이 역참조됩니다. StringHash::hash()key.impl()->hash()를 호출하는데, null String의 경우 impl()이 nullptr를 반환하기 때문입니다. 결과적으로 HashTable::validateKey()가 실행되기 전에 network process가 crash합니다. 이번 fix는 세 endpoint 모두에 MESSAGE_CHECK를 추가하여 null name을 거부하며, 기존의 origin 검증과 동일한 방식으로 처리합니다.

Source/WebKit/NetworkProcess/NetworkBroadcastChannelRegistry.cpp

void NetworkBroadcastChannelRegistry::registerChannel(IPC::Connection& connection, const WebCore::ClientOrigin& origin, const String& name)
{
MESSAGE_CHECK(isValidClientOrigin(origin), connection);
+ MESSAGE_CHECK(!name.isNull(), connection);
 
auto& channelsForOrigin = m_broadcastChannels.ensure(origin, [] { return NameToConnectionIdentifiersMap { }; }).iterator->value;
auto& connectionIdentifiersForName = channelsForOrigin.ensure(name, [] { return Vector<IPC::Connection::UniqueID> { }; }).iterator->value;
...
void NetworkBroadcastChannelRegistry::unregisterChannel(...) {
MESSAGE_CHECK(isValidClientOrigin(origin), connection);
+ MESSAGE_CHECK(!name.isNull(), connection);
...
void NetworkBroadcastChannelRegistry::postMessage(...) {
MESSAGE_CHECK_COMPLETION(isValidClientOrigin(origin), connection, completionHandler());
+ MESSAGE_CHECK_COMPLETION(!name.isNull(), connection, completionHandler());

LayoutTests/ipc/coreipc.js

case 'String':
+ if (argument === null)
+ return {value: null, type: 'String'};

registerChannel()unregisterChannel()에는 MESSAGE_CHECK(!name.isNull(), connection)이 추가되었습니다. postMessage()에는 MESSAGE_CHECK_COMPLETION(!name.isNull(), connection, completionHandler())가 추가되었습니다. 두 경우 모두 기존의 isValidClientOrigin(origin) 검증 직후, String name이 HashMap key로 사용되기 전에 위치합니다. 나머지 diff는 부수적인 변경입니다. IPC testing API를 통해 버그를 재현하는 새 layout test와, null String 인자를 직렬화할 수 있도록 coreipc.jsArgumentSerializer에 추가된 한 줄 변경이 포함됩니다.

Hash-map key로 사용되기 전, 공격자 제어 IPC 입력에 대한 null 검증 누락 — hashing 과정에서 backing StringImpl 역참조 발생.

BroadcastChannel은 동일 origin의 browsing context 간에 메시지를 주고받을 수 있는 Web API입니다. NetworkProcess는 WebProcess 간 메시지 라우팅을 위해 중앙 registry를 관리합니다. MESSAGE_CHECK는 WebKit IPC 매크로로, 수신 메시지에 대한 조건을 검증합니다. 검증 실패 시 처리를 계속하지 않고 해당 connection을 종료합니다. WTF String은 refcount 기반의 StringImpl을 감싸는 wrapper입니다. null String의 경우 impl()은 null을 반환하며, StringHash::hash()key.impl()->hash()를 호출하여 key의 hash를 계산합니다. HashMap의 삽입 및 조회 시에는 먼저 key를 hashing한 뒤 HashTable::validateKey()를 실행합니다. IPCTestingAPI는 테스트 전용 기능으로, layout test에서 대상 process로 raw IPC 메시지를 직접 합성할 수 있습니다. 여기서는 침해된 WebProcess가 전송할 수 있는 메시지를 재현하는 데 활용되었습니다.

검증되지 않은 IPC 입력으로 인한 null pointer dereference입니다. fix 이전에는 NetworkBroadcastChannelRegistry가 IPC로 전달된 채널 name을 null 여부 확인 없이 그대로 HashMap<String, ...> key로 사용했습니다. 각 endpoint는 isValidClientOrigin을 통해 ClientOrigin을 검증했지만, name에 대해서는 동일한 검증을 수행하지 않았습니다.

null String이 key로 사용되면, hash table은 HashTable::validateKey()에 도달하기 전에 key의 hash를 먼저 계산합니다. 이 과정에서 StringHash::hash()key.impl()->hash()를 호출합니다. null String의 경우 impl()은 nullptr를 반환하므로, null StringImpl이 역참조됩니다.

🔒

Where exactly does the null-name crash occur, and why does the hash table's own validation never get a chance to catch it? The cross-process impact is assessed in depth.

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

Audit directions Analysis

🔒

Several reusable audit directions for IPC-keyed map handlers across the NetworkProcess, with concrete grep targets for finding sibling-field validation gaps.

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

🔒

Where exactly does the null-name crash occur, and why does the hash table's own validation never get a chance to catch it? The cross-process impact is assessed in depth.

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

🔒

Several reusable audit directions for IPC-keyed map handlers across the NetworkProcess, with concrete grep targets for finding sibling-field validation gaps.

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