ooooooo_qの日記

脆弱性の話とか

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

github.com

Gem in a Boxに登録するgemのメタ情報からのXSS。Gem in a Boxへのアップロード自体には認証がないので、XSSによって危険性が増すことはさほどなさそうという印象です。

Gitlab (Stored XSS in custom emoji)

hackerone.com

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の問題を調べているときに見つけて報告していたものです。詳細は徳丸さんの動画を見てください。

www.youtube.com

unicornにも同じ問題があってsnykを通して連絡してもらったのですが、そちらはnginxと一緒に利用することを想定しているので脆弱性としては扱われないとのことでした。

Rack/Rails Rack::Sendfile

hackerone.com

proxyがちゃんと設定されていない中でRack::Sendfileが使われているとまずいことが起こる可能性があるもの。これはRails7でRack::SendFileが外されることで対応される…という話でしたがまだ実装はされていないようです。

Ruby/Railsのデシリアライズまとめ本

zenn.dev

以前ブログに書いた記事をzennにも載せてみようという気持ちから書き始め、ついでだからと色々調べていたら1年弱かかってしまったもの。書くことよりも調べたり連絡することのほうが大変でした。

Pull request/Merge Requestのレビューの際、コメントで参考資料として使いやすいようにすることを意識して書いてました。

以下の2つは本を書いている途中で見つけたものです。

bundler-auditのYAMLファイル

github.com

bundler-auditの脆弱性データベースを読み込むとき、YAMLでデシリアライズできるクラスに制限がなかったのでRCE可能だったもの。 (その後Psych 4.0ではデフォルトの挙動がsafe_loadのものになりました)

Hanamiのセッション

hanamirb.org

hanamiのセッションはデシリアライズにMarshalが使われますが、開発時のsecretがコミットされてしまうことが組み合わさると、ややこしいことをするとRCEができてしまっていました。


RubyやRubyのOSSの脆弱性を見つけた話の続きの続き

この記事はRuby Advent Calendar 2020 - Qiita20日目です。


一昨年(RubyやRubyのOSSの脆弱性を見つけた話 - ooooooo_qの日記)と去年 (RubyやRubyのOSSの脆弱性を見つけた話の続き - ooooooo_qの日記)と同様にRuby関連で今年見つけた脆弱性の話です。

Rails

XSS by file (Active Storage Proxying)

hackerone.com

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

hackerone.com

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のコード挿入脆弱性

hackerone.com

脆弱性なのか判断に迷うもの。 引数が.sendにそのまま渡されるので値によってはコードが実行できるものでした。 .sendを使って実際に攻撃できるパターンが有るのか、Rubyのコードの中を調べて見つけた覚えがあります。

CVE-2019-15845: File.fnmatch の NUL 文字挿入脆弱性

hackerone.com

またNul文字。さすがにRubyではもうNul文字の問題はないのではないでしょうか。多分。

Pathnameでのコマンドインジェクション

hackerone.com

Ruby 2.6までのPathnameFileと同様にIOのクラスを継承していたため、.readなどのメソッドに値が渡されるとき、先頭の文字が|の場合にはコマンドが実行できました。 これも脆弱性か仕様なのか微妙なところですが、報奨金をいただけました。

Rubygems

CVE-2019-8320 symlinkを使ったディレクトリの削除

hackerone.com

重複になった報告の修正漏れでした。gemの解凍しようとすると全く関係ないディレクトリの中身が消えます。rubygemsのtarの解凍の仕方はちょっと特殊ですね。

ESCAPE SEQUENCE INJECTION * 4 (CVE-2019-8321,CVE-2019-8322, CVE-2019-8323, CVE-2019-8325)

blog.rubygems.org

実際のところ現在ではescape sequence injectionが影響あるようなターミナルは存在しないのでは、とも思っていたんですがitermでは印刷ダイアログが出せるようです(iTerm2 で `cat /dev/urandom` すると印刷ダイアログが出ることがある - mizdra's blog)。まだ知られていないことがあるかもしれません。

Rails

MarshalからのObject injectionとCVE-2019-5420

hackerone.com

詳細はRailsの上で走る - ooooooo_qの日記の方に書いたのでそちらを。

Discourse

hackerone.com

昨年と同じくDiscourseにも2つほど。どちらもファイルアップロード経由でのXSSでした。*1

github.com

アップロードされたらファイルのダウンロード時に、Content-Dispositionの値をinlineに変更できてしまったので、そのままXSSとなりえたものです。

github.com

SVGのアップロード時にはXSSになりそうなタグが除去されていたんですが、イベントハンドラが使えてしまったもの。

感想

今年はお金が出るところばかり探していたのが反省点です*2。あとRailsの情報をどこまで出していいのか探り探りで疲れましたね…。

少し順位が上がりました。

*1:1/5にコミットへのリンクなど追記。

*2:その割には去年より少ない

Railsの上で走る

(2021/9/27追記: この記事の内容に色々追加した物をzennへ載せました Deserialization on Rails)


この記事はRuby on Rails Advent Calendar 2019 - Qiitaの11日目です。



この記事を見ている方はRailsアプリケーションの開発をしている方が多いと思います。手元のRailsリポジトリでちょっとbin/rails routesを試してみてください。

続きを読む