🎉
[Feature #19630] Kernel.#open に | から始まる文字列を渡せないようにする
[Feature #19630] [RFC] Deprecate Kernel#open("|command-here")
due to frequent security issues
-
Kernel#open
の引数に|
からはじまる文字列を渡すと|
以降の文字列が外部コマンドとして実行される
# mkdir hoge が外部コマンドとして実行される
open("|mkdir hoge")
- これが原因での脆弱性がいくつか発生しているのでこの挙動を非推奨にしようというチケット
- 例えば任意のディレクトリ配下のファイルを読み込むようなコードを書いている場合にそのディレクトリ配下に『
|mkdir hoge
』という名前のファイルが置かれていると任意のコマンドが実行できてしまう(されてしまう) - CVE-2017-17405: Net::FTP におけるコマンドインジェクションの脆弱性について
- CVE-2021-31799: RDoc におけるコマンドインジェクションの脆弱性について
- 例えば任意のディレクトリ配下のファイルを読み込むようなコードを書いている場合にそのディレクトリ配下に『
- ちょっと前から色々と議論が進んでいたんですが結論としては以下のような感じになったみたい
- Ruby 3.x 系で使用した場合は警告がでるようになる
-
-w
を付けておく必要がある
-
- Ruby 4.0 で削除される
- Ruby 3.x 系で使用した場合は警告がでるようになる
open("|echo ok")
# Ruby 3.3 => warning: Calling Kernel#open with a leading '|' is deprecated and will be removed in Ruby 4.0; use IO.popen instead
# Ruby 4.0 => error
- さすがにこれを意図的に使ってるコードはないと思いたい…
Discussion