Có lỗ hổng DoS trong thư viện REXML được bao gồm trong Thư viện Tiêu
chuẩn Ruby. Kỹ thuật tấn công gọi là \"XML entity explosion\" có thể
được sử dụng để làm sập (vô hiệu hóa) từ xa bất kỳ ứng dụng nào phân
tích XML do người dùng cung cấp bằng REXML.

Hầu hết các ứng dụng Rails sẽ bị ảnh hưởng vì Rails phân tích XML do
người dùng cung cấp bằng REXML theo mặc định.

## Tác động

Kẻ tấn công có thể gây ra từ chối dịch vụ bằng cách khiến REXML phân
tích một tài liệu chứa các thực thể lồng nhau đệ quy như:

<figure class="highlight"><pre><code class="language-xml" data-lang="xml"><span class="cp">&lt;?xml version="1.0" encoding="UTF-8"?&gt;</span>
<span class="cp">&lt;!DOCTYPE member [
  &lt;!ENTITY a "&amp;b;&amp;b;&amp;b;&amp;b;&amp;b;&amp;b;&amp;b;&amp;b;&amp;b;&amp;b;"&gt;</span>
  <span class="cp">&lt;!ENTITY b "&amp;c;&amp;c;&amp;c;&amp;c;&amp;c;&amp;c;&amp;c;&amp;c;&amp;c;&amp;c;"&gt;</span>
  <span class="cp">&lt;!ENTITY c "&amp;d;&amp;d;&amp;d;&amp;d;&amp;d;&amp;d;&amp;d;&amp;d;&amp;d;&amp;d;"&gt;</span>
  <span class="cp">&lt;!ENTITY d "&amp;e;&amp;e;&amp;e;&amp;e;&amp;e;&amp;e;&amp;e;&amp;e;&amp;e;&amp;e;"&gt;</span>
  <span class="cp">&lt;!ENTITY e "&amp;f;&amp;f;&amp;f;&amp;f;&amp;f;&amp;f;&amp;f;&amp;f;&amp;f;&amp;f;"&gt;</span>
  <span class="cp">&lt;!ENTITY f "&amp;g;&amp;g;&amp;g;&amp;g;&amp;g;&amp;g;&amp;g;&amp;g;&amp;g;&amp;g;"&gt;</span>
  <span class="cp">&lt;!ENTITY g "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"&gt;</span>
]&gt;
<span class="nt">&lt;member&gt;</span>
<span class="ni">&amp;a;</span>
<span class="nt">&lt;/member&gt;</span></code></pre></figure>

## Các phiên bản bị ảnh hưởng

### 1.8 series

* 1\.8.6-p287 và tất cả các phiên bản trước đó
* 1\.8.7-p72 và tất cả các phiên bản trước đó

### 1.9 series

* tất cả các phiên bản

## Giải pháp

Vui lòng tải bản vá monkey patch sau để sửa vấn đề này.

* [&lt;URL:https://www.ruby-lang.org/security/20080823rexml/rexml-expansion-fix2.rb&gt;][1]

Sau đó sửa ứng dụng của bạn để tải rexml-expansion-fix2.rb trước khi
sử dụng REXML.

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="nb">require</span> <span class="s2">"rexml-expansion-fix2"</span>
<span class="o">...</span>
<span class="n">doc</span> <span class="o">=</span> <span class="no">REXML</span><span class="o">::</span><span class="no">Document</span><span class="p">.</span><span class="nf">new</span><span class="p">(</span><span class="n">str</span><span class="p">)</span>
<span class="o">...</span></code></pre></figure>

Nếu bạn có ứng dụng Rails, hãy sao chép rexml-expansion-fix2.rb vào
thư mục trên đường dẫn tải (chẳng hạn RAILS\_ROOT/lib/), và thêm dòng
sau vào config/environment.rb.

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="nb">require</span> <span class="s2">"rexml-expansion-fix2"</span></code></pre></figure>

Nếu ứng dụng của bạn là Rails 2.1 trở lên, bạn chỉ cần sao chép
rexml-expansion-fix2.rb vào RAILS\_ROOT/config/initializers và nó sẽ
được tự động tải.

Theo mặc định, giới hạn mở rộng thực thể XML là 10000. Bạn có thể thay
đổi bằng cách thay đổi REXML::Document.entity\_expansion\_limit. Ví dụ:

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="no">REXML</span><span class="o">::</span><span class="no">Document</span><span class="p">.</span><span class="nf">entity_expansion_limit</span> <span class="o">=</span> <span class="mi">1000</span></code></pre></figure>

Bản sửa lỗi này sẽ được cung cấp dưới dạng gem và được sử dụng bởi
các phiên bản Rails trong tương lai, nhưng người dùng nên thực hiện biện
pháp khắc phục ngay lập tức.

## Ghi nhận

Ghi nhận Luka Treiber và Mitja Kolsek thuộc ACROS Security đã tiết lộ
vấn đề cho Đội An ninh Ruby và Rails.

Ghi nhận Michael Koziarski thuộc Rails Core Team đã tạo bản vá monkey
patch để sửa lỗ hổng.

## Thay đổi

* 2008-08-29 18:46 +09:00 đã sửa phần tóm tắt để không gây hiểu lầm
  rằng lỗ hổng này chỉ liên quan đến Rails.
* 2008-11-09 12:40 +09:00 đã sửa [một lỗi của bản vá monkey patch][2].



[1]: https://www.ruby-lang.org/security/20080823rexml/rexml-expansion-fix2.rb
[2]: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=502535
