blob: ff835a7a2801fb57fcd4011fc6cbdd90058ac7a9 [file] [view]
# Apache httpd Security Policy
This document is an overview of the security model for Apache
httpd. Security vulnerabilities reported to the project need to
demonstrate how an attacker can violate the security model.
## Supported Versions
Currently the only supported version is the latest patch release of the
`2.4.x` stable branch. Vulnerabilities which exist *only* in
unreleased branches (such as `trunk`) should be reported as normal bug
reports via <https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2>.
## Reporting Vulnerabilities
For information on how to report a new security problem please see
[here](http://httpd.apache.org/security_report.html). The process of
reporting and handling vulnerabilities is out of scope for this
document.
For a list of already-addressed vulnerabilities, see [Apache 2.4 Security
Vulnerabilities](http://httpd.apache.org/security/vulnerabilities_24.html).
## Model scope
Every vulnerability report MUST begin with a concise, human-readable
description either:
a) clearly identifying the aspect of this security model which is
violated by the reported bug, including any applicable
[module-specific trust boundary](#module-specific-trust-boundaries), or
b) succinctly describing a trust boundary which is not covered by this
document, supported by references (such as the httpd documentation),
and showing how it is violated by the reported bug.
Reports will be rejected if they invent contrived trust boundaries, or
fail to give a simple explanation of why a trust boundary is relevant.
Verbose, AI-generated reports will often fail these tests without
sufficient human review or oversight.
Any security vulnerability SHOULD be reproducible:
1. under a reasonable, supported configuration.
2. without using third-party modules, or modules explicitly designed
for debugging.
3. using the *latest* released sources published via <https://httpd.apache.org/download.cgi#apache24>.
4. under a standard build, on a supported platform.
Issues which are reproducible only using instrumented builds (such as
ASAN, or under valgrind) should be clearly explained as such, and may
be rejected if they do not demonstrate any practical impact in
non-instrumented builds.
Issues which depend on a specially crafted server configuration MUST
include references (such as public documentation) which show why that
is a configuration that would arise naturally in common deployments.
Special considerations also apply to any issues requiring `.htaccess`
files, per the [Delegated Configuration](#delegated-configuration) section.
It MAY be helpful to use references to vulnerabilities previously
disclosed by this project, the httpd documentation (see docs/manual),
and to demonstrate common usage patterns. Issues MUST NOT be reported
based only on the similarity to a known vulnerability; all the
requirements described here MUST be met (a reproducible bug, with a
description of the specific security impact under the model).
## Basic model
Processing of requests by remote untrusted users (HTTP clients) MUST
NOT crash or prematurely terminate server processes, nor gain code
execution privileges. In the default configuration, timeouts are
applied to most aspects of HTTP request handling such that a single
idle client connection SHOULD NOT tie up a single processing thread or process
indefinitely.
It is the responsibility of the server administrator to tune and
configure httpd appropriately to the operating environment, for
example adjusting MPM limits (see
https://httpd.apache.org/docs/trunk/misc/security_tips.html).
Denial of service attacks are expected to be mitigated at firewall or
network level. It is expected that an attacker who is able to
establish multiple simultaneous connections to the server will, to
some extent, deny service to other remote users.
Example vulnerabilities which violated the model: CVE-2026-23918,
CVE-2004-0786.
## Resource Consumption
Handling requests entails resource consumption (CPU, memory, disk
space for logs, etc). It is expected that resource consumption by the
server is at worst proportional to the volume of network traffic.
Memory consumption by a single request should be capped, with
configurable limits; e.g. LimitRequestFields limits the RAM
consumption by HTTP headers, LimitXMLRequestBody limits the RAM
consumption by parsing XML request documents.
Example vulnerabilities which violated the model: CVE-2004-0942.
## Privilege separation on Unix platforms
On Unix platforms, when httpd is started as the root user, privilege
separation is used between the parent process which retains root
privileges, and child processes (and threads). Child processes/threads
run as a less-privileged user and group which is configurable via the
`mod_unixd` module, https://httpd.apache.org/docs/2.4/mod/mod_unixd.html
The less-privileged user:
* MUST be restricted from gaining root privileges, and
* SHOULD NOT have read or truncate access to log files
but otherwise has full control over network communication with
clients, and, for example, retains access to SSL private key data in a
typical configuration.
Use of platform-specific sandboxing or security features (such as use
of containers, chroot, SELinux) are out of scope for this security
model.
Example vulnerabilities which violated the model: CVE-2007-3304,
CVE-2012-0031.
## Delegated Configuration
Server configuration can be delegated to trusted local site authors by
allowing use of .htaccess files in some configurations (see
https://httpd.apache.org/docs/2.4/howto/htaccess.html). Site authors
gain a significant degree of control over, and access to, the server
at run-time:
* site authors are trusted to not attack the server with malformed or
malicious .htaccess files
* site authors gain access to some data (such as files or the
environment) which is otherwise restricted.
Examples of malicious `.htaccess` files include, but are not limited
to:
* configuration files of excessive size
* configurations using deliberately constructed regular expressions
which are expensive to evaluate
In configurations where `.htaccess` files can configure in-process
code execution which is not sandboxed, such as `mod_lua` (see the
[mod_lua](#mod_lua) section below), SSI documents with `Options
Includes`, or third-party interpreters such as `mod_php`, site authors
have exactly equivalent privileges to the user which the server runs
as.
## Trusted Services
Attacks from servers and services which are implicitly or explicitly
trusted in the httpd configuration are outside the scope of the
security model.
Examples of trusted services include, but are not limited to:
* Services used for caching privileged or protected data, including
all `mod_socache_*` providers (memcached, Redis/Valkey, distcache,
shared memory, DBM) whether used for the `mod_ssl` session or
stapling cache, `mod_authn_socache` credentials, or `mod_cache_socache`
* Database or LDAP servers used for authentication, authorization or
session storage via `mod_dbd` or `mod_ldap`, including LDAP referral
targets when `LDAPReferrals` is enabled
* OCSP servers used for client certificate verification, or server
certificate "stapling", and CA/CRL/certificate/key files
* ACME servers used for issuing certificates in `mod_md`
* Intermediaries listed in `RemoteIPTrustedProxy`/`RemoteIPInternalProxy`,
and PROXY protocol senders (see `mod_remoteip` below)
* The local syslog, journald and systemd services
* External programs executed by the server as configured by the
administrator: piped loggers, `RewriteMap prg:`, `ExtFilterDefine`,
`SSLPassPhraseDialog exec:`, `mod_md` notification commands, CGI
programs and FastCGI/SCGI/uWSGI applications
* Loadable modules (`LoadModule`) and ISAPI extensions
Backend servers are those explicitly configured by the administrator
in a reverse proxy (or gateway) configuration, typically via
`ProxyPass`, `ProxyPassMatch`, `BalancerMember` or `RewriteRule [P]`,
using HTTP, HTTP/2, AJP, FastCGI, SCGI or uWSGI (see
https://httpd.apache.org/docs/current/mod/mod_proxy.html#forwardreverse).
Backend servers are trusted to provide content and response headers,
and bugs triggered only by a malicious backend are outside the model,
with one exception: backends SHOULD NOT be able to influence HTTP
protocol framing logic in the frontend (client) communication (so
called "response splitting" attacks).
Origin servers contacted in a *forward* proxy configuration
(`ProxyRequests On`, `CONNECT` tunnels via `mod_proxy_connect`, and FTP
servers via `mod_proxy_ftp`) are NOT trusted; they are arbitrary
network peers and are covered by the basic model.
Example vulnerabilities which violated the model: CVE-2026-33523,
CVE-2024-42516.
## Module-specific trust boundaries
The following describes trust boundaries specific to individual
modules, in addition to the general model above.
### Administrative handlers
The `balancer-manager` (`mod_proxy_balancer`), `server-status`
(`mod_status`), `server-info` (`mod_info`), `ldap-status` (`mod_ldap`)
and `md-status` (`mod_md`) handlers expose privileged information or
allow runtime reconfiguration. They MUST be protected by access
control, as described in each module's documentation. Any user granted
access to these handlers is trusted as an administrator; in particular
a `balancer-manager` user can direct traffic to arbitrary backends.
Disclosure resulting from enabling these handlers without access
control, including via `SetHandler` in `.htaccess`, is a configuration
error. The nonce and Referer checks in `balancer-manager` defend an
authorized operator against cross-site request forgery only.
### mod_sed, mod_substitute, mod_ext_filter
The sed script configured via `InputSed`/`OutputSed`, the `Substitute`
pattern and replacement, and the program configured via
`ExtFilterDefine` are trusted input. `mod_sed` scripts can read and
write any file accessible to the server user (`r` and `w` commands);
`InputSed`/`OutputSed` are not available in `.htaccess`. `Substitute`
is available to `.htaccess` authors, who are trusted per the Delegated
Configuration section.
Processing of content by `mod_sed` or `mod_substitute` may have
non-linear process or memory costs for any given script and/or regular
expression used, and computational costs for these modules is outside
the model.
### mod_proxy_hcheck
Health checks are sent to configured backends, which are trusted as
described under Trusted Services. Defects triggered only by a
malicious or malformed health-check response are outside the model.
The limits on health-check processing described in the module
documentation are robustness measures and are not a security
guarantee.
### mod_proxy_scgi
With `ProxySCGISendfile` the backend may direct the server to serve any
file readable by the server user, and with `ProxySCGIInternalRedirect`
(the default) any internal URL. This is by design: SCGI backends are
trusted at the level of the server user.
### mod_proxy_wstunnel, mod_proxy_connect, mod_proxy_fdpass
Once a protocol upgrade (101) is accepted from a configured backend,
or a `CONNECT` tunnel is established, bytes are relayed without
interpretation; the content of the tunnel is outside the model and
only timeouts apply. `CONNECT` targets are untrusted peers (see Trusted
Services). A process receiving client sockets via `mod_proxy_fdpass`
owns the connection thereafter and is fully trusted.
### mod_proxy_beacon, mod_heartbeat, mod_heartmonitor
Holders of the `ProxyBeaconSecret` are trusted as balancer
administrators. Datagrams which fail authentication or freshness
checks are untrusted network input and MUST have no effect beyond
logging. `mod_heartmonitor` accepts *unauthenticated* status packets
and `POST` requests to the `hearbeat` handler: both are only
accessible to trusted hosts.
### mod_remoteip
Client addresses asserted by proxies listed in `RemoteIPTrustedProxy`
or `RemoteIPInternalProxy` are trusted; spoofing by such a proxy is
out of scope, as is spoofing by any client when `RemoteIPHeader` is
used without a trusted proxy list (a documented misconfiguration).
Assertions from unlisted peers MUST be ignored. Listeners enabled with
`RemoteIPProxyProtocol` MUST be reachable only by the intermediaries
expected to send the PROXY protocol header; under that configuration
the PROXY header is trusted input.
### mod_cgi, mod_cgid, mod_suexec, mod_actions, mod_include
CGI programs, SSI documents with `exec` enabled, and programs invoked
via `Action`/`Script` are trusted code running as the server user (or
the `suexec` target user). Their output is trusted content but, by
default, is not trusted to control HTTP framing: `Content-Length` is
recomputed unless `ap_trust_cgilike_cl` is set and `Transfer-Encoding`
is rejected. The `mod_cgid` socket is accessible only to the server
user; processes already running as that user are within the same trust
domain. The `suexec` wrapper trusts only the server user as caller and
enforces the checks documented at
https://httpd.apache.org/docs/current/suexec.html; a target user's own
insecure scripts are out of scope.
### mod_lua
Lua scripts, and anyone able to configure them (including `.htaccess`
authors where `AllowOverride` permits the `Lua*` directives, per
[Delegated Configuration](#delegated-configuration)), are trusted with
the full privileges of the server user. mod_lua provides
no sandbox: scripts may use the `os` and `io` libraries, read and
modify server configuration via `r:config()` and the request object,
and share Lua state across requests under `LuaScope thread` or
`server`. Consequently the following are NOT vulnerabilities: any
crash, hang, resource exhaustion or disclosure caused by a script's
own actions, including calling API functions with undocumented
argument types or values, requesting unbounded allocations, or
leaking data between scripts, requests or virtual hosts through a
shared Lua state.
Scripts are responsible for bounding client-derived data they pass to
the API, for example via the `sizeLimit` argument of `r:parsebody`;
memory use proportional to a limit the script chose is by design.
Every mod_lua code path runs on behalf of a remote client, so that a
client request triggers a defect establishes nothing by itself.
Ordinary robustness bugs in mod_lua's own bindings - including, but not
limited to, memory leaks, crashes, hangs and other resource exhaustion
- are treated as ordinary bugs, not security vulnerabilities, however
they are reached; a report MUST demonstrate a security outcome beyond
the crash or leak itself, such as memory corruption a client can
leverage for code execution or a bypass of access control.
Reports MUST include the triggering Lua script and show that it is one
a careful author following the documentation would write.
### mod_rewrite
Rewrite rules and all `RewriteMap` sources (`txt`, `dbm`, `rnd`,
`prg`, `dbd`/`fastdbd`) are trusted configuration; `prg` maps run with
the privileges of the user who started the server unless configured
otherwise. Rules which pass unconstrained client input to redirect,
proxy or filesystem targets are configuration errors, as described in
the documentation. The module's default protections (such as
`AllowAnyURI` being off, and the `UnsafeAllow3F`/`UnsafePrefixStat`
flags being required) are part of the model and their bypass is in
scope.
### mod_ssl, mod_md
Certificate, key, CA, CRL and OpenSSL configuration files and
`SSLOpenSSLConfCmd` are trusted. Client certificate data is untrusted
input; identity derived from it is meaningful only when verification
succeeds against a configured CA, and `SSLVerifyClient optional_no_ca`
provides no authentication. TLS to backends authenticates the backend
only with `SSLProxyVerify require`. In `mod_md`, requests to the ACME
challenge paths, `acme-tls/1` handshakes and the public
`certificate-status` handler are untrusted client input; the ACME
server, `MDStoreDir`, and the commands configured via
`MDChallengeDns01`, `MDMessageCmd` and `MDNotifyCmd` are trusted.
### mod_session, mod_session_cookie, mod_session_crypto, mod_auth_form
A session stored in a client cookie without `mod_session_crypto` is
fully client-controlled and provides neither confidentiality nor
integrity; treating its contents as authentic is a configuration
error. With `mod_session_crypto`, forging a session without the key is
in scope. Backends and scripts able to set `SessionHeader` are trusted
to write sessions. `mod_auth_form` re-verifies session credentials on
each request; the documented risks of inline login forms and of the
`AuthFormSitePassphrase` with unencrypted sessions are out of scope.
### mod_dav, mod_dav_fs
The DAV repository, lock database and property databases are private to
the server; modification outside httpd is unsupported. Authorized DAV
users are untrusted for protocol parsing, memory safety and path
confinement, but the documented denial-of-service possibilities open
to authorized users (filling the disk, `DavDepthInfinity`,
`DavHonorMtimeHeader`) are out of scope.
### mod_cache, mod_cache_disk
Cached content from reverse-proxy backends is trusted as provided. The
on-disk cache is writable by the server user and tampering with it
requires that privilege. Cache poisoning via the origin (DNS poisoning,
request smuggling against the origin) and the documented effects of
`CacheQuickHandler On` on per-directory access control are out of
scope.
### mod_mime_magic, mod_mime_libmagic
The magic database file is trusted configuration. The file content
examined may be untrusted (for example uploaded files) and the built-in
matcher MUST handle it safely. The risks of `MimeMagicDecompression`
(off by default) are documented and out of scope; defects in libmagic
itself are third-party.
### mod_ident, DNS
The RFC 1413 "ident" service queried by `mod_ident` runs on the
client's own host and is untrusted; its response is client input and
the documentation states it is not reliable. Reverse DNS results are
controlled by the owner of the client address and are untrusted; the
server performs double-reverse lookups for `Require host`. The
configured DNS resolver, and forward DNS used when parsing the
configuration, are trusted services (see
https://httpd.apache.org/docs/current/dns-caveats.html).
### Authentication providers
Credential and group stores used by authentication and authorization
providers (`htpasswd`/DBM files, SQL via `mod_dbd`, LDAP, FastCGI
authorizers via `mod_authnz_fcgi`, cached credentials via
`mod_authn_socache`, JWT signing keys for `mod_autht_jwt`) are trusted.
Credentials and tokens presented by clients are untrusted. Configuring
`AuthtJwtVerify none` delegates trust to the transport.
### Logging
Log files, their directories and piped log programs (which run as the
user who started the server) are trusted. Client-supplied data written
to logs is escaped as documented; a client able to inject raw control
characters or forge log lines via an escaped format field violates the
model.
Example vulnerabilities which violated the model: CVE-2003-0083,
CVE-2003-0020, CVE-2013-1862, CVE-2024-47252.
### Debugging, example and experimental modules
The following are out of scope regardless of build configuration:
`mod_bucketeer`, `mod_dumpio`, `mod_firehose`, `mod_log_debug`,
`mod_echo`, `mod_dialup`, `mod_noloris`, `mod_serf`, and all modules
under `modules/examples` and `modules/test`.