We do not have a reliable USD price for the recorded assets yet.
0x56d3ed5f635b009e19d693e432479323b23b3eb368cf04e161adbc672a15898e0x667dfed3c4d56df32ecc3f2e3ce5bcc4ef03a6dcBSCProtocol: Unknown BSC bridge/vault pair (0x8de7... and 0x667d...) ACT classification: ATTACK on BSC (is_act = True)
On BSC, an unprivileged EOA 0x8477... deployed an orchestrator that created helper contract 0xd0a6..., used 0xd0a6... to self-assign DEFAULT_ADMIN_ROLE on bridge/admin contract 0x8de7..., and in the same transaction called adminWithdraw so that vault 0x667d... transferred 10463638549999999999999 BEP20DAI to profit EOA 0x603d....
Bridge/admin contract 0x8de7... implements grantRole and adminWithdraw so that a caller without any prior role membership can grant itself DEFAULT_ADMIN_ROLE and immediately pass the adminWithdraw authorization check, which breaks the intended invariant that only pre-authorized admins can move vault funds.
Category: ATTACK
0x8de7... has flawed internal access control: its grantRole implementation allows a caller without existing admin permissions to grant itself DEFAULT_ADMIN_ROLE, and adminWithdraw relies on this role check to authorize withdrawals from vault 0x667d..., so a single self-grant and adminWithdraw call drains vault funds.
Invariant Only accounts that already hold DEFAULT_ADMIN_ROLE on 0x8de7... are allowed to grant or revoke DEFAULT_ADMIN_ROLE and invoke adminWithdraw to move assets out of vaults that trust 0x8de7... as _bridgeAddress.
Breakpoint In tx 0x56d3ed5f635b009e19d693e432479323b23b3eb368cf04e161adbc672a15898e, helper contract 0xd0a6... without any prior RoleGranted history executes grantRole(0x0,0xd0a6...) on 0x8de7..., emitting RoleGranted(DEFAULT_ADMIN_ROLE,0xd0a6...,0xd0a6...), and then immediately satisfies the adminWithdraw authorization check in the same transaction to instruct vault 0x667d... to transfer BEP20DAI to 0x603d....
Decompiled and bytecode-level analysis of 0x8de7... shows an AccessControl-style role mapping where grantRole(bytes32 role, address account) records membership and emits RoleGranted events, and adminWithdraw constructs and sends a call to a vault only after verifying that msg.sender holds an admin role. RoleGranted/RoleRevoked logs before block 41770502 show that DEFAULT_ADMIN_ROLE was assigned to 0x5e44... and then to 0xe9fc..., with 0x5e44... revoked, and no grants to 0xd0a6.... In the incident transaction, helper 0xd0a6... calls grantRole(0x0,0xd0a6...) on 0x8de7... and the resulting RoleGranted(DEFAULT_ADMIN_ROLE,0xd0a6...,0xd0a6...) log proves that 0xd0a6... successfully added itself as an admin without any pre-existing role. Immediately afterward, 0xd0a6... calls adminWithdraw on 0x8de7..., which checks the role mapping using CALLER and treats 0xd0a6... as an authorized admin, then calls vault 0x667d... (whose slot0 storage snapshot at block 41770501 equals 0x8de7...) to execute its withdrawal function and forward 10463638549999999999999 BEP20DAI to 0x603d.... This control flow demonstrates that 0x8de7... does not enforce the invariant that only already-authorized admins can grant admin rights or withdraw vault funds; instead, any caller can self-grant DEFAULT_ADMIN_ROLE and immediately exercise full adminWithdraw power.
Vulnerable components
ACT exploit conditions
Security principles violated
Single BSC transaction in which an unprivileged EOA deploys an orchestrator and helper, self-grants DEFAULT_ADMIN_ROLE on 0x8de7..., and immediately calls adminWithdraw to drain BEP20DAI from vault 0x667d... to a profit EOA.
Adversary-related cluster accounts
Victim candidates
Adversary lifecycle stages