日に日に増すセキュリティの重要性
7Pay問題をきっかけにセキュリティの重要性が再認識されてきている中、IPAが提供するAppGoatに以下項目が追加されました。
- ディレクトリ・トラバーサル
- OSコマンドインジェクション
- セッション管理の不備編
- Fiddlerの使い方
ちゃんと更新されるんだなという感想は置いておいて、せっかくなので順に沿って学んでみようかなと思います。
まずはバッファーオーバーフローから。
事前準備
-
以下のページからAppGoatをダウンロード
https://www.ipa.go.jp/security/vuln/appgoat/index.html -
展開し、IPAToolフォルダにあるstart.batを実行
-
80番ポートが利用中のため起動出来ないエラーが出た場合、以下コマンドで利用しているサービスを確認する。
netstat -nao
※IISが起動している場合が多いため、サービス一覧から「World Wide Web Publishing Service」を停止させてください。
バッファーオーバーフローとは?
一度確保したバッファ領域に、それ以上に大きいデータを後から上書きする事によってプログラムに予期しない動きをさせる攻撃方法です。
AppGoatのサンプルプログラムでは関数ポインタを格納した変数に対して大きなデータを割り当て、想定外の挙動を実行させるという内容でした。
以下、重要な所だけ抜き出したコード@C++です。
# define ARCBOF_MAX_PATH 256
showProgress2(IN ArcDoShowProgress_t DoShowProgress,IN LPCSTR pExtraField)
{
CHAR ExtraFieldBuffer[ARCBOF_MAX_PATH] = {0};
strcpy( ExtraFieldBuffer, pExtraField );
}
256で確保したExtraFieldBufferに、引数で渡されたpExtraFieldの値を割り当てているため、pExtraFieldが大きいデータの場合バッファーオーバーフローが発生するという演習です。
AppGoatの教本が分かりやすいので、ぜひ一度試してみる事をお勧めします。
バッファオーバーフロー攻撃を防ぐためにすべき事
元も子もない話ですが、バッファオーバーフロー攻撃のリスクが発生する余地のない言語を使用することであると思います。
参考
https://www.synopsys.com/blogs/software-security/ja-jp/detect-prevent-and-mitigate-buffer-overflow-attacks/
最近流行りの言語はほぼバッファオーバーフロー攻撃のリスクが発生する余地のない言語に該当するので、問題ないと思います。
初めて学習する人はこんな攻撃手法があるんだなという理解だけで十分という事ですね。
※参考に上げた記事にて、発生するリスクがある言語で行うべき対策が書いてあるので読むと勉強になるかも。
まとめが雑になってしまいましたが以上です、読んでいただきありがとうございました。
次回はバッファオーバーフローの脆弱性の検証手法の一つであるファジングという手法についてまとめる予定です。