https://redmine.ruby-lang.org/
https://redmine.ruby-lang.org/favicon.ico?1711330511
2013-10-08T17:11:35Z
Ruby Issue Tracking System
Ruby master - Bug #8995: バイナリデータを文字列として encode! すると readbyte の結果が変化する
https://redmine.ruby-lang.org/issues/8995?journal_id=42331
2013-10-08T17:11:35Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul></ul><p>=begin<br>
最小コードはこんな感じですね。<br>
$ ruby -E:UTF-8 -e 'p "\xff".encode.unpack("C*")'<br>
[239, 191, 189]<br>
(({Encoding.default_internal}))をセットしていると、同じエンコーディング同士でも変換が起きているようです。<br>
=end</p>
Ruby master - Bug #8995: バイナリデータを文字列として encode! すると readbyte の結果が変化する
https://redmine.ruby-lang.org/issues/8995?journal_id=42332
2013-10-08T19:01:30Z
hsbt (Hiroshi SHIBATA)
hsbt@ruby-lang.org
<ul><li><strong>Category</strong> set to <i>core</i></li><li><strong>Target version</strong> set to <i>2.1.0</i></li></ul>
Ruby master - Bug #8995: バイナリデータを文字列として encode! すると readbyte の結果が変化する
https://redmine.ruby-lang.org/issues/8995?journal_id=42335
2013-10-08T22:18:38Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>Description</strong> updated (<a title="View differences" href="/journals/42335/diff?detail_id=30680">diff</a>)</li></ul><p>=begin<br>
理由はr40390です。</p>
<pre><code>* transcode.c (str_transcode0): If invalid: :replace is specified for
String#encode, replace invalid byte sequence even if the destination
encoding equals to the source encoding.
</code></pre>
<p>(({encode_params}))の引数はHTTPで渡ってくるパラメータのようですから、バイナリデータかどうかを判断する手がかりが他にあればともかく、(({valid_encoding}))でなければ(({ASCII-8BIT}))にするくらいしかできないんじゃないでしょうか。<br>
=end</p>
Ruby master - Bug #8995: バイナリデータを文字列として encode! すると readbyte の結果が変化する
https://redmine.ruby-lang.org/issues/8995?journal_id=42336
2013-10-08T23:06:46Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Third Party's Issue</i></li></ul><p>まぁ、そもそもバイナリデータをエンコーディング変換したら壊れるのが当然ですね。</p>
Ruby master - Bug #8995: バイナリデータを文字列として encode! すると readbyte の結果が変化する
https://redmine.ruby-lang.org/issues/8995?journal_id=42337
2013-10-08T23:14:31Z
hsbt (Hiroshi SHIBATA)
hsbt@ruby-lang.org
<ul></ul><p>rails の該当箇所は rails 3 リリース時から存在するもので、invalid な utf-8 をパラメータとして渡して攻撃するものを防御するためのコードのようです。いったん、rails 側で何とかできないか考えてきます。</p>
Ruby master - Bug #8995: バイナリデータを文字列として encode! すると readbyte の結果が変化する
https://redmine.ruby-lang.org/issues/8995?journal_id=42338
2013-10-08T23:34:03Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul></ul><p>同じエンコーディング間では何もしていなかったので、防御にはなっていなかったんじゃないでしょうか。</p>
Ruby master - Bug #8995: バイナリデータを文字列として encode! すると readbyte の結果が変化する
https://redmine.ruby-lang.org/issues/8995?journal_id=42402
2013-10-10T10:56:06Z
naruse (Yui NARUSE)
naruse@airemix.jp
<ul></ul><p>なかださんの指摘の通り、</p>
<blockquote>
<p>return params.force_encoding("UTF-8").encode!<br>
の行は何がしたいのかよくわかりませんね。<br>
本当は<br>
return params.force_encoding("UTF-16").encode!<br>
とやって、まさに Ruby 2.1 の挙動にしたかったのかな。</p>
</blockquote>
<p>結論もなかださんの仰るとおり、<br>
バイナリデータフラグを加えるか、ASCII-8BITで流すかあたりになるんじゃないかと思います。</p>
Ruby master - Bug #8995: バイナリデータを文字列として encode! すると readbyte の結果が変化する
https://redmine.ruby-lang.org/issues/8995?journal_id=43098
2013-11-23T11:34:56Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul></ul><p>workaroundが入ったようですが、元々UTF-8ではないバイナリデータが壊れないということは、裏を返せばmalformed UTF-8の攻撃文字列も破棄されないということです。<br>
つまり、脆弱性はそのまま残っているわけなので、何らかの対策が必要であろうことだけは警告しておきます。</p>