Alta

Response Splitting from unsanitized headers

  • Publicada: 22.09.2021
  • Actualizado: 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:

Software afectado

Haz clic en una tecnología para ver todas sus vulnerabilidades.

PlataformaPaqueteVersiones vulnerablesCorregida en
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 sin corrección
Java / Kotlin (Maven) org.http4s:http4s-server_2.11 <= 0.21.28 sin corrección
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 sin corrección
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

Referencias

Puntuación CVSS 8.7/10
Vector CVSS
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:N
Debilidad (CWE)
CWE-74, CWE-918
Plataforma
Java / Kotlin (Maven)
Paquete
org.http4s:http4s-client_2.12, org.http4s:http4s-client_2.13, org.http4s:http4s-client_3
Publicada
22.09.2021
Actualizado
11.10.2026 12:22

Fuentes y licencias

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

Historial de vulnerabilidades: org.http4s:http4s-server_2.13

Todas las vulnerabilidades publicadas de este paquete (Java / Kotlin (Maven)), de la más reciente a la más antigua. Muestra si es un fallo aislado o un paquete que hay que vigilar.

Entradas en total
3
Primera → última
09.2021 09.2026
Sin corrección
0
Explotada en ataques
0

Distribución por gravedad

  • Crítica 1
  • Alta 1
  • Media 1

Divulgaciones por año

  1. 2021: 2
  2. 2022: 0
  3. 2023: 0
  4. 2024: 0
  5. 2025: 0
  6. 2026: 1
  1. Media · 5.9 CVE-2026-69201 < 0.23.35, >= 1.0.0-M1, < 1.0.0-M47 0.23.35, 1.0.0-M47
  2. Response Splitting from unsanitized headers esta entrada
    Alta · 8.7 CVE-2021-41084 < 0.21.29, >= 0.22.0, < 0.22.5, >= 0.23.0, < 0.23.4 0.21.29, 0.22.5, 0.23.4
  3. Crítica · 9.1 CVE-2021-39185 < 0.21.27, >= 0.22.0, < 0.22.3, >= 0.23.0, < 0.23.2 0.21.27, 0.22.3, 0.23.2

Identifica las vulnerabilidades de tu aplicación

Con la integración de DockRay y el inventario de software activado, DockRay compara las versiones notificadas de los componentes con las vulnerabilidades conocidas y avisa de las coincidencias confirmadas. La cobertura depende de la tecnología compatible y de los avisos disponibles.

Conectar tu aplicación
Newsletter DockRay

La seguridad de tus aplicaciones en tu correo

Vulnerabilidades importantes, recomendaciones concretas y consejos prácticos para tus aplicaciones. Elige tus tecnologías y sigue lo que importa para tu proyecto.

  • Un resumen diario de nuevas vulnerabilidades, también las críticas.
  • Avisos sobre actualizaciones importantes.
  • Consejos prácticos sobre seguridad y monitorización de aplicaciones.

Déjalo vacío para recibir avisos de todas las tecnologías.

Suscripción gratuita. Date de baja con un clic en cualquier correo.