iOS
Π§ΡΠΎ ΠΈΡΠ΅ΠΌ
AppLinks ΠΈ Universal Links: ΠΊΠ°ΠΊΠΈΠ΅ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ.
Π Π°Π±ΠΎΡΠ° Ρ WebView ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ. Π‘ΠΌΠΎΡΡΠΈΠΌ, ΡΡΠΎ Π²ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΎ (ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ Π² MSTG ΠΈ Π½Π° ΠΏΡΠΎΡΡΠΎΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ°). ΠΠ΄Π΅ΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΠ»Π½Ρ, ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ½ΡΠ΅ Π΄Π»Ρ Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π² Keychain ΠΈ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Π² MSTG ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΈΡΠ°ΡΡ ΠΎ ΡΠ΅Ρ ΠΌΠ΅ΡΡΠ°Ρ , Π³Π΄Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ Ρ ΡΠ°Π½ΠΈΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ)
Π Π°Π±ΠΎΡΠ° Ρ AppExtensions (Π΅ΡΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ)
TLS: ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π·Π°ΡΠΈΡΠ΅Π½Π½ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅, SSLPinning, ΡΠ°ΠΌ ΡΡΠ°ΡΠΈΠΊ Π½Π΅ ΡΡΠΎΠ³Π°Π΅ΠΌ (Π΅ΡΠ»ΠΈ ΡΡΠΎ Π±ΡΠΎΡΠΈΡΡΡ Π² Π³Π»Π°Π·Π° β ΠΎΠΊ, Π½ΠΎ API Π½Π΅ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΠΊΠΎΠΏΠ° ΡΡΠΈΡ ΡΠ°Π±ΠΎΡ).
Π¨ΠΈΡΡΠΎΠ²Π°Π½ΠΈΠ΅: Π²ΡΠ΅ ΠΏΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΡΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ, Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ (Π³Π΄Π΅ ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ)
ΠΠ°Ρ Π°ΡΠ΄ΠΊΠΎΠΆΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΠΊΡΠ΅ΡΡ
ΠΠΈΠΊΠ°ΠΊΠΈΠ΅ ΠΊΡΠΈΡΠΈΡΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΠΎΠ±Ρ ΠΎΠ΄ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ (Π΄Π°ΠΆΠ΅ Π³ΠΈΠΏΠΎΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅)
ΠΠ°ΠΊΠ°Π·ΡΠΈΠΊ ΡΠΊΠ°Π·Π°Π», ΡΡΠΎ Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ Π½ΠΎΠ²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ (ΡΠΌ jira). ΠΡΠ»ΠΈ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΠΈΡ Π³Π΄Π΅, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, ΡΡΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π΄Π»Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° (Π΅ΡΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ)
ΠΡΠ°ΡΠΊΠΎ:
Π§ΡΠΎ ΠΈΡΠ΅ΠΌ ΠΊΡΠ°ΡΠΊΠΎ:
IPC:
- applinks:
- application:continueUserActivity:restorationHandler:
```swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: [Any?] -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL else { return false }
print(url) // Π Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ URL ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΡΠΊΡΡΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ ΡΠΊΡΠ°Π½Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
return true
}
```
- openURL:options:completionHandler:
- UIApplication.shared.open(url, options: options, completionHandler: completion)
UIActivity Sharing:
- application:openURL:options:
- UTExportedTypeDeclarations / UTImportedTypeDeclarations / CFBundleDocumentTypes
App Extensions:
- NSExtensionPointIdentifier
- NSExtensionActivationRule
- ΠΠ°Π΄ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ app extensions:
- application:shouldAllowExtensionPointIdentifier:
UIPasteboard:
- pasteboardWithName:create:
- pasteboardWithUniqueName
- setPersistent:
WebView:
- UIWebView
- JSContext
- JSExport
- WKWebView
- add(_ scriptMessageHandler:name:)
- SFSafariViewController
NSPredicate:
- %%@
- NSPredicate predicateWithFormat:
NSSecureCoding: decodeObject
- _name = [aDecoder decodeObjectForKey:@"name"]; // This is insecure.
- _name = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"name"]; // This is secure
Binary:
- lloc
- strcpy
deeplink
TODO:
- ΠΠ°Π΄ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ app extensions:
- application:shouldAllowExtensionPointIdentifier:Mobile / iOS: ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ: objection, frida, frida-tools, ida/ghidra, ..
ΠΠ°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ
Backups: ΡΠ΄Π΅Π»Π°ΡΡ Π·Π°ΠΌΠ΅ΡΠΊΠΈ (ΡΠΊΡΠΈΠ½Ρ, Π΅ΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ) ΠΏΠΎ ΡΠΎΠΌΡ, ΡΡΠΎ ΠΈ Π³Π΄Π΅ Ρ ΡΠ°Π½ΠΈΡΡΡ. ΠΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ ΡΠ°Π½ΠΈΡ ΠΏΠ΅ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΡΠΊΠ°Π·Π°ΡΡ Π² ΠΊΠ°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΈ ΠΊΠ°ΠΊΠΎΠΉ Π½Π°Π±ΠΎΡ ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΠ°Π±ΡΠ°ΡΡ IPA-ΠΎΠ±ΡΠ°Π· ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π² MobSF. ΠΡΠ»ΠΈ mobsf ΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ β Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°ΡΡ
ΠΠ°Π»ΠΈΡΠΈΠ΅ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° SSL Pinning Π΄Π»Ρ Π²ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π΅ΡΡΡ β Π½Π°ΠΏΠΈΡΠ°ΡΡ frida-Ρ ΡΠΊΠΈ ΠΎΠ±Ρ ΠΎΠ΄Π°, ΡΡΠΎΠ±Ρ Π²Π΅ΡΡ ΡΡΠ°ΡΠΈΠΊ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π²ΠΈΠ΄Π΅ΡΡ Π² Burp Suite. ΠΡΠ»ΠΈ ΠΎΠ±Ρ ΠΎΠ΄ Π½Π΅ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, Π½Π°ΠΏΠΈΡΠ°ΡΡ Ρ ΡΠΊΠΈ Π΄Π»Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠΎΠ² Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ.
Objection: Ρ ΠΊΠ°ΠΊΠΈΠΌΠΈ ΡΠ»Π°Π³Π°ΠΌΠΈ ΡΠΎΠ±ΡΠ°Π½Ρ Π±ΠΈΠ½Π°ΡΠΈ β ΡΠΊΡΠΈΠ½
ΠΡΠΎΠ²Π΅ΡΠΈΡΡ Π»ΠΎΠ³ΠΈ (Π½Π° ΠΌΠ°ΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
Console.app). ΠΡΠ»ΠΈ Π²ΠΈΠ΄ΠΈΠΌ Π·Π°ΠΏΡΠΎΡΡ, ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ΅ ΠΈ/ΠΈΠ»ΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΡΠΏ) β ΠΎΡΠΎΡΠΌΠ»ΡΠ΅ΠΌ ΠΊΠ°ΠΊ Information DisclosureΠ‘ΠΎΠ±ΠΈΡΠ°Π΅ΠΌ ΡΡΡΠΎΠΊΠΈ ΠΈΠ· IPA-ΠΎΠ±ΡΠ°Π·Π° (IDA ΠΈΠ»ΠΈ ipanema, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ). ΠΡΠ΅ΠΌ Π°ΡΡΠΈΡΠ°ΠΊΡΡ ΡΠ±ΠΎΡΠΊΠΈ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΡΡΠ΅Π½Π΄Π°Ρ , Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ ΡΠ΅ΡΡΠΎΠ²ΡΡ ΡΡΠ΅Π΄ ΠΈ ΡΠΏ
AppLinks ΠΈ Universal Links: ΠΊΠ°ΠΊΠΈΠ΅ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ. ΠΡΠΈΠΌΠ΅ΡΡ Π»ΠΈΠ½ΠΊΠΎΠ²
Backups: ΡΠ΅ΡΠ΅Π· objection ΡΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π΅ΡΡΡ Π² iOS Keychain. ΠΠ°ΠΊΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠ°ΠΌ Ρ ΡΠ°Π½ΡΡΡΡ, Ρ ΠΊΠ°ΠΊΠΈΠΌΠΈ ΡΠ»Π°Π³Π°ΠΌΠΈ (ΠΌΠΎΠ³ΡΡ Π»ΠΈ ΡΡΠΈ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎΠΏΠ°ΡΡΡ Π² Π±ΡΠΊΠ°ΠΏ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ)
Firebase: ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ firebase-Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅. ΠΡΡΡ Π»ΠΈ ΠΏΡΠ°Π²Π° Π½Π° ΡΡΠ΅Π½ΠΈΠ΅.
MSTG
Sensitive Functionality Exposure through IPC
ΠΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π»Π΅ΡΠ°ΡΡ ΡΡΡ Π±Π΅Π· Π·Π°ΡΠΈΡΡ Π½Π°ΠΏΡΠ°Π²ΠΎ ΠΈ Π½Π°Π»Π΅Π²ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π°
Custom URL Schemes
Universal Links
UIActivity Sharing
App Extensions
UIPasteboard
AppLinks / DeepLinks
Checking the Associated Domains entitlement (ΠΈΡΠ΅ΠΌ
applinks:)Retrieving the Apple App Site Association file
ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π΄ΠΎΠΌΠ΅Π½Ρ Π½Π° domain.com/.well-known/apple-app-site-association ΠΈΠ»ΠΈ domain.com/apple-app-site-association
Checking the link receiver method
ΠΡΠ΅ΠΌ:
application:continueUserActivity:restorationHandler:Checking the data handler method
ΠΠΎΠ»ΠΆΠ½ΡΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, ΠΊΠ°ΠΊ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΌΠ΅ΡΠΎΠ΄Π΅.
Checking if the app is calling other app's universal links
ΠΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ²Ρ
openURL:options:completionHandler:ΠΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΠΈ Π΄Π»Ρ Custom URL Schemes.
Static test for custom URL schemes
Testing custom URL schemes registration
Testing application query schemes registration
Testing URL handling and validation
Testing URL requests to other apps
Testing for deprecated methods
ΠΡΠ°ΡΠΊΠΎ, ΠΈΡΠ΅ΠΌ openUrl (Π±Π΅Π· ΡΡΠ΅ΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠ°)
UIActivity Sharing
Sent data
When testing UIActivity Sharing you should pay special attention to:
the data (items) being shared,
the custom activities,
the excluded activity types.
If having the source code, you should take a look at the UIActivityViewController:
Inspect the activities passed to the init(activityItems:applicationActivities:) method.
Check if it defines custom activities (also being passed to the previous method).
Verify the excludedActivityTypes, if any.
Received data
ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ
ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π»ΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ custom document types (by looking into Exported/Imported UTIs -> Xcode project / Info). The list of all system declared UTIs (Uniform Type Identifiers) can be found in the archived Apple Developer Documentation (https://developer.apple.com/library/archive/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html#//apple_ref/doc/uid/TP40009259).
ΠΡΠ»ΠΈ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π»ΡΠ±ΡΠ΅ document type, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΊΡΡΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ°.
if the app properly verifies the received data by looking into the implementation of
application:openURL:options:(or its deprecated versionUIApplicationDelegate application:openURL:sourceApplication:annotation:) in the app delegate.
ΠΡΠ»ΠΈ Π½Π΅Ρ ΠΈΡΡ ΠΊΠΎΠ΄Π°, Π»Π΅Π·Π΅ΠΌ Π² Info.plist:
UTExportedTypeDeclarations/UTImportedTypeDeclarationsif the app declares exported/imported custom document types.CFBundleDocumentTypesto see if the app specifies any document types that it can open.
App Extensions
App Extension β ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠ΅ ΡΠ°ΠΉΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠ΅Π³ΠΎ ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ (Containing App).
App Extension Π½Π΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Ρ Π² App Store, ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΌΠ΅ΡΡΠ΅ Ρ Containing App.
Host App β ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° App Extension.
ΠΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅: https://habr.com/en/company/mobileup/blog/441890/
The static analysis will take care of:
Verifying if the app contains app extensions
ΠΡΠ΅ΠΌ NSExtensionPointIdentifier.
Determining the supported data types
ΠΡΠ΅ΠΌ Π² app extension's Info.plist NSExtensionActivationRule. ΠΡΠ΄ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ (ΠΈ Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ
MaxCount Π½Π΅ 0)
Checking data sharing with the containing app
ΠΠ°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΡΠ΅ΡΠ΅Π· App Groups ΠΈΠ»ΠΈ ΡΠ΅ΡΠ΅Π· NSUserDefaults (ΡΠΎΠΆΠ΅ ΡΠ΅ΡΠ΅Π· app group). ΠΡΠ΅ Π²Π°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: App Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°ΡΡΡΠΎΠΈΡΡ Shared Container, Π΅ΡΠ»ΠΈ App extension ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ NSURLSession. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, Extension ΠΈ Containing App Π±ΡΠ΄ΡΡ ΠΈΠΌΠ΅ΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΡΠΌ Π΄Π°Π½Π½ΡΠΌ.
Verifying if the app restricts the use of app extensions
Host app ΠΌΠΎΠΆΠ΅Ρ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ app extension Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ
Π΄Π°Π½Π½ΡΡ
. ΠΠ΅Π»Π°Π΅ΡΡΡ ΡΡΠΎ ΡΠ΅ΡΠ΅Π· ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ β application:shouldAllowExtensionPointIdentifier:.
ΠΠΊΡΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΎ Π΄Π»Ρ ΠΊΠ°ΡΡΠΎΠΌΠ½ΡΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ.
UIPasteboard
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ.
systemwide general pasteboard: Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ Ρ Π»ΡΠ±ΡΠΌΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ (ΠΏΠ΅ΡΡΠΈΡΡΡΡΡΡ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° ΠΈΠ»ΠΈ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ)
custom / named pasteboards: Π΄Π»Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½ΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌΠΈ Ρ ΠΎΠ΄Π½ΠΈΠΌ team ID. ΠΠ°Π½Π½ΡΠ΅ Π½Π΅ ΠΏΠ΅ΡΡΠΈΡΡΡΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ.
ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠΎΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ:
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΈ ΠΎΡΠΊΠ»ΠΎΠ½ΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ Π² ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅ Π±ΡΡΠ΅ΡΠ° ΠΎΠ±ΠΌΠ΅Π½Π°
ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΠΎΠ½Π΅ Π½Π΅ ΠΌΠΎΠ³ΡΡ ΡΠΈΡΠ°ΡΡ Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
Apple Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ named pasteboards: ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ shared containers.
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ iOS 10 ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π½ΠΎΠ²Π°Ρ ΡΠΈΡΠ° Universal Clipboard (Π²ΠΊΠ»ΡΡΠ΅Π½Π° ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ), ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΌΠ΅ΠΆΠ΄Ρ ΡΡΡΡΠΎΠΉΡΡΠ²Π°ΠΌΠΈ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΡΠ° ΡΠΈΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π°, Π° ΡΠ°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ.
Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·
systemwide general pasteboard
ΠΡΠ΅ΠΌ generalPasteboard. ΠΡΠΎΡ ΡΠΈ Π±ΡΡΠ΅ΡΠ° ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π΄Π°Π½Π½ΡΡ .
custom pasteboards
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ pasteboardWithName:create: ΠΈΠ»ΠΈ pasteboardWithUniqueName. ΠΡΠ»ΠΈ Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π°ΡΡΡΠΎΠ΅Π½ ΠΊΠ°ΠΊ ΠΏΠ΅ΡΡΠΈΡΡΠ΅Π½Ρ (ΠΈΡΠ΅ΠΌ Π²ΡΠ·ΠΎΠ² setPersistent:), ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠΈΠ²Π°Π΅ΠΌ, ΡΡΠΎ Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ shared container.
Π Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅:
ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
removePasteboardWithName:, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ Π½Π΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ, ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Ρ Π²ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΈΠΌ ΡΠ΅ΡΡΡΡΡ (Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° general pasteboard)ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, if there are excluded pasteboards, there should be a call to
setItems:options:with theUIPasteboardOptionLocalOnlyoption.ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, if there are expiring pasteboards, there should be a call to
setItems:options:with theUIPasteboardOptionExpirationDateoption.ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΡΠ°Π΅Ρ Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΡΡ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΠΈΠ»ΠΈ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π΄Π΅Π»Π°ΡΡΡΡ Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΡΠΊΡΡΡΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ°ΡΠΎΠ»ΡΠ½ΡΠΌΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°ΠΌΠΈ).
WebView
https://mobile-security.gitbook.io/mobile-security-testing-guide/ios-testing-guide/0x06h-testing-platform-interaction#testing-ios-webviews-mstg-platform-5
ΠΡΠ΅ΠΌ:
UIWebView (deprecated)
WKWebView
SFSafariViewController
For the static analysis we will focus mostly on the following points having UIWebView and WKWebView under scope.
Identifying WebView usage
Testing JavaScript configuration
Testing for mixed content
Testing for WebView URI manipulation
Other:
Testing how WebViews are loaded
Testing WebView file access (
file://)Checking telephone number detection
Π’Π°ΠΊΠΆΠ΅ ΠΈΡΠ΅ΠΌ Π²ΡΠ΅ ΡΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΎ "JavaScript" (Π² Π»ΡΠ±ΠΎΠΌ ΡΠ΅Π³ΠΈΡΡΡΠ΅)
Native Bridge
ΠΠ°ΠΊ ΠΈ Π² android Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±ΡΠ°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Native App ΠΈ WebView.
UIWebView β JSContext, JSExport protocol. ΠΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ, ΠΎΠ±Π΅ΡΠ½ΡΡΡΠ΅ Π² JSExport, Π΄ΠΎΡΡΡΠΏΠ½Ρ Π² JS ΠΊΠΎΠ΄Π΅.
WKWebView β JS ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π² Native App ΡΠ΅ΡΠ΅Π· ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ postMessage. JS ΠΎΠ±ΡΠ΅ΠΊΡΡ ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠΎΡΠΎΠΌ ΡΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΡΡΡΡΡ Π² ObjC ΠΈΠ»ΠΈ Swift ΠΎΠ±ΡΠ΅ΠΊΡΡ. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ΅ΡΠΎΠ΄Π° add(_ scriptMessageHandler:name:)
Π₯ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ
NSPredicate
ΠΡΠ°ΠΊΡΡΡΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²Π΅ ΡΠ΅ΡΠ΅Π· ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ NSPredicate. (ΠΠ°, ΡΠ΅ΠΉΡΠ°Ρ ΡΡΠΎ Π½Π΅ Π½Π°Π·Π²Π°ΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΡΡ, ΡΠΊ Ρ ΡΠ΅Π»Π΅ΡΠΎΠ½Π° ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΅Π΄ΠΈΠ½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠ°ΡΡ Π°ΠΊΡΡΠ°Π»ΡΠ½ΡΠΌ)
// Insecure
NSURL* url = [NSURL URLWithString:@"http://www.example.com"];
NSString* name = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; // input
NSString* predicateFormat = [NSString stringWithFormat:@"(firstName == %@) AND (age > %%@)",name];
NSPredicate* predicate = [NSPredicate predicateWithFormat:predicateFormat, @11]; // vulnerable to NSPredicate Injection
// Secure
NSURL* url = [NSURL URLWithString:@"http://www.example.com"];
NSString* name = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; // input
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(firstName == %@) AND (age > %@)", name, @11]; // Secure. Format is a string literal, input is provided in second argumentTLS, Pinning, Network
Coding / Crypto / Secrets
iOS ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π²Π° ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° Π΄Π»Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ / Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΠΉ β NSCoding NSSecureCoding.
NSSecureCoding
Use only decodeObjectOfClass:forKey:methods for object deserialization in classes implementing the NSSecureCoding protocol.
_name = [aDecoder decodeObjectForKey:@"name"]; // This is insecure.
_name = [aDecoder decodeObjectOfClass:[NSString class] forKey:@"name"]; // This is secureObj-C Ρ ΡΠΈΡΡΡΠΌ C/C++-ΠΊΠΎΠ΄ΠΎΠΌ
C/C++-ΠΊΠΎΠ΄ΠΎΠΌApple Secure Coding Guide: https://developer.apple.com/library/archive/documentation/Security/Conceptual/SecureCodingGuide/Articles/BufferOverflows.html
ΠΠ΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ:
strcpy
Should use unsigned integers for memory arithmetic
void f() {
size_t size = 10;
char buf[size];
}Last updated
Was this helpful?