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

  • 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/UTImportedTypeDeclarations if the app declares exported/imported custom document types.

  • CFBundleDocumentTypes to 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 (Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ), которая позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ±ΠΌΠ΅Π½Π° ΠΌΠ΅ΠΆΠ΄Ρƒ устройствами для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ прилоТСния. Π­Ρ‚Π° Ρ„ΠΈΡ‡Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π°, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ врСмя ΠΆΠΈΠ·Π½ΠΈ скопированной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

БтатичСский Π°Π½Π°Π»ΠΈΠ·

  1. systemwide general pasteboard

Π˜Ρ‰Π΅ΠΌ generalPasteboard. Π­Ρ‚ΠΎΡ‚ Ρ‚ΠΈ Π±ΡƒΡ„Π΅Ρ€Π° ΠΎΠ±ΠΌΠ΅Π½Π° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ‡ΡƒΠ²ΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….

  1. 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 UIPasteboardOptionLocalOnly option.

  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, if there are expiring pasteboards, there should be a call to setItems:options: with the UIPasteboardOptionExpirationDate option.

  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‡ΠΈΡ‰Π°Π΅Ρ‚ Π±ΡƒΡ„Π΅Ρ€ ΠΎΠ±ΠΌΠ΅Π½Π°, Ссли ΠΎΠ½ΠΎ ΡƒΡ…ΠΎΠ΄ΠΈΡ‚ Π² Ρ„ΠΎΠ½ΠΎΠ²Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒΡΡ для ограничСния раскрытия ΠΊΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠ°Ρ€ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π°ΠΌΠΈ).

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 argument

TLS, 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 secure

Obj-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?