iOS Custom URI Handlers / Deeplinks / Custom Schemes

Support HackTricks

Basic Information

사용자 정의 URL 스킴은 앱이 Apple Developer Documentation에서 자세히 설명된 사용자 정의 프로토콜을 사용하여 통신할 수 있게 합니다. 이러한 스킴은 앱에서 선언해야 하며, 이후 해당 스킴에 따라 들어오는 URL을 처리합니다. 모든 URL 매개변수를 검증하고 형식이 잘못된 URL은 폐기하는 것이 중요합니다. 이를 통해 이 벡터를 통한 공격을 방지할 수 있습니다.

예를 들어, URI myapp://hostname?data=123876123는 특정 애플리케이션 작업을 호출합니다. 주목할 만한 취약점은 Skype Mobile 앱에서 발견되었으며, 이는 skype:// 프로토콜을 통해 허가되지 않은 통화 작업을 허용했습니다. 등록된 스킴은 앱의 Info.plistCFBundleURLTypes에서 찾을 수 있습니다. 악의적인 애플리케이션은 URI를 재등록하여 민감한 정보를 가로챌 수 있습니다.

Application Query Schemes Registration

iOS 9.0부터, 앱이 사용 가능한지 확인하기 위해 canOpenURL:Info.plistLSApplicationQueriesSchemes에 URL 스킴을 선언해야 합니다. 이는 앱이 쿼리할 수 있는 스킴을 50개로 제한하여 앱 열거를 방지하고 개인 정보를 향상시킵니다.

<key>LSApplicationQueriesSchemes</key>
<array>
<string>url_scheme1</string>
<string>url_scheme2</string>
</array>

Testing URL Handling and Validation

개발자는 application:didFinishLaunchingWithOptions:application:openURL:options:와 같은 소스 코드의 특정 메서드를 검사하여 URL 경로 구성 및 유효성 검사를 이해해야 합니다. 예를 들어, Telegram은 URL을 여는 다양한 방법을 사용합니다:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ application: UIApplication, open url: URL, sourceApplication: String?,
annotation: Any) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ app: UIApplication, open url: URL,
options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
self.openUrl(url: url)
return true
}

func application(_ application: UIApplication, handleOpen url: URL) -> Bool {
self.openUrl(url: url)
return true
}

다른 앱에 대한 URL 요청 테스트

openURL:options:completionHandler:와 같은 메서드는 다른 앱과 상호작용하기 위해 URL을 여는 데 중요합니다. 앱의 소스 코드에서 이러한 메서드의 사용을 식별하는 것은 외부 통신을 이해하는 데 핵심입니다.

사용 중단된 메서드 테스트

application:handleOpenURL:openURL:와 같은 URL 열기를 처리하는 사용 중단된 메서드는 식별하고 보안 영향을 검토해야 합니다.

URL 스킴 퍼징

URL 스킴 퍼징은 메모리 손상 버그를 식별할 수 있습니다. Frida와 같은 도구는 다양한 페이로드로 URL을 열어 충돌을 모니터링하여 이 프로세스를 자동화할 수 있습니다. 이는 iGoat-Swift 앱에서 URL 조작의 예로 설명됩니다:

$ frida -U SpringBoard -l ios-url-scheme-fuzzing.js
[iPhone::SpringBoard]-> fuzz("iGoat", "iGoat://?contactNumber={0}&message={0}")
Watching for crashes from iGoat...
No logs were moved.
Opened URL: iGoat://?contactNumber=0&message=0

Custom URL scheme hijacking

이 게시물에 따르면, 악성 앱은 다른 앱의 커스텀 스킴을 등록할 수 있으며, 그러면 악성 앱은 ASWebAuthenticationSession을 사용하여 Safari 앱의 모든 쿠키가 있는 브라우저를 열 수 있습니다.

악성 앱은 브라우저를 통해 공격자가 제어하는 웹 페이지를 로드할 수 있으며, TCC는 모바일 사용자에게 해당 앱을 열기 위한 권한을 요청합니다. 그런 다음, 악성 웹 페이지는 피해자 페이지로 리디렉션될 수 있으며, 예를 들어 prompt=none 매개변수를 가진 OAuth 흐름으로 리디렉션됩니다. 사용자가 이미 OAuth 흐름에 로그인한 경우, OAuth 흐름은 피해자 앱의 커스텀 스킴을 사용하여 비밀을 피해자 애플리케이션으로 다시 보냅니다. 그러나 악성 앱도 이를 등록했기 때문에, 사용된 브라우저가 악성 앱 내에 있기 때문에, 이 경우 커스텀 스킴은 악성 앱에 의해 처리되어 OAuth 토큰을 훔칠 수 있습니다.

References

Support HackTricks

Last updated