うつろい journal のダウンロード機能は拡張子の検証を実装している:
// PHP - 末尾が .pdf であることを要求
$file = $_GET['file'];
if (!str_ends_with($file, '.pdf')) {
abort(400, 'Only PDF files are allowed');
}
return readfile('/var/www/utsuroi/articles/' . $file);
開発者は「拡張子で絞っているから安全」と考えた。しかし、レガシーな C ベースの低レベル処理(古い PHP、組込み機器、OS のシステムコール経由)ではnull バイト(\0、URL 表記 %00)が文字列の終端として扱われる。
拡張子チェックは ...passwd%00.pdf として通過するが、ファイル読み込み関数は %00 以降を切り捨てて ...passwd を読む。