Wysoka

Response Splitting from unsanitized headers

  • Ujawniono: 22.09.2021
  • Aktualizacja: 11.10.2026 12:22

Impact

http4s is vulnerable to response-splitting or request-splitting attacks when untrusted user input is used to create any of the following fields:

  • Header names (Header.nameå
  • Header values (Header.value)
  • Status reason phrases (Status.reason)
  • URI paths (Uri.Path)
  • URI authority registered names (URI.RegName) (through 0.21)

The following backends render invalid carriage return, newline, or null characters in an unsafe fashion.

blaze-server ember-server blaze-client ember-client jetty-client
header names ⚠ ⚠ ⚠ ⚠ ⚠
header values ⚠ ⚠ ⚠ ⚠
status reasons ⚠ ⚠
URI paths ⚠ ⚠
URI regnames ⚠ < 0.22 ⚠ < 0.22

For example, given the following service:

scala
import cats.effect._
import org.http4s._
import org.http4s.dsl.io._
import org.http4s.server.blaze.BlazeServerBuilder
import scala.concurrent.ExecutionContext.global

object ResponseSplit extends IOApp {
  override def run(args: List[String]): IO[ExitCode] =
    BlazeServerBuilder[IO](global)
      .bindHttp(8080)
      .withHttpApp(httpApp)
      .resource
      .use(_ => IO.never)

  val httpApp: HttpApp[IO] =
    HttpApp[IO] { req =>
      req.params.get("author") match {
        case Some(author) =>
          Ok("The real content")
            .map(_.putHeaders(Header("Set-Cookie", s"author=${author}")))
        case None =>
          BadRequest("No author parameter")
      }
    }
}

A clean author parameter returns a clean response:

bash
curl -i 'http://localhost:8080/?author=Ross'
http
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Set-Cookie: author=Ross
Date: Mon, 20 Sep 2021 04:12:10 GMT
Content-Length: 16

The real content

A malicious author parameter allows a user-agent to hijack the response from our server and return different content:

bash
curl -i 'http://localhost:8080/?author=hax0r%0d%0aContent-Length:+13%0d%0a%0aI+hacked+you'
http
HTTP/1.1 200 OK
Content-Type: text/plain; charset=UTF-8
Set-Cookie: author=hax0r
Content-Length: 13

I hacked you

Patches

Versions 0.21.29, 0.22.5, 0.23.4, and 1.0.0-M27 perform the following:

  • If a status reasoon phrase is invalid, it is dropped. Rendering is optional per spec.
  • If a header name is invalid in a request or response, the header is dropped. There is no way to generically sanitize a header without potentially shadowing a correct one.
  • If a header value is invalid in a request or response, it is sanitized by replacing null (\u0000), carriage return (\r), and newline (\n) with space ( ) characters per spec.
  • If a URI path or registered name is invalid in a request line, the client raises an IllegalArgumentException.
  • If a URI registered name is invalid in a host header, the client raises an IllegalArgumentException.

Workarounds

http4s services and client applications should sanitize any user input in the aforementioned fields before returning a request or response to the backend. The carriage return, newline, and null characters are the most threatening.

Not all backends were affected: jetty-server, tomcat-server, armeria, and netty on the server; async-http-client, okhttp-client, armeria, and netty as clients.

References

For more information

If you have any questions or comments about this advisory:

Czego dotyczy

Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.

PlatformaPaczkaPodatne wersjePoprawka w wersji
Java / Kotlin (Maven) org.http4s:http4s-client_2.12 < 0.21.29, >= 0.22.0, < 0.22.5, >= 0.23.0, < 0.23.4 0.21.29, 0.22.5, 0.23.4
Java / Kotlin (Maven) org.http4s:http4s-client_2.13 < 0.21.29, >= 0.22.0, < 0.22.5, >= 0.23.0, < 0.23.4 0.21.29, 0.22.5, 0.23.4
Java / Kotlin (Maven) org.http4s:http4s-client_3 < 0.21.29, >= 0.22.0, < 0.22.5, >= 0.23.0, < 0.23.4 0.21.29, 0.22.5, 0.23.4
Java / Kotlin (Maven) org.http4s:http4s-server_2.10 <= 0.21.28 brak poprawki
Java / Kotlin (Maven) org.http4s:http4s-server_2.11 <= 0.21.28 brak poprawki
Java / Kotlin (Maven) org.http4s:http4s-server_2.12 < 0.21.29, >= 0.22.0, < 0.22.5, >= 0.23.0, < 0.23.4 0.21.29, 0.22.5, 0.23.4
Java / Kotlin (Maven) org.http4s:http4s-server_2.13 < 0.21.29, >= 0.22.0, < 0.22.5, >= 0.23.0, < 0.23.4 0.21.29, 0.22.5, 0.23.4
Java / Kotlin (Maven) org.http4s:http4s-server_2.13.0-M5 <= 0.21.28 brak poprawki
Java / Kotlin (Maven) org.http4s:http4s-server_3 >= 0.22.0, < 0.22.5, >= 0.23.0, < 0.23.4 0.22.5, 0.23.4

Odnośniki

Ocena CVSS 8.7/10
Wektor CVSS
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:N
Słabość (CWE)
CWE-74, CWE-918
Platforma
Java / Kotlin (Maven)
Paczka
org.http4s:http4s-client_2.12, org.http4s:http4s-client_2.13, org.http4s:http4s-client_3
Ujawniono
22.09.2021
Aktualizacja
11.10.2026 12:22

Źródła i licencje

OSV / GitHub Advisory Database - GHSA-5vcm-3xc3-w7x3 - CC BY 4.0

Historia podatności: org.http4s:http4s-server_2.11

Wszystkie opisane podatności tej paczki (Java / Kotlin (Maven)), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.

Wszystkich wpisów
2
Pierwsza → ostatnia
09.2021 09.2021
Bez poprawki
2
Wykorzystywana w atakach
0

Rozkład istotności

  • Krytyczna 1
  • Wysoka 1

Ujawnienia w latach

  1. 2021: 2
  2. 2022: 0
  3. 2023: 0
  4. 2024: 0
  5. 2025: 0
  6. 2026: 0
  1. Response Splitting from unsanitized headers ten wpis
    Wysoka · 8.7 CVE-2021-41084 <= 0.21.28 brak poprawki
  2. Krytyczna · 9.1 CVE-2021-39185 wszystkie wersje brak poprawki

Dowiedz się, które podatności dotyczą Twojej aplikacji

Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.