mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-16 16:34:42 +00:00
haproxy public development tree
89265224d3
Before HTX was introduced, all the HTTP request elements passed in pseudo-headers fields were used to build an HTTP/1 request whose syntax was then scrutinized by the HTTP/1 parser, leaving no room to inject invalid characters. While NUL, CR and LF are properly blocked, it is possible to inject spaces in the method so that once translated to HTTP/1, fields are shifted by one spcae, and a lenient HTTP/1 server could possibly be fooled into using a part of the method as the URI. For example, the following request: H2 request :method: "GET /admin? HTTP/1.1" :path: "/static/images" would become: GET /admin? HTTP/1.1 /static/images HTTP/1.1 It's important to note that the resulting request is *not* valid, and that in order for this to be a problem, it requires that this request is delivered to an already vulnerable HTTP/1 server. A workaround here is to reject malformed methods by placing this rule in the frontend or backend, at least before leaving haproxy in H1: http-request reject if { method -m reg [^A-Z0-9] } Alternately H2 may be globally disabled by commenting out the "alpn" directive on "bind" lines, and by rejecting H2 streams creation by adding the following statement to the global section: tune.h2.max-concurrent-streams 0 This patch adds a check for each character of the method to make sure they belong to the ones permitted in a token, as mentioned in RFC7231#4.1. This should be backported to versions 2.0 and above. For older versions not having HTX_FL_PARSING_ERROR, a "goto fail" works as well as it results in a protocol error at the stream level. Non-HTX versions are safe because the resulting invalid request will be rejected by the internal HTTP/1 parser. Thanks to Tim Düsterhus for reporting that one. |
||
---|---|---|
.github | ||
addons | ||
admin | ||
dev | ||
doc | ||
examples | ||
include | ||
reg-tests | ||
scripts | ||
src | ||
tests | ||
.cirrus.yml | ||
.gitattributes | ||
.gitignore | ||
.travis.yml | ||
BRANCHES | ||
CHANGELOG | ||
CONTRIBUTING | ||
INSTALL | ||
LICENSE | ||
MAINTAINERS | ||
Makefile | ||
README | ||
ROADMAP | ||
SUBVERS | ||
VERDATE | ||
VERSION |
The HAProxy documentation has been split into a number of different files for ease of use. Please refer to the following files depending on what you're looking for : - INSTALL for instructions on how to build and install HAProxy - BRANCHES to understand the project's life cycle and what version to use - LICENSE for the project's license - CONTRIBUTING for the process to follow to submit contributions The more detailed documentation is located into the doc/ directory : - doc/intro.txt for a quick introduction on HAProxy - doc/configuration.txt for the configuration's reference manual - doc/lua.txt for the Lua's reference manual - doc/SPOE.txt for how to use the SPOE engine - doc/network-namespaces.txt for how to use network namespaces under Linux - doc/management.txt for the management guide - doc/regression-testing.txt for how to use the regression testing suite - doc/peers.txt for the peers protocol reference - doc/coding-style.txt for how to adopt HAProxy's coding style - doc/internals for developer-specific documentation (not all up to date)