こんにちは。Rubyコミッターのusaです。
なんかRuby の 最新 リリースと一緒に、脆弱性 情報 が いっぱい 公開 されましたね。うわー、なんかよくわかんないけど、やばそうですね!正味のところ、こいつら結局どれくらい危なそうなのか、それらの脆弱性の記事を書いた人がたまたまピクシブにいましたので、率直に本音を語っていこうと思います。
CVE-2017-17742: WEBrick における HTTP レスポンス偽装の脆弱性について
うまく利用するのは難しいとは思いますが、使いようによっては利用者(WEBrickで作って公開したサイトを訪問した人)をひどいめにあわせることができるかもしれない脆弱性です。 でも、WEBrickで作ったサイトをプロダクションで公開してる人なんているわけないよねははは。
CVE-2018-8777: WEBrick における巨大リクエストにともなう DoS 脆弱性について
わぁいDoS! あかりDoS大好き! うまく組み立てた攻撃リクエストを投げつけると、サーバ側のメモリを浪費させることができてDoSが成立する、ってやつですが、WEBrickで作ったサイトをプロダクションで(以下略
CVE-2018-6914: Tempfile および Tmpdir でのディレクトリトラバーサルを伴う意図しないファイルまたはディレクトリ作成の脆弱性について
Dir.mktmpdir
メソッド(tmpdirライブラリ)には、第1引数に配列を与えると、1つ目の要素をディレクトリ名のプレフィックスに、2つ目の要素をサフィックスにする、という機能があるんですが、そこでそこに "/../"
を含む文字列を与えてやると任意のディレクトリ上にテンポラリディレクトリを作成できる、というお話です。
なお、Tempfile.open
の第1引数にも同じ入力を与えられますので同じことができます。
しかし信頼できない入力をここに無造作にあてはめてるスクリプトなんか存在しないでしょ、っていうか、そんなスクリプトがあったらそれはそいつの脆弱性じゃねえのかよ、っていう。
ただ、今回のほかの脆弱性と違って、これは踏んでる人がいるかもしれない気がするので、皆さん確認してみてください。
CVE-2018-8778: String#unpack における範囲外読み込みの脆弱性について
String#unpack
のフォーマット指定子で @
っていうのが使えて、普通の使い方としては入力文字列の最初のほうにある要らない分をスキップしたりとかなんですが、ここに内部的にオーバーフローする巨大な整数を与えると、なんと範囲外アクセスができてしまうという。
運がよければRubyをクラッシュさせたりヒープの中身を読みだしたりできると思われます。
が、信頼できない入力をフォーマット指定子に無造作に当てはめるスクリプトなんか存在しないでしょ、っていうか(以下略
CVE-2018-8779: UNIX ドメインソケットにおいて NUL 文字挿入により意図しないソケットにアクセスされうる脆弱性について
えーと、信頼できない入力を UNIXServer.open
とかの引数に与えないでください。与えないでくださーい!!
設定ファイルとかコマンドライン引数とかからは普通に来ると思いますが、そういう時はNUL文字を挿入するのちょっとめんどうそうなので、あまりないかなあ、と思ったりもします。あと、そもそも、悪意を持って設定ファイルを書き換えたりコマンド起動できたりする場合、すでにそのシステムはアウトですよね。
ちなみにLinuxだと、UNIXドメインソケットのパス名の先頭がNUL文字だとなんか特殊なソケットとして扱うっていう機能があるらしく、どういう嫌がらせなんだかよくわかりません。
CVE-2018-8780: Dir において NUL 文字挿入により意図しないディレクトリにアクセスされうる脆弱性について
えーと、信頼できない入力を Dir.open
とかの引数に与えないでください。与えないでくださーい!!
まあ、ファイルシステムへのアクセス時に信頼できない入力を使っちゃうっての、典型的な脆弱性ですので、今時そんなことしてる人はさすがにいないとは思うんですが、しかし今回のやつは入力内容をチェックとかしててもやり方がまずかったらすり抜けるかも、というパターンなので、やっぱりちょっと危ないのかな……。
RubyGems の複数の脆弱性について
これは今回(3/28)公開されたわけじゃなくて、先月の中旬から公開されていたものです。
rubygems側で対応版が既に出てましたが、今回のRubyのリリースでそれが最初から入ってるようになりましたよ、ということですね。
なので、ふつうの人は2月にこの情報が出たときにお手元のrubygemsを gem update --system
してたはずです。
ちなみに、基本的には、rubygemsサーバの脆弱性ばかりなので、ふつうの人は直接に踏むことはないものばかりだと思います。
まとめ
というわけで、おそらく、どの脆弱性も、普段から真面目にRubyをやってる皆さんであれば、そうそう踏んだりはしていないんじゃないかと思われます。 が、油断は禁物ですので、この機会に関連していそうなコードを確認しておいてください。 あ、もちろん、お手元のRubyの更新も忘れないでくださいね! どのバージョンも、脆弱性以外のバグもいっぱい直ってますよ!