
PoC de pont inter-chaînes pour CVE-2026-23003 : démontre la falsification de messages via l'absence d'ID de chaîne d'origine en utilisant un contrat Solidity vulnérable et un exploit 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
}
Un pont inter‑chaînes valide les preuves de messages mais ne vérifie pas l'ID de la chaîne source. Un attaquant peut rejouer un événement de dépôt provenant d'une chaîne à faible sécurité sur le pont principal, frappant ainsi des jetons sans contrepartie.
withdraw accepte un paramètre chainId provenant de la preuve mais ne vérifie pas qu'il correspond à la chaîne source attendue ; la preuve ne signe que le message, pas le contexte de la chaîne.Déployez le contrat vulnérable, simulez un dépôt sur une chaîne de test, puis appelez withdraw sur la chaîne principale avec la même preuve – les jetons sont libérés.
git clone https://github.com/yourorg/CVE-2026-23003.git
cd CVE-2026-23003
# Deploy with Hardhat/Foundry and test