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ファイルの抽出
- APKファイルを解凍:
unzip target.apk
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, (^^ゞ