以下の内容はhttps://cysec148.hatenablog.com/entry/2025/08/28/140637より取得しました。


第47回:Nativeコードに存在する脆弱性の診断方法

Hello there, ('ω')ノ

🧩 そもそも「ネイティブコード」とは?

AndroidアプリのほとんどはJavaやKotlinで作られていますが、一部の高負荷処理(画像処理・暗号化・音声処理など)はC/C++で書かれたネイティブコードとして実装されることがあります。

このネイティブコードは、アプリの lib ディレクトリに .so ファイルとして含まれます。 つまり、APKファイルの中に「埋め込まれた実行形式ライブラリ」があるということです。


🔓 なぜネイティブコードが危ないのか?

リスク 内容
メモリ管理が手動 Javaのように自動で安全に管理されない
危険関数の利用 strcpy, memcpy, sprintf など脆弱な関数が使われがち
コンパイル後の可視性が低い Javaに比べて可読性・可視性が低く解析が困難
ライブラリ依存 古いOpenSSLなど既知の脆弱性が含まれている可能性

🧪 脆弱性診断のアプローチ

ネイティブコードの脆弱性診断は、以下の3つのアプローチで行います:

✅ 1. 静的解析.soファイルの構造を読む

✅ 2. 動的解析:実行時の動作や異常を確認する

✅ 3. ファジング(Fuzzing):異常入力で挙動を揺さぶる


🔍 静的解析のステップ

⬇️ Step 1. .soファイルの抽出

  1. APKファイルを解凍:
unzip target.apk
  1. lib/armeabi-v7a/lib/x86/ フォルダ内に .so ファイルがあるか確認

🛠 Step 2. バイナリ解析ツールで内容を調査

おすすめのツール:

ツール 用途
Ghidra 無料の強力な逆アセンブラ。関数名・処理内容の推測が可能
IDA Pro 商用ツール。詳細な逆コンパイルに対応
objdump / readelf ELFファイルのヘッダ・シンボルの確認に
strings バイナリ中の平文文字列を抽出して機密情報を探す

たとえば strings libnative.so を実行すると:

strcpy
root_token
/tmp/logs

危険な関数やハードコードされたパスワードなどが見つかることも。


🧪 動的解析(実行中の挙動を見る)

実機またはエミュレータ上で、アプリがネイティブコードを呼び出すタイミングを監視します。

おすすめツール:

ツール 用途
Frida 実行中の関数にフックして引数・戻り値を見る
gdbserver + gdb デバッガ接続でスタックやメモリ状態を観察
logcat + ADB クラッシュやエラー時のログを追跡

たとえば Frida では、以下のように .so 内の関数をフックできます:

Interceptor.attach(Module.findExportByName("libnative.so", "dangerousFunction"), {
    onEnter: function(args) {
        console.log("dangerousFunction called with arg0: " + args[0]);
    }
});

→ 実際にどのような引数が渡され、何が処理されているのかが観察できます。


⚡ ファジング(Fuzzing)

ファジングとは、わざと異常なデータや極端なサイズの入力を与え、挙動を観察する手法です。

例:画像処理ライブラリに対し、異常なJPEGファイルを与えてアプリがクラッシュするか確認する → 脆弱性があれば、バッファオーバーフローやメモリ破壊が発生する可能性あり

使用ツール例:

  • AFL(American Fuzzy Lop)
  • honggfuzz
  • custom script(Frida + Python)

✅ 診断時のチェックリスト

チェック項目 内容
.so ファイルが含まれているか? MobSF や apktool で確認
危険な関数を使用していないか? strcpy, gets, sprintf など
入力に対する境界チェックがあるか? strlen, memcpy の使い方に注意
不審な文字列がないか? パスワード・鍵・コマンドなどが埋め込まれていないか
クラッシュや例外が発生するか? 動的解析・Fuzzingで動作確認

🛡️ セキュアコーディングのポイント(開発者向け)

  • セーフ関数を使う(strncpy, snprintf など)
  • ポインタの初期化・開放を正しく行う
  • エラーハンドリングを丁寧に
  • Stack Canary / PIE / NX Bit / ASLR などコンパイラのセキュリティオプションを有効に

✅ まとめ

  • Androidアプリに含まれる ネイティブコードは、目に見えにくくても深刻な脆弱性の温床
  • .so ファイルは逆アセンブルして関数名やロジックを読み解くことが可能
  • 実機テストやファジングにより、クラッシュや挙動の異常から脆弱性を浮き彫りにできる
  • セーフなC言語設計と、セキュリティ機能の有効化が何よりの防御手段!

Best regards, (^^ゞ




以上の内容はhttps://cysec148.hatenablog.com/entry/2025/08/28/140637より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14