萩萩日記

世界に5人くらい存在するかもしれない僕のファンとドッペルゲンガーに送る日記

RubyのREXMLのアレ

外向けのサーバでRuby作ってないしってことでまだ調べてなかったREXMLのセキュリティホール、ちょっと調べてたのだけど、Rubyのサイトには、

脆弱性の存在するバージョン

1.8系

* 1.8.6-p287以前のすべてのバージョン
* 1.8.7-p72以前のすべてのバージョン

1.9系

* すべてのバージョン

と書いてあり、で、昨日の時点で一番新しいバージョン(1.8.6系)は1.8.6-p287で、日付的にはこのアナウンスの発表時点(8/23)より前の8/11で、でも「以前」って「以上」みたいに「その値も含む」のか「その値は含まない」のかよくわからず、いや、「以外」以外の「以」関係は「その値も含む」と思うので、要するに1.8.6系は全部ダメってことだと思うんだけど、1.9系には「すべてのバージョン」と書いてあって1.8系にはわざわざ「1.8.6-p287以前のすべての」と断ってあるから含まないの?とか悩んでしまって、いま思うと英語のアナウンスも読めば「含まれる」ということはわかったのだけど、そのときはそれに気が付かなかったので、とりあえず再現するコードを探してみようと思いいろいろ調べてみたのだが、「こういうXMLを食わせるとアレですよ」みたいな説明はあるものの、実際に問題が起こるコードが載ってるサイトがない。

と、ここまで1文で書いてしまった。

さておき、そうこうするうちに見つけたのが、id:zrsvさんのRubyのREXMLにビビった話。というエントリ。REXMLというものをまったく使ったことがなかったので、ここにあったソースを参考にさせてもらい(zrsvさん、ありがとうございます)、頭に、

require "rexml/document"

を補ったりしながら試す。そしたら1.8.6-p287では特に問題なし。「あれ?やっぱり含まないの?」とか思いつつ一応ということで1.8.6-p286でも試したところやっぱり問題なし。「うーん?」とか思っていろいろ調べてたら、なんか、パースのところでCPU負荷がかかる的な話だったので、実際にパースするような処理をせんといかんのかなあと思い、いろいろ思考錯誤しながら適当なXPathを発行してみたら、

p doc.root.elements['/*'].text

なんだかマシンが大忙しになりました。たまたま同じマシンで、「あー、なんかネイピア数を10万桁ぐらい知りてー!」とか思って、

$ echo 'scale=100000;e(1)' | bc -l

とかやってたもんだから、このエコい時代にだいぶCPUの無駄遣いな感じでした。

というわけで1.8.6-p287も問題アリだということがわかり、Rubyのアナウンスに紹介されてたモンキーさんを試したところ大丈夫になりました。

試すことと調べることは大事だなあと思った秋の夜でした。

ちなみにネイピア数10万桁は数日かかっても終わらなかったので諦めました。

追記。

その後ちらっと検索したら、ネイピア数には自分と自分の運命の人の誕生日が並べて載ってるそうですな。が、別に運命の人を探したくて10万桁を調べたわけではないので、ここにその旨、書いておきます(笑)。つーか超越数だし無限に続く数だから、すべての組み合わせが入ってるわけで、てことはネイピア数の中にはすべての誕生日の人との組み合わせが入ってるんじゃないですかね。