セキュリティマガジン4号でのクロスサイトスクリプティングについての記事や、友人との話題において、少し思ったことがあるので、少しまとめてみました。
XSS というのは、Cross Site Scripting の略で、CSS とも言われます。CSS は Cascading Style Sheets(スタイルシート)の略でもあるため、混在してややこしいので、ここでは、XSS という用語を使います(これについては、 "The Cross Site Scripting FAQ" の "What does XSS and CSS mean?" を参照)。
クロスサイトスクリプティングについては、IPA が公開している、セキュア・プログラミング講座 の [1-2.] クロスサイトスクリプティングに詳しく書かれています。
XSS 対策として、< や > をサニタイズ (無効化: < を < や > を > に変換すること) するという対処を行なうベンダーや CGI の作者が多いようですが、これだけでは、完全には問題に対処したことにはなりません。
サニタイズする文字は基本的に、 < > & " ' の5文字ですが、場合によっては、半角スペースを含む 6文字になる可能性があります。シングルコーテーションや半角スペースをサニタイズするのは不用な場合もありますが、CGIプログラムを書く人と、HTMLを書く人が違う場合は全て変換しておいた方が安全です。
例えば、HTML に POST や GET などで受け取った文字列(ここでは $str )を HTML 内に埋めこんで出力するときに、スクリプトの該当部分のソースが以下のようになっていた場合、サニタイズする文字は < > & " の4文字です。
<a href="$str">
同じように、
<a href='$str'>
の場合、サニタイズする文字は < > & ' の4文字になります。
いちいち、これらのことを考えていては面倒なので、< > & " ' の 5文字はサニタイズしてしまうのが正しい方法だと思います。
ただ、問題になるのは、
<a href=$str>
のように、$str を " や ' で囲まない場合です(HTMLのサイズの軽減が目的だったり、単純に面倒だということが多いようです)。
その時は半角スペースも に変換しておかないと問題が起こる可能性があります。
$str = "a.html onclick=alert('')";
のような入力があった場合、
<a href=a.html onclick=alert('')>
となり、Javascript が先に起動してしまうブラウザもあります(正しい動作ですが)。ここでは Javascript の onclick を使っていますが、onmouseover などのイベントを使っても同様にスクリプトが起動します。
この場合、XSS を起こすのに、< > & " は不用です。' が ' に変換されていても Javascript が動きます(Mozilla 1.0 RC3 で確認しましたが、他のブラウザでも同様に動くと思います)。これを回避するには、半角スペースを に変換するくらいしかありません。
そのような対策をしているサイトは少ない思いますが、HTMLのオプションの引数に、必ず " か ' のどちらかで囲むような実装になっていれば、この問題は起きません。
結論としては、CGI を使って動的に HTML を生成する場合は、面倒だからといって、' や " を省略するようなコーディングはやめた方が安全です。
他にも、CGI を作成する側としては、スタイルシート中に入力文字列を埋めこむとか、Javascript のスクリプト中に入力文字列を埋めこむというような実装をできる限りしないようにする必要があると思います。どうしてもという場合は、予想外のことが起きないように、入力文字列のチェックと、出力時のサニタイズを徹底する必要があります。
例えば、以下のように、
<script type="text/javascript"> var value = '$str'; # ... value を使った処理 ... </script>
script タグに囲まれたスクリプト中にユーザが入力した変数を埋めこんでいる場合についても、HTMLと同様にサニタイズを行なう必要があります。もし、上の例であれば、' をサニタイズしていなかった場合、scriptタグも特殊文字も入力する必要なく、Javascript のコードを実行させることができてしまいます。
また、改行コードが含まれていた場合、Javascript がエラーを起こし、製作者の予想通りに動かなくなることが多いです。このため、XSS 以外の問題にも気を使う必要があり、非常にデバッグが大変になります。
また、スタイルシートの <style type="text/css"> から </style> の間でも、Javascript を使用することができます。このため、スタイルシート中にユーザからの入力変数を埋め込まないようにする必要があります。
詳しくは、上でも挙げた、セキュア・プログラミング講座 の [1-2.] クロスサイトスクリプティングを参考にして下さい。
後は、参考程度に。
' | => | ' |
" | => | " |
& | => | & |
> | => | > |
< | => | < |
=> | (半角スペース) |
トラフィック分析ツールの選び方――目的の明確化とシステムとしての視点が不可欠
IDS と パケットアナライザの選択基準について。読むには、登録の必要があります
プログラミングサイドからセキュアなプログラミング手法を標準化するという文書
パケットモニタツール
オープンソースのブラウザ。まだ1.0の正式版は出ない
Mozilla 1.0RC2 ベースに変更された Netscape 7 のプレビュー版
Windows から、Linux のファイルシステムである、ext2 や ext3 を読むためのツール。かなり久々のリリースらしい。
cvs サーバの構築メモなどを確認しながら書いていたら、また時間がなくなってしまった・・・。ここに書くには大きくなりすぎたので、別のファイルで作成しました。
cvs を使っている人にしか分からないような気がするので、 cvs に関しては、使い方を説明しているサイトを参考にしてください。こんなメモを作ったのは、 tcpserver で cvspserver を起動しているところが少なかったので。
ただ、説明を省略し過ぎたかもしれないので、また機会があれば、修正、追記するかもしれません。
Internet Explorer(IE 5.01SP2, 5.5SP1, 5.5SP2, 6.0) についての累積的な修正プログラムセキュリティホール memo の情報に詳しく書かれています。とりあえず、IE を使っている人はパッチを当てることを強くお薦めします。
Opera 6.01以前にcookie/file/cache漏洩の脆弱性
Opera にもユーザの個人情報漏洩のセキュリティホールがあるらしい。6.02 では修正されているらしいが、Opera のページには詳しい情報はないらしい。
有名な Web サイトで Mozilla が問題なく表示できるか、他の有名なブラウザとの比較などをテストした報告書
総務省が行なったセキュリティ対策の状況調査の結果。
HTML 内部に記述できるスクリプト言語。バグフィックス。
Unix 系 OS の FTP デーモン。
いろいろな OS で動作が可能なメールクライアント。最近は Windows にも移植されていて、Sylpheed for Win32 という名前で開発が進んでいる。少し問題はあるものの、動作するらしい。
Mozilla 1.0RC2 日本語パック リリース版 Ver.1.0
Web ブラウザの Mozilla のメニューなどの表示を日本語化するパッケージ。Mozilla も RC2 になって、問題になっていたセキュリティ問題も修正された。もう1.0のリリースも近いと思われる。
暗号化してネットワーク接続を行うツール。telnet の代用。バグフィックスや実験的な機能のサポートなどが行われているらしい。
ちょっとスタイルシートの調整とか、qmail 関係のメモを調べながら書いたりしていたら時間がなくなってしまった。時間がないので手短に。
ちなみに、このメモはちゃんと見直しとかチェックをしていないため、間違いが多いかもしれないので、あまり参考にしすぎないで下さい。また時間があればチェックとか修正をする予定。
cvs サーバを構築するメモも書いていたりするのだが、まとめている時間もなさそうなので、次の機会に。
下は今週の気になったニュースなど。コメントを書いている時間は無さそう。
連休も今日で終わって明日から仕事。ゆっくりできたような、できなかったような・・・。
qmail 関係のインストールで、tcpserver についてのメモを作ってみたので、アップロードした。qmail のインストールについてのメモは、また今度にでも・・・。
FreeBSD PRESS No.10 を読んでいて、便利なスクリプトがあったので、自分が使いそうなもののうち、一部をメモ。シェルは bsh系なので、 csh系は少し異なるらしい。
for i in *.jpeg; do mv $i `echo $i | sed 's/\.jpeg$/.jpg/'`; done
for i in *.jpeg; do mv $i `basename $i .jpeg`.jpg; done
for i in *; do mv $i `echo $i | tr A-Z a-z`; done
awk '{print $1}' /usr/local/apache/logs/access_log | sort | uniq -c
ファイル名の変更は Linux は結構苦手だと思っていたので、結構意外だった。いままでは Windows の DOS 上で ren を使ったりしていたが、今後は Linux でもできそう。
uniq コマンドは -c と言うオプションがあるとは知らなかった。これは、かなり便利かも知れない。man で uniq を見てみると、 -s や -f というオプションもある。これも使い方によってはいろいろとできそう。
連休も残すところ、後一日。それにしても、急に暑くなったような気がする。夜は涼しいので、まだましだが、嫌いな夏がまた来るのか・・・。疲れがたまっているらしく、肩こりが酷いのと、調子が悪い。
最近、プロ野球では阪神が妙に強くて意外な感じ。4月だけかと思っていたら、5月に入っても頑張っているようだ。阪神ファンではないが、関西に住んでいる者としては、少し関心がある。ただ、巨人がまた連勝しているのが気に入らないのだが。
後は、google.co.jp のロゴにこいのぼりが入っていたり、Xboxの中古価格が大幅下落していたり、Netscape/Mozillaにローカルファイル読みとりの脆弱性が見つかったりと、何かいろいろあった。
そろそろメールサーバを真面目に勉強するために qmail をインストールしたので、その関係のメモを作成中。明日か来週くらいに時間があればアップロードしよう・・・。
では、また、いくつかメモ。
PostgreSQLなどのデータベースサーバで、CPU性能とメモリが十分の場合は、共有メモリや同時オープンファイル数を多くしておくとパフォーマンスが向上する。
/etc/sysctl.conf(変更 共有メモリ:128M ファイル数: 32768)
kernel.shmall = 134217728 kernel.shmmax = 134217728 fs.file-max = 32768
ちなみに、デフォルト状態では、共有メモリ 2M 、最大共有メモリ 32M 、 同時ファイルオープン数 8192。再起動後に有効になる。
現在の値は、/proc/sys/kernel/shmall 、 /proc/sys/kernel/shmmax 、 /proc/sys/fs/file-max を cat などで見ることで確認できる。
PHP は、デフォルトでセッション変数をファイルにして保存するが、それを共有メモリに置くことでパフォーマンスを向上させる。
mm パッケージがインストールされていれば使用できる。RedHat 7.2 ではデフォルトでインストールされている。
PHP のコンパイル時に、--with-mm をつけて configure を行う。例としては以下のように。
./configure \ --with-mm \ --with-apxs=/usr/local/apache/bin/apxs \ --with-pgsql=/usr/local/pgsql \ --without-mysql \ --enable-mbstring \ --enable-mbstr-enc-trans \ --enable-mbregex
あとは、/usr/local/lib/php.ini を編集して、 session.save_handler を変更する。
[Session] ; Handler used to store/retrieve data. ;session.save_handler = files session.save_handler = mm
これで Apache を再起動するとセッション変数が共有メモリに保存されるようになる。頻繁にセッション変数を利用している Web アプリケーションで、メモリが十分にあるサーバなどでは、パフォーマンス向上の有効な一つの手段になるかもしれない。
FlashのActiveXプラグインに脆弱性(スラッシュドット ジャパン)
Flash 6.0r23 以前にバッファオーバーフローの脆弱性があるらしい。対策済みのバージョンがあるので、ダウンロードすること。
Netscape/Mozillaにローカルファイル読みとりの脆弱性
IEでも同じセキュリティホールがあったらしいが、 Mozilla 0.9.2 以降や、Netscape 6.x でもセキュリティホールが存在するようだ。 現在のところ、Mozilla も Netscape もバグ対処バージョンを正式リリースしていない。Mozilla の方は Nightly Build の方で既に修正されているので、分かる人はそちらを使ったほうがいいかもしれない。
mod_python, ppp, Nautilus, DocBook, sudo についてのセキュリティアップデート、バグフィックスがリリースされようだ。
結構前にリリースされていたのだが、書くのを忘れていた・・・。マルチバイト正規表現のサポートなどいろいろと機能が追加されている。
Linux/Unix で動作するダウンロードマネージャ。Windows の ReGet や Iria のようなもの。ページのデザインも変更されている。
Windows、Linux、Solaris で利用可能なオフィス環境。/.J の情報によると、日本語版も用意されているらしい。MS Office と比べるとどうかは知らない。
Unix系マシンでWindows NT互換のファイル/プリント・サーバの機能を実現する。あまり使っていないので、日本語化しなくても大丈夫かは分からない。日本 samba ユーザ会 もあるので、そちらを参照。