# Allowlist and blacklist bypass

A restriction checked on one path while another path reaches the same effect unchecked

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

## How it works
A restriction (allowlist, blacklist, transfer lock, deployer gate, selector denylist) is enforced at one entry point, but the protected effect is reachable through another path that never runs the check. The broken assumption is that every way to move value, mint, burn, transfer, deploy, or mutate a privileged mapping funnels through the guarded function. Base contracts, opcode paths, bridge modes, and internal callees each provide a separate door. Two sub-cases recur: an alternate path skips the check entirely [E4](https://bugbountylibrary.com/r/c4%3A2024-02-ai-arena%3AH-01.md)[E6](https://bugbountylibrary.com/r/c4%3A2025-02-thorwallet%3AH-02.md)[E7](https://bugbountylibrary.com/r/c4%3A2025-02-initia-cosmos%3AM-02.md)[E8](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AM-08.md), or the check runs on a value later reassigned, so the predicate is evaluated on a shadow copy rather than the value acted on [E5](https://bugbountylibrary.com/r/sherlock%3A2025-07-malda%3AM-4.md). A third shape: the check trusts a third party's output that can be empty or narrower than assumed [E1](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-06.md).

Distinguish a true bypass (a path skips the check) from misconfiguration (the allowlist is too narrow, causing a freeze). Only the former is this pattern.

## Where it shows up
- Transfer restrictions overriding `transferFrom`/`safeTransferFrom` instead of a shared hook [E4](https://bugbountylibrary.com/r/c4%3A2024-02-ai-arena%3AH-01.md).
- Bridge send/mint/burn paths that skip the token's own validation [E6](https://bugbountylibrary.com/r/c4%3A2025-02-thorwallet%3AH-02.md).
- Same-chain or self-routing in cross-chain handlers where source and destination checks both pass [E3](https://bugbountylibrary.com/r/c4%3A2024-08-chakra%3AH-06.md).
- A modifier checks a parameter an internal callee later reassigns from decoded calldata [E5](https://bugbountylibrary.com/r/sherlock%3A2025-07-malda%3AM-4.md).
- Allowlist enforced in message handlers but not in the EVM CREATE/CREATE2 opcode path [E7](https://bugbountylibrary.com/r/c4%3A2025-02-initia-cosmos%3AM-02.md).
- Selector denylists that omit non-standard-but-honest functions like burn/permit [E8](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AM-08.md).
- Order validation trusting a marketplace execution array that can be empty [E1](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-06.md).
- Prefix-based path allowlists lacking a separator or end anchor, so a sibling path passes [E2](https://bugbountylibrary.com/r/ghsa%3AGHSA-5h3f-q97h-ccvc.md).

## How to review
Invariant: for every path that moves, mints, burns, transfers, deploys, or mutates a privileged mapping, the restriction predicate is evaluated on the actual acting values, not a shadowed or pre-reassignment copy.
- Enumerate every entry point producing the restricted effect, then confirm each reaches the same check.
- Token locks: list all transfer overloads including bytes-data variants and hooks [E4](https://bugbountylibrary.com/r/c4%3A2024-02-ai-arena%3AH-01.md).
- Bridges: trace send and receive modes and whether same-chain routing is possible [E3](https://bugbountylibrary.com/r/c4%3A2024-08-chakra%3AH-06.md)[E6](https://bugbountylibrary.com/r/c4%3A2025-02-thorwallet%3AH-02.md).
- Deployer gates: compare handler-level and opcode-level enforcement [E7](https://bugbountylibrary.com/r/c4%3A2025-02-initia-cosmos%3AM-02.md).
- Selector guards: enumerate every state-changing function real implementations expose [E8](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AM-08.md).
- Path allowlists: confirm each matcher anchors on a separator/end, not a raw prefix [E2](https://bugbountylibrary.com/r/ghsa%3AGHSA-5h3f-q97h-ccvc.md).
- Marketplace-trusted checks: confirm the invariant holds when the execution array is empty [E1](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-06.md).

## Variants seen
- Overload bypass: inherited `safeTransferFrom(...,data)` skips the override [E4](https://bugbountylibrary.com/r/c4%3A2024-02-ai-arena%3AH-01.md).
- Alternate value path: bridge mint/burn skips transfer validation [E6](https://bugbountylibrary.com/r/c4%3A2025-02-thorwallet%3AH-02.md).
- Self-routing: same-chain message unlocks without a real burn [E3](https://bugbountylibrary.com/r/c4%3A2024-08-chakra%3AH-06.md).
- Parameter shadowing: blacklist checked on overwritten receiver [E5](https://bugbountylibrary.com/r/sherlock%3A2025-07-malda%3AM-4.md).
- Opcode-level gap: CREATE/CREATE2 skips publisher allowlist [E7](https://bugbountylibrary.com/r/c4%3A2025-02-initia-cosmos%3AM-02.md).
- Selector gap: burn/permit not denylisted [E8](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AM-08.md).
- Empty-execution trust: zero executions skip recipient checks [E1](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-06.md).
- Prefix match: sibling path shares allowlisted prefix [E2](https://bugbountylibrary.com/r/ghsa%3AGHSA-5h3f-q97h-ccvc.md).

## Impact and severity
Drained handler funds [E3](https://bugbountylibrary.com/r/c4%3A2024-08-chakra%3AH-06.md), locked tokens moved pre-launch [E6](https://bugbountylibrary.com/r/c4%3A2025-02-thorwallet%3AH-02.md), arbitrary contract deployment [E7](https://bugbountylibrary.com/r/c4%3A2025-02-initia-cosmos%3AM-02.md), destroyed rented NFTs [E8](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AM-08.md), broken game-server accounting from transferred locked fighters [E4](https://bugbountylibrary.com/r/c4%3A2024-02-ai-arena%3AH-01.md), blacklisted users withdrawing [E5](https://bugbountylibrary.com/r/sherlock%3A2025-07-malda%3AM-4.md), fake rentals draining escrow [E1](https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-06.md), host-context module load [E2](https://bugbountylibrary.com/r/ghsa%3AGHSA-5h3f-q97h-ccvc.md). Severity rises when the bypass is permissionless and repeatable; privileged bypasses like the deployer gate [E7](https://bugbountylibrary.com/r/c4%3A2025-02-initia-cosmos%3AM-02.md) are lower but still enable downstream permissionless abuse.

## Evidence
- E1: https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AH-06.md
- E2: https://bugbountylibrary.com/r/ghsa%3AGHSA-5h3f-q97h-ccvc.md
- E3: https://bugbountylibrary.com/r/c4%3A2024-08-chakra%3AH-06.md
- E4: https://bugbountylibrary.com/r/c4%3A2024-02-ai-arena%3AH-01.md
- E5: https://bugbountylibrary.com/r/sherlock%3A2025-07-malda%3AM-4.md
- E6: https://bugbountylibrary.com/r/c4%3A2025-02-thorwallet%3AH-02.md
- E7: https://bugbountylibrary.com/r/c4%3A2025-02-initia-cosmos%3AM-02.md
- E8: https://bugbountylibrary.com/r/c4%3A2024-01-renft%3AM-08.md
