Title: [254892] trunk/Source/WebKit
Revision
254892
Author
[email protected]
Date
2020-01-21 16:08:40 -0800 (Tue, 21 Jan 2020)

Log Message

[IPC Hardening] Only process Messages::NetworkProcess messages when sent by the UIProcess
https://bugs.webkit.org/show_bug.cgi?id=206558
<rdar://problem/58733679>

Reviewed by Alex Christensen.

Port UpdateQuotaBasedOnSpaceUsageForTesting IPC from the NetworkProcess to the NetworkConnectionToWebProcess
since it is sent by the WebContent process. As a result, we can now stop forwarding all Messages::NetworkProcess
IPC messages from the WebContent process to the NetworkProcess class.

* NetworkProcess/NetworkConnectionToWebProcess.cpp:
(WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
(WebKit::NetworkConnectionToWebProcess::didReceiveSyncMessage):
(WebKit::NetworkConnectionToWebProcess::updateQuotaBasedOnSpaceUsageForTesting):
* NetworkProcess/NetworkConnectionToWebProcess.h:
* NetworkProcess/NetworkConnectionToWebProcess.messages.in:
* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::didReceiveMessage):
(WebKit::NetworkProcess::didReceiveSyncMessage):
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in:
* Platform/IPC/StringReference.h:
(IPC::StringReference::operator!=):
* WebProcess/Cache/WebCacheStorageConnection.cpp:
(WebKit::WebCacheStorageConnection::updateQuotaBasedOnSpaceUsage):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (254891 => 254892)


--- trunk/Source/WebKit/ChangeLog	2020-01-21 23:53:27 UTC (rev 254891)
+++ trunk/Source/WebKit/ChangeLog	2020-01-22 00:08:40 UTC (rev 254892)
@@ -1,3 +1,31 @@
+2020-01-21  Chris Dumez  <[email protected]>
+
+        [IPC Hardening] Only process Messages::NetworkProcess messages when sent by the UIProcess
+        https://bugs.webkit.org/show_bug.cgi?id=206558
+        <rdar://problem/58733679>
+
+        Reviewed by Alex Christensen.
+
+        Port UpdateQuotaBasedOnSpaceUsageForTesting IPC from the NetworkProcess to the NetworkConnectionToWebProcess
+        since it is sent by the WebContent process. As a result, we can now stop forwarding all Messages::NetworkProcess
+        IPC messages from the WebContent process to the NetworkProcess class.
+
+        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+        (WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
+        (WebKit::NetworkConnectionToWebProcess::didReceiveSyncMessage):
+        (WebKit::NetworkConnectionToWebProcess::updateQuotaBasedOnSpaceUsageForTesting):
+        * NetworkProcess/NetworkConnectionToWebProcess.h:
+        * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::didReceiveMessage):
+        (WebKit::NetworkProcess::didReceiveSyncMessage):
+        * NetworkProcess/NetworkProcess.h:
+        * NetworkProcess/NetworkProcess.messages.in:
+        * Platform/IPC/StringReference.h:
+        (IPC::StringReference::operator!=):
+        * WebProcess/Cache/WebCacheStorageConnection.cpp:
+        (WebKit::WebCacheStorageConnection::updateQuotaBasedOnSpaceUsage):
+
 2020-01-21  Daniel Bates  <[email protected]>
 
         Add Legacy WebKit SPI and WebKit IPI to show and hide placeholder

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (254891 => 254892)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2020-01-21 23:53:27 UTC (rev 254891)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp	2020-01-22 00:08:40 UTC (rev 254892)
@@ -157,6 +157,9 @@
 
 void NetworkConnectionToWebProcess::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)
 {
+    // For security reasons, Messages::NetworkProcess IPC is only supposed to come from the UIProcess.
+    ASSERT(decoder.messageReceiverName() != Messages::NetworkProcess::messageReceiverName());
+
     if (decoder.messageReceiverName() == Messages::NetworkConnectionToWebProcess::messageReceiverName()) {
         didReceiveNetworkConnectionToWebProcessMessage(connection, decoder);
         return;
@@ -185,12 +188,6 @@
         return;
     }
 
-    if (decoder.messageReceiverName() == Messages::NetworkProcess::messageReceiverName()) {
-        m_networkProcess->didReceiveNetworkProcessMessage(connection, decoder);
-        return;
-    }
-
-
 #if USE(LIBWEBRTC)
     if (decoder.messageReceiverName() == Messages::NetworkRTCSocket::messageReceiverName()) {
         rtcProvider().didReceiveNetworkRTCSocketMessage(connection, decoder);
@@ -241,8 +238,7 @@
         return paymentCoordinator().didReceiveMessage(connection, decoder);
 #endif
 
-    LOG_ERROR("Unhandled network process message '%s:%s'", decoder.messageReceiverName().toString().data(), decoder.messageName().toString().data());
-
+    WTFLogAlways("Unhandled network process message '%s:%s'", decoder.messageReceiverName().toString().data(), decoder.messageName().toString().data());
     ASSERT_NOT_REACHED();
 }
 
@@ -264,6 +260,9 @@
 
 void NetworkConnectionToWebProcess::didReceiveSyncMessage(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& reply)
 {
+    // For security reasons, Messages::NetworkProcess IPC is only supposed to come from the UIProcess.
+    ASSERT(decoder.messageReceiverName() != Messages::NetworkProcess::messageReceiverName());
+
     if (decoder.messageReceiverName() == Messages::NetworkConnectionToWebProcess::messageReceiverName()) {
         didReceiveSyncNetworkConnectionToWebProcessMessage(connection, decoder, reply);
         return;
@@ -282,9 +281,16 @@
         return paymentCoordinator().didReceiveSyncMessage(connection, decoder, reply);
 #endif
 
+    WTFLogAlways("Unhandled network process message '%s:%s'", decoder.messageReceiverName().toString().data(), decoder.messageName().toString().data());
     ASSERT_NOT_REACHED();
 }
 
+void NetworkConnectionToWebProcess::updateQuotaBasedOnSpaceUsageForTesting(const ClientOrigin& origin)
+{
+    auto storageQuotaManager = m_networkProcess->storageQuotaManager(sessionID(), origin);
+    storageQuotaManager->resetQuotaUpdatedBasedOnUsageForTesting();
+}
+
 void NetworkConnectionToWebProcess::didClose(IPC::Connection& connection)
 {
 #if ENABLE(SERVICE_WORKER)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (254891 => 254892)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2020-01-21 23:53:27 UTC (rev 254891)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h	2020-01-22 00:08:40 UTC (rev 254892)
@@ -219,6 +219,7 @@
     void createSocketStream(URL&&, String cachePartition, uint64_t);
 
     void createSocketChannel(const WebCore::ResourceRequest&, const String& protocol, uint64_t identifier);
+    void updateQuotaBasedOnSpaceUsageForTesting(const WebCore::ClientOrigin&);
 
 #if ENABLE(SERVICE_WORKER)
     void establishSWServerConnection();

Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (254891 => 254892)


--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2020-01-21 23:53:27 UTC (rev 254891)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in	2020-01-22 00:08:40 UTC (rev 254892)
@@ -79,6 +79,7 @@
     CloseSWContextConnection()
 #endif
 
+    UpdateQuotaBasedOnSpaceUsageForTesting(struct WebCore::ClientOrigin origin)
     CreateNewMessagePortChannel(struct WebCore::MessagePortIdentifier port1, struct WebCore::MessagePortIdentifier port2)
     EntangleLocalPortInThisProcessToRemote(struct WebCore::MessagePortIdentifier local, struct WebCore::MessagePortIdentifier remote)
     MessagePortDisentangled(struct WebCore::MessagePortIdentifier local)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (254891 => 254892)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-01-21 23:53:27 UTC (rev 254891)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-01-22 00:08:40 UTC (rev 254892)
@@ -214,6 +214,13 @@
 
 void NetworkProcess::didReceiveMessage(IPC::Connection& connection, IPC::Decoder& decoder)
 {
+    ASSERT(parentProcessConnection() == &connection);
+    if (parentProcessConnection() != &connection) {
+        WTFLogAlways("Ignored message '%s:%s' because it did not come from the UIProcess (destination: %" PRIu64 ")", decoder.messageReceiverName().toString().data(), decoder.messageName().toString().data(), decoder.destinationID());
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
     if (messageReceiverMap().dispatchMessage(connection, decoder))
         return;
 
@@ -234,6 +241,13 @@
 
 void NetworkProcess::didReceiveSyncMessage(IPC::Connection& connection, IPC::Decoder& decoder, std::unique_ptr<IPC::Encoder>& replyEncoder)
 {
+    ASSERT(parentProcessConnection() == &connection);
+    if (parentProcessConnection() != &connection) {
+        WTFLogAlways("Ignored message '%s:%s' because it did not come from the UIProcess (destination: %" PRIu64 ")", decoder.messageReceiverName().toString().data(), decoder.messageName().toString().data(), decoder.destinationID());
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
     if (messageReceiverMap().dispatchSyncMessage(connection, decoder, replyEncoder))
         return;
 
@@ -2325,12 +2339,6 @@
         m_storageManagerSet->deleteLocalStorageModifiedSince(PAL::SessionID::legacyPrivateSessionID(), -WallTime::infinity(), []() { });
 }
 
-void NetworkProcess::updateQuotaBasedOnSpaceUsageForTesting(PAL::SessionID sessionID, const ClientOrigin& origin)
-{
-    auto storageQuotaManager = this->storageQuotaManager(sessionID, origin);
-    storageQuotaManager->resetQuotaUpdatedBasedOnUsageForTesting();
-}
-
 void NetworkProcess::resetQuota(PAL::SessionID sessionID, CompletionHandler<void()>&& completionHandler)
 {
     LockHolder locker(m_sessionStorageQuotaManagersLock);

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (254891 => 254892)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-01-21 23:53:27 UTC (rev 254891)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-01-22 00:08:40 UTC (rev 254892)
@@ -285,7 +285,6 @@
     void syncLocalStorage(CompletionHandler<void()>&&);
     void clearLegacyPrivateBrowsingLocalStorage();
 
-    void updateQuotaBasedOnSpaceUsageForTesting(PAL::SessionID, const WebCore::ClientOrigin&);
     void resetQuota(PAL::SessionID, CompletionHandler<void()>&&);
 
 #if ENABLE(SANDBOX_EXTENSIONS)
@@ -292,8 +291,6 @@
     void getSandboxExtensionsForBlobFiles(const Vector<String>& filenames, CompletionHandler<void(SandboxExtension::HandleArray&&)>&&);
 #endif
 
-    void didReceiveNetworkProcessMessage(IPC::Connection&, IPC::Decoder&);
-
 #if ENABLE(SERVICE_WORKER)
     WebCore::SWServer* swServerForSessionIfExists(PAL::SessionID sessionID) { return m_swServers.get(sessionID); }
     WebCore::SWServer& swServerForSession(PAL::SessionID);
@@ -348,6 +345,8 @@
     void platformInitializeNetworkProcess(const NetworkProcessCreationParameters&);
     std::unique_ptr<WebCore::NetworkStorageSession> platformCreateDefaultStorageSession() const;
 
+    void didReceiveNetworkProcessMessage(IPC::Connection&, IPC::Decoder&);
+
     void terminate() override;
     void platformTerminate();
 

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in (254891 => 254892)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2020-01-21 23:53:27 UTC (rev 254891)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2020-01-22 00:08:40 UTC (rev 254892)
@@ -154,8 +154,6 @@
     SyncLocalStorage() -> () Synchronous
     ClearLegacyPrivateBrowsingLocalStorage()
 
-    UpdateQuotaBasedOnSpaceUsageForTesting(PAL::SessionID sessionID, struct WebCore::ClientOrigin origin)
-
     StoreAdClickAttribution(PAL::SessionID sessionID, WebCore::AdClickAttribution adClickAttribution)
     DumpAdClickAttribution(PAL::SessionID sessionID) -> (String adClickAttributionState) Async
     ClearAdClickAttribution(PAL::SessionID sessionID) -> () Async

Modified: trunk/Source/WebKit/Platform/IPC/StringReference.h (254891 => 254892)


--- trunk/Source/WebKit/Platform/IPC/StringReference.h	2020-01-21 23:53:27 UTC (rev 254891)
+++ trunk/Source/WebKit/Platform/IPC/StringReference.h	2020-01-22 00:08:40 UTC (rev 254892)
@@ -68,6 +68,11 @@
         return a.m_size == b.m_size && !memcmp(a.m_data, b.m_data, a.m_size);
     }
 
+    friend bool operator!=(const StringReference& a, const StringReference& b)
+    {
+        return !(a == b);
+    }
+
     void encode(Encoder&) const;
     static bool decode(Decoder&, StringReference&);
 

Modified: trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.cpp (254891 => 254892)


--- trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.cpp	2020-01-21 23:53:27 UTC (rev 254891)
+++ trunk/Source/WebKit/WebProcess/Cache/WebCacheStorageConnection.cpp	2020-01-22 00:08:40 UTC (rev 254892)
@@ -107,7 +107,7 @@
 
 void WebCacheStorageConnection::updateQuotaBasedOnSpaceUsage(const WebCore::ClientOrigin& origin)
 {
-    connection().send(Messages::NetworkProcess::UpdateQuotaBasedOnSpaceUsageForTesting(WebProcess::singleton().sessionID(), origin), 0);
+    connection().send(Messages::NetworkConnectionToWebProcess::UpdateQuotaBasedOnSpaceUsageForTesting(origin), 0);
 }
 
 }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to