ITmedia エンタープライズ:Perlの脆弱性は氷山の一角か

この話を聞いてまず思うのは、なぜ必要無い場面でFormat stringを受け付ける関数を呼んでしまったのか、ということでした。
結論から言うと、Sys::Syslogモジュールの現時点での最新版(0.09)では問題がないのですが、Perl-5.8.7に入っている版(0.06)では問題があるということです。つまり、0.07以前のSys::Syslogが提供するsyslog関数は、Format stringを受け取るものしか実装されていなかったんですね。それ以後では、string以後に引数が無ければ文字列がそのまま展開されず使われます。これこそPerlの「空気を読んで適当に上手くやってくれる」仕様でしょう。
言語のコアに十分な文字列処理の入っているPerlとFormat stringの文化はやや違和感を感じていたのですが、やはりWebminの開発者もsyslog文字列をPerl的なやりかたで構築してそのまま渡してしまったんでしょう。単にFormat string bugだと非難するのは簡単ですが、第三者の利用するモジュールを提供する場合には「暗黙的に想定される使い方」というのに注意しないといけないですね。

あと、もちろん今回の脆弱性の本質は、Format string bugがPerlにおいてremote code exploitの糸口となりえてしまう、という部分です。上で書いたのは、想定外の場面で Format string として扱われてしまうという点に対する考えです。