ヌルバイト攻撃

関数によるNULLバイト("\x00"や"\0")の認識の違いを利用し、意図的に誤動作を引き起こす攻撃。

PHPの関数には次の2種類があり、
  • NULLバイトを正しく処理できる関数…バイナリセーフの関数
  • NULLバイトを文字列の終端として認識してしまう…バイナリセーフでない関数

問題が起こる可能性のあるケースとしては次の2パターンがある。
  1. バイナリセーフの関数で入力チェックを行い、バイナリセーフでない関数を使用した処理を行った場合
  2. バイナリセーフでない関数で入力チェックを行い、バイナリセーフの関数を使用した処理を行った場合

例えば"abc\0def"という文字列は、バイナリセーフの関数ではそのまま"abc\0def"と認識されるが、バイナリセーフでない関数では"abc"として認識されてしまう。
この認識の違いを悪用されると、入力データが正しくないにも関わらずチェックが通過してしまう等の事態が引き起こされてしまう。


■対策

入力データからNULLバイトを取り除く。
(ただし、入力データがテキストである場合に限る)


■注意

正規表現でチェックする場合には、バイナリセーフであるPerl互換の関数を使うのが安全。
更に、文字列の最終部分だけをチェックするのではなく、文字列の先頭から詳しくチェックしていくクセを付けること。

ファイル名をチェックする場合は、is_file() や basename() を使用して確実にチェックを行うこと。


■メモ

こんな風に定番処理にしておくと楽かも。

function sanitize( $arr )
{
    if ( is_array( $arr ) ) {
        return array_map( 'sanitize', $arr );
    }
    return str_replace( "\0", "", $arr );
}

$_GET    = sanitize( $_GET );
$_POST   = sanitize( $_POST );
$_COOKIE = sanitize( $_COOKIE );


○参考
2005年08月19日(金) 03:39:26 Modified by isamun3




スマートフォン版で見る