# CVE-2022-31109: laminas-diactoros XSS — Fixed in 2.11.1

🐘

🐘 Packagist

Not in CISA KEV

HIGH severity

# CVE-2022-31109 — laminas-diactoros

HIGH [Fix: laminas/laminas-diactoros@25b11d4](https://github.com/laminas/laminas-diactoros/commit/25b11d422c2e5dad868f68619888763b30f91e2d)

CVE-2022-31109 is a high-severity (CVSS 7.2) Cross-site Scripting (XSS) vulnerability in laminas/laminas-diactoros. A fix is available for laminas/laminas-diactoros — see the affected versions and patch details below.

HTTP Host Header Attack Vulnerability in laminas-diactoros

Also known as[GHSA-8274-h5jp-97vr](/vulnerability/GHSA-8274-h5jp-97vr)

Published

Aug 1, 2022

Updated

Oct 28, 2026

Affected

1 pkg

Patched

1 / 1

Exploits

None indexed

Exploitation data as of Nov 6, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

## Exploitation Status

### No confirmed exploitation observed yet

-   CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
-   CISA’s own triage has not observed active exploitation or public proof-of-concept code for this CVE as of its last assessment.

Exploitation and automatability from CISA’s SSVC triage for CVE-2022-31109.

## EPSS Exploitation Probability

[via FIRST.org ↗](https://www.first.org/epss/)

0.8%probability of exploitation in next 30 days

Lower Risk0.00%

Lower risk than most CVEs57th percentile — riskier than 57% of all scored CVEsHighest risk

0.00%0.43%0.86%1.30%0.5%0.8%May 26Sep 26Nov 26

Probability of exploitation in the next 30 days, from [FIRST.org EPSS](https://www.first.org/epss/).

## How urgent is this, really

## Where this sits among everything scored

## Real-World Exposure

1 pkg affected

🐘`laminas/laminas-diactoros`

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects Packagist packages — download data is not available via public APIs for these ecosystems.

## Description

#### 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

-   [HTTP Host Header Attacks](https://portswigger.net/web-security/host-header)

#### For more information

If you have any questions or comments about this advisory:

-   Open an issue in [laminas/laminas-diactoros](https://github.com/laminas/laminas-diactoros/)
-   [Email us](mailto:security@getlaminas.org)

## Affected Packages

1 total 1 fixed

Ecosystem

Package

Vulnerable range

Fix

🐘Packagist

`laminas/laminas-diactoros` 

all versions

2.11.1`composer require laminas/laminas-diactoros:^2.11.1`

## Affected Products

1 product · 1 configurations

Application

`laminas-diactoros`getlaminas

< 2.11.1

range

## Detection & mitigation playbook

Open-source dependency

1.  ### Detect
    
    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for laminas/laminas-diactoros, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
    
2.  ### Fix
    
    Update laminas/laminas-diactoros to 2.11.1 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2022-31109 is resolved across your whole dependency graph.
    
3.  ### Workarounds
    
    Escape or sanitise the affected output on the server side rather than relying on client-side filtering, and add a Content-Security-Policy that blocks inline script execution so injected markup cannot run even if it reaches the page.
    

## Frequently Asked Questions

\### 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\`,

O3 Security · Impact-Aware SCA

### Is CVE-2022-31109 in your dependencies?

Find it across Packagist, including transitive dependencies.

[Scan my dependencies](/book-demo) [How O3 SCA works](/impact-aware-sca)