Attackathon _ Fuel Network 32628 - [Blockchain_DLT - Medium] A GraphQL query crashes core process
Submitted on Thu Jun 27 2024 16:57:59 GMT-0400 (Atlantic Standard Time) by @xylix for Attackathon | Fuel Network
Report ID: #32628
Report type: Blockchain/DLT
Report severity: Medium
Target: https://github.com/FuelLabs/fuel-core/tree/8b1bf02103b8c90ce3ef2ba715214fb452b99885
Impacts:
RPC API crash affecting projects with greater than or equal to 25% of the market capitalization on top of the respective layer
Shutdown of greater than or equal to 30% of network processing nodes without brute force actions, but does not shut down the network
Network not being able to confirm new transactions (total network shutdown)
Shutdown of greater than 10% or equal to but less than 30% of network processing nodes without brute force actions, but does not shut down the network
Description
Brief/Intro
When using the GraphQL API to query for blocks, if the fields before
or after
are used to filter, without also populating either the first
or last
parameter, there will be an empty response and the whole fuel-core process being ran will crash.
Vulnerability Details
As described in the intro, when the GraphQL API is used to query blocks by the after
or before
filter, when the first
and last
parameters are empty, the fuel-core process running the GraphQL server crashes. (The POC contains a CURL query demonstrating this.)
The crash message thread 'tokio-runtime-worker' panicked at crates/fuel-core/src/schema.rs:129:17
pointed me to check the following code file: https://github.com/FuelLabs/fuel-core/blob/8b1bf02103b8c90ce3ef2ba715214fb452b99885/crates/fuel-core/src/schema.rs#L129 There seems to be a case where when neither of [first, last] parameters is provided, the validation doesn't see this as a problem, and the unreachable!
macro is invoked, crashing the process.
Impact Details
Any node that provides the public GraphQL API could be taken down with this exploit, leading to a denial of service, quite cheaply (it being a single exploit query attack, and not brute force, and not requiring any sort of authentication). Reading the documentation, it seems all client nodes provide this GraphQL API. This implies that all client nodes could be taken down with this exploit.
References
The code where the crash stack trace points: https://github.com/FuelLabs/fuel-core/blob/8b1bf02103b8c90ce3ef2ba715214fb452b99885/crates/fuel-core/src/schema.rs#L129
Proof of concept
Have the node running locally in release mode cargo run --release --bin fuel-core -- run
Run the query curl 'http://localhost:4000/v1/graphql' -H 'Content-Type: application/json' -H 'Accept: application/json' --data-binary '{"query":"{ blocks(after: \"1\") { edges { node { id }}} }"}'
There will be an empty reply from server, an error such as curl: (52) Empty reply from server
, and the server process will have shut down.
OR using the project's provided GraphQL playground at http://localhost:4000/v1/playground, and run the query { blocks(after: "1") { edges { node { id } } } }
. There will be a "error": "NetworkError when attempting to fetch resource."
error and the server process will crash.
In the terminal running the core process, the following stack trace should appear:
Last updated