Incident report: October 5, 2026
On October 5th, 2026, an attacker exploited a flaw in the veBTC contract to move 37 veBTC positions out of 36 holders’ wallets, and bridge the proceeds off the Mezo chain. Approximately 5.52 BTC was taken. The vulnerability has been fixed, funds are at no further risk, and all impacted users will be made whole.
Summary
veBTC is Mezo's vote-escrow system: you lock BTC and receive an NFT representing the locked position and the voting power that comes with it. The contract behind it, VotingEscrow, is deployed with a set of external Solidity libraries that hold most of its logic and supports meta-transactions through a trusted forwarder, so that actions can be relayed on a user's behalf. Each of those two design choices is standard and safe on its own and the attacker exploited how they interact with each other.
The attack vector
The meta-transaction standard we use identifies the real sender of a relayed call by having the forwarder verify their off-chain signature and append the verified sender's address to the end of the calldata. The contract later reads the last 20 bytes of its own calldata to learn who the actual sender is.
The attacker exploited the fact the veBTC contract was split into libraries given the EVM maximum contract size limit, and a call to an external library executes in a new stack frame with the compiler building a fresh argument buffer from the function’s declared parameters. The sender address appended by the forwarder is not a declared parameter - the compiler has no way to know it is there - so it is not carried across to the new stack frame. A carefully crafted _data parameter of safeTransferFrom function leads to interpreting the last 20 bytes as the actual sender supplied by the trusted forwarder.
This chain allowed the attacker to take over any veBTC position, but because of veBTC locking, they specifically targeted unlocked-but-not-redeemed veBTC positions so that they could redeem and bridge out BTC held in those out of the Mezo chain.
Timeline (all times UTC)
October 5th
- 18:03: attacker pre-funds their Mezo address for gas from Ethereum.
- 18:54 - 19:06: veBTC positions are taken, 37 positions total.
- 19:09: full balance bridged from Mezo to Ethereum.
- 19:15: proceeds converted to 174.61 ETH on a decentralised exchange.
- 19:51: proceeds consolidated into a holding wallet.
October 6th
- 08:45: team notices anomalous rebase transactions with BTC withdrawals to the zero
address, and begins investigating veBTC locks. - 09:04: a security incident is declared.
- 09:17: bridge withdrawals are paused.
- 09:21: the vulnerability is located in the code.
- 09:27: all transactions on the Mezo chain are halted.
- 10:00: SEAL 911 is contacted and the attacker’s addresses are shared with them.
- 15:00: the vulnerability is fixed. The bridge and the chain are unpaused.
Affected positions
| Holder | NFT ID | BTC |
0xb11c4b5ea7be19151d8669af9669007829005091 | 826 | 3.366676916 |
0x6530656db9704562239013e1f36039abdc04c8e2 | 5799 | 1.024286394 |
0x6530656db9704562239013e1f36039abdc04c8e2 | 5805 | 0.262477784 |
0x043b223fd4804ca5f9151c1d44250bb7799287ac | 5483 | 0.249935078 |
0x9d673364f781a92e494875df230ac33528cee617 | 805 | 0.097998000 |
0x301b623af819848371fee227c5ead1bdfc44f8aa | 174 | 0.078954241 |
0x4f6d39f4f9c7dbee275a8da0b205458700ba00e1 | 5717 | 0.055000000 |
0x3e9e0f056a2a1d808897b095a1de46bb17137375 | 640 | 0.048998000 |
0xac8ac4d7cf30491e6c77ba453ec6e58e9866aa8e | 881 | 0.025607134 |
0xbfdf6dabb37a087f301f00c513441d926198c8d9 | 781 | 0.018998000 |
0xbc876a492628c354ea9482d9986bae485b6ed3e8 | 5732 | 0.018998000 |
0x6a105113d268c0778e6b179ed56ea52a5db1816c | 196 | 0.016871400 |
0x5988fd76c5aa84ebc70327f09d50382c7aeacc3f | 5559 | 0.015254300 |
0xb641f5ede32fcb0bf117efb8ee68507afe634db3 | 6001 | 0.014992625 |
0x350ec29cf9bb5aa2f9bc0b9befdb4b6d6241afab | 1296 | 0.012998000 |
0x614e6301b1c4b0098e7bfb8d6b7ba5037753dd1d | 860 | 0.012497705 |
0x4980327f352a6205b2ce8968c7c4d3570fe5fa80 | 5662 | 0.012279139 |
0xdbfc2ef76a7a442887b12d87c22699dcd6045284 | 2533 | 0.012009571 |
0xe0444764a1a37c380576cca011f5d644f854805f | 322 | 0.010174890 |
0x80a362de6037710b6fd2ef834641a574435b9a51 | 583 | 0.010038000 |
0x815612815d7fb01b1e8a97fe4a0996e77245a3aa | 5885 | 0.010001908 |
0x5ddfbfe0d816f182739c03137c19da4d16af3820 | 5565 | 0.010000000 |
0x4dc3bd3fe0a63202faec9c87400b9283c7329d21 | 763 | 0.010000000 |
0xfd16baa3aea2c9fb9fc4d71b4a07d1779f4a5586 | 5824 | 0.009998000 |
0xf09569f8715d890b783a2c4fd32be2e8d4cd5e79 | 5329 | 0.009998000 |
0x0d55ac143237edc1219fa80ed3e4f2e353a795b6 | 5284 | 0.009998000 |
0xa5bc7f86f610706b7e589cd5834cdf08284733c1 | 5441 | 0.009538000 |
0xd4bd23c3be11a7d902810c782cd1abad2b835923 | 5795 | 0.008998000 |
0xb60e87e7ec4003a8711cbea6143046e5a9b19e09 | 6037 | 0.008998000 |
0x653ea14508eef2fcfd4d9996cad162b769610145 | 5889 | 0.008998000 |
0x51b09278018d08fa85ea292afb662126b7f893ce | 851 | 0.008998000 |
0x3376de30fe52d5fe45e067b881c315dd52f94c08 | 378 | 0.008998000 |
0x11897d469071b55a296a1acbb0448cd8851bcd33 | 456 | 0.008998000 |
0xe4ed958ebbf7e32144d07b2f1de940b6b591c7fb | 937 | 0.008500000 |
0x94283815a787b9760aa8bc1034f3dff9662a73e4 | 1350 | 0.007997882 |
0x98c7a0c5ec68939d43f30488e673f59b668967ea | 1104 | 0.007888805 |
0x89119a9caabeb3ab358faf77e6bcc293ebdc05de | 1204 | 0.006317630 |
Total | 5.519271401 |
Actions taken
Once we detected the attack, we paused bridge withdrawals within 33 minutes. We identified the vulnerability and disabled metatransactions altogether as there is currently no production use for them. We audited every other function reachable through the same path enumerating every external library function that resolves a sender this way and triaged each. Three functions besides the exploited one had access-control exposure, though far more constrained than the one used in the exploit; the rest reverted rather than misbehaving. All are covered by the same fix. Additionally, we verified the vulnerability was only exploited on this specific occasion. We reviewed every finding submitted to our Cantina bug bounty program and every report sent to security@mezo.org, and confirmed this vulnerability was never reported through either channel. Finally, we contacted SEAL 911, centralized exchanges in the funding chain, the venues used in the laundering path, law enforcement, and others to coordinate subsequent tracing and response.
Fund recovery
All affected users will be receiving the BTC that they lost from protocol-owned sources. That process will take a few days. BTC balances will be directly transferred to the affected wallets—no additional website or interaction will be needed, so please do not follow any links promising recovery of your funds, and remember to stick with official sources of news—the Mezo X profile, and this blog.
Next steps
The attacker in this case moved very quickly, and the window for the team to act at attack time was very short. As such, the best cure here would have been prevention. To that end, we have several initiatives that were already in motion to reduce risk on the chain:
- For some time, we have been reviewing all changes with frontier AI security models.
- We have introduced several security controls that allow relatively faster reaction to situations like this one, including the ability to pause bridge transactions in the system when an attack is detected.
- We are in the process of removing or limiting lesser-used features that expand our risk surface; this includes the recent sunsetting of native BTC wallet sign-up and native BTC wallet bridge-ins.
- We will continue to calibrate bridge-out limits to balance risk and convenience.
- We are in the process of setting up an offensive review harness for existing mainnet contracts that will continuously monitor for new vulnerabilities. Though the code in this exploit was audited twice and has had a bug bounty on it for many months, the modern security landscape is such that additional continuous monitoring is becoming a key part of security strategy.
In addition to these existing initiatives, we are investigating whether there is a class of automated triggers that could have allowed both automated detection and automated blast prevention in the case of this and other vulnerabilities we have seen across the space. We will share updates on this front as we have them.
A message to the attacker
We are currently pursuing recovery and law enforcement action; however, we would rather resolve this than litigate, so we would like to extend a simple offer:
Return 4.415417121 BTC - equivalently 139.69 ETH, 80% of what you took - to address 0xbe6Fdc9DA59cadc157f959B5B28A7e3ea74BdCd4, and the remaining 1.103854280 BTC (34.92 ETH, 20%) is yours to keep as a bug bounty. You can also contact us at security@mezo.org per the process outlined at https://mezo.org/security.txt. We will treat the disclosure as a white-hat finding, and we will stop pursuing criminal action. This was a real vulnerability that two audits and our own reviews missed. Under our bug bounty program, that work has value, and we are willing to pay for it under those terms.
This offer is open until 23:59 UTC on October 14th, 2026.
This material is provided for informational purposes and reflects the understanding as of the date of publication, based on an investigation. It may be updated, supplemented, or corrected, and no representation or warranty is made as to its completeness. Statements regarding future plans, initiatives, timing, and outcomes are based on current information and are subject to change. Security audits, code reviews, bug bounty programs, and monitoring reduce but do not eliminate risk, and no representation is made that the Mezo network is or will remain free from vulnerabilities; use of the network involves risk, including risk of loss. References to third parties are descriptive only and do not imply endorsement or partnership.
Comments ()