Title: [258495] trunk
Revision
258495
Author
pvol...@apple.com
Date
2020-03-16 08:19:53 -0700 (Mon, 16 Mar 2020)

Log Message

[Cocoa] Limit set of classes that can be decoded when a preference has changed
https://bugs.webkit.org/show_bug.cgi?id=208012

Reviewed by Brent Fulgham.

Source/WebKit:

As a hardening measure, limit the set of ObjectiveC classes that can be decoded in the WebContent process
as a result of a preference change.

API tests: WebKit.PreferenceChangesDictionary
           WebKit.PreferenceChangesData
           WebKit.PreferenceChangesDate

* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::notifyPreferencesChanged):

Tools:

* TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm:
(TEST):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (258494 => 258495)


--- trunk/Source/WebKit/ChangeLog	2020-03-16 13:15:52 UTC (rev 258494)
+++ trunk/Source/WebKit/ChangeLog	2020-03-16 15:19:53 UTC (rev 258495)
@@ -1,3 +1,20 @@
+2020-03-16  Per Arne Vollan  <pvol...@apple.com>
+
+        [Cocoa] Limit set of classes that can be decoded when a preference has changed
+        https://bugs.webkit.org/show_bug.cgi?id=208012
+
+        Reviewed by Brent Fulgham.
+
+        As a hardening measure, limit the set of ObjectiveC classes that can be decoded in the WebContent process
+        as a result of a preference change.
+
+        API tests: WebKit.PreferenceChangesDictionary
+                   WebKit.PreferenceChangesData
+                   WebKit.PreferenceChangesDate
+
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::WebProcess::notifyPreferencesChanged):
+
 2020-03-16  youenn fablet  <you...@apple.com>
 
         Unique origins should not be Potentially Trustworthy

Modified: trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm (258494 => 258495)


--- trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2020-03-16 13:15:52 UTC (rev 258494)
+++ trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2020-03-16 15:19:53 UTC (rev 258495)
@@ -912,11 +912,12 @@
     if (!encodedData)
         return;
     NSError *err = nil;
-    auto object = retainPtr([NSKeyedUnarchiver unarchivedObjectOfClass:[NSObject class] fromData:encodedData.get() error:&err]);
+    auto classes = [NSSet setWithArray:@[[NSString class], [NSNumber class], [NSDate class], [NSDictionary class], [NSArray class], [NSData class]]];
+    id object = [NSKeyedUnarchiver unarchivedObjectOfClasses:classes fromData:encodedData.get() error:&err];
     ASSERT(!err);
     if (err)
         return;
-    [defaults setObject:object.get() forKey:key];
+    [defaults setObject:object forKey:key];
 }
 
 void WebProcess::unblockPreferenceService(const SandboxExtension::Handle& handle)

Modified: trunk/Tools/ChangeLog (258494 => 258495)


--- trunk/Tools/ChangeLog	2020-03-16 13:15:52 UTC (rev 258494)
+++ trunk/Tools/ChangeLog	2020-03-16 15:19:53 UTC (rev 258495)
@@ -1,3 +1,13 @@
+2020-03-16  Per Arne Vollan  <pvol...@apple.com>
+
+        [Cocoa] Limit set of classes that can be decoded when a preference has changed
+        https://bugs.webkit.org/show_bug.cgi?id=208012
+
+        Reviewed by Brent Fulgham.
+
+        * TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm:
+        (TEST):
+
 2020-03-16  youenn fablet  <you...@apple.com>
 
         Unique origins should not be Potentially Trustworthy

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm (258494 => 258495)


--- trunk/Tools/TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm	2020-03-16 13:15:52 UTC (rev 258494)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit/PreferenceChanges.mm	2020-03-16 15:19:53 UTC (rev 258495)
@@ -127,4 +127,104 @@
     ASSERT_TRUE([object isEqual:changedArray]);
 }
 
+TEST(WebKit, PreferenceChangesDictionary)
+{
+    NSDictionary *dict = @{
+        @"a" : @1,
+        @"b" : @2,
+    };
+
+    auto userDefaults = adoptNS([[NSUserDefaults alloc] initWithSuiteName:@"com.apple.coremedia"]);
+    [userDefaults.get() setObject:dict forKey:@"testkey"];
+
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    WKRetainPtr<WKContextRef> context = adoptWK(TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest"));
+    configuration.get().processPool = (WKProcessPool *)context.get();
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
+
+    auto preferenceValue = [&] {
+        return [webView stringByEvaluatingJavaScript:@"window.internals.encodedPreferenceValue(\"com.apple.coremedia\", \"testkey\")"];
+    };
+
+    preferenceValue();
+
+    NSDictionary *changedDict = @{
+        @"a" : @1,
+        @"b" : @2,
+        @"c" : @3,
+    };
+    [userDefaults.get() setObject:changedDict forKey:@"testkey"];
+
+    auto encodedString = preferenceValue();
+    auto encodedData = adoptNS([[NSData alloc] initWithBase64EncodedString:encodedString options:0]);
+    ASSERT_TRUE(encodedData);
+    NSError *err = nil;
+    auto object = retainPtr([NSKeyedUnarchiver unarchivedObjectOfClass:[NSObject class] fromData:encodedData.get() error:&err]);
+    ASSERT_TRUE(!err);
+    ASSERT_TRUE(object);
+    ASSERT_TRUE([object isEqual:changedDict]);
+}
+
+TEST(WebKit, PreferenceChangesData)
+{
+    NSData *data = "" dataWithBytes:"abc" length:3];
+
+    auto userDefaults = adoptNS([[NSUserDefaults alloc] initWithSuiteName:@"com.apple.coremedia"]);
+    [userDefaults.get() setObject:data forKey:@"testkey"];
+
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    WKRetainPtr<WKContextRef> context = adoptWK(TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest"));
+    configuration.get().processPool = (WKProcessPool *)context.get();
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
+
+    auto preferenceValue = [&] {
+        return [webView stringByEvaluatingJavaScript:@"window.internals.encodedPreferenceValue(\"com.apple.coremedia\", \"testkey\")"];
+    };
+
+    preferenceValue();
+
+    NSData *changedData = [NSData dataWithBytes:"abcd" length:4];
+    [userDefaults.get() setObject:changedData forKey:@"testkey"];
+
+    auto encodedString = preferenceValue();
+    auto encodedData = adoptNS([[NSData alloc] initWithBase64EncodedString:encodedString options:0]);
+    ASSERT_TRUE(encodedData);
+    NSError *err = nil;
+    auto object = retainPtr([NSKeyedUnarchiver unarchivedObjectOfClass:[NSObject class] fromData:encodedData.get() error:&err]);
+    ASSERT_TRUE(!err);
+    ASSERT_TRUE(object);
+    ASSERT_TRUE([object isEqual:changedData]);
+}
+
+TEST(WebKit, PreferenceChangesDate)
+{
+    NSDate *date = [NSDate dateWithTimeIntervalSinceNow:0];
+
+    auto userDefaults = adoptNS([[NSUserDefaults alloc] initWithSuiteName:@"com.apple.coremedia"]);
+    [userDefaults.get() setObject:date forKey:@"testkey"];
+
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    WKRetainPtr<WKContextRef> context = adoptWK(TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest"));
+    configuration.get().processPool = (WKProcessPool *)context.get();
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 300, 300) configuration:configuration.get() addToWindow:YES]);
+
+    auto preferenceValue = [&] {
+        return [webView stringByEvaluatingJavaScript:@"window.internals.encodedPreferenceValue(\"com.apple.coremedia\", \"testkey\")"];
+    };
+
+    preferenceValue();
+
+    NSDate *changedDate = [NSDate dateWithTimeIntervalSinceNow:10];
+    [userDefaults.get() setObject:changedDate forKey:@"testkey"];
+
+    auto encodedString = preferenceValue();
+    auto encodedData = adoptNS([[NSData alloc] initWithBase64EncodedString:encodedString options:0]);
+    ASSERT_TRUE(encodedData);
+    NSError *err = nil;
+    auto object = retainPtr([NSKeyedUnarchiver unarchivedObjectOfClass:[NSObject class] fromData:encodedData.get() error:&err]);
+    ASSERT_TRUE(!err);
+    ASSERT_TRUE(object);
+    ASSERT_TRUE([object isEqual:changedDate]);
+}
+
 #endif // WK_HAVE_C_SPI
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to