Skip to content

Commit fd67112

Browse files
committed
Ignore secure_scheme_headers in Trailer section
In common configuration unlikely a big security problem in itself you are just fooling the remote about https. However, it is offers an oracle for otherwise invisible proxy request headers, so it might help exploiting other vulnerabilities.
1 parent ac29c9b commit fd67112

File tree

2 files changed

+10
-6
lines changed

2 files changed

+10
-6
lines changed

gunicorn/http/body.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ def parse_trailers(self, unreader, data):
5151
if done:
5252
unreader.unread(buf.getvalue()[2:])
5353
return b""
54-
self.req.trailers = self.req.parse_headers(buf.getvalue()[:idx])
54+
self.req.trailers = self.req.parse_headers(buf.getvalue()[:idx], from_trailer=True)
5555
unreader.unread(buf.getvalue()[idx + 4:])
5656

5757
def parse_chunked(self, unreader):

gunicorn/http/message.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def force_close(self):
6666
def parse(self, unreader):
6767
raise NotImplementedError()
6868

69-
def parse_headers(self, data):
69+
def parse_headers(self, data, from_trailer=False):
7070
cfg = self.cfg
7171
headers = []
7272

@@ -76,9 +76,13 @@ def parse_headers(self, data):
7676
# handle scheme headers
7777
scheme_header = False
7878
secure_scheme_headers = {}
79-
if ('*' in cfg.forwarded_allow_ips or
80-
not isinstance(self.peer_addr, tuple)
81-
or self.peer_addr[0] in cfg.forwarded_allow_ips):
79+
if from_trailer:
80+
# nonsense. either a request is https from the beginning
81+
# .. or we are just behind a proxy who does not remove conflicting trailers
82+
pass
83+
elif ('*' in cfg.forwarded_allow_ips or
84+
not isinstance(self.peer_addr, tuple)
85+
or self.peer_addr[0] in cfg.forwarded_allow_ips):
8286
secure_scheme_headers = cfg.secure_scheme_headers
8387

8488
# Parse headers into key/value pairs paying attention
@@ -294,7 +298,7 @@ def parse(self, unreader):
294298
self.unreader.unread(data[2:])
295299
return b""
296300

297-
self.headers = self.parse_headers(data[:idx])
301+
self.headers = self.parse_headers(data[:idx], from_trailer=False)
298302

299303
ret = data[idx + 4:]
300304
buf = None

0 commit comments

Comments
 (0)