CVE-2018-16396: Array#pack および String#unpack の一部のフォーマット指定においてtaintフラグが伝播しない脆弱性について

Array#pack および String#unpack の一部のフォーマット指定において、元データの taint フラグが適切に出力文字列・配列に対して伝播しないという脆弱性が発見されました。 この脆弱性は、CVE-2018-16396 として登録されています。

詳細

Array#pack メソッドでは、引数で指定されたフォーマット文字列に従い、レシーバである配列の内容を文字列に変換したものを返します。 本来であれば、配列の要素の中に taint フラグが立っているものが含まれていれば、返す文字列にもそれが伝播して taint フラグが立つべきです。 また、その逆を行う String#unpack メソッドにおいても、レシーバである文字列に taint フラグが立っている場合、返される配列とその各要素にそれが伝播して taint フラグが立たなければなりません。 ところが、 B b H h というフォーマットに関しては、taint フラグが伝播していませんでした。 このため、外部の信頼できない入力をこれらのフォーマットを指定して文字列化していて、かつ、その生成された文字列が信頼できるかどうかの判断に taint フラグを使用していた場合、および、外部の信頼できない入力文字列をこれらのフォーマットを指定して unpack し、かつ、その生成された各要素が信頼できるかどうかの判断に taint フラグを使用していた場合、誤った判断となってしまう可能性があります。

この問題の影響を受けるバージョンの Ruby のユーザーは、速やかに問題の修正されたバージョンに更新してください。

影響を受けるバージョン

  • Ruby 2.3.7 以前の全ての Ruby 2.3 系列
  • Ruby 2.4.4 以前の全ての Ruby 2.4 系列
  • Ruby 2.5.1 以前の全ての Ruby 2.5 系列
  • Ruby 2.6.0-preview2 以前の全ての Ruby 2.6 プレビュー
  • revision 65125 より前の開発版

クレジット

この脆弱性は、Chris Seaton 氏が報告してくださいました。

更新履歴

  • 2018-10-17 23:00:00 (JST) 初版