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

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/04/14(金)トラックバック - adiary拡張仕様(日本向け)

トラックバックの技術仕様 Version1.1に対する拡張です。

予備規定

  • 文字コードの表示。日本語の文字コードは「EUC-JP」「UTF-8」「Shift_JIS」「iso-2022-jp」のいずれかの文字列を指定すること。

トラックバックフォーム(POSTデータ)の拡張

  • トラックバックを受信する場合、未知のパラメータ(key)に対するデータは無視すること(規定外のフォームデータを送信してもよい)。
  • charset パラメーター。トラックバックの文字コードを示す。トラックバックが日本語文字を含む場合、必ず含まなければならない
  • x_author パラメーター。その記事を書いた人の名前を x_author として送信することができる(optional)。

トラックバック送信時のヘッダ拡張

  • トラックバックを送信時、クライアントはHTTPの定める「User-Agent」ヘッダを送信し、このときblogシステム(など)を名乗ることができる(optional)。

トラックバックURLへのGETの規定

  • トラックバックURLをGETした場合、サーバソフトは Content-Type ヘッダに、charset を付加し内部文字コードを示さなければならない。ここで示す内部文字コードでトラックバックを送信した場合、文字化けしないことを保証しなければならない

例)Contenet-Type: text/xml; charset=EUC-JP

  • トラックバックURLをGETした場合、サーバソフトは拡張ヘッダ「X-TB-Accept-Charset」を出力し、トラックバックとして受信可能な文字コードをカンマ区切りで示すことができる(optional)。

例)X-TB-Accept-Charset: EUC-JP, UTF-8, Shift_JIS, iso-2022-jp, iso-8859-1

updates

  • 2006/04/14 初版
  • 2006/07/24 author を author_name に変更(WordPressでの問題に対応)
  • 2006/08/01 WordPressへの対応のため、author_name を x_author に変更(fix)*1

*1 : Wordpress が author も author_name も特殊処理をした挙げ句、Queryを消去してくれるお茶目さんなので。おそらくセキュリティがらみだと思いますが……