年: 2005年

PHPに重大な脆弱性(PHP4.4.0以下、PHP5.0.5以下)

このページ情報は不正確です。このページを参照された方は

まとめ
http://blog.ohgaki.net/index.php/yohgaki/2005/11/09/phpa_rc_fei_a_oa_oa_fa_sa_le_acsa_oe_afp_2

を参照して頂けるようお願いいたいたします。

PHPの脆弱性リスト


PHPに深刻な脆弱性がある事が発表されました。今まで見つかったPHPの脆弱性の中でも「最悪」の脆弱性です。全てのPHPユーザは今すぐ対処を行う必要があります。

http://www.hardened-php.net/advisory_202005.79.html
http://www.hardened-php.net/advisory_192005.78.html
http://www.hardened-php.net/globals-problem

PHP4とPHP5で多少影響範囲が異なります。詳しくはオリジナルのアドバイザリと脆弱性の説明を読んでください。この脆弱性は非常に危険です。特にオープンソースのPHPアプリケーションを使用している場合、速やかに対処される事をお勧めします。

PEARを利用していない場合PEARファイルを削除するなどの対処も、一時的には、有効な対策になると思います。
# この対策は脆弱性をほんの少し隠すくらいの意味しかありません。
## ワームなどに利用される可能性が高いPEAR.phpにアクセスさせない為
# PHP本体をアップグレードしないと根本的な対策となりません。

PHP4はPHP4.4.1にアップグレードすれば大丈夫です。PHP4.4.xはソースの埋め込み定数参照の仕様が変更されているためプログラムが動作しなくなることがあります。(念のため)

WikiにPHP 4.3.11、PHP 5.0.4用とPHP 5.0.5用のパッチを載せました。

http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2F%24GLOBAL%CA%DD%B8%EE%A5%D1%A5%C3%A5%C1

PHP5.0.5はPHP4.4.0と同様に埋め込み定数参照の仕様が変更されています。PHP 4.3 -> PHP 4.4と同じ互換性問題がPHP 5.0.4 -> PHP 5.0.5で発生します。この為PHP 5.0.4とPHP 5.0.5の両方を用意しました。

パッチを見れば判りますがPHP 5.0.6となるCVSのPHP_5_0ブランチにはこの変更は組み込まれています。

脆弱性の説明から

Impact of GLOBALS overwrite

The impact of this kind of vulnerabilities is very high, because the problematic code seems to be secure unless you know about this behaviour of PHP and therefore very many applications are vulnerable to this problem. Additionally it is problematic, that the heart of PEAR (PEAR.php) also suffers from this vulnerability in PHP, although their code is written in a way that should be safe onder normal circumstances.

According to PHP usage statistics 71.03% of all servers, that announce a PHP4 version within their HTTP headers, are still using PHP <= 4.3.10. This actually means that most of the servers out there are running with old versions of PEAR where a application gets automatically vulnerable if it includes PEAR.php and is running with register_globals turned on. And this also means, that any PHP application that suffers from a local file include vulnerability can be easily turned into a remote code execution vulnerability by simply including the local copy of PEAR.php, that is usually in standard (or easyly guessable) paths. Additionally the PEAR directory is often trusted and therefore added as safe_mode_include_dir or to the open_basedir, so that it is even possible to include PEAR.php if SAFE_MODE or open_basedir is used to secure the system.

In the end it is simply unknown how many PHP applications suffer from these problems, because the problem is often overseen, widespread and unknown to a lot of security auditors. And with PEAR.php and vBulletin there are already two very big names on the list of affected applications.

要約すると

– この脆弱性は非常に危険
– さらに悪いことにはPEAR.phpもこの脆弱性の影響を受ける
– 世の中にはPHP 4.3.10以下のサーバが多くある
(注:4.3.10以下はさらに危険。4.3.11で$_GET/$_POST/$_COOKIEの脆弱性が対処されている)
– PEAR.phpのインクルードパスは信頼されている場合が多く、safe_mode, open_basedirによる保護が効かない
– 影響を付けるシステム、アプリケーションは数え切れないほど多い

PHP4ユーザは少なくとも今すぐPHP 4.3.11にアップグレードし、さらに$_FILESの脆弱性を埋めるパッチを適用するべきです。

PHP5ユーザはPHP 5.0.4またはPHP 5.0.5にアップグレードし脆弱性に対するパッチを適用するべきです。

なか見!検索 – Amazonでも中身が見れる

使用許諾は随分前だったのですがやっとAmazonの本文参照サービスがスタートしたようです。「はじめてのPHP言語プログラミング入門」も中身が見えるようになりました。

本に表記されているページ数で言うと20ページまで見ることができました。個人的にはもっと見えるようになっている方が良いと思います。

「はじめてのPHP言語プログラミング入門」はプログラミング初心者には不評、プログラミング経験者には好評、と評価がはっきり分かれる本なのでネットでもう少し読めた方が読者満足度が増して良いと思うのですが…

MySQL 4.1, 5.0の文字化け回避

日本人には必要なオプションがmysqldのオプションに追加されたようです。4.1.15、5.0.15以降なら使えるそうです。

A new command line argument was added to mysqld to ignore client character set information sent during handshake, and use server side settings instead, to reproduce 4.0 behaviour (Bug #9948):

mysqld –skip-character-set-client-handshake

ちょっと乱暴ですがPostgreSQLなら「initdbのオプションに–no-localeを付ける」にあたいするくらい重要かも知れません。

不要なドメインは使わない

このブログの「新しいドメインの仕組や新ドメインは必要か?」等で時々新しいドメインは不必要と書いていますがDomainKeysの例が解かりやすいと思います。

Yahoo! AuctionがDomainKeysに対応したそうです。

ただしこのときユーザは、そのドメインが自分の登録しているサービスや金融機関等がもつドメインなのかどうか、を自分自身で知っている必要がある。

当り前ですがユーザがこのドメインは信頼できる、と知っていなければDomainKeysは役に立たないのです。

組織によってはやたらとブランドやサービス毎に新しいドメイン名を持ちたがる所があります。例えば

  • brand-a.jp, brand-b.jp 等商品ブランド毎にドメインを持つ
  • service-a.jp, service-b.jp 等サービスタイプ毎にドメインを持つ

等です。そして最悪なのが「組織ドメイン名+サービス・ブランド名」を使っている場合です。

  • brand-a-company.jp
  • service-a-company.jp

この様なドメインと使うと「私のサイト利用者をどうぞフィッシングしてください」と言っているようなものです。

googleやsony等の大企業が特定のサービスやブランド、gmailやplaystation等、を本気でプロモーションする等のケース以外は全て自社ドメインのサブドメインとするべきです。例え大企業でも出来る限り自社ドメインのサブドメインを使ったサイトを構築した方がユーザにとって親切です。

brand-a.jp や brand-a-company.jpではなく

  • brand-a.company.jp

とした方がユーザにとってドメインが信用できるかどうか判り易いのは明らかです。

しっかりとプロモーション、SEO対策を行えば自社ドメインのサブドメインとしてサービス、製品サイトを作っても何の問題もありません。中途半端にしかプロモーションしないのであれば新規の組織レベルドメインは有害でさえあります。不要/無用/有害なドメインが多すぎると感じるのは私だけでは無いと思います。

# ここではDomainKeysに対応したというニュースに対して
# コメントしていますが、httpsでも全く同じ問題が発生
# します。無用なドメインは排除するべきでしょう。
# 特に国際化ドメインは信頼できるサイトとしては乱用
# を防ぐために保持する事は避けられませんが、使用する
# べきでは無いと考えています。

Nessusがクローズドソースにライセンスを変更

このニュースは随分前(10月はじめ)のアナウンスですが先週末知りました。

Nessusはセキュリティ脆弱性スキャナーとして最も人気が高いオープンソース製品(GPL2)です。現在はVersion2系が最新リリース版ですが、多くの機能、性能が向上しているとされているVersion3系のソースコードは公開されないようです。

Nessus 3 is major enhancement of the key components of the Nessus engine – the NASL3 intepreter has been rewritten from scratch, the process management has changed to reduce the overhead of executing a plugin (instead of creating NxM processes, nessusd now only creates N processes), the way plugins are stored has been improved to reduce disk usage, etc…

Nessus 3 also contains a lot of built-in features and checks to debug crashes and mis-behaving plugins more easily, and to catch inconsistencies early.

As a result, Nessus 3 is much faster than Nessus 2 and less resource intensive. Your mileage may vary, but when scanning a local network, Nessus 3 is on average twice as fast as Nessus 2, with spikes going
as high as 5 times faster when scanning desktop windows systems.

Nessusはセキュリティ確保の為のスキャナーとして利用されますが、個々の脆弱性を検査するプラグインには度々不備が見つかっています。中にはコマンド実行を可能とする物も少なくありません。Nessus3のエンジン部分は1から書き直され、Nessus3ではスキャン性能が向上し動作がおかしいプラグインをより容易く検知できるようになっているようです。

Nessus 3 will be available free of charge, including on the Windows platform, but will not be released under the GPL.

Nessus 3 will be available for many platforms, but do understand that we won’t be able to support every distribution / operating system available. I also understand that some free software advocates won’t want to use a binary-only Nessus 3. This is why Nessus 2 will continue to be maintained and will stay under the GPL.

To make things simple :

  - Nessus 2 : GPL, will have regular releases containing bug fixes
  - Nessus 3 : free of charge, contains major improvements

問題のNessus3がクローズドソース製品になってしまう、という部分です。要旨は次の通りです。

  • Nessus3はWindow版も含め無料で利用できる
  • Nessus3のライセンスはGPLではない
  • Nessus2とNessus3はほとんどのプラグインを共有する
  • Nessus2はGPL版としてメンテナンスされる

Nessus2のメンテナンスも継続されるようですが新しい機能を利用するにはNessus3が必要になるようです。

何故クローズドソースにライセンスを変更するか?という部分ですが作者(セキュリティ系の製品・サービスを提供しているらしい)競争相手との競争に負けないようにするためだそうです。ソースを公開すると競争相手に取り込まれてしまい…. と言った状況になっている(なる?)らしいです。

Nessus2とNessus3はオープンソースの新しいビジネスモデルとしても興味深い点が多くあります。これからどうなっていくか注目ですね。

PHPで記述されたnanoftpd

PHPで記述されたWebサーバ、nanowebが公開されたのは随分前で確かsoket関数に地雷が沢山埋まっている頃だったと思います。地雷にもめげずよく作ったものだ、と関心した事を覚えています。

PHPで記述されたFTPサーバ(nanoftpd)公開されていたんですね。PHPは使えるけどFTPは使えないサーバに便利かも知れないですね。

MySQL5リリース

#ちょっと遅いのですが自分用のメモとして。

10/24にMySQL5が正式リリースされました。

新しい機能として

  • ストアドプロシージャ
  • トリガ
  • カーソル
  • スキーマ
  • XAトランザクション

サポートされています。

FEDERATED Tablesと呼ばれる他のMySQLサーバのテーブルとリンクする機能も追加されたようですがこれはPostgreSQLのdblinkと同類の機能ですね。

dblink/
ここには2つの関数が提供されています。1つ(dblink())はリモートデータベースに 対して実行したいSQLのクエリーの結果をポインタを受け取るものです。引数を2つ (接続するデータベースを標準のlibpq形式で記述したものと実行したいSQL文)渡すだけで リモートデータベースから結果を受け取ることができます。もう1つはdblink()の結果から 各フィールドの結果を文字列で返すものです。構文や使用例は、このディレクトリにある README.dblinkを参照してください。

http://www.sraoss.co.jp/PostgreSQL/7.2/contrib.html

Wikiの場所を移動しました

前からWiki(http://www.ohgaki.net/wiki/)をhttp://wiki.ohgaki.net/に移動しようと思っていたのですがやっと移動しました。

Web管理者には珍しい話でも機能でもなんでもありませんが、新しいホストで前のコンテンツが表示できるようにした後、Apacheのmod_rewriteを使ってwww.ohgaki.netのバーチャルホスト設定に次の設定を入れるだけです。

RewriteEngine on
RedirectMatch ^/wiki/(.*) http://wiki.ohgaki.net/$1

引越はmod_rewriteで。

# 何故こんな事を書くかというと今日某ISPサイトのお知らせサービスに
# 登録したのですが登録後のリンクが切ていたので…
# ちなみにIISでも同様の事が可能です。

Weblog Usability: The Top Ten Design Mistakes

最近「ブログデザイン10の間違い」というページが結構人気らしい、原文は英語なので10項目だけ意訳するとこんな感じでしょうか?

  • 著者の略歴が無い
  • 著者の写真が無い
  • 本文の内容を推測できない投稿タイトル
  • リンク先が明示されていない
  • 古い人気投稿を埋もらせない
  • カレンダーのみのナビゲーション
  • 不定期な投稿
  • ごちゃまぜなトピック
  • 未来の上司に対して記述している事を忘れている
  • ブログサービスのドメイン名が入ったブログを使っている

少なくともb2evolutionがデフォルトで提供してくれている機能+最後の独自ドメインというのはクリア :)

PHPのlintモード

エラーハンドラでE_ERRORを処理できるようにして関数名などのタイポに対応できても、タイポによる構文エラーに対処できなければ意味が無いよね?と言う事でlintモードの紹介です。

随分前のPHPからlint(構文をチェックするモード)はあったのですがあまり使われていない(?)ような気がします。実際、かなり長い間壊れていた事もあります。最近のPHPのlintモードは壊れていないので-lオプションを使ってチェックすれば思わぬ構文エラーによるスクリプトの停止も免れます。

いくらエラーハンドラでエラーをwebmasterに通知していても構文エラーには無力です。特にアプリの新規作成時や大量の変更がある場合にはlintモードを使う方が良いでしょう。詳しくはWikiに書きました。

ユーザ定義エラーハンドラの拡張パッチ

最近のPHPはE_ERROR(未定義の関数呼び出しなどで発生)をユーザ定義エラーハンドラで処理できません。これはE_ERRORが発生した場合、必ずeixtを呼び出しスクリプトの実行を停止しないと誤作動する問題に対処した為です。

随分前(PHP 4.3がリリースされた頃)からこんな感じでパッチを書けばよいです、と紹介はしていたのですがWikiに書きました。よろしければご利用ください。ユーザ定義エラーハンドラに問題(E_ERRORが発生する等)が無ければE_ERRORでexitすれば問題は発生しないはずです。万が一、関数名をタイポしていてもエラーページを表示しwebmasterに通知する処理などをエラーハンドラに定義できるので有用です。

php内部でのmmapの使い方

遅ればせながらPHP 5.0.5使っていて直しているだろう、と思い込んでいたバグが直っていない事に気が付きました。

PHP内部のphp_stream_passthru()関数はreadfile()やfpassthru()関数に利用されているのですがmmapの使い方がいい加減です。PHP 4.3.xのバグレポートでreadfile()で大きなファイルが読めない旨のバグレポートがあったので全てのブランチで直っている、と思っていたのが間違いでした。

mmapは名前通りファイルをメモリにマップする関数です。メモリマップすることにより典型的なファイルI/Oコードに必要なバッファへのコピー、その後の出力、というステップがメモリからの読み出しと同時に出力、とバッファコピーが減るメリットがあります。

メモリにマップするので色々制限があります。特に32bitシステムでは小さいファイルしか(と言っても2GBくらいのファイルなら取り扱えますが)取り扱えない、メモリ圧迫する(2GBのファイルをマップすると、2GB mallocが失敗するなど)の問題があります。さらに比較的大きなファイルを実際に読み出すとスワップの嵐になるシステムも… 当たり前といえば当たり前の制限です。

と前置きしたのでPHP 5.0.5でどうなっていたかと言うと「mmapをサポートするシステムの場合、ファイル全体をマップする」ようになっています。当然前述のような問題が発生します。そこで2MB以上のファイルはmmapできないようにしています…

PHPAPI char *_php_stream_mmap_range(php_stream *stream, size_t offset, size_t length, php_stream_mmap_operation_t mode, size_t *mapped_len TSRMLS_DC)
{
SNIP
/* For now, we impose an arbitrary 2MB limit to avoid
* runaway swapping when large files are passed thru. */
if (length > 2 * 1024 * 1024) {
return NULL;
}

別にこれ自体はそれほど悪い事(2MBなどと非常に小さい値にしている事は除いて)ではないのですがこのおかげでphp_stream_mmap_range()を利用する、恐らく、ほとんどの関数で2MB以上のファイルを正しく取り扱えなくなっているようです。

中途半端に使える物は使わない方が良いのでmmapを使わせないようにするには

– PHPのランタイムからはstreamのオプションでmmapを使わないよう全てのスクリプトで設定する(iniオプションが無い!)
– 次のパッチを当ててPHPをリビルドする

等として回避する必要があります。

diff -ur php-5.0.5.orig/main/streams/php_stream_mmap.h php-5.0.5/main/streams/php_stream_mmap.h
— php-5.0.5.orig/main/streams/php_stream_mmap.h 2004-02-20 17:22:12.000000000 +0900
+++ php-5.0.5/main/streams/php_stream_mmap.h 2005-10-23 10:23:56.492890384 +0900
@@ -62,7 +62,7 @@

/* Returns 1 if the stream in its current state can be memory mapped,
* 0 otherwise */
-#define php_stream_mmap_possible(stream) (!php_stream_is_filtered((stream)) && php_stream_mmap_supported((stream)))
+#define php_stream_mmap_possible(stream) 0

BEGIN_EXTERN_C()
PHPAPI char *_php_stream_mmap_range(php_stream *stream, size_t offset, size_t length, php_stream_mmap_operation_t mode, size_t *mapped_len TSRMLS_DC);

きちんと直すの事も簡単(チャンク単位でmap, unmapを繰り返す)なのですがとりあえず情報として…

# この問題、開発者が理解してないかも…

アンチウィルスソフトには優先度制御が必須…

最近Windowsマシンとして使っているPCのHDDが壊れてHDD交換&再インストールしたのですがアンチウィルスソフト(Noton AntiVirus:以下NAV)プロセスの優先度を下げる為にインストールしていたAutoGearと言うプログラムはまだインストールしていませんでした。AutoGearはアンチウィルスソフトには必須かも知れませんね。

メールクライアントにはThunderbirdを利用しています。NAVがメールをスキャンしてくれるのは良いのですが一生懸命スキャンしすぎて他のプロセスが遅くなりすぎです。IMEさえまともに反応しなくなります。AutoGearをインストールしてccApp.exeの優先度を「低」に設定して一件落着です。しかし元々もう少しお手柔らかにスキャンするように設定しておいた方が良いような気がします。PentiumM 1.3GhzなのでそれほどCPUが遅い訳でもでも無いですが、スキャン時の遅さは耐え難い物があります。

VMware Playerを使ってみる

やっとVMware Playerがダウンロードできました。
Windowsバイナリ、Linux RPM、Linux tarがダウンロードできるようになっていました。
マニュアルのページを見るとPDFマニュアルには日本語版もありましたがVMware Playerの日本語マニュアルはまだのようでした。

VMwareのWebサイトによると基本機能(Key Features)としては以下であるとしています。

* Run any virtual machine. Run virtual machines created by VMware Workstation, GSX Server or ESX Server. VMware Player also supports Microsoft virtual machines and Symantec LiveState Recovery disk formats.
* Revert to previous state. Revert virtual machines to a previous ‘clean’ state within seconds.
* Access host PC devices. Use host CD/DVD drives, network adapters, and plug-and-play USB devices.
* Copy and paste. Copy text and files between the virtual machine and the host PC.
* Drag and drop. Drag and drop files between a Windows host PC and a Windows virtual machine.
* Shared folders. Use shared folders to easily share files between virtual machine and the host PC.
* Multiple networking options. Virtual machines can share or obtain new IP addresses or be isolated from the network and host.
* 32- and 64-bit host and guest operating system support. Run a wide variety of virtual machines containing 32- and 64-bit operating systems simultaneously on the same physical PC. Compatible 64-bit guest operating systems include select Microsoft Windows, Red Hat, SUSE, and FreeBSD distributions.
* Adjustable memory. Tune virtual machine memory for optimal performance.
* Configurable shutdown. Power down or suspend the virtual machine when closing VMware Player.

普段はLinux版VMwareしか使っていないのですが、実はこのPlayerのアナウンスが出る前日にVMware for Windowsを追加購入しています。VMware PlayerをWindows XPホスト、Windows 2000ゲストで使ってみた感想は「VMware Playerで十分だった orz」です。VM再起動時に自動的に初期状態に戻るような事もありません。Snapshotは取れないようですがVMのファイルを保存しておけばsnapshot代わりになるのであまり困らないでしょう。

気を付けないとならないのはFDD、CDROMなどのデバイスです。VMware Playerの名前の通りVMの設定をメモリ以外は全く変更できないようです。当然ですがWindowsとLinuxではデバイスの取り扱いが異なるのでLinuxで作成した仮想マシンはWindows上でも動作するのですがデバイスの再作成が必要になります。(Linuxで作成したVMのFDD,CDROMを削除してWindows上でFDD,CDROMを追加するなど)今時FDDは必要も無いかもしれませんがCDROMが使えないと困ると思います。VMware Player用にVMを配る場合は、Windowユーザ用、Linuxユーザ用、2種類用意する方が良いと思います。デバイスが無いというエラーを表示させたくない場合は思い切りよく予めFDDとCDROMデバイスを削除しておいても良いと思います。

広く公開するにはメモリの大きさにも注意が必要かも知れません。試していないので何とも言えませんが1GBのメモリを割り当てているとメモリが少ないシステムでは困った事になるような気がします。「Adjustable memory. Tune virtual machine memory for optimal performance.」とあるので大丈夫なのかも知れません。一応 VMware Playerでも「Player->Troubleshoot->Change Memory Allocation…」からメモリサイズだけは変更できるようになっています。

VMwareToolsのインストーラはVMware Playerには付属していないように見えます。VMwareToolsをインストールしておいた方が良いと思いますが、Key FeaturesにはVMwareToolsがインストールされていないと利用できない機能が記述されているのでもしかしたらインストールする方法があるのかも知れませんね。どちらにしてもVMwareの機能を十分発揮するにはVMwareToolsのインストールは必須です。VMware Workstationでインストールしておくべきでしょう。

当り前と言えば当り前ですが画面サイズは自由に変更できます。少し驚いたのはVMware Playerウィンドウ右上あたりにあるVMwareアイコンをダブルクリックすると画面が最大化されWindowサイズも自動的に解像度に合わせて調整された事です。(1024×768->1400×1050) 最大化した画面でもVMware Playerのツールバーのような物が画面上に表示されていました。このツールバーは制御がホストOSにつながっています。ゲストOSのウィンドウを最大化してもツールバーの下にウィンドウが表示されて不便だなと一瞬思いましたが、このバーの左にある押しピンアイコンをクリックするとWindowsの「タスクバーを自動的に隠す」と同じ様な感じで隠れてくれるようになりました。この機能意外に便利です。このあたりの動作はVMware Workstationと動作が異なります。VMware Workstationでも似たような動作になると良いですね。

最後にWindowsホストではVMware WorkstationがインストールされているとVMware Playerはインストールできないようです。試す場合は予めVMware Workstationをアンインストールしておく必要があるようです。
# RPM版 LinuxはVMware Workstationとconflictするのかな?