# Arbitrary transactions possible due to insufficient signature validation

Biconomy SmartAccount checkSignatures never verifies the EIP-1271 signer is the owner, letting anyone pass a fake signer and execute arbitrary delegatecalls to selfdestruct the wallet.

- Payout: Contest reward
- Severity: high
- Program: Biconomy
- Credited: 0xdeadbeef0x
- Disclosed: 2023-03-03
- Write-up quality: 8/10
- Original: https://github.com/code-423n4/2023-01-biconomy-findings/issues/175
- Library page: https://bugbountylibrary.com/r/c4%3A2023-01-biconomy%3AH-04
- Tags: domain:web3 impact:funds-loss impact:integrity kind:contest platform:code4rena sev:high tech:evm tech:solidity technique:source-review vuln:access-control vuln:auth-bypass vuln:signature-replay

**Target:** SmartAccount smart wallet proxy (execTransaction / checkSignatures)
**Root cause:** checkSignatures accepts any EIP-1271 signer address embedded in the signature and only checks that isValidSignature returns the magic value, without verifying the signer equals the wallet owner.
**Steps:**
1. Deploy `FakeSigner` whose `isValidSignature` always returns `0x20c13b0b`
2. Deploy `SelfDestructingContract` with `selfDestruct(address)` calling `selfdestruct`
3. Build `Transaction{to: sdc, value:0, data: abi.encodeWithSelector(sdc.selfDestruct.selector, hacker), operation: DelegateCall}`
4. Craft signatures: `abi.encodePacked(bytes32(uint256(uint160(address(fs)))), bytes32(uint256(65)), uint8(0), bytes32(0))`
5. Call `proxySmartAccount.execTransaction(tx, 0, fr, signatures)`
6. Verify `extcodesize(proxy) == 0` and subsequent calls revert
**How found:** Code review of checkSignatures: noticed the EIP-1271 branch extracts `_signer` from the signature and only checks the magic return value, with no comparison to owner — a missing authorization check on the signer address.
**Exploitation:** Attacker calls execTransaction with a delegatecall to a selfdestructing contract, passing a fake EIP-1271 signer in the signature blob; checkSignatures accepts it, the delegatecall destroys the proxy, and the attacker sweeps all wallet funds. Alternatively delegatecall updateImplementation to a malicious implementation to drain tokens and lock out the EOA.
**Escalation:** Chaining delegatecall with updateImplementation lets attacker replace implementation, drain native/ERC20 balances, unstake protocol positions, and permanently lock the EOA out of the proxy.
**Insight:** In EIP-1271 signature schemes, the signer address is attacker-supplied data inside the signature blob; always assert it equals the trusted owner before trusting the magic-value return, otherwise any contract can vouch for any transaction.
