過去の日記: 2002/05

以前の日記らしきもの。

戻る


2002/05/26(Sun) [ クロスサイトスクリプティング ]

セキュリティマガジン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 対策として、< や > をサニタイズ (無効化: <&lt;>&gt; に変換すること) するという対処を行なうベンダーや CGI の作者が多いようですが、これだけでは、完全には問題に対処したことにはなりません。

サニタイズする文字は基本的に、 < > & " ' の5文字ですが、場合によっては、半角スペースを含む 6文字になる可能性があります。シングルコーテーションや半角スペースをサニタイズするのは不用な場合もありますが、CGIプログラムを書く人と、HTMLを書く人が違う場合は全て変換しておいた方が安全です。

例えば、HTML に POST や GET などで受け取った文字列(ここでは $str )を HTML 内に埋めこんで出力するときに、スクリプトの該当部分のソースが以下のようになっていた場合、サニタイズする文字は < > & " の4文字です。

<a href="$str">

同じように、

<a href='$str'>

の場合、サニタイズする文字は < > & ' の4文字になります。

いちいち、これらのことを考えていては面倒なので、< > & " ' の 5文字はサニタイズしてしまうのが正しい方法だと思います。

ただ、問題になるのは、

<a href=$str>

のように、$str を " や ' で囲まない場合です(HTMLのサイズの軽減が目的だったり、単純に面倒だということが多いようです)。

その時は半角スペースも &nbsp; に変換しておかないと問題が起こる可能性があります。

$str = "a.html onclick=alert('')";

のような入力があった場合、

<a href=a.html onclick=alert('')>

となり、Javascript が先に起動してしまうブラウザもあります(正しい動作ですが)。ここでは Javascript の onclick を使っていますが、onmouseover などのイベントを使っても同様にスクリプトが起動します。

この場合、XSS を起こすのに、< > & " は不用です。' が &#039; に変換されていても Javascript が動きます(Mozilla 1.0 RC3 で確認しましたが、他のブラウザでも同様に動くと思います)。これを回避するには、半角スペースを &nbsp; に変換するくらいしかありません。

そのような対策をしているサイトは少ない思いますが、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.] クロスサイトスクリプティングを参考にして下さい。

後は、参考程度に。

特殊文字の変換テーブル
'=>&#039;
"=>&quot;
&=>&amp;
>=>&gt;
<=>&lt;
=>&nbsp; (半角スペース)



2002/05/19(Sun) [ cvs サーバ ]

cvs サーバの構築メモなどを確認しながら書いていたら、また時間がなくなってしまった・・・。ここに書くには大きくなりすぎたので、別のファイルで作成しました。

cvs を使っている人にしか分からないような気がするので、 cvs に関しては、使い方を説明しているサイトを参考にしてください。こんなメモを作ったのは、 tcpserver で cvspserver を起動しているところが少なかったので。

ただ、説明を省略し過ぎたかもしれないので、また機会があれば、修正、追記するかもしれません。



2002/05/12(Sun) [ qmail ]

ちょっとスタイルシートの調整とか、qmail 関係のメモを調べながら書いたりしていたら時間がなくなってしまった。時間がないので手短に。

ちなみに、このメモはちゃんと見直しとかチェックをしていないため、間違いが多いかもしれないので、あまり参考にしすぎないで下さい。また時間があればチェックとか修正をする予定。

cvs サーバを構築するメモも書いていたりするのだが、まとめている時間もなさそうなので、次の機会に。

下は今週の気になったニュースなど。コメントを書いている時間は無さそう。



2002/05/06(Mon) [ 明日から仕事 ]

連休も今日で終わって明日から仕事。ゆっくりできたような、できなかったような・・・。

qmail 関係のインストールで、tcpserver についてのメモを作ってみたので、アップロードした。qmail のインストールについてのメモは、また今度にでも・・・。

FreeBSD PRESS No.10 を読んでいて、便利なスクリプトがあったので、自分が使いそうなもののうち、一部をメモ。シェルは bsh系なので、 csh系は少し異なるらしい。

ファイル名の変更は Linux は結構苦手だと思っていたので、結構意外だった。いままでは Windows の DOS 上で ren を使ったりしていたが、今後は Linux でもできそう。

uniq コマンドは -c と言うオプションがあるとは知らなかった。これは、かなり便利かも知れない。man で uniq を見てみると、 -s や -f というオプションもある。これも使い方によってはいろいろとできそう。


2002/05/05(Sun) [ 子どもの日 ]

連休も残すところ、後一日。それにしても、急に暑くなったような気がする。夜は涼しいので、まだましだが、嫌いな夏がまた来るのか・・・。疲れがたまっているらしく、肩こりが酷いのと、調子が悪い。

最近、プロ野球では阪神が妙に強くて意外な感じ。4月だけかと思っていたら、5月に入っても頑張っているようだ。阪神ファンではないが、関西に住んでいる者としては、少し関心がある。ただ、巨人がまた連勝しているのが気に入らないのだが。

後は、google.co.jp のロゴにこいのぼりが入っていたり、Xboxの中古価格が大幅下落していたりNetscape/Mozillaにローカルファイル読みとりの脆弱性が見つかったりと、何かいろいろあった。

そろそろメールサーバを真面目に勉強するために qmail をインストールしたので、その関係のメモを作成中。明日か来週くらいに時間があればアップロードしよう・・・。

では、また、いくつかメモ。

Linux で共有メモリと同時にオープンできるファイル数を増やす方法。

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( Shared Memory Library ) を使用。

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 アプリケーションで、メモリが十分にあるサーバなどでは、パフォーマンス向上の有効な一つの手段になるかもしれない。



戻る