crytic / crytic/slither

[False-Positive]: arbitrary-send-erc20 fires on EIP-712 signed order patterns

Open
#3,055 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
Python
Stars
6.4k
Forks
1.1k
PR merge metrics
No merged PRs in 30d

Description

## Description

The \rbitrary-send-erc20\ detector fires on \ ransferFrom(signedOffer.maker, ...)\ even when \offer.maker\ is not attacker-controlled — it is the signer of a validated EIP-712 offer.

## Reproduction

In 3FLabs/grunt (\Request.sol#consume\):

\\\solidity
function consume(Offer calldata offer, bytes calldata signature, uint256 ptAmount)
external
onlyOwnerOrRoles(_ROLE_CONSUMER) // access-controlled
nonReentrant
returns (uint256 ytAmount)
{
_validateOffer(offer, signature); // EIP-712 signature check
// ...
_asset().safeTransferFrom(offer.maker, address(this), ptAmount); // <-- flagged
}
\\\

Slither flags this as High-severity because \offer.maker\ is passed as the \ rom\ argument. But:

1. The offer is EIP-712-validated — \offer.maker\ signed the offer and authorized the exact transfer
2. The function is access-controlled (\onlyOwnerOrRoles(_ROLE_CONSUMER)\)
3. The maker cannot be overridden by an attacker — they signed the struct hash

## Why this is a false positive

The \rbitrary-send-erc20\ detector was designed to catch cases where an attacker can pass an arbitrary \ rom\ address to drain tokens from any account that approved the contract. In this pattern, the \ rom\ is fixed by the offer signature — the maker explicitly authorized the transfer by signing.

This is a widely used pattern in DeFi (similar to Seaport, 0x protocol, Morpho intents). The detector has no concept of EIP-712 authorization and incorrectly treats signed makers as attacker-controlled.

## Impact

Every DeFi protocol using signed order books, intent-based execution, or EIP-712 offers gets High-severity false positives from this detector.

## Environment

- Tested on 3FLabs/grunt (https://github.com/3FLabs/grunt)
- Full analysis: https://github.com/holistis/bug-bounty-intelligence-mcp/blob/main/BENCHMARK.md

Contributor guide

Open the contributing guide

Research direction

Reproduce the warning on 3FLabs/grunt's Request.sol#consume, focusing on _validateOffer and the safeTransferFrom(offer.maker, ...) call, then inspect Slither's arbitrary-send-erc20 detector. Done means validated EIP-712-signed makers no longer produce this false positive while genuinely attacker-controlled from addresses remain detectable.

Written by the indexing model from the issue text.

Assessment

Tech stack
python, solidity
Domain
devtools, security
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.