# Unvalidated helper or module address

Caller-supplied helper, router, module or adapter address trusted without registry or allowlist binding

_Area: Smart contract access control and control flow. Seen in 38 disclosed reports; latest 2026-10-01. Updated 2026-10-23._

## How it works
A contract takes an address from its caller — helper, module, adapter, router, exchange proxy, silo, or hook — and grants it trust: approves tokens to it, calls it with caller-supplied calldata, delegatecalls into it, or accepts its word about authorization. The broken assumption is that the address is legitimate because the caller supplied it, or because the address vouches for itself. Neither is a check. The recurring shapes: (a) self-attestation, where auth asks `msg.sender` about `msg.sender` [E1](https://bugbountylibrary.com/r/dhl%3A20261001-flashloopadapter.md); (b) missing tenant binding, where a shared helper checks only its own address, not which tenant started the action [E2](https://bugbountylibrary.com/r/c4%3A2024-04-noya%3AH-08.md); (c) selector-only guards that ignore arguments [E3](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-02.md); (d) forged immutable args in clones [E5](https://bugbountylibrary.com/r/sherlock%3A2024-01-rio-vesting-escrow%3AH-1.md); (e) harvest or swap targets not bound to the legitimate pool or market [E4](https://bugbountylibrary.com/r/cantina%3Avii_finance_jan2026%3A3.1.4.md)[E6](https://bugbountylibrary.com/r/dhl%3A20250625-silofinance.md).

## Where it shows up
- Address parameter later `approve`d, `call`ed, or `delegatecall`ed — grep the param name near those calls.
- Auth querying the caller about itself: `isModuleEnabled`, `isWhitelisted`, `supportsInterface` on `msg.sender` [E1](https://bugbountylibrary.com/r/dhl%3A20261001-flashloopadapter.md).
- Shared helpers checking `msg.sender == trustedHelper` but not the initiator [E2](https://bugbountylibrary.com/r/c4%3A2024-04-noya%3AH-08.md).
- Guards blocking selectors but not arguments (`setFallbackHandler`, module setters) [E3](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-02.md).
- Permissionless pool creation accepting existing vault/token wrappers [E4](https://bugbountylibrary.com/r/cantina%3Avii_finance_jan2026%3A3.1.4.md).
- `_getArgAddress()` feeding `call`/`delegatecall` in clone-with-immutable-args [E5](https://bugbountylibrary.com/r/sherlock%3A2024-01-rio-vesting-escrow%3AH-1.md).
- Helpers holding residual balances that take a caller-supplied contract address [E7](https://bugbountylibrary.com/r/cantina%3Asilo%3A3.2.2.md).

## How to review
For every caller-supplied address, find the invariant binding it to a trusted set: a registry/factory lookup, an allowlist, or a commitment recorded before the call. The property: no address supplied by an untrusted caller can cause the contract to move funds, approve, delegatecall, or accept an authorization claim. Shared helpers must authenticate the initiating tenant, not just themselves. Guards must validate arguments of allowed functions. Treat clone immutable args as attacker-controlled when the implementation is directly callable. False-positive triage: if the address is bound by a factory/registry check, or is the factory-deployed address itself, it is not this pattern.

## Variants seen
- Self-attestation auth plus unconstrained router call drains real Safes [E1](https://bugbountylibrary.com/r/dhl%3A20261001-flashloopadapter.md).
- Shared flash-loan helper, no initiator binding, cross-vault theft [E2](https://bugbountylibrary.com/r/c4%3A2024-04-noya%3AH-08.md).
- Guard blocks selector but not handler address argument [E3](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-02.md).
- Permissionless pool creation reuses victim's vault wrapper; harvest target not bound to the legitimate pool, so yield is donated to the attacker's pool [E4](https://bugbountylibrary.com/r/cantina%3Avii_finance_jan2026%3A3.1.4.md).
- Forged immutable args delegatecall a selfdestructing adaptor, bricking escrows [E5](https://bugbountylibrary.com/r/sherlock%3A2024-01-rio-vesting-escrow%3AH-1.md).
- User-supplied swap/silo targets let a fake lender callback reach the real market [E6](https://bugbountylibrary.com/r/dhl%3A20250625-silofinance.md).
- Unvalidated silo address in liquidation helper drains residual profit [E7](https://bugbountylibrary.com/r/cantina%3Asilo%3A3.2.2.md).
- Caller-supplied router/recipient address receives LP tokens without being called [E8](https://bugbountylibrary.com/r/dhl%3A20250108-hors.md).

## Impact and severity
Full or partial fund loss, up to ~12M USD [E7](https://bugbountylibrary.com/r/cantina%3Asilo%3A3.2.2.md), cross-tenant theft [E2](https://bugbountylibrary.com/r/c4%3A2024-04-noya%3AH-08.md), and permanent bricking [E5](https://bugbountylibrary.com/r/sherlock%3A2024-01-rio-vesting-escrow%3AH-1.md). Severity rises when the helper holds approvals or residual balances [E7](https://bugbountylibrary.com/r/cantina%3Asilo%3A3.2.2.md), when one helper serves many tenants [E2](https://bugbountylibrary.com/r/c4%3A2024-04-noya%3AH-08.md), and when no owner withdrawal path exists [E7](https://bugbountylibrary.com/r/cantina%3Asilo%3A3.2.2.md).

## Evidence
- E1: https://bugbountylibrary.com/r/dhl%3A20261001-flashloopadapter.md
- E2: https://bugbountylibrary.com/r/c4%3A2024-04-noya%3AH-08.md
- E3: https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-02.md
- E4: https://bugbountylibrary.com/r/cantina%3Avii_finance_jan2026%3A3.1.4.md
- E5: https://bugbountylibrary.com/r/sherlock%3A2024-01-rio-vesting-escrow%3AH-1.md
- E6: https://bugbountylibrary.com/r/dhl%3A20250625-silofinance.md
- E7: https://bugbountylibrary.com/r/cantina%3Asilo%3A3.2.2.md
- E8: https://bugbountylibrary.com/r/dhl%3A20250108-hors.md
