RubyやRubyのOSSの脆弱性を見つけた話_4
この記事はCalendar for Ruby | Advent Calendar 2021 - Qiitaの15日目です。
今年Ruby関連で見つけた、または公開された脆弱性のまとめです。
Ruby(CVE-2021-41819: Cookie Prefix Spoofing in CGI::Cookie.parse)
CVE-2021-41819: Cookie Prefix Spoofing in CGI::Cookie.parse
Rack/Rails側に報告されていたCookie parserの問題が他にもないか探して見つけたものです。ブラウザのcookieはhttpでの接続、サブドメインからまたはjsからも書き込みできますが、それを防ぐための仕様である CookiePrefixによってcookieが上書きされてないことを保証しようとしても、サーバ側でキーをデコードしている可能性があるものでした。とはいえCGIを使っているサーバで利用しているケースは少なそうです。
Gem in a Box のXSS
Gem in a Boxに登録するgemのメタ情報からのXSS。Gem in a Boxへのアップロード自体には認証がないので、XSSによって危険性が増すことはさほどなさそうという印象です。
Gitlab (Stored XSS in custom emoji)
Gitlabの実験的機能でのXSS。GraphQL経由で登録する必要があったので多少面倒でした。
Gitlab (Reflected Cross-Site Scripting in Jira Integration)
GitLab Security Release: 14.3.1, 14.2.5, and 14.1.7 | GitLab
なぜかこの記事を書いている時点ではまだ詳細が公開されていません。XSSとしてはシンプルなものでした。
ThinのHTTP header injection
Fix possible HTTP Response Splitting by macournoyer · Pull Request #377 · macournoyer/thin · GitHub
RailsのActionableExceptionsの問題を調べているときに見つけて報告していたものです。詳細は徳丸さんの動画を見てください。
unicornにも同じ問題があってsnykを通して連絡してもらったのですが、そちらはnginxと一緒に利用することを想定しているので脆弱性としては扱われないとのことでした。
Rack/Rails Rack::Sendfile
proxyがちゃんと設定されていない中でRack::Sendfileが使われているとまずいことが起こる可能性があるもの。これはRails7でRack::SendFileが外されることで対応される…という話でしたがまだ実装はされていないようです。
Ruby/Railsのデシリアライズまとめ本
以前ブログに書いた記事をzennにも載せてみようという気持ちから書き始め、ついでだからと色々調べていたら1年弱かかってしまったもの。書くことよりも調べたり連絡することのほうが大変でした。
Pull request/Merge Requestのレビューの際、コメントで参考資料として使いやすいようにすることを意識して書いてました。
以下の2つは本を書いている途中で見つけたものです。
bundler-auditのYAMLファイル
bundler-auditの脆弱性データベースを読み込むとき、YAMLでデシリアライズできるクラスに制限がなかったのでRCE可能だったもの。 (その後Psych 4.0ではデフォルトの挙動がsafe_loadのものになりました)
Hanamiのセッション
hanamiのセッションはデシリアライズにMarshalが使われますが、開発時のsecretがコミットされてしまうことが組み合わさると、ややこしいことをするとRCEができてしまっていました。
RubyやRubyのOSSの脆弱性を見つけた話の続きの続き
この記事はRuby Advent Calendar 2020 - Qiitaの20日目です。
一昨年(RubyやRubyのOSSの脆弱性を見つけた話 - ooooooo_qの日記)と去年 (RubyやRubyのOSSの脆弱性を見つけた話の続き - ooooooo_qの日記)と同様にRuby関連で今年見つけた脆弱性の話です。
Rails
XSS by file (Active Storage Proxying
)
Rails6.1で導入された機能での脆弱性です。修正されたのが6.1のリリース前だったからかCVEの割当はされていません。Active Storageを使ってS3などに上げた画像をRailsを通して取得できるようにするものでしたが、Content-Disposition: inline
がデフォルトで設定されていたためSVGなどjavascriptが実行できるファイルをアップロードすることでXSSが可能でした。
[CVE-2020-8159] Arbitrary file write/potential remote code execution in actionpack_page-caching
Rails4でコアから外れたactionpack_page-cachingの脆弱性。キャッシュに使うキーがアクセスで使われたURLをもとにしていて、 ..%2f
してやると意図せぬパスにキャッシュが作れました。
パッチの提案を出していたのですが、clean_pathしただけではキャッシュの外には出ないですが他のキャッシュに上書きできてしまっていたのでだめでしたね。
[CVE-2020-8264] Possible XSS Vulnerability in Action Pack in Development Mode
[CVE-2020-8264] Possible XSS Vulnerability in Action Pack in Development Mode
レポートを書くのに1日かかったとてもややこしいものなのですが、この記事の時点ではまだ詳細が公開されていないので省略
rails-ujs/JQuery-ujs
XSS in some browsers · Issue #517 · rails/jquery-ujs · GitHub
Hackeroneに出したところ、Hackeroneのスタッフにはリポジトリの方に出してと言われたので出したんですがそのままになってます。まあ影響あるのはレアケースですね。
Discourse
github.com
またファイルアップロード。ホワイトリストで許可されたタグの中にuse
があり、それを使うとXSSが可能な状態でした。
Cross-Site Scripting (XSS) Cheat Sheet - 2020 Edition | Web Security Academyを見ていて見つけたものです。
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の情報をどこまで出していいのか探り探りで疲れましたね…。
Railsの上で走る
(2021/9/27追記: この記事の内容に色々追加した物をzennへ載せました Deserialization on Rails)
この記事はRuby on Rails Advent Calendar 2019 - Qiitaの11日目です。
この記事を見ている方はRailsアプリケーションの開発をしている方が多いと思います。手元のRailsリポジトリでちょっとbin/rails routes
を試してみてください。