まだ重たいCMSをお使いですか?
毎秒1000リクエスト を捌く超高速CMS「adiary

2006/09/13(水)β9リリース情報

ダウンロードはこちらから

トラックバックされた不具合を修正し上記ファイルを差し替えました 2006/09/15

設定を保存するとタイトルイメージなどが強制的に追加される不具合を修正しました。お困りの方はお手数ですが落としなおしてください。

β8→β9の変更点

今回はbug-fixとXSS対策がメインです。

  • XSS対策】CSSXSSされない対策/CSSによるXSSをさせない対策を取りました。また一部のXSS対策が不十分だったため修正しました。
  • 【スケルトン】<span class="adminmenu">全体を<span class="admin-links">で括りました(idea by kaede)。
  • 【さつきパーサ】[hatena:help:はてな記法一覧:はてな内リンク記法]への互換性を高めました(adiaryでは[hatena:r:sample]などと使用します)。
  • 【fix】スケルトンコンパイラにおいて括弧 ( )対応の検出が狂っていたので修正しました*1
  • 【fix】コメント等編集画面から、日記を削除できなくなっていたので修正しました。
  • 【fix】日記インポート画面にエラーがある不具合を修正しました。
  • 【fix】はてなテーマ使用時にIEで表示が崩れる問題を修正しました。
  • 【fix】任意の日記帳作成画面が表示出来なくなっていたので修正しました。
  • 【テーマ】「lfdiary」を最新版(β8で一部の表示が崩れる問題に対応)に差し替えました。
  • 【テーマ】テーマ「このみ」を収録しました。
  • その他、細々とした修正。
  • その他、細々としたクラスの追加。

β6以降からのアップグレード

そのまま上書きしてください。

β5以前からのアップグレード

adiary.conf.cgi に次のエントリを追加してください。

<$Temp_dir = 'data/tmp/'>

*1 : この影響で標準アップローダの最大サイズ表示が狂っていました。

コメント

IE向けのセキュリティー対策は不毛ですね。やらないわけにはいかないし、やったから言ってと少しも機能が増えるわけでもなく無駄にソースが増えるばかり*2。その上、機能追加より何倍も手間がかかりモチベーションも上がりにくいという(;;

*2 : せっかくシステム全体を軽く作ってるのに

2006/09/12(火)adiaryのXSS対策

Version1.00β9以降についての記述です。

対外部ユーザー=アカウント非保持者

  • コメント欄、TBなどのtag記号<, >, "はすべてエスケープ。
  • USER_AGENT, DNS逆引きホスト名内のタグ文字などをエスケープ。
  • PATH_INFOなどの文字列は、エスケープなしに(表示等に)使用しない。
  • CSSXSS対策。「{」を「&#123;」に置き換える。

対内部ユーザー=アカウント保持者

  • 日記内や日記の紹介、RSSなどで使用可能なタグと属性値をホワイトリスト式とする。
  • タグの href, src, site, cite, action属性では、登録されたプロトコル以外で始まるリンクを消去*1。相対パスの場合は"./"を付加。
  • タグの最後の属性値が0x80以上の文字で終わる場合、スペースを付加するかさらに後ろにダミーの属性値xss=""を追加する(EBXSS対策)。

*1 : &#58;, &#058;, &#x3a;などは":"に戻してから処理します

スタイルシートXSS対策

日記本文内の style="" 指定

  1. \, @記号および、0x00~0x1fの制御コード、0x80~0xffまでの文字コード(全角文字など)を除去
  2. /*, */, &#, script, java, exp, eval, cookie, includeといった文字列が完全になくなるまで除去*2

ユーザースタイルシート内

  1. TAB, LF以外の制御文字を除去する。
  2. コメントを最初に退避し、"*/""*/ "に置き換える。
  3. "~"といった文字列(改行を含む)を退避し、文字列内から改行を除去*3、さらに日本語文字で終わる場合はスペースを付加する。(EBXSS対策
  4. ", ', *, #を除く文字の、手前に付く\記号を除去する。
  5. 0x80~0xffのコード(全角文字など)をすべて消去する。
  6. /*, */, &#, script, java, exp, eval, cookie, includeといった文字列が完全になくなるまで除去する。
  7. TAB や LF を間に挟んだ上記の記号列が1つでも存在する場合、TABやLFの手前にスペースを1つ追加する。
  8. url() が正しいかチェックする。相対リンクの場合は"./"を先頭に付加する。
  9. 文字列を復元する。
  10. コメントを復元する。

*2 : 正規表現で1回マッチングするだけ不完全。例えば"javascrscriptipt:"と書かれた文字列でXSSを起こせるので、参考にする方は注意

*3 : IEではCSS内において改行を含む文字列を許可するので、注意が必要です。Firefox等で許可されません(改行で文字列が終わったことになります)。

参考文献

スクリプト側で対応不可能な既知のIE脆弱性

お願い

adiaryでセキュリティーホールを発見した場合はどんなに些細なものでもお知らせ下さい*4。また「このセキュリティーホールに対応していますか?」という問い合わせはこの記事にどうぞ。

*4 : セキュリティーホールだと思ったら「結果的に勘違いだった……」でも構いません。こちらで確認しますし、その確認の過程でセキュリティーホールを見つけることも結構ありますので。

2006/09/11(月)CSSXSSの問題

CSSXSSとは?

IEがCSSではない{を含む*1テキストをCSSと見なしてインポートしてしまい、あろうことかそのテキストがJavaScriptから操作可能なために発生するセキュリティーホールです。IE5、IE6などに存在します。

検証用コード。

<html><head>
<title>CSSXSS</title>
<style type="text/css">
@import url("./cssxss.txt");
</style>
</head><body>
<h1>CSSXSS</h1>
<textarea rows="20" cols="80" id="cssxss"></textarea>
<script type="text/javascript">
var text = document.getElementById( "cssxss" );
text.innerText = document.styleSheets(0).imports(0).cssText;
document.write("test")
</script>
</body></html>

この例では、cssxss.txt が「{」を含む場合、その中身を<textarea>に表示します。

悪意のあるサイトにアクセスした第3者に対し、既知のURL(例えばmixiなど)へユーザー自身にアクセスさせその結果をJavaScripを用いることで攻撃サイトに送信するなどという使い方をします。BASIC認証、Cookie認証その他あらゆる認証により守られたページも、ユーザー自身にアクセスさせることで突破できてしまうという驚異のセキュリティーホールです。

有効な対策

有効な対策は2つ。1つは、CSSXSSの攻撃をされたくないあらゆるページにおいて{」を「&#123;」にエンコードして出力することです。

もう1つはIE系ブラウザ((IEエンジンを使用するブラウザ))のアクセスを拒否することです。個人的には後者を選びたいのですけど(笑)

*1 : この文字だけであることIE6で確認しました。Shift JISの場合は2バイト目に { を含んでも同じ

2006/09/03(日)adiaryメモ

今後の予定

とりあえずあと1~2ヶ月でリリースしたいところです。安定度というより付けたい機能があるというだけで、別に現状でも問題はありません。まあただβリリースなんで、ときどき(よく?)細かいバグ付きでリリースされてますが(苦笑)

βだけあって、様子見が多いのかインストールはあまり増えてません(把握してる限り)。様子見は結構あるみたいですが、それもよく分かりません。だから早くリリースしたい気持ちと、機能的に完全にしたい気持ちと色々です。adiary本体よりも、スケルトンシステムの普及を計りたい部分あるので*1。あとは、adiaryの強烈な標準パーサー(さつきパーサー)の単独公開、これもやりたいですね。

利用者紹介ページですが、リリース前に仕組みを変更する予定です。単純なモノ(仕組み)ですけど、お楽しみに。

*1 : Templateツールキットより考え方はスマートですよ。スマートすぎて若干恐ろしいかも知れませんけど(^^;

2006/08/23(水)CSSXSS

CSSの中でjavascript実行しちゃったりする問題

CSSXSSというのがあるんですが、もちろんIE専用。要するに「罠サイトからスタイルシートに見せかけることで好きなサイトのデータを(クライアントに)取得させ、それをJavaScriptで処理することで罠サイト側に情報漏洩出来る」セキュリティホールです。さすがIEやることが違う!

というわけなんですが、CSSXSSさせない(加害者にならない)対策は取れても、CSSXSSされない(被害者にならない)対策は取りようがない。漏洩したことろでセッションは盗めないのですが(でも機密とかダダ漏れ)、CSSXSS+CSRFされるともはや手の打ちようがない。

世の中のIE使ってる人、危険極まりないですよこれは(汗