Changeset 251358 in webkit
- Timestamp:
- Oct 20, 2019, 6:55:11 PM (6 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 4 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r251326 r251358 1 2019-10-20 Brent Fulgham <bfulgham@apple.com> 2 3 Improve serialization logic 4 https://bugs.webkit.org/show_bug.cgi?id=203039 5 <rdar://problem/55631691> 6 7 Reviewed by Alex Christensen. 8 9 Check that the SecItemRequestData only contains relevant types for 10 CFNetwork uses. 11 12 * Platform/spi/Cocoa/SecItemSPI.h: Added. 13 * Shared/mac/SecItemRequestData.cpp: 14 (WebKit::arrayContainsInvalidType): Added. 15 (WebKit::dictionaryContainsInvalidType): Added. 16 (WebKit::validTypeIDs): Added. 17 (WebKit::isValidType): Added. 18 (WebKit::SecItemRequestData::decode): Check types during decode. 19 * Shared/mac/SecItemRequestData.h: 20 * WebKit.xcodeproj/project.pbxproj: 21 1 22 2019-10-19 Adrian Perez de Castro <aperez@igalia.com> 2 23 -
trunk/Source/WebKit/Platform/spi/Cocoa/SecItemSPI.h
r251357 r251358 1 1 /* 2 * Copyright (C) 201 1Apple Inc. All rights reserved.2 * Copyright (C) 2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #ifndef SecItemRequestData_h 27 #define SecItemRequestData_h 26 #pragma once 28 27 29 #include <wtf/RetainPtr.h> 28 #include <Security/SecAccessControl.h> 29 #include <Security/SecBase.h> 30 #include <Security/SecCertificate.h> 31 #include <Security/SecIdentity.h> 32 #include <Security/SecPolicy.h> 33 #include <Security/SecTrust.h> 30 34 31 namespace IPC { 32 class Decoder; 33 class Encoder; 35 #if PLATFORM(MAC) 36 #include <Security/SecACL.h> 37 #include <Security/SecAccess.h> 38 #include <Security/SecTrustedApplication.h> 39 #endif 40 41 #if USE(APPLE_INTERNAL_SDK) 42 43 #include <Security/SecCode.h> 44 #include <Security/SecRequirement.h> 45 #include <Security/SecStaticCode.h> 46 47 #else 48 49 #ifdef __cplusplus 50 extern "C" { 51 #endif 52 53 CF_ASSUME_NONNULL_BEGIN 54 55 CFTypeID SecCodeGetTypeID(); 56 CFTypeID SecRequirementGetTypeID(); 57 CFTypeID SecStaticCodeGetTypeID(); 58 59 CF_ASSUME_NONNULL_END 60 61 #ifdef __cplusplus 34 62 } 63 #endif 35 64 36 namespace WebKit { 37 38 class SecItemRequestData { 39 public: 40 enum Type { 41 Invalid, 42 CopyMatching, 43 Add, 44 Update, 45 Delete, 46 }; 47 48 SecItemRequestData(); 49 SecItemRequestData(Type, CFDictionaryRef query); 50 SecItemRequestData(Type, CFDictionaryRef query, CFDictionaryRef attributesToMatch); 51 52 void encode(IPC::Encoder&) const; 53 static bool decode(IPC::Decoder&, SecItemRequestData&); 54 55 Type type() const { return m_type; } 56 57 CFDictionaryRef query() const { return m_queryDictionary.get(); } 58 CFDictionaryRef attributesToMatch() const { return m_attributesToMatch.get(); } 59 60 private: 61 Type m_type; 62 RetainPtr<CFDictionaryRef> m_queryDictionary; 63 RetainPtr<CFDictionaryRef> m_attributesToMatch; 64 }; 65 66 } // namespace WebKit 67 68 #endif // SecItemRequestData_h 65 #endif // USE(APPLE_INTERNAL_SDK) -
trunk/Source/WebKit/Shared/mac/SecItemRequestData.cpp
r204668 r251358 1 1 /* 2 * Copyright (C) 2011 Apple Inc. All rights reserved.2 * Copyright (C) 2011-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 29 29 #include "ArgumentCoders.h" 30 30 #include "ArgumentCodersCF.h" 31 #include "SecItemSPI.h" 32 #include <CoreFoundation/CoreFoundation.h> 31 33 32 34 namespace WebKit { … … 63 65 } 64 66 67 static bool isValidType(CFTypeRef); 68 69 static bool arrayContainsInvalidType(CFArrayRef array) 70 { 71 CFIndex entryCount = CFArrayGetCount(array); 72 73 for (CFIndex entry = 0; entry < entryCount; ++entry) { 74 CFTypeRef value = reinterpret_cast<CFTypeRef>(CFArrayGetValueAtIndex(array, entry)); 75 if (!isValidType(value)) 76 return true; 77 } 78 79 return false; 80 } 81 82 static bool dictionaryContainsInvalidType(CFDictionaryRef dict) 83 { 84 CFIndex entryCount = CFDictionaryGetCount(dict); 85 86 Vector<const void*> keys(entryCount); 87 Vector<const void*> values(entryCount); 88 CFDictionaryGetKeysAndValues(dict, keys.data(), values.data()); 89 90 for (CFIndex entry = 0; entry < entryCount; ++entry) { 91 CFTypeRef key = reinterpret_cast<CFTypeRef>(keys[entry]); 92 if (!isValidType(key)) 93 return true; 94 95 CFTypeRef value = reinterpret_cast<CFTypeRef>(values[entry]); 96 if (!isValidType(value)) 97 return true; 98 } 99 100 return false; 101 } 102 103 #if PLATFORM(MAC) 104 typedef std::array<CFTypeID, 16> ValidTypes; 105 #else 106 typedef std::array<CFTypeID, 13> ValidTypes; 107 #endif 108 109 static const ValidTypes& validTypeIDs() 110 { 111 static ValidTypes types = {{ 112 CFBooleanGetTypeID(), CFDataGetTypeID(), CFStringGetTypeID(), CFNullGetTypeID(), CFNumberGetTypeID(), 113 SecAccessControlGetTypeID(), SecCertificateGetTypeID(), SecCodeGetTypeID(), SecIdentityGetTypeID(), 114 SecPolicyGetTypeID(), SecRequirementGetTypeID(), SecStaticCodeGetTypeID(), SecTrustGetTypeID() 115 #if PLATFORM(MAC) 116 , SecACLGetTypeID(), SecAccessGetTypeID(), SecTrustedApplicationGetTypeID() 117 #endif 118 }}; 119 120 static dispatch_once_t onceToken; 121 dispatch_once(&onceToken, ^{ 122 std::sort(types.begin(), types.end()); 123 }); 124 125 return types; 126 } 127 128 static bool isValidType(CFTypeRef type) 129 { 130 auto typeID = CFGetTypeID(type); 131 if (typeID == CFDictionaryGetTypeID()) 132 return !dictionaryContainsInvalidType(reinterpret_cast<CFDictionaryRef>(type)); 133 134 if (typeID == CFArrayGetTypeID()) 135 return !arrayContainsInvalidType(reinterpret_cast<CFArrayRef>(type)); 136 137 const auto& validTypes = validTypeIDs(); 138 139 bool validType = std::binary_search(validTypes.begin(), validTypes.end(), typeID); 140 if (!validType) { 141 String typeName { adoptCF(CFCopyTypeIDDescription(typeID)).get() }; 142 WTFLogAlways("SecItemRequestData::decode: Attempted to serialized invalid type %s", typeName.utf8().data()); 143 } 144 return validType; 145 } 146 65 147 bool SecItemRequestData::decode(IPC::Decoder& decoder, SecItemRequestData& secItemRequestData) 66 148 { … … 72 154 return false; 73 155 74 if (expectQuery && !IPC::decode(decoder, secItemRequestData.m_queryDictionary)) 75 return false; 156 if (expectQuery) { 157 if (!IPC::decode(decoder, secItemRequestData.m_queryDictionary)) 158 return false; 159 160 if (dictionaryContainsInvalidType(secItemRequestData.m_queryDictionary.get())) 161 return false; 162 } 76 163 77 164 bool expectAttributes; … … 79 166 return false; 80 167 81 if (expectAttributes && !IPC::decode(decoder, secItemRequestData.m_attributesToMatch)) 82 return false; 83 168 if (expectAttributes) { 169 if (!IPC::decode(decoder, secItemRequestData.m_attributesToMatch)) 170 return false; 171 172 if (dictionaryContainsInvalidType(secItemRequestData.m_attributesToMatch.get())) 173 return false; 174 } 175 84 176 return true; 85 177 } -
trunk/Source/WebKit/Shared/mac/SecItemRequestData.h
r204668 r251358 1 1 /* 2 * Copyright (C) 2011 Apple Inc. All rights reserved.2 * Copyright (C) 2011-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #ifndef SecItemRequestData_h 27 #define SecItemRequestData_h 26 #pragma once 28 27 29 28 #include <wtf/RetainPtr.h> … … 65 64 66 65 } // namespace WebKit 67 68 #endif // SecItemRequestData_h -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r251320 r251358 1179 1179 7A8A9D5A1EF13029009801AE /* APIInjectedBundleBundleClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A8A9D591EF13020009801AE /* APIInjectedBundleBundleClient.h */; }; 1180 1180 7A8A9D5C1EF14598009801AE /* APIInjectedBundlePageResourceLoadClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A8A9D5B1EF1458E009801AE /* APIInjectedBundlePageResourceLoadClient.h */; }; 1181 7AA746D523593D8100095050 /* SecItemSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AA746D42359308400095050 /* SecItemSPI.h */; }; 1181 1182 7AB6EA451EEAAE3800037B2B /* APIIconDatabaseClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AB6EA441EEAAE2300037B2B /* APIIconDatabaseClient.h */; }; 1182 1183 7AB6EA471EEAB6B800037B2B /* APIGeolocationProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 7AB6EA461EEAB6B000037B2B /* APIGeolocationProvider.h */; }; … … 3768 3769 7A8A9D591EF13020009801AE /* APIInjectedBundleBundleClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIInjectedBundleBundleClient.h; sourceTree = "<group>"; }; 3769 3770 7A8A9D5B1EF1458E009801AE /* APIInjectedBundlePageResourceLoadClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIInjectedBundlePageResourceLoadClient.h; sourceTree = "<group>"; }; 3771 7AA746D42359308400095050 /* SecItemSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SecItemSPI.h; sourceTree = "<group>"; }; 3770 3772 7AB4EA3F22777C460085BBAA /* SandboxExtensionCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SandboxExtensionCocoa.mm; sourceTree = "<group>"; }; 3771 3773 7AB4EA4122777FC70085BBAA /* SandboxInitialiationParametersCocoa.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SandboxInitialiationParametersCocoa.mm; sourceTree = "<group>"; }; … … 6270 6272 57B826402304EB3E00B72EB0 /* NearFieldSPI.h */, 6271 6273 3754D5441B3A29FD003A4C7F /* NSInvocationSPI.h */, 6274 0E97D74C200E8FF300BF6643 /* SafeBrowsingSPI.h */, 6275 7AA746D42359308400095050 /* SecItemSPI.h */, 6272 6276 37B47E2C1D64DB76005F4EFF /* objcSPI.h */, 6273 0E97D74C200E8FF300BF6643 /* SafeBrowsingSPI.h */,6274 6277 ); 6275 6278 path = Cocoa; … … 9407 9410 1A4D664818A2D91A00D82E21 /* APIUIClient.h in Headers */, 9408 9411 BCDB86C11200FB97007254BE /* APIURL.h in Headers */, 9412 7AA746D523593D8100095050 /* SecItemSPI.h in Headers */, 9409 9413 BCE2315D122C30CA00D5C35A /* APIURLRequest.h in Headers */, 9410 9414 BC90A1D2122DD55E00CC8C50 /* APIURLResponse.h in Headers */,
Note:
See TracChangeset
for help on using the changeset viewer.