セキュリティの論点 Linuxに潜む脆弱性「GHOST」とは何だったのか

1月27日、米国のセキュリティ企業であるQualys（クォリス）から、Linuxで一般的な標準Cライブラリ「glibc（GNU C Library）」に重大な脆弱性が存在することを確認した、という発表がありました。まだ記憶にも新しいこの脆弱性（CVE-2015-0253）は通称「GHOST」と名付けられましたが、今回はこの件に関して説明します。

GHOSTは、glibcの関数「gethostbyname*()」を呼び出すことで引き起こされるバッファオーバーフロー（Buffer Overflow）の脆弱性です。これが利用されると、オペレーティングシステム（OS）としてLinuxを搭載するクライアントやサーバなどのマシン上で任意のコードを実行することが可能になったり、それを利用して最終的にはマシンを乗っ取ることが可能となったりするかもしれない、というものです。

バッファオーバーフローというのは代表的な脆弱性の一つですが、確保したメモリ領域を超えてデータが入力された場合に、データがあふれてしまう現象を起こす脆弱性を指します。まずはとても大ざっぱに解説します。

バッファオーバーフローとは

プログラムが主に「一時的に利用するデータ」を格納するための領域のうち、コンパイラやOSがメモリ上に割り当てる領域「スタック」には、複数の文字情報を格納するためのバッファ領域があり、他にも子関数から親関数に戻るためのメモリアドレス（戻りアドレス、リターンアドレス）などが保持されます。

もし、リクエストされた文字データがスタック上のバッファ領域よりも大きかったら、どうなるでしょうか。





この文字データをバッファ領域にコピーさせようとした場合、バッファ領域より入力しようとしている文字データの方が大きいので、通常であればプログラムが単にエラーメッセージを返せばいいだけですが、





サイズのチェックを行わずにコピーを実行する（脆弱性）関数を用いている場合など、上記のようにバッファがあふれ（これをバッファオーバーランと言います）、戻りアドレスが文字データで上書きされてしまって親関数に戻れなくなり、プログラムが誤作動を起こすことがあります。これがバッファオーバーフローという現象です。

そして、この脆弱性を利用することで、





上のようなデータをバッファ領域にコピーさせると、





スタックの中身が上書きされ、本来の戻りアドレスを悪意あるコードが存在するアドレスに置き換えられたことによって、CPUはこのアドレスを参照して悪意のあるコードを実行してしまいます。かなり大ざっぱですが、これが“バッファオーバーフロー攻撃”です。