2018年1月に、脆弱性情報ID番号1 000 001( CVE-2018-1000001 )に関するニュースが浮上しました。
報道各社は通常、ぽかんとあいた抜け道を通してタンクを動かしたというようなことでも(たとえその後、その大きな穴がやぶで覆われ、そして長期間使用されていないままになるようなものだとしても)、人をひきつけるようなキャッチフレーズを使って相手をその物語に引き込みます。今回我々は、そういった方法をとらず、そのIDの脆弱性について、読者に普通に伝えていきたいと思います。
この脆弱性 ( CVE-2018-1000001 )はGlibcで発見され、相対パスがシステム関数 getcwd() によって返されたときに発生します。
getcwd() は不完全なパスを返し、その一部を "(到達不能)"で置き換えることができ、 realpath() を呼び出すが、"到達不能"で止まることはありませんが、この処理を正しく処理できず、メモリ内のパスのルートディレクトリを探します。 また、パス名中の冗長要素( "/./"、 "/../"、 "//")は、正規のパスを得るためにパス文字列から日常的に削除されるため、割り当てられたバッファサイズの関数は "(到達不能)"で停止せず、バッファの開始前にメモリ内のデータを解析し続けます。 バッファが逆順で塗りつぶされているので、 "/../"を含むシンボリックリンクを処理するために realpath() を取得すると、バッファの先頭より前に目的のメモリ領域にポインタを移動させることができ、パス文字列の断片が書き込まれますこの領域はバッファの外側にあります。
この脆弱性を発見した研究者は、脆弱性プロトタイプを思いつきました。
詳細は以下をご覧ください。
(リンク »)
お問い合わせにつきましては発表元企業までお願いいたします。