HOME | LastUpdate: 2005-06-22
phpsec メーリングリストで "PHP-Based User Authentication Security" という議論に対して Davey 氏がまとめた、安全な Web サイトを構築する 7 つのポイントについての投稿です。
全てを行う必要はないと書かれていますが、参考になることがあるかもしれません。
CSRF(Cross Site Request Forgeries) と呼ばれる攻撃方法についての論文を紹介しています(論文では CSRF のことを Session Riding と呼んでいます)。
論文(Session Riding (PDF))では、多くの例を挙げて危険性を強調しています。場合によってはクロスサイトスクリプティングよりも危険とされています。Web アプリケーションの開発側だけではなく、アプリケーションを使用するユーザも注意する必要があります。
CSRF については、最近までよく知らなかったのですが、2001 年には既にそのような攻撃手法が知られていたようです。Bugtraq の投稿に CSRF についての説明がありました。Cross-Site Request Forgeries (Re: The Dangers of Allowing Users to Post Images)(Bugtraq)。
また、日本語では非常によくまとまっているページがありました。対処方法などは非常に参考になると思います。CSRF - クロスサイトリクエストフォージェリ
XSS cheatsheet の紹介で見つけた、クロスサイトスクリプティングのテストケース集です。
セキュリティホール memo の 2005.01.27 の記事に HTTP Response Splitting Attack という攻撃手法についてのまとめがあります。
HTTP Response Splitting Attack はクロスサイトスクリプティング (XSS) と同様に、web アプリにおける入力値の除染が不十分なことが引金になる。ただし、XSS は「スクリプトとみなされるような入力」を許容してしまうために発生するが、HTTP Response Splitting Attack は「複数の HTTP レスポンスとみなされるような入力」を許容してしまうために発生する。典型的な例として、
- リダイレクトをする web アプリにおいて、
- アクセス元 URL をパラメータ (の一部) としてリダイレクトする場合に、
- パラメータの除染が不十分である
と、HTTP Response Splitting Attack に対して脆弱である、とされている。 (詳細は論文読んでください)
DNS サーバの ISC BIND 8.4.4/8.4.5 と 9.3.0 にセキュリティ問題が見つかっています。
BIND 8.4.4 と 8.4.5 のバージョンに、ネームサーバや IP アドレスを調べる際に使用する配列(q_usedns)の処理で Buffer Overflow が起きる可能性があり、DoS 攻撃が可能という問題が見つかっています。
この問題は BIND 8.4.4 と 8.4.5 のみで、BIND 8.4.6 で修正されています。また回避方法として、named.conf で再起的問い合わせを無効にするという方法が挙げられています。
options { ... recursion no; fetch-glue no; ... }
また、BIND 9.3.0 には、DNS Security Extensions(DNSSEC) が有効になっている場合、authvalidated()
が不正な要求を処理する際に内部整合性テスト失敗し、named が不正終了してしまうという問題が報告されています。
この問題は BIND 9.3.1 で修正されています。また、回避方法として、named.conf で、dnssec-enable
を no
にする(デフォルト値)という方法が挙げられています。
dnssec-enable no;
Windows 上で動作する MySQL に感染するワームが広まっているようです。
MySQL の Security Alert 01/27/2005 によると、MySQL 上に存在するパスワードを設定していない、または、弱いパスワードが設定されている root アカウントを辞書攻撃によって解析し、感染した後、他のシステムに対して感染活動を行うようです。
ワームに感染しているかを確認するためには、MySQL に対して以下の命令を実行し、"app_result" という名前の UDF(User Defined Function) が存在しないかどうかを確認します。
SELECT * FROM mysql.func;
もし、"app_result" が見つかった場合は、感染しています。以下の命令を実行すると駆除できるそうです。
DROP FUNCTION app_result;
感染しないためには、MySQL の全てのアカウントに強いパスワードを設定する、ファイアウォールを使用して MySQL サーバを保護する(Port 3306)という方法が挙げられています。
Squid に WCCP recvfrom() 関数が確保されたバッファ以上のデータを受けるという問題があり、攻撃者から通常より大きな WCCP メッセージを受けると Buffer Overflow を引き起こす可能性があるそうです。
この問題に対する Patch が公開されていますので、適用して Squid を再構築するか、squid.conf の設定で WCCP を無効にすることで回避できます。
WCCP を無効にするには、wccp_router
ディレクティブをコメントアウトします。または、Squid をコンパイルする際の configure オプションに --desable-wccp
を加えることでも無効にすることができるそうです。
(2005.02.06 追加)
PostgreSQL 8.0 の解説記事。登録が必要です。
BSD 系の OS。
PHP でグラフ作成を行うオブジェクト指向のクラスライブラリ。PHP 4.3.0 以降と GD ライブラリが必要です。
データベース管理システム。
Proxy サーバ。Squid 2.5 STABLE8 のリリース候補 2 版。セキュリティ問題への対応が含まれています。
オープンソースのネットワーク侵入検知システム(NIDS)。
オブジェクト指向のプログラミング言語。
Windows で使用できる SCP/SFTP クライアント。
最近見つけた PHP 関連で個人的に興味があったもののメモです。Open Source Web Development - Dev Shed に公開されている文書は勉強になりそうなものが多いです。
PHP でベイジアンフィルタのインターフェースを実装する方法について紹介しています。
クロスサイト・スクリプティングを防ぐ方法についてのメモ。
コマンドラインから外部の PHP スクリプトの脆弱性を調査するツール。include()
関連の問題、クロスサイトスクリプティング、SQL Injection などの問題を調査してくれます。
Squid Advisories に最近報告された問題が追加されています。Squid を使用している場合は、Patch を適用して再構築するか、設定によって問題を回避するようにしておくと安全です。
Patch : http://www.squid-cache.org/Versions/v2/2.5/bugs/squid-2.5.STABLE7-gopher_html_parsing.patch
回避方法 : Gopher に対するリクエストを全て拒否するように設定する(squid.conf に以下の設定を追加して Squid を再起動)
acl Gopher proto Gopher http_access deny Gopher
Patch : http://www.squid-cache.org/Versions/v2/2.5/bugs/squid-2.5.STABLE7-wccp_denial_of_service.patch
回避方法 : squid.conf で wccp_router
をコメントアウトして WCCP を無効にする、または、Squid のコンパイル時に configure
に --disable-wccp
を追加して再構築する
また、Squid には別のセキュリティ問題も報告されています。Patch が公開されています。
Java Plug-In に 2 つのセキュリティ問題が報告されています。
この問題は Java SDK/JRE 1.4.2_06 と 1.3.1_13、5.0 以降のバージョンでは修正されています。
Known Vulnerabilities in Mozilla(日本語訳 : Mozilla における既知の脆弱性 )のページが更新され、Firefox 1.0、Thunderbird 1.0、Mozilla 1.7.5 で修正されたセキュリティ問題についての情報が追加されています。
(2005.01.30 追加)
(2005.02.06 追加)
ImageMagick の PSD ファイルのデコードモジュールに Buffer Overflow の問題があり、任意のコードが実行されてしまう可能性があるそうです。現在は ImageMagick 6.1.9-1 が公開されていますが、この問題は ImageMagick 6.1.8-8 で修正されているそうです。
Xpdf で PDF ファイルを読み込む時の Decrypt::makeFileKey2()
関数に問題があり、不正な PDF ファイルを開くと Buffer Overflow を起こす可能性があるそうです。この問題は Xpdf 3.00pl3 で修正されています。
KDE に含まれる kpdf、KOffice PDF Import Filter なども同じ問題が報告されています。
Ethereal 0.10.8 以前のバージョンに多くのセキュリティ問題が報告されています。Ethereal 0.10.9 で修正が行われていますので、Ethereal を使用している場合はバージョンアップした方が安全です。
企業内での社員教育、学校での授業、各種セミナーや研修などで利用できるように作成された PowerPoint と PDF 資料。
データベース管理システム(RDBMS)。8.0 の正式版が公開されました。多くの新機能やパフォーマンス改善、Windows 環境でのサポートなどが行われています。
オープンソースのオフィス環境。OpenOffice 1.1.4 の日本語版が公開されました。
FTP/SFTP クライアント。
ネットワーク分析ツール。セキュリティ問題の修正が含まれています。
PHP 4.3.0 以上で使用できるグラフ描画ライブラリ。
Windows の修正プログラムが公開されています。
対象: Windows 2000 SP3/SP4, Windows XP SP1/SP2, Windows Server 2003, Windows 98/98SE/Me
最大深刻度: 緊急
参考
対象: Windows NT Server 4.0, Windows 2000 SP3/SP4, Windows XP SP1, Windows Server 2003, Windows 98/98SE/Me
最大深刻度: 緊急
参考
対象: Windows 2000 SP3/SP4, Windows XP SP1, Windows Server 2003
最大深刻度: 重要
参考
Microsoft がウイルス対策のツールを公開しています。
Mozilla や Mozilla Firefox でダウンロードダイアログを偽装される問題についての追加情報がありました。
Opera 7.54u1 for Windows 以前のバージョンで data:
で始まる URI の扱いに問題があり、ダウンロードダイアログに間違った情報を表示してしまう問題があるそうです。
現在のところ、信頼できない場所からのファイルを開かないようにして対処するしかないようです。
Squid に、NTLM fakeauth_auth Helper の DoS 攻撃の問題、"WCCP_I_SEE_YOU" メッセージの扱いに問題があり、Squid がクラッシュする問題、"gopherToHTML()" 関数で Buffer Overflow を引き起こしてしまう問題が報告されています。
Patch が公開されていますので、適用することでこの問題を回避できます。
Vim 6.x に安全でないテンポラリファイルを作成してしまう問題が報告されています。
Vim に含まれる tcltags と vimspell.sh のスクリプトで安全でないテンポラリファイルを作成することがあるため、シンボリックリンク攻撃 (IPA セキュアUnix/Linuxプログラミング)を受けてしまう可能性があるそうです。この問題は Vim 6.3 で報告されているそうですが、他のバージョンでもおそらく同じ問題があると考えられるそうです。
今年に入ってから [phpsec] PHP Security Mailing List という PHP のセキュリティ関連のメーリングリストができたようです。以下の内容が取り上げられるそうです。
海外でも広く使用されている PHP アプリケーションのセキュリティ問題や PHP 自体のセキュリティに関心のある人は参加しておくと良さそうです。
参加してみたところ、最近の投稿としては、以下のようなものがありました。
Mozilla と Firefox にダウンロードダイアログの表示を偽装される問題が報告されています。この問題が修正されたバージョンはまだ公開されていませんので、信頼できないサイトからファイルをダウンロードしないように気を付ける必要があります。
SSH によるポートフォーワーディングの設定、コマンドオプションについての説明。
SQL Injection について、例を挙げての説明。
オブジェクト指向のプログラミング言語。
ネットワーク負荷の監視、グラフ化ツール。バグ修正が行われています。
データベース管理システム(RDBMS)。リリース候補の第 4 版
今年もよろしくお願いします。
include()
、require()
を使用して感染を広げるワームが出現しています。この問題に対する回避方法と調べた事などについてメモしておきます。何か間違いなどがありましたら指摘してください。
まず、ワームの回避方法についてですが、確実な方法は、include()
、require()
に変数を渡している場合、変数を渡す前に不正な値が入っていないか確認することです。
その際に、以下の点についてチェックを行っておくと安全です。また、以前に、PHP と Web アプリケーションのセキュリティについてのメモのPHP の include(), require() 関連の問題についてでまとめていますので、詳しくはそちらの方を参照してください。
include()
、require()
などのファイル名を扱う関数の多くは、
NULL バイトが含まれていると、その前までの文字列までしか処理しません。
以下のように、入力文字列から NULL バイトを削除しておくと、この問題は気にする必要はありません。
NULL バイトが引き起こす問題については、Null Byte Attack を参照してください。
$name = str_replace( "\0", '', $name );
include()
などを行う前に、preg_match()
などの正規表現関数によって、
チェックを行っても良いと思います。ただし、NULL バイトが含まれないように、"."(全ての文字列にマッチする)は
使用せず、また文字列全体をチェックしてください。
if ( ! preg_match( '/^\w+$/', $name ) ) { // 不正な文字列が含まれていた場合の処理 exit; }
include()
を行う前にファイルの存在確認
include()
によって、外部のサーバからファイルを読み込むということは少ないと思いますので、is_file()
や file_exists()
などの関数によって、読み込み対象ファイルが存在するかどうかを確認しておくと安全です。file://...
や http://...
などが入力文字列に含まれていた場合、is_file()
や file_exists()
関数は FALSE を返します。
$filename = $dir . $name . '.php'; if ( ! is_file( $filename) ) { // 不正な文字列が含まれていた場合の処理 exit; }
注意として、上位ディレクトリを表す ../ や NULL バイトが含まれていないか、先にチェックを行っておいてください。../ を排除するために、basename()
を使用すると便利です。
switch
文や配列を使用した対処方法
読み込み可能なファイルが決まっている場合は、以下のように、switch
文や配列によって、include()
の引数に渡すことが可能な文字列を制限する方法があります。
switch ( $name ) { case 'file1' : case 'file2' : case 'file3' : include( $dir . $name . '.php' ); break; default : // 不正な文字列が含まれていた場合の処理 exit; }
$allow_list = array( 'file1', 'file2', 'file3' ); if ( ! in_array( $name, $allow_list ) ) { // 不正な文字列が含まれていた場合の処理 exit; } include( $dir . $name . '.php' );
ワームの対処方法として、php.ini の設定で allow_url_fopen
を Off
にして、PHP から外部へのアクセスを禁止するという方法がありますが、この設定を行えば安全というものではありません。以下の問題があります。
allow_url_fopen
は PHP 4.3.4 以前では PHP_INI_ALL
(どこでも設定可能なエントリ)であり、
セーフモードが Off の場合は、PHP スクリプト中で変更可能です。
allow_url_fopen
は PHP 4.3.5 から PHP_INI_SYSTEM
(php.ini または httpd.conf で設定可能なエントリ) に変更され、PHP スクリプト中では設定変更ができないようになっています(PHP 4.3.5 の ChangeLog)。
include()
に php://input
が入ると、POST で渡された文字列を PHP スクリプト
として実行できてしまうという問題があります
([PHP] include() bypassing filter with php://input)。
こちらの問題は、allow_url_fopen
が Off
になっていて実行されます。
allow_url_fopen
を Off
にしていても、fsockopen()
関数による外部サーバへのアクセスは可能です。これらを利用すれば、allow_url_fopen
を Off
にしているサーバに対してでも感染するワームが作成できてしまうと思われます。
PHP スクリプトを変更せずに、他の方法でワームの問題に対処する方法もあるようです。
PHP に対する Patch 集で、include()
などに関連する問題に対処を行っています。この Patch を適用して PHP をコンパイルすることで、様々なセキュリティ問題に、PHP 側で対処を行ってくれます。
現在は、PHP 4.3.9, PHP 4.3.10, PHP 5.0.3 に対する Patch が公開されています。
Apache などに組み込むセキュリティモジュール。ルールを作成することで、危険なアクセスを PHP に実行させないようにすることが可能です。
PHP スクリプトのミスを利用して感染を広げるワームが広まっているようです。include()
、require()
を使用して感染するワームですので、外部から入力される値をinclude()
や require()
に渡している場合、危険な場合があります。
不正な値が入らないように入力チェックを行うことで、感染は回避できます。
まだ修正されていない Internet Explorer のセキュリティ問題を利用したウイルスが出回っているようです。
Active スクリプト、Active X を無効にするなどの対処を行うことで回避できるようです。または、Internet Explorer のセキュリティ上の問題 "クリックとスクロール" からコンピュータを保護する方法 を参考に対処を行ってください。
Mozilla 1.7.3 以前のバージョンの NNTP プロトコルの処理部分の関数に問題があり、"news://" から始まる不正な URI 入力されると、任意のコードを実行されてしまうそうです。
この問題は、Mozilla 1.7.5 で修正されています
2005年 1月30日分を追加。
2005年 1月23日分を追加。
2005年 1月16日分を追加。
2005年 1月10日分を追加。
このページを作成。2005年 1月 3日分を追加。
LastUpdate: 2005-06-22 | HOME