Hello there, ('ω')ノ
🧠 メモリ破壊とは?
メモリ破壊(Memory Corruption)とは、アプリが本来書き込んではいけない領域にデータを書き込んでしまうことによって、 データの異常や意図しないコード実行が起こる状態を指します。
最も代表的なものが:
- バッファオーバーフロー(Buffer Overflow)
- Use After Free(解放後使用)
- Heap Overflow(ヒープオーバーフロー)
- Format String Attack(フォーマット文字列攻撃)
などです。
💣 Buffer Overflow(バッファオーバーフロー)とは?
簡単に言うと、「用意された箱より大きなデータを詰め込んで、隣の箱まで壊してしまう」ことです。
📦 例:C言語の危険なコード
char name[8]; strcpy(name, "1234567890ABCDEF");
→ name という配列は8文字までしか入らないのに、16文字も入れてしまうと、
その隣にある別の変数や、戻り先アドレスまで書き換えられる可能性があります。
結果として、任意のコードが実行される「コードインジェクション」に繋がるのです。
📱 Androidでの発生ポイント
AndroidアプリのJavaコードでは基本的にメモリ破壊は起きませんが、 NDK(Native Development Kit)を使ってC/C++のコードを含むアプリでは以下のケースで発生します:
| 発生場所 | 具体例 |
|---|---|
| ネイティブライブラリ(.so) | 画像処理・音声解析・暗号処理などでよく使われる |
| JNI呼び出し | JavaとC/C++をつなぐ部分で境界チェックをミス |
| 外部ライブラリとの連携 | OpenSSLやlibpngなど脆弱性が報告されているライブラリの古いバージョン |
🧪 実例:脆弱なコードと悪用シナリオ
脆弱なCコード(JNIで呼ばれる関数)
void process_input(char* userInput) { char buffer[64]; strcpy(buffer, userInput); // 入力チェックなし! }
この関数に長すぎる文字列を送ると、スタックの中身(関数の戻り先など)を上書きできてしまう可能性があります。
悪用結果
- アプリがクラッシュする(DoS)
- 任意のコードが実行される(RCE)
- ルート権限の奪取に繋がる(特権昇格)
🔍 診断方法
✅ 1. MobSFやapktoolで.soファイルの存在を確認
アプリにネイティブライブラリが含まれているかどうか確認:
lib/armeabi-v7a/xxx.solib/x86/xxx.soなどのファイルがAPKにあるか?
✅ 2. GhidraやIDA Proで解析
.soファイルを逆コンパイルし、strcpy、memcpy、sprintfなど危険な関数の使用箇所を調査。
✅ 3. 動的診断(fuzzing)
- ネイティブ関数に長すぎるデータやランダムなバイト列を送信
- 異常終了やメモリ破壊を起こすかを観察
※FridaやValgrindなどの動的解析ツールが有効です。
🛡️ 対策方法
| 対策 | 内容 |
|---|---|
| 安全な関数を使う | strcpy → strncpy, sprintf → snprintf |
| 境界チェックを徹底 | 入力長のチェックを必ず行う |
| コンパイラレベルの保護を使う | Stack Canary, PIE, NX Bit などを有効に |
| ASLR, DEPの利用 | 実行ファイルにアドレスランダム化と実行保護を設定 |
| C/C++での書き直しを最小限に | Java/Kotlinでできる処理はネイティブにしない |
🧠 実際にあった脆弱性の例
- Stagefright(2015年):Androidのメディア処理ライブラリに存在したメモリ破壊バグ。MMS受信だけでリモートコード実行が可能になった。
- OpenSSL Heartbleed(2014年):ライブラリのバグにより、隣のメモリ領域を読み取れてしまい、機密情報が漏洩した。
✅ まとめ
- メモリ破壊は、ネイティブコードを含むアプリでは常に警戒すべきリスク
- 特にバッファオーバーフローは、不正コード実行に直結する深刻な脆弱性
- 診断では、ネイティブ関数・危険な関数の使用・入力チェックの有無を確認する
- 開発段階からの防御策(セーフAPI、ASLR、Stack Canaryなど)が重要
Best regards, (^^ゞ