Perlは悪くない――CGIセキュリティホールの落とし穴スパム時代のサニタイズ開発手法(1/2 ページ)

比較的レガシーになってきた言語「Perl」に対し、旧サービスのメンテナンス不備が問題視されている。問題なく稼働中であっても、脆弱性が潜んでいる場合があるからだ。何に注意すればよいのか? 具体的に触れていこう。

» 2005年12月20日 08時34分 公開
[平田豊,ITmedia]

 先ごろ報じられた「Perlの脆弱性は氷山の一角か」は、一見するとPerl自体の問題? と思われるかもしれない。しかし、核心はPerl言語で作られたスクリプト(ソースコード)自体の問題だ。

 Perl=CGIと思われるほど広まっているこの言語は、フリーで配布されているものが多く、コンパイルする必要なくファイル属性にさえ注意すれば容易に動かすことが可能だ(仕組みの詳細は後述)。このため数多くのPerlスクリプトが公開されているが、十分にセキュリティ対策を行っていないものもある。見かけ上の動作に問題がなければ、セキュリティホールに気付かないことも多い。

 「セキュリティプログラミング」とひと口に言っても、さまざまな考え方がある。このオンライン・ムック「スパム時代のサニタイズ開発手法」のテーマでもある「サニタイズ」は、あらゆるWebアプリが混在するサーバ上では入力の時点で適さない文字列をまとめて無効化させてしまおうという考え方のものだ。万が一、ソフト自体にホールがあったとしても、想定外の文字列は受け付けないことでWebサーバ全体のセキュリティレベルを高めるわけだ。

 このオンライン・ムックでは、これまでに情報漏えいの仕組み(関連記事)や、概念(関連記事)について解説してきた。そして、今回は開発と運用の現場で接することの多いCGIについて理解を深めていきたい。最も広がりを見せたこの言語にこそ、サニタイズを理解するためのノウハウが含まれているからだ。

CGIは多くのサイトを支えてきたが

 従来までのサイト(ホームページ)の多くは、HTML(HyperText Markup Language)を直接公開状態のまま記述するケースが多かった。ユーザーからのアクションに応えられるような動的ページは、コストパフォーマンスを考えると大規模開発でもない限り敷居が高かったからだ。しかし、オープンソースソフトウェアの恩恵によって、サーバソフトウェアだけでなく関連するツールや環境が廉価に構築することができるようになった(カスタマイズを行うデベロッパーの力量に支えられている)。そして、サーバ側でプログラムが動作できるようにするための仕組みとして、CGI(Common Gateway Interface)が考案されたのだ。

 CGIを利用して動作するプログラム(ソフトウェア)やソースコードのことを、CGIスクリプトやCGIプログラムと呼ぶ。開発言語はPerl、そして最近ではPHPが使われることが多いが、サーバのプラットフォーム上で動作する仕様であればどのような言語でも構わないのがCGIの仕様なのだ。最近流行のWiki(ウィキ:不特定多数のユーザでのWebページ編集を可能とする仕組み)や、ブログのMovable TypeもCGIスクリプトの集合体である。

 しかし、比較的動的な処理を苦手とするCGIは1997年辺りのブームから徐々に下火となってきており、現在ではPHPなどがWebアプリケーションからの人気だ。そうとはいえ、稼働中のサイトは圧倒的な数だと想像に難しくなく、現在でも掲示板やアクセスカウンタなどに多用されている。

悪意ある要求に素直な出力をしてはならない

 CGIスクリプトはあらかじめサーバへアップロードしておき、ユーザーがWebページを閲覧した時にサーバ上のリソースを使って起動する。Webサーバソフト(Apacheが著名なものの代表格)は、CGIスクリプトの実行結果を受け取り、クライアントへそのまま送り返すという処理の流れだ。このときの実行結果は、HTMLデータであることが多いが、スクリプトの処理によっては画像イメージであったり、単なるテキストファイルであることも多い。エラーなどの場合によっては何らかのスクリプトシステムコードが返される場合もある。最終的に、CGIスクリプトの実行結果をどう解釈するかは、Webブラウザの処理に委ねられるのだ。

 この“スクリプトコード”という仕組みが現在はネックとされる一つであり、ブラウザ側のセキュリティ設定に不備があれば、何をされるか分からない状況なのだ。すべて想定内の処理で稼働しているのがソフトウェアの理想だろう。

 ブラウザ上で動作するスクリプトコードとしては、従来からJavaScriptが存在するが、最近はJavaScript自身のバージョンも上がっており、表現力が増している。悪意あるスクリプトコードを受け取って対策が講じられていないと、ローカルPCから情報が抜かれてしまい任意のサーバなどへ自動送信といったこともできてしまう。

 IEなどで使われるActiveXは、仕様上でレジストリの読み出しも可能としているため厳重な注意が必要となる。もちろん、便利さゆえの機能ではあるが、セキュリティと利便性は裏腹ともいえるのだ。

フォームには規定外の文字列も入ると考えるべき

 いろいろなサイトを見ていると、下画面のようなフォームを見かけるだろう。これはCGIを利用している例の一つだ。HTMLのフォームタグで囲われたテキストボックスにデータを入力すると、内容がCGIに渡されてページが切り替わり、出力データが含まれるページが現れる。HTMLだけの静的なマークアップ言語では実現が難しい。

 なお、このCGIスクリプトはPerlで作成している。興味ある人はソースコード(関連リンク)をのぞいてほしい。

Webブラウザのフォーム例
       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ