Skip to content
Snippets Groups Projects
  1. Apr 26, 2022
  2. Apr 12, 2022
  3. Mar 08, 2022
  4. Feb 11, 2022
  5. Dec 15, 2021
  6. Dec 14, 2021
  7. Dec 07, 2021
    • Stef Schenkelaars's avatar
      Fix invalid forwarded host vulnerability · fd6a64fe
      Stef Schenkelaars authored
      Prior to this commit, it was possible to pass an unvalidated host
      through the `X-Forwarded-Host` header. If the value of the header
      was prefixed with a invalid domain character (for example a `/`),
      it was always accepted as the actual host of that request.
      
      Since this host is used for all url helpers, an attacker could change
      generated links and redirects. If the header is set to
      `X-Forwarded-Host: //evil.hacker`, a redirect will be send to
      `https:////evil.hacker/`. Browsers will ignore these four slashes
      and redirect the user.
      
      [CVE-2021-44528]
      fd6a64fe
  8. Aug 19, 2021
  9. Aug 18, 2021
    • Jonathan Hefner's avatar
      Refactor CVE-2021-22881 fix · 9fe57c0f
      Jonathan Hefner authored
      Follow-up to 83a6ac3f.
      
      This allows `HTTP_HOST` to be omitted as before, and reduces the number
      of object allocations per request.
      
      Benchmark:
      
      ```ruby
       # frozen_string_literal: true
      require "benchmark/memory"
      
      HOST = "example.com:80"
      BEFORE_REGEXP = /\A(?<host>[a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9.:]+\])(:\d+)?\z/
      AFTER_REGEXP = /(?:\A|,[ ]?)([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9.:]+\])(?::\d+)?\z/i
      
      Benchmark.memory do |x|
        x.report("BEFORE (non-nil X-Forwarded-Host)") do
          origin_host = BEFORE_REGEXP.match(HOST.to_s.downcase)[:host]
          forwarded_host = BEFORE_REGEXP.match(HOST.to_s.split(/,\s?/).last)[:host]
        end
      
        x.report("BEFORE (nil X-Forwarded-Host)") do
          origin_host = BEFORE_REGEXP.match(HOST.to_s.downcase)[:host]
          forwarded_host = BEFORE_REGEXP.match(nil.to_s.split(/,\s?/).last)
        end
      
        x.report("AFTER (non-nil X-Forwarded-Host)") do
          origin_host = HOST&.slice(AFTER_REGEXP, 1) || ""
          forwarded_host = HOST&.slice(AFTER_REGEXP, 1) || ""
        end
      
        x.report("AFTER (nil X-Forwarded-Host)") do
          origin_host = HOST&.slice(AFTER_REGEXP, 1) || ""
          forwarded_host = nil&.slice(AFTER_REGEXP, 1) || ""
        end
      end
      ```
      
      Results:
      
      ```
      BEFORE (non-nil X-Forwarded-Host)
                             616.000  memsize (   208.000  retained)
                               9.000  objects (     2.000  retained)
                               2.000  strings (     1.000  retained)
      BEFORE (nil X-Forwarded-Host)
                             328.000  memsize (     0.000  retained)
                               5.000  objects (     0.000  retained)
                               2.000  strings (     0.000  retained)
      AFTER (non-nil X-Forwarded-Host)
                             248.000  memsize (   168.000  retained)
                               3.000  objects (     1.000  retained)
                               1.000  strings (     0.000  retained)
      AFTER (nil X-Forwarded-Host)
                              40.000  memsize (     0.000  retained)
                               1.000  objects (     0.000  retained)
                               1.000  strings (     0.000  retained)
      ```
      
      [CVE-2021-22942]
      9fe57c0f
  10. Jun 15, 2021
  11. Jun 10, 2021
  12. Jun 07, 2021
  13. May 28, 2021
  14. May 05, 2021
  15. May 04, 2021
Loading