ITmedia NEWS >

Perlの脆弱性は氷山の一角か

» 2005年12月06日 17時29分 公開
[Larry Seltzer,eWEEK]
eWEEK

 先週、深刻な脆弱性が公表されたが、マスコミ、さらにはセキュリティ業界さえもこれにはあまり関心を寄せなかった。わたしとしては、これは本当に厄介な脆弱性だと思っている――特に、パッチを当てられないまま広範囲にわたって放置されると見られるからだ。

 問題となっているプログラムは、至る所で使われているプログラミング言語「Perl」だ。Perlはスクリプト言語だ。スクリプト言語というと人によってとらえ方が違うが、ある種の仮想マシン(VM)でソースの形で解釈されることが主な特徴だとわたしは考えている。Perlはサーバ側のWebサイトプログラミングだけでなく、システム管理スクリプトにも幅広く使われているが、ここ近年はPHP、ASPなどのサーバ側スクリプト言語にかなり取って代わられてきている。

 今回報告された脆弱性「Perl_sv_vcatpvfn Format String Integer Wrap Vulnerability」は、文字列フォーマットの利用に関連したものだ。Perlには、C言語の文字列ライブラリ関数に似た文字列フォーマット機能がある。こうした関数では、例えばprintf("the number is %4u\n",x)を使って整数の変数xを4けたの符号なし整数としてプリントする。

 このような文字列フォーマットには、C言語の世界で悪用されてきた悲しい歴史がある。Perlについても同じだと考えていい。先に挙げたSecurityFocusのアドバイザリーが明記しているように、これらの関数にデータを渡すプログラムを使っている場合は、まずデータをサニタイズして、データが適切なバウンドにあることを確かめるべきだ。アドバイザリーで挙げられている文字列のインスタンスはほぼ確実に一例にすぎず、ほかのPerlのケースにほかの多数のインスタンスが存在するに違いない。

 この脆弱性に関して混乱をもたらすと思われるもう1つのポイントは、しばしばWebmin(Perlで書かれたWebベースシステム管理ツール)の脆弱性として説明されている点だ。だが、わたしがImmunityのデイブ・エイテル氏とともに確認した幾つかの報告では、根本的な問題はPerl自体にあることが明らかになっている。

 SecurityFocus(とわたし)にとって、「このような関数を呼び出す前に全データをチェックするように」と呼び掛けるのは簡単だ。しかし実際は、その呼び掛けの多くが実行されることはない。実のところ、わたしがPerlプログラムを調べた経験から言うと、Perlプログラムは最もぞんざいに書かれた、もっとも読みにくいプログラムなのだ。

 ある同僚はPerlプログラムを「モデムノイズ」とバカにしている。彼の言うことは的を射ている。Perlソースに点在するのは簡潔な正規表現だけではないし、Perlはクイックハックプログラミング向けに設計されている。(Perlで書けば)手早くプログラムを走らせることができる。おそらく、1回だけ使うプログラムでなければ、後で改善して、エラーチェックやセキュリティチェックを加えるべきだ。しかし、ショッキングに思えるかもしれないが、そうした作業が常に行われるわけではない。

 なぜPerlでプログラムが書かれるのか、それがどのように悪用されるのかを示すいい例を、オンラインでこの脆弱性に関してコメントしている観測筋の1人が提示している。スティーブン・クリスティー氏はSys::Syslogモジュールのsyslog()関数を挙げて、次のように話している。「これは*NIX環境ではプログラマーの経歴にかかわらず一般的であり、フォーマット文字列引数――syslog("info", "A user said $user_input")など――に直接挿入される信用できないデータとともに呼び出される可能性が非常に高い」

 プログラマーがPerlスクリプトを書いてから3度転職して、そのスクリプトのことを忘れてしまっている――そんなPerlスクリプトを走らせているシステムはたくさんあるに違いない。こうした懸念が出てくる前に書かれたPerl CGIコードも間違いなくたくさんある(もしもわたしが幾つかスクリプトを書いていたら、修正しようと思えばできるが、誰もその報酬を払ってくれないからやらないだろう)。

 今はこれらの脆弱性を突いた大規模な攻撃が起きるという心配はしていない。だが、特定のシステムに入り込もうとしている連中にとってはいい入り口になるかもしれない。Perlインタプリタが実行される状況がきちんと管理されていない場合は特にその危険性がある。

 分別があるはずの人たちの間でさえも、Perlのような「VM」言語は本質的にほかより安全だという思い込みがある。ある程度はそうかもしれないが、本質的に「安全」というわけではない。実際、Perlのルーツがインターネットセキュリティ以前の時代にさかのぼることを考えると、この思い込みは特に疑わしい。いずれこの問題はもっと話題になるとわたしは考えている。

Editorial items that were originally published in the U.S. Edition of “eWEEK” are the copyrighted property of Ziff Davis Enterprise Inc. Copyright (c) 2011. All Rights Reserved.