RubyやRubyのOSSの脆弱性を見つけた話の続き
この記事はRuby Advent Calendar 2019 - Qiitaの24日目です。
去年(RubyやRubyのOSSの脆弱性を見つけた話 - ooooooo_qの日記)と同様にRuby関連で今年見つけた脆弱性の話です。
Ruby
CVE-2019-16255: Shell#[]およびShell#testのコード挿入脆弱性
脆弱性なのか判断に迷うもの。
引数が.send
にそのまま渡されるので値によってはコードが実行できるものでした。
.send
を使って実際に攻撃できるパターンが有るのか、Rubyのコードの中を調べて見つけた覚えがあります。
CVE-2019-15845: File.fnmatch の NUL 文字挿入脆弱性
またNul文字。さすがにRubyではもうNul文字の問題はないのではないでしょうか。多分。
Pathnameでのコマンドインジェクション
Ruby 2.6までのPathname
はFile
と同様にIO
のクラスを継承していたため、.read
などのメソッドに値が渡されるとき、先頭の文字が|
の場合にはコマンドが実行できました。
これも脆弱性か仕様なのか微妙なところですが、報奨金をいただけました。
Rubygems
CVE-2019-8320 symlinkを使ったディレクトリの削除
重複になった報告の修正漏れでした。gemの解凍しようとすると全く関係ないディレクトリの中身が消えます。rubygemsのtarの解凍の仕方はちょっと特殊ですね。
ESCAPE SEQUENCE INJECTION * 4 (CVE-2019-8321,CVE-2019-8322, CVE-2019-8323, CVE-2019-8325)
実際のところ現在ではescape sequence injectionが影響あるようなターミナルは存在しないのでは、とも思っていたんですがitermでは印刷ダイアログが出せるようです(iTerm2 で `cat /dev/urandom` すると印刷ダイアログが出ることがある - mizdra's blog)。まだ知られていないことがあるかもしれません。
Rails
MarshalからのObject injectionとCVE-2019-5420
詳細はRailsの上で走る - ooooooo_qの日記の方に書いたのでそちらを。
Discourse
昨年と同じくDiscourseにも2つほど。どちらもファイルアップロード経由でのXSSでした。*1
アップロードされたらファイルのダウンロード時に、Content-Dispositionの値をinline
に変更できてしまったので、そのままXSSとなりえたものです。
SVGのアップロード時にはXSSになりそうなタグが除去されていたんですが、イベントハンドラが使えてしまったもの。
感想
今年はお金が出るところばかり探していたのが反省点です*2。あとRailsの情報をどこまで出していいのか探り探りで疲れましたね…。