
PoC кроссчейн-моста для CVE-2026-23003: демонстрирует подделку сообщений из-за отсутствующего идентификатора исходной цепочки с использованием уязвимого контракта Solidity и эксплойта на Python.
// Bridge.sol - Vulnerable bridge contract
contract Bridge {
mapping(bytes32 => bool) public processed;
event Deposited(address from, address to, uint256 amount, uint256 chainId);
function deposit(address to, uint256 amount, uint256 chainId) external payable {
emit Deposited(msg.sender, to, amount, chainId);
}
function withdraw(bytes memory proof, address from, address to, uint256 amount, uint256 chainId) external {
// Verify proof signature (simulated)
require(verifyProof(proof, from, to, amount, chainId), "Invalid proof");
// Missing check: did this message originate from chainId?
// An attacker can replay a Deposit event from another chain where they are the 'from'
payable(to).transfer(amount);
}
function verifyProof(...) internal pure returns (bool) { return true; } // simplified
}
Кросс-чейн мост проверяет доказательства сообщений, но не проверяет идентификатор цепи (chain ID) исходного блокчейна. Злоумышленник может воспроизвести событие депозита с низкозащищённой цепи на основном мосте, фактически создавая токены из воздуха.
withdraw принимает параметр chainId из доказательства, но не проверяет, что он соответствует ожидаемой исходной цепи; доказательство подписывает только сообщение, а не контекст цепи.Разверните уязвимый контракт, симулируйте депозит в тестовой цепи, затем вызовите withdraw в основной цепи с тем же доказательством – токены будут выпущены.
git clone https://github.com/yourorg/CVE-2026-23003.git
cd CVE-2026-23003
# Deploy with Hardhat/Foundry and test