# TrustedVolumes RFQ proxy: forged orders drain $5.87M

Permissionless signer registration plus signer check keyed on attacker-controlled taker let forged RFQ orders drain $5.87M from TrustedVolumes' approved inventory.

- Payout: Real-world hack
- Severity: critical
- Program: TrustedVolumes
- Credited: DeFiHackLabs
- Disclosed: 2026-05-07
- Write-up quality: 8/10
- Original: https://github.com/SunWeb3Sec/DeFiHackLabs/blob/main/src/test/2026-05/TrustedVolumes_exp.sol
- Library page: https://bugbountylibrary.com/r/dhl%3A20260507-trustedvolumes
- Tags: domain:web3 impact:funds-loss kind:incident platform:defihacklabs sev:critical tech:evm technique:source-review vuln:access-control vuln:auth-bypass vuln:business-logic vuln:signature-replay

**Target:** RFQ settlement proxy (registerAllowedOrderSigner / fill)
**Root cause:** registerAllowedOrderSigner had no access control, and fill authorized the recovered signer against _allowedOrderSigner[order.taker][signer] using the attacker-controlled taker instead of the maker who owns the funds.
**Steps:**
1. Call `registerAllowedOrderSigner(attackerEOA, true)` (selector `0xea7faa61`) from the attack contract so `_allowedOrderSigner[taker][attackerEOA]=true`.
2. Build order with `maker=victim resolver`, `taker=attack contract`, `makerAsset=WETH`, `makerAmount=1291e18`, `takerAsset=USDC`, `takerAmount=1`.
3. Sign order with attackerEOA; submit via fill selector `0x4112e1c2`.
4. Repeat for USDT, WBTC, USDC orders; proxy pulls each makerAsset from victim via standing unlimited approval.
5. Attacker pays 1 wei USDC per order as nominal taker payment.
**How found:** Reading the public registerAllowedOrderSigner function name revealed missing access control; tracing the fill authorization showed the lookup keyed on taker rather than maker, and saltStatus wrote/read different storage keys so replay protection never fired.
**Exploitation:** Attacker contract acts as taker, registers its own EOA as allowed signer for itself, then submits four self-signed orders naming the victim resolver as maker. Proxy pulls maker assets from victim's unlimited approval, paying 1 wei USDC per fill; ~$5.87M drained in one tx.
**Escalation:** Four sequential fills in one transaction across WETH, USDT, WBTC, USDC to maximize extraction before any response.
**Insight:** On RFQ/settlement contracts, check which party the signer-authorization mapping is keyed on — if it's a field the caller controls (taker/receiver) rather than the fund owner (maker), any self-registered signer can authorize drains of other users' approvals.
