セキュアソフトウェア

ソフトウェアの脆弱性を突いて,自分のやりたいことをどのようにすればできるか,ということの技術的な詳細が記されている本だ.原題の"Exploiting Software: Hhow to Break Code"のほうが,より刺激的なタイトルなのだが,邦題では,ずいぶんとマイルドになっている.内容は,リバースエンジニアリングの方法,クライアントソフトウェアの攻略,サーバソフトウェアの攻略,バッファオーバーフローの方法,rootkitの実装について,などと,システム管理者なら,頭をかかえたくなるような内容が並んでいる.

個人的には,脆弱性を発見するリバースエンジニアリングの方法がもっとも興味深かったので,それを簡単に紹介したい.(ちなみに,以下は私の理解に基づくものです)

脆弱性の発見とは,ソフトウェアへの入力が,どのようなフローを経て,脆弱性のある箇所(典型的には文字列操作ライブラリなど)へ到達するか,を明らかにすることである.具体的な手順は,「脆弱性のある箇所からの探索」と,「入力からの探索」の二つの方法がある.まず,前者については,以下のような手順となる.

  • 脆弱性が存在するか,脆弱性の原因となりやすいAPIや,ライブラリ呼出しの選ぶ.
    • このような呼出しは,dllの呼出しなどを伴うため,バイナリコード上のどこで実行されているか,を外部から発見することができる.
  • 次に,この呼出しが実行に至るフローを,コードを一つ一つさかのぼることで解析する.

この方法では,ジャンプをさかのぼることは困難でもあり,ある程度以上の解析はできないが,実際に脆弱性のある箇所の概要を知ることができる.後者の.「入力からの探索」による方法は,以下の手順をとる.

  • どのような入力列で,脆弱性のある箇所へ辿り着くか,を解析する.
    • 実行されるフローの追跡は,デバッガで可能であり,入力を工夫すれば,脆弱性のある箇所が分っていれ,いずれは必要な入力が分かる(こともある).
  • フローが複雑で候補がいくつもある場合は,特徴的な入力列をソフトウェアに与え,その入力列がどこへコピーされるかを計測する.インテルのCPUは,特定のメモリエリアへのアクセスに対して割込みを掛けることができ,入力列に対する操作をしているコードを判別することができる.
  • フローが解析されると,入力を無害化するためのフィルタを回避するために,入力列がどのように変化させられているかを解析する.

以上のような方法により,送りたい入力を送りたい箇所に与える方法を解析することができる,というわけだ.本書では,このような具体的な方法が,有用なツールとともに紹介されている.ただ,紹介されている方法を実行するには,アセンブラのコードをどんどん読んでいける高度なスキルは必要なのであるが.

とにかく,世の中に実在するソフトウェアの攻略方法の巧妙さを実感できる本なので,ソフトウェアの設計・実装をする人には,必須の本と言えるのではないだろうか.