GIVE YOUR AGENT THE EVIDENCE

Set up in your agent.

One prompt to get started. Paste it into your coding agent to connect cve.new through MCP and bring vulnerability context into your workflow.

Your agent needs remote MCP support and access to https://cve.new/mcp.

Read the setup guide

GIVE YOUR AGENT THE EVIDENCE

Investigate in your agent.

Turn this advisory into a focused investigation. Ask your agent to check your project’s versions, explain the evidence, and suggest a compatible fix.

Your agent needs remote MCP support and access to https://cve.new/mcp.

Read the setup guide

GHSA-8274-h5jp-97vrmedium6.1

Diactoros before 2.11.1 vulnerable to HTTP Host Header Attack

Check your stack

The advisory, in context

Impact

Applications that use Diactoros, and are either not behind a proxy, or can be accessed via untrusted proxies, can potentially have the host, protocol, and/or port of a Laminas\Diactoros\Uri instance associated with the incoming server request modified to reflect values from X-Forwarded-* headers. Such changes can potentially lead to XSS attacks (if a fully-qualified URL is used in links) and/or URL poisoning.

Patches

Any version after 2.11.0.

Starting in laminas/laminas-diactoros 2.11.1, we have added Laminas\Diactoros\ServerRequestFilter\FilterServerRequestInterface, which defines the single method __invoke(Psr\Http\Message\ServerRequestInterface $request): Psr\Http\Message\ServerRequestInterface. Filters implementing this interface allow modifying and returning a generated ServerRequest.

The primary use case of the interface is to allow modifying the generated URI based on the presence of headers such as X-Forwarded-Host. When operating behind a reverse proxy, the Host header is often rewritten to the name of the node to which the request is being forwarded, and an X-Forwarded-Host header is generated with the original Host value to allow the server to determine the original host the request was intended for. (We have always examined the X-Forwarded-Proto header; as of Diactoros 2.11.1, we also examine the X-Forwarded-Port header.) To accommodate this use case, we created Laminas\Diactoros\ServerRequestFilter\FilterUsingXForwardedHeaders.

Due to potential security issues, it is generally best to only accept these headers if you trust the reverse proxy that has initiated the request. (This value is found in $_SERVER['REMOTE_ADDR'], which is present as $request->getServerParams()['REMOTE_ADDR'] within PSR-7 implementations.) FilterUsingXForwardedHeaders provides named constructors to allow you to trust these headers from any source (which has been the default behavior of Diactoros since the beginning), or to specify specific IP addresses or CIDR subnets to trust, along with which headers are trusted.

Laminas\Diactoros\ServerRequestFactory::fromGlobals() was updated to accept a FilterServerRequestInterface as an additional, optional argument. Since the X-Forwarded-* headers do have valid use cases, particularly in clustered environments using a load balancer, to prevent backwards compatibility breaks, if no filter is provided, we generate an instance via FilterUsingXForwardedHeaders::trustReservedSubnets(), which generates an instance marked to trust only proxies on private subnets.

Workarounds

Infrastructure or DevOps can configure web servers to reject X-Forwarded-* headers at the web server level.

Users of laminas/laminas-diactoros can make use of the Laminas\Diactoros\RequestFilter\RequestFilterInterface functionality in order to either (a) disable usage of the X-Forwarded-* headers entirely, (b) opt-in to it, or (c) opt-in to the usage for configured proxy servers.

References

For more information

If you have any questions or comments about this advisory:

Affected packages

Start with the recorded fix for your release branch. Check your installed version and test compatibility before upgrading. Fixing this advisory does not rule out other vulnerabilities in the release.

Ecosystem versions

Earlier releases before 2.11.1

Fixed in 2.11.1

110 explicitly affected versions

1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.4, 1.0.5, 1.1.0, 1.1.1, 1.1.2, 1.1.3, 1.1.4, 1.2.0, 1.2.1, 1.3.0, 1.3.1, 1.3.10, 1.3.11, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7, 1.3.8, 1.3.9, 1.4.0, 1.4.1, 1.5.0, 1.6.0, 1.6.1, 1.7.0, 1.7.1, 1.7.2, 1.8.0, 1.8.0p1, 1.8.0p2, 1.8.1, 1.8.1p1, 1.8.1p2, 1.8.2, 1.8.2p1, 1.8.2p2, 1.8.3, 1.8.3p1, 1.8.3p2, 1.8.4, 1.8.4p1, 1.8.4p2, 1.8.5, 1.8.5p1, 1.8.5p2, 1.8.6, 1.8.6p1, 1.8.6p2, 1.8.7, 1.8.7p1, 1.8.7p2, 2.0.0, 2.0.0p1, 2.0.0p2, 2.0.1, 2.0.1p1, 2.0.1p2, 2.0.2, 2.0.2p1, 2.0.2p2, 2.0.3, 2.0.3p1, 2.0.3p2, 2.1.0, 2.1.0p1, 2.1.0p2, 2.1.1, 2.1.1p1, 2.1.1p2, 2.1.2, 2.1.2p1, 2.1.2p2, 2.1.3, 2.1.3p1, 2.1.3p2, 2.1.4, 2.1.4p1, 2.1.4p2, 2.1.5, 2.1.5p1, 2.1.5p2, 2.10.0, 2.11.0, 2.2.0, 2.2.0p1, 2.2.0p2, 2.2.1, 2.2.1p1, 2.2.1p2, 2.2.2, 2.2.3, 2.3.0, 2.3.1, 2.3.2, 2.4.0, 2.4.1, 2.5.0, 2.5.1, 2.6.0, 2.7.0, 2.8.0, 2.9.0, 2.9.1, 2.9.2

View affected-version evidence
{
  "ranges": [
    {
      "events": [
        {
          "introduced": "0"
        },
        {
          "fixed": "2.11.1"
        }
      ],
      "type": "ECOSYSTEM"
    }
  ],
  "versions": [
    "1.0.0",
    "1.0.1",
    "1.0.2",
    "1.0.3",
    "1.0.4",
    "1.0.5",
    "1.1.0",
    "1.1.1",
    "1.1.2",
    "1.1.3",
    "1.1.4",
    "1.2.0",
    "1.2.1",
    "1.3.0",
    "1.3.1",
    "1.3.10",
    "1.3.11",
    "1.3.2",
    "1.3.3",
    "1.3.4",
    "1.3.5",
    "1.3.6",
    "1.3.7",
    "1.3.8",
    "1.3.9",
    "1.4.0",
    "1.4.1",
    "1.5.0",
    "1.6.0",
    "1.6.1",
    "1.7.0",
    "1.7.1",
    "1.7.2",
    "1.8.0",
    "1.8.0p1",
    "1.8.0p2",
    "1.8.1",
    "1.8.1p1",
    "1.8.1p2",
    "1.8.2",
    "1.8.2p1",
    "1.8.2p2",
    "1.8.3",
    "1.8.3p1",
    "1.8.3p2",
    "1.8.4",
    "1.8.4p1",
    "1.8.4p2",
    "1.8.5",
    "1.8.5p1",
    "1.8.5p2",
    "1.8.6",
    "1.8.6p1",
    "1.8.6p2",
    "1.8.7",
    "1.8.7p1",
    "1.8.7p2",
    "2.0.0",
    "2.0.0p1",
    "2.0.0p2",
    "2.0.1",
    "2.0.1p1",
    "2.0.1p2",
    "2.0.2",
    "2.0.2p1",
    "2.0.2p2",
    "2.0.3",
    "2.0.3p1",
    "2.0.3p2",
    "2.1.0",
    "2.1.0p1",
    "2.1.0p2",
    "2.1.1",
    "2.1.1p1",
    "2.1.1p2",
    "2.1.2",
    "2.1.2p1",
    "2.1.2p2",
    "2.1.3",
    "2.1.3p1",
    "2.1.3p2",
    "2.1.4",
    "2.1.4p1",
    "2.1.4p2",
    "2.1.5",
    "2.1.5p1",
    "2.1.5p2",
    "2.10.0",
    "2.11.0",
    "2.2.0",
    "2.2.0p1",
    "2.2.0p2",
    "2.2.1",
    "2.2.1p1",
    "2.2.1p2",
    "2.2.2",
    "2.2.3",
    "2.3.0",
    "2.3.1",
    "2.3.2",
    "2.4.0",
    "2.4.1",
    "2.5.0",
    "2.5.1",
    "2.6.0",
    "2.7.0",
    "2.8.0",
    "2.9.0",
    "2.9.1",
    "2.9.2"
  ]
}

References