2008年1月
2008年1月31日(木曜日)
スマブラX
「大乱闘スマッシュブラザーズX (www.amazon.co.jp)」の発売日ということで、午前10時ちょっと過ぎ頃にビックカメラへ。
そうしたらですね、もう、行列なわけですよ。「たかがゲームソフト1本に、何ムキになってるんだこいつら……」などと思いながら、ムキになって 15分くらい並んで購入しました。
出社したら何故か会社に3本あったので (確認しただけで3本なので、実はもっとあったかも)、そのうちの1本で対戦したり。名前入力のインターフェイスが携帯電話のそれになっていたりするのですが、みんな意外にすんなり馴染んでいたりして興味深いです。
※でも、濁点と半濁点の判読がしづらいのはちょっとマイナス。
- 「スマブラX」にコメントを書く
2008年1月29日(火曜日)
Unicodeエスケープのサロゲート対応版 (続き)
Kconv だと余計な正規化が入ったりするというご指摘をいただいたので (成瀬さんありがとうございます)、まじめにサロゲートペアを計算することにしました。こんな感じ。
def js_unicode_escape(text) text.unpack('U*').map{ |num| if(num < 0x10000) format('\\u%04x', num) else num -= 0x10000 upper = num / 0x400 + 0xD800 lower = num % 0x400 + 0xDC00 format('\\u%04x\\u%04x', upper, lower) end } end
ちなみに UTF-16 で表現できない文字のことは考慮していません。:-)
関連する話題: プログラミング / Ruby / JavaScript
2008年1月28日(月曜日)
Unicodeエスケープのサロゲート対応版
先日のコードはサロゲートペアに対応していなかったので、こんな感じに修正。
def js_unicode_escape(text)
text.kconv(Kconv::UTF16, Kconv::UTF8).unpack("H*")[0].gsub(/.{4}/, '\\\\u\&')
end
参考にしたコードは「速くする」というテーマだったので正規表現置換になっていたのだと思いますが、速度にこだわらなければ、Kconv の方が楽で読みやすい感じではあります。
関連する話題: プログラミング / Ruby / JavaScript
2008年1月25日(金曜日)
Ruby の正規表現の落とし穴
気になったのでメモ。「Rubyist Magazine - 標準添付ライブラリ紹介 【第 12 回】 正規表現 (1) (jp.rubyist.net)」より。
文字列先頭や文字列末尾の意味で「^」や「$」を使ってはいけません。Perl などの他の言語の正規表現とは意味が違うので気をつけてください。たとえば、CGI の入力のチェックで間違って「^\d+$」のように使ってしまうと、「数字だけからなる文字列」を受け付けたつもりでも「数字のみの行」を含む文字列を受け付けることになってしまいます。
これはなかなか厳しい罠ですなぁ。
2008年1月23日(水曜日)
JavaScript のリテラルに任意の文字列を出力してみる
更新: 2008年1月27日
Web アプリケーションのセキュリティガイドラインには、たいていの場合「スクリプト内に動的生成の文字列などを出力してはならない」という掟があったりするのですが、それにあえて背く場合のお話。
こんな感じの HTML 断片があったとします。
<script type="text/javascript">
<!--
foo.bar = <%= value %>;
//-->
</script>
そして、この「<%= value %>」の部分に、ユーザが検索文字列として入力した任意の値を入れるというのが課題です。もちろん、そのまま出力すると XSS であっさり死亡するので、何らかの処理をしてから出力する必要があります。ちなみに、ユーザが何を入力したのか正確に知りたいので、任意の文字を削除したりすることはできない (削除してしまうと仕様を満たせない) と考えてください。
要はエスケープ処理をすれば良いのですが、このエスケープ処理が凄い難易度です。たとえば、Ruby on Rails の場合だと escape_javascript というヘルパーが用意されているので、
foo.bar = '<%= escape_javascript(value) %>';
……と書けば良さそうに思うかもしれませんが、"</script><iframe……" などが渡されるとあっさり陥落します (おそらく、escape_javascript は外部 JS ファイル内での出力しか想定していない)。
文字列を to_json してしまうと良さそうにも思えますが、
foo.bar = <%= value.to_json %>;
実は to_json だと "--" がそのまま残ってしまうので、COM (コメント区切り子) がインジェクションできてしまいます。まあ script要素の内容モデルは CDATA なので COM が出力されても問題はないと言えばないのですが、
- script要素を知らないブラウザの場合 (今時あるのかは謎ですが……ちなみに「スクリプトを実行できないブラウザ」とはイコールではありません)
- XHTML として「正しく」解釈された場合
などでコメント区切り子が生きてくる可能性があるので、-- が出力されてしまうと問題があります。
と、そんなこんなでいろいろ考えたのですが、結局、全部 '\uXXXX' の形式 (ありみかさとみ先生 (www.remus.dti.ne.jp)によると「ユニコードエスケープ」と呼ばれたりするらしい) で出力することにしました。「Rails の to_json を 13 倍速くする方法 (d.hatena.ne.jp)」を参考に、こんな感じ。
def js_unicode_escape(text)
text.gsub(/([\x00-\x7f]|[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})+/ux) { |s| s.unpack("U*").pack("n*").unpack("H*")[0].gsub(/.{4}/, '\\\\u\&') }
end
これで一切合切が (NUL文字さえも) \uXXXX の形式で出力されるようになったので、これを '' の中に突っ込みます。
foo.bar = '<%= js_unicode_escape(value) %>';
たとえば、「'"</script>-->」という文字列を投入すると、こんな感じで出力されます。
foo.bar = '\u0027\u0022\u003c\u002f\u0073\u0063\u0072\u0069\u0070\u0074\u003e\u002d\u002d\u003e';
これで、'' の中にはどうやっても \ と u と [0123456789abcdef] しか出現しないはずなので、まあ大丈夫かなぁと……。
※……と、思うのですが、それでも一抹の不安がぬぐえない。
※2008-01-27追記 : ちなみに、このコードは BMP にない文字に対応していません。本来は \x10000 以上の文字はサロゲートペアにして出力してやらないとダメです。
※2009-01-09追記 : サロゲート対応版もどうぞ。
関連する話題: セキュリティ / クロスサイトスクリプティング脆弱性 / Ruby / JavaScript
2008年1月22日(火曜日)
Let's Note の BIOS アップデートでズッコケ
Let's Note の BIOS アップデートが出ていたので、適用してみました。
なんか、ダウンロードした exe ファイルが未署名なのですが……。ダウンロードも HTTPS ではないし、これは微妙です。
……勇気を持って実行してみたら自己解凍式の書庫だったようで、署名付きの exe ファイルが出てきました。
って、外側が署名されていないと意味ないと思うのですが……。
※……と、思いましたが実は外側も署名されていて、しかし署名が期限切れで無効になっているようです (TsuSUZUKI さん、ありがとうございます)。いずれにしても厳しいですが……。
関連する話題: Windows Vista / Let's Note / セキュリティ
2008年1月21日(月曜日)
Let's Note の BIOS アップデート
Let's Noteが死ぬ話ですが、マイレッツ倶楽部からメールが来ていました。「CF-R6M/CF-R6Aシリーズご使用のお客様へのご案内 (askpc.panasonic.co.jp)」というページができており、BIOS のアップデートが公開されています。
原因はまだ MS 側で調査中という話ですが、ともあれこれでひとまず安心……なのですかね。しかし、
ただし、本現象がすでに発生している場合は、対策のBIOSアップデートプログラムを導入できません。
大変お手数ですが、下記の修理相談窓口に修理のご相談をお願いします。
これはきついなぁ。
関連する話題: Windows Vista / Let's Note
2008年1月20日(日曜日)
届出件数2007Q4
2007年Q4の届出状況が公開されていますね。
- 2007年4Qは脆弱性の修正件数は過去最高に――IPA調べ (www.itmedia.co.jp)
- ソフトウエア等の脆弱性関連情報に関する届出状況[2007年第4四半期(10月~12月)] (www.ipa.go.jp)
修正件数最高だそうで。なにげに Web の届出件数は減っていますが、Q4 は忙しくて……。
関連する話題: セキュリティ / IPA / JPCERT/CC / JVN / 情報セキュリティ早期警戒パートナーシップ
2008年1月19日(土曜日)
脆弱性届け出られ側のお話
JPCERT/CCとの「脆弱性情報ハンドリング」の記録 (dsas.blog.klab.org)。興味深いです。
とりあえず、この制度の正式な名前は「情報セキュリティ早期警戒パートナーシップ」だと思うのですが、正しく呼ばれることはほとんど無いような気がしますね。名前が長い上に、いまいちピンと来ないからでしょうか……?
さらに、公表日に一般へ開示する情報はあくまでも脆弱性の概要であり、悪用される可能性のある詳細な情報は公表日以降も機密として扱わなければならない、と先方から説明を受けました。
あれ、そうなのですか? そういうルールだとしたら、届出側に対してもそういう説明があって良さそうなものですが、言われたことがないような……。
ともあれ、JVN の情報公開はイマイチな印象があります。たとえば、「JVN#29273468 QRcode Perl CGI & PHP scripts におけるサービス運用妨害の脆弱性 (jvn.jp)」なんてのがありますが、原理については「特定のリクエストによって」としか書かれていないので、何がどうなって DoS 状態になるのか良く分かりません。
ところで最近、私は仕事で開発中のアプリケーションに脆弱性が存在することに気づき、リリース前に対応することができました。実はこれ、JVN#29273468 の詳細を知っていたからこそ発見できたものです。しかし、私がその詳細を知っていたのは偶然に過ぎません。一般の人が JVN#29273468 を読んでも、同種の脆弱性の発見や防止に結びつけることは難しいでしょう。攻撃手法まできちんと理解していないと、脅威を正しく理解したり、防御策を考えたりするのは難しいと思います。
というわけで、対応が完了した脆弱性については、同種の脆弱性の再発を防ぐためにも積極的に詳細情報を公表して欲しいなぁ、と個人的には思っていますが、難しいですか……。
情報の公開時刻は各者間で完全に同期させるのではなく、開発者側が数時間先行し、その完了を確認してからJPCERT/CC側が追随するという考え方のようです。たしかに、対策方法の詳細がもっぱら開発者側の公開情報内に含まれることを考えると、不慮の事故等でJVN分の情報が先行して露出した場合の危険性は容易に想像ができます。
Trac の時なんかはずいぶんタイムラグができてしまって、よく分からないことになっていましたが。複数のベンダーに影響する場合は、情報公開時期のハンドリングが大変らしいですね。
※たとえば、「JVN#465742E4 Wiki クローンにおけるクロスサイトスクリプティングの脆弱性 (jvn.jp)」は公開日が2005年5月19日となっているのですが、良く読んでいくと Hiki の修正版リリースは情報公開日より前の 5月17日になっていたりします。中の人の苦労が忍ばれますね……。
関連する話題: セキュリティ / IPA / JPCERT/CC / JVN / 情報セキュリティ早期警戒パートナーシップ
Let's Note + Vista が死ぬ?
なんか Windows Update したら Vista な Let's Note が起動不能になったりする事例があるそうで。
- 1/9 以降、Windows VISTA 搭載 レッツノートのハードディスクが突然死する可能性がある (blog.gcd.org)
- Windows VISTA 用の更新プログラム KB943899 が原因で突然死したハードディスクを復旧させる方法 (blog.gcd.org)
うーむ、手元の Let's Note R6 も Vista なマシンな訳でして、他人事じゃないですね。とりあえず KB943899 はアンインストールしておいた方が良いのかなぁ。
関連する話題: Windows Vista / Let's Note
2008年1月16日(水曜日)
風呂の電球カバーは全力で左に回す
風呂場の電球が切れたようで交換しようと思ったのですが、どうやっても電球カバーが外れずに難儀しました。何か特殊な外し方があるのかと思い、ダメ元で「風呂 電球 カバー」ググってみると、
- 風呂の電球カバーはゴムパッキンが固くなっていて外れにくいことがある
- 勇気を持って全力で反時計回りに回す
- ゴム手袋が有効
- パッキン部分を暖めると取れやすくなる
……といった情報が得られました。
というわけで、ゴム手袋を装備して全力で左に回してみたところ、割とあっさり陥落。いやぁ、Web ってお風呂の電球カバーを外すのにも役に立つのですね。
関連する話題: 与太話
2008年1月15日(火曜日)
メタルスレイダーグローリー
Wii (www.amazon.co.jp) のバーチャルコンソールで「メタルスレイダーグローリー (www.nintendo.co.jp)」が出ていたので、ダウンロードしてみました。一時期はプレミアがついてかなり高額になっていたという伝説のソフトなのですが、バーチャルコンソールだと 600 Wiiポイント (600円相当) なのでお手軽です。
※でも普通のファミコンソフトは 500 Wiiポイントなので、ちょっとだけ高い設定なのですね。
なかなか面白いと思いますが、コマンド選択時のカーソル位置の表現がちょっと分かりにくいのが気になりました。コマンドは白文字で書かれていて、選択しようとしているコマンドは赤文字点滅で表現されるのですが、選択肢が二つしかないときなどは、どちらが選択状態なのか分かりにくいです。まあ、慣れれば良いのでしょうが……。
2008年1月14日(月曜日)
この世界の片隅に
偶然発見したので購入。
- この世界の片隅に (www.amazon.co.jp)
「知らない人のところにお嫁に行く」という点では「長い道 (www.amazon.co.jp)」に近い感じですが、時代背景や周りの人々など、周辺の風景に焦点がある感じでしょうか。しかし、相変わらずスゴイ絵で圧倒されますね。
2008年1月8日(火曜日)
これは中間者攻撃?
Webメール狙うサイド・ジャッキング (itpro.nikkeibp.co.jp)。
特徴は,無線LANの通信パケットをキャプチャし,人がデータの内容を盗み見て解析する点である。いわゆるMan in the Middle(中間者)攻撃だ。以前にも同様の手口が見付かったことがある。無線LAN通信の解析ツール「Kismet」を使う方法で,図1のようなコマンドを実行することでクッキー情報を奪うことができる。
(~中略~)
リモートからのクッキー情報詐取といえば,クロスサイト・スクリプティングのぜい弱性を悪用する手口に注目が集まっている。ただ,Man in the Middleの方が攻撃の効率を高められる上,情報鮮度がいいことが多い。
うーむ、これは単なる傍受であって、中間者攻撃ではないような気がしますけれども。
※後半を見ると偽 AP を用意して中継するという話が出ていて、その場合は中間者っぽい雰囲気はありますけれども、通信内容を改竄したりせずにそのまま相手に送るのだとすれば、いわゆる中間者攻撃の手法とは性質が異なるはず。よく「DH鍵交換は傍受には強いが中間者攻撃に弱い」なんて言われたするように、傍受と中間者攻撃とでは攻撃の性質が違うわけでして。
2008年1月7日(月曜日)
DocumentFragment の CloneNode()
DocumentFragment の CloneNode(true) でハマったのでメモ。DOM1 の仕様 (www.w3.org)を見ると、DocumentFragment には以下のような性質があります。
When a DocumentFragment is inserted into a Document (or indeed any other Node that may take children) the children of the DocumentFragment and not the DocumentFragment itself are inserted into the Node.
以上、Document Object Model (Core) Level 1 : Interface DocumentFragment より
DocumentFragment をドキュメントに挿入すると、DocumentFragment の子ノードだけが挿入され、DocumentFragment 自身は挿入されずに独り(?)残されるという仕様になっています。AppendChild すると DocumentFragment は空っぽになってしまうので、その後で CloneNode(true) しても、空の DocumentFragment しか得られません。
たいていのノードは AppendChild した後でも CloneNode(true) でコピーが得られるのですが、DocumentFragment だけは AppendChild する前にコピーしておかないと駄目ということです。
※あるメソッドが XmlElement ではなく XmlDocumentFragment を返すように修整したら動かなくなってしまい、結構はまりました……。
2008年1月5日(土曜日)
ERB で改行が消えない
なんか eRuby で <%-……-%> と書いても改行が出力されてしまう問題が起きていて残念な思いをしていましたが、「Rubyist Magazine - 標準添付ライブラリ紹介 【第 10 回】 ERB (jp.rubyist.net)」によると、
改行文字は "\n" のみを想定しているため、行末を見て改行を出力しないようになっているものは、改行が "\n" ではなく "\r\n" になっている場合も改行が出力されてしまいます。
……ということなのだそうで。この辺、ちょっと確認してみますか。
2008年1月4日(金曜日)
4コマ 小学生 兄妹 なめこ 泌尿器
霧島ティルトウェイトさくら先生が出てくるマンガの 2巻が出ていたので購入。
- ○本の住人 2 (www.amazon.co.jp)
巻頭「しおり」の「ねずみのえをかく」のがいちばん危ないというのは笑ってしまいました。ただ、マニアックなネタがメインなので、万人にお勧めできるわけではないですが……。
※「10点か評価不能にしろ!」なんてのの元ネタが分かるゲーマーな人にはお勧め。
しかし驚異的なのは帯ですな。この帯によって「4コマ 小学生 兄妹 なめこ 泌尿器」という検索ワードでトップに来てしまうという物凄い SEO 効果が……。無意味かと思いきや、実は「4コマ 小学生」や「4コマ 兄妹」でもトップに来るので、それなりに意味はありそうです。
2008年1月1日(火曜日)
「拡張子ではなく、内容によってファイルを開く」無効でも駄目なケース
「画像ファイルに偽装した,HDDをフォーマットしようとするトロイの木馬がネットで話題に (itpro.nikkeibp.co.jp)」だそうで。
安全のため「拡張子ではなく、内容によってファイルを開く」設定を無効にするか,Internet Explorerとそのエンジンを利用したブラウザ以外のWebブラウザでアクセスすることを推奨する。
うーむ、これはどうでしょう。この話は XSS ではなくブラクラということなのですから、悪意を持ったサーバ管理者が「正しい」設定をする可能性があります。ちゃんと Content-Type: text/html を返す設定になっていれば、「拡張子ではなく,内容によってファイルを開く」が無効であっても HTML として処理されることになります。
※例: http://minazuki.com/content-type/texthtml.jpg (minazuki.com)
ブラクラの内容は確認していませんが、このような「正しい」設定がなされていれば、IE 以外のブラウザでも動作するかもしれません。
もちろん、実際には「拡張子ではなく、内容によってファイルを開く」を無効にすれば防げるケースもあるでしょうし、IE のこの設定は無効を推奨したいところではありますが、このようなケースの「対策」としては確実ではないというところです。
関連する話題: セキュリティ / Internet Explorer / ITpro
- 前(古い): 2007年12月のえび日記
- 次(新しい): 2008年2月のえび日記