以下の内容はhttps://cysec148.hatenablog.com/entry/2025/09/04/182646より取得しました。


第57回:ASLRとDEPの仕組みと役割

Hello there, ('ω')ノ

🔐 ASLR(アドレス空間配置のランダム化)とは?

✅ 一言でいうと:

「メモリ内の各コード・データの位置を、毎回ランダムに変えることで、攻撃者が“場所を特定できなくなる”ようにする」


🧠 背景:

従来の攻撃(例:バッファオーバーフロー)では、ジャンプ先のアドレスを予測して書き換えるという方法が使われていました。

しかし、ASLRが有効だと…

  • 実行ファイル(バイナリ)の読み込まれる位置
  • ライブラリ(libc.soなど)のアドレス
  • スタックやヒープ領域のアドレス

が、毎回ランダムになるため、攻撃者が正確にジャンプ先を設定できず、攻撃が失敗するのです。


🔍 診断時の確認方法:

cat /proc/[PID]/maps

このコマンドで、現在のプロセスがどのアドレス空間に何を読み込んでいるかを確認できます。 → 同じアプリを何度も起動して、読み込み位置が異なっていれば、ASLRが有効です。


⚠️ 無効なケース:

  • Android 4.x 以前ではASLRが未実装または限定的
  • -no-pie でビルドされた古いバイナリ
  • NDKの一部ネイティブコードでPIE対応が不十分なもの

🚫 DEP(データ実行防止)とは?

✅ 一言でいうと:

「スタックやヒープなど、“データ用”メモリ上でプログラムを実行することを禁止する」


🧠 背景:

バッファオーバーフロー攻撃の古典的手法は、「シェルコードをスタックに書き込み、リターンアドレスを書き換えてジャンプ」でした。 しかし、DEPが有効だと、スタックは**「実行不可属性」**としてマークされているため、ジャンプしてもクラッシュして終わります。


🔍 診断時の確認方法:

バイナリを以下のようにビルドしているかどうかを見ると、DEPの有無が推測できます。

readelf -l [対象バイナリ] | grep GNU_STACK

出力例:

GNU_STACK      0x0     0x0     0x0     0x0     0x0     RWE
  • RWE(Read Write Execute)ならDEP 無効
  • RW(Read Write)ならDEP 有効

⚠️ DEPを回避する攻撃とは?

DEPが有効な環境では、スタック上でのコード実行ができません。 → そこで登場するのが ROP(Return-Oriented Programming)

ROPは、既存のコード片(ガジェット)をつなぎ合わせて処理を実行する手法で、DEPを迂回します。 そのROPを困難にするのがASLRです。 → つまり、ASLRとDEPはセットで使ってこそ強力な防御になるのです。


🧪 実際の診断での見え方

✔ 攻撃が失敗するケース

  • ROP攻撃で使うガジェットのアドレスが毎回変わる(ASLR)
  • スタックにジャンプしてもクラッシュする(DEP)

✔ 攻撃が成功する条件

  • 非PIEバイナリでASLRが無効
  • スタックが実行可能(DEPが無効)
  • .so ライブラリの読み込み位置が固定でROPが成立

✅ 診断ポイントのまとめ

観点 チェック方法
ASLRが有効か? maps ファイルでアドレスがランダムか確認
PIE対応しているか? readelf -h の「Type」が DYN かどうか
DEPが有効か? readelf -l で GNU_STACK の属性が RWかRWEか
ROPが成立する余地は? .so に含まれるガジェット、リターン先などを分析

✅ まとめ

  • ASLR は攻撃者がメモリアドレスを予測できないようにする防御機構
  • DEP は「実行すべきでない場所」でのコード実行を防ぐ仕組み
  • 両者は バッファオーバーフローやROP攻撃に対する根本的な防御となる
  • 診断時には、ASLR/DEPが有効かを確認し、もし無効なバイナリがある場合は注意深く分析しよう

Best regards, (^^ゞ




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

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