破绽描绘
6.1.2.1、6.0.3.5 之前的 Action Pack 中的主机受权中间件存在开放重定向破绽。特制的`Host` 标头与某些“允许的主机”格式相分离,可能会招致 Action Pack 中的主机受权中间件将用户重定向到歹意网站。受影响的应用程序将允许带有前导点的主机。当允许的主机包含前导点时,能够运用特制的“Host”标头重定向到歹意网站。
影响版本
Rails 6.1.3.1 和 Rails 6.1.3.2
影响
黑客能够将受害者重定向到歹意网站。
破绽剖析
问题出在这个代码https://github.com/rails/rails/blob/6-1-stable/actionpack/lib/action_dispatch/middleware/host_authorization.rb#L115
origin_host = valid_host.match(
request.get_header("HTTP_HOST").to_s.downcase)
forwarded_host = valid_host.match(
request.x_forwarded_host.to_s.split(/,s?/).last)
forwarded_host在downcase之后短少.to_s,这招致nil分配给forwarded_host,然后招致true以下代码
origin_host && @permissions.allows?(origin_host[:host]) && (forwarded_host.nil? || @permissions.allows?(forwarded_host[:host]))
由于nil?检查forwarded_host
forwarded_host.nil? || @permissions.allows?(forwarded_host[:host])
我给出的示例正在运用localhost,但我也运用具有如下配置的消费环境确认了这一点
Rails.application.config.hosts = %w(.EXAMPLE.com)
破绽复现
重现步骤 这是CVE-2021-22881和 https://github.com/rails/rails/commit/83a6ac3fee8fd538ce7e0088913ff54f0f9bcb6f
运用如下所示的控制器
class TestsController < ApplicationController
extend ActiveSupport::Concern
def index
redirect_to('/')
end
end
发送如下所示的恳求时,其中 URL 包含大小写混合字符
curl 'http://localhost:3000/tests' -H 'X-Forwarded-Host: Evil.com'
或全部大写
curl 'http://localhost:3000/tests' -H 'X-Forwarded-Host: EVIL.COM'
预期行为
<div id="container">
<h2>To allow requests to evil.com, add the following to your environment configuration:</h2>
<pre>config.hosts << "Evil.com"</pre>
</div>
实践行为
<html><body>You are being <a href="http://Evil.com/">redirected</a>.</body></html>%
Host标头攻击
curl -i -H "Host: google.com#sub.tkte.ch" http://localhost:3001/
处理方法
平安风险
当host在中间件中运用特定格式停止受权时HostAuthorization,攻击者能够制造特定的 HTTP Host 标头以强迫 ActionPack 将用户重定向到歹意站点。
受影响的应用程序是那些在主机中具有以句点开头的值的应用程序。例如 :
config.hosts << '.tonsite.fr'
以这种方式配置的应用程序会遭到 HTTP Host 标头的攻击,迫运用户重定向到歹意站点。
运用 Monkey 补丁手动装置补丁
关于受影响但无法更新到包含补丁的 Rails 版本的应用程序,能够在初始化文件中应用猴子补丁:
module ActionDispatch
class HostAuthorization
private
def authorized?(request)
valid_host = /
A
(?<host>[a-z0-9.-]+|[[a-f0-9]*:[a-f0-9.:]+])
(:d+)?
z
/x
origin_host = valid_host.match(
request.get_header("HTTP_HOST").to_s.downcase)
forwarded_host = valid_host.match(
request.x_forwarded_host.to_s.split(/,s?/).last)
origin_host && @permissions.allows?(origin_host[:host]) && (
forwarded_host.nil? || @permissions.allows?(forwarded_host[:host]))
end
end
end
补丁
为了协助无法更新他们的 rails 版本,并且不想运用上一章中描绘的猴子补丁的用户,有 2 个 git-am 格式的补丁。
这些补丁由 Discussion.rubyonrails.org 托管。在将其应用于源代码之前,您应该考证其出处:
6-0-host-authorization-open-redirect.patch
https://discuss.rubyonrails.org/uploads/short-url/8wyh9cp18blD2TsjzCmXqyni9Cf.patch
6-1-host-authorization-open-redirect.patch
https://discuss.rubyonrails.org/uploads/short-url/dHolJIzcr0TPG9f4RlY9mNtBwfS.patch
感谢您的来访,获取更多精彩文章请收藏本站。
![](https://www.gyzsq.com/wp-content/uploads/2022/07/9259adea4619.gif)
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
![头像](/wp-content/themes/zibll/img/avatar-default.png)