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 version- UIApplicationDelegate 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 the- UIPasteboardOptionLocalOnlyoption.
- ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, if there are expiring pasteboards, there should be a call to - setItems:options:with the- UIPasteboardOptionExpirationDateoption.
- ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΡΠ°Π΅Ρ Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ ΡΡ ΠΎΠ΄ΠΈΡ Π² ΡΠΎΠ½ΠΎΠ²ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΠΈΠ»ΠΈ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ Π΄Π΅Π»Π°ΡΡΡΡ Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΡΠ°ΡΠΊΡΡΡΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ΄Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠ°ΡΠΎΠ»ΡΠ½ΡΠΌΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ°ΠΌΠΈ). 
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?