What Happened
On September 22, 2025, UxLink’s multisig was compromised through private key theft, resulting in $11.3M direct theft plus unauthorized minting of 10 trillion tokens worth ~$28M. Attackers manipulated the multisig configuration to drain funds and gain token minting privileges.Why It Worked
The attack exploited two weaknesses:- Compromised Private Keys: Attackers gained access to UxLink’s multisig owner private keys
- Unrestricted Multisig Configuration: Safe contract allowed threshold reduction and owner changes without security checks
- Token Minting Access: Compromised multisig gained Manager privileges over the UXLINK token contract
Attack Analysis
Attack Sequence
Phase 1: Multisig Compromise Attackers used compromised private keys to revoke admin privileges, add themselves as owners, and reduce the multisig threshold to 1, gaining full control. Phase 2: Treasury Drainage Drained $11.3M in assets (USDT, USDC, WBTC, ETH) and converted them across chains. Phase 3: Token Exploitation Used multisig control to mint unlimited UXLINK tokens, causing a price crash and significant market cap loss.Root Causes
- Private Key Compromise: Compromised private keys due to poor operational security
- No Multisig Protection: No safeguards against rapid configuration changes
- No Rate Limiting: Multisig changes executed immediately without cooling periods
- Missing Access Controls: No whitelisting for owner changes
Assertion Pattern
Multisig protection assertions could have prevented this attack by enforcing governance invariants:Assertions cannot track state across transactions (e.g., cooling periods). The original attack used rapid sequential transactions, which would require off-chain monitoring or timelocked governance contracts to fully prevent. However, the assertions above still provide strong protection by enforcing minimum thresholds and owner whitelisting.
How the Assertions Would Have Prevented It
What they do:- Threshold Protection: Prevents threshold from dropping below a safe minimum (e.g., 2)
- Owner Whitelisting: Only allows pre-approved addresses to become owners
- Removal Validation: Ensures owner removals don’t reduce threshold below minimum
- Step 1:
assertThresholdProtection()blocks any attempt to reduce threshold to 1 - Step 2:
assertOwnerAddition()blocks attacker addresses that aren’t whitelisted - Step 3:
assertOwnerRemoval()ensures threshold stays above minimum even when removing owners - Result: Attacker cannot gain solo control of the multisig

