2024年02月22日
【第19回】脆弱性を含む記述例1
静的解析/コンパイラ技術
CWE Top 25の脆弱性からコーディング例を考えてみます。
CWE-119(メモリバッファ範囲内での不適切な操作)
CWEサイトにはいくつかの例がありますが、文字列変換の例をまねてサンプルを作りました。
オート変数の配列を10バイト確保していますが、’¥’を’¥¥’に変更しているのでバッファサイズが足りずにエリアを超えて書き込むことがあります。
脆弱性は攻撃に対する弱点だけでなく、プログラム自身が持つ不具合も含まれると考えた方が良さそうです。そうであれば、静的解析ツールやルールチェッカーで検出できるものがあります。本不具合を検出できるかどうかはルールチェッカーの性能によるでしょう。
このプログラムでは難しそうですが、オート変数の配列に対して領域外書き込みを可能にする脆弱性は、攻撃者に制御を奪われる可能性があります。
「スタックフレーム」の回でスタックの配置図をお見せしましたが、こんな図でした。
赤字の箇所にはprint_string関数がmain関数に戻るためのアドレスを保存してあり、この情報はbuffer[SIZE]変数の少し下にあることが判ります。
もしここに、バッファオーバーフローを利用して攻撃者の作った関数のアドレスを書き込むことができれば、print_string関数がリターンした時にmain関数へは戻らず、攻撃者の作った関数が動くことになります。
CWE-125(範囲外の読み取り)
こちらも、CWEの情報をお手本に、サンプルを作りました。
get_public_data関数が、引数で受けたインデックス値の指す公開データ(public_data)を提供する関数であるとき、引数の上限値だけしかチェックしていないので、マイナスのインデックスを渡された時にはpublic_data[]の前に宣言されているnon_public_data[]をアクセスする可能性があります。
もし、non_public_data[]とpublic_data[]が連続していなければ、構造体ではない別のデータを取り出す不具合になるでしょう。
筆者紹介
浅野 昌尚(あさの まさなお)
ガイオ・テクノロジー株式会社
開発1部 QTXグループ
1980年代から30年以上にわたり汎用構造のCコンパイラ開発に従事し、その間に8ビットマイコンからRISC・VLIW・画像処理プロセッサまで、さまざまなCPU向けのクロスCコンパイラを開発。