16 Eylül 2022'de, bazı saldırganların PoS zincirindeki mesajı (yani calldata'yı) EthereumPoW üzerinde (diğer adıyla PoW zinciri) yeniden oynatarak çok miktarda ETHW elde ettiğini tespit ettik. Saldırının temel nedeni, PoW zincirindeki Omni köprüsünün eski chainId'yi kullanması ve zincirler arası mesajın gerçek chainId'sini doğru biçimde doğrulamamasıdır.
EthereumPoW'un resmi ekibiyle hemen iletişime geçtik. Ekip aktif olarak harekete geçmeye istekliydi ve ayrıca Omni Bridge ile iletişim kurmaya çalıştılar.
That's why we asked the other day...
— EthereumPoW (ETHW) Official (@EthereumPoW) September 18, 2022
A message from the core -https://t.co/aemIaDFXvP
And a tweet to clarify - https://t.co/9bCKm0sugK
Thanks Blocksec, they were the 1st to pinpoint the issue.
Thanks the core and eip155, for protecting ETHW community.#safu #security https://t.co/htlLXQlTT7
Ancak gerçek dünyada giderek daha fazla saldırı gözlemlendiğinden, riskin kamuoyuna bildirilmesi gerektiğine inandık ve 18 Eylül 2022'de uyarıyı yayımladık.
Bu saldırılar hakkında, yani mesaj yerine işlemin yeniden oynatılması konusunda hâlâ bazı yanlış anlamalar mevcut olduğundan, bu raporda konuyu netleştirmek amacıyla ayrıntılı bir analiz sunmak istiyoruz.
Saldırı Analizi
Aşağıda örnek bir saldırı işlemi yer almaktadır:
- Ethereum'daki PoS İşlemi: https://etherscan.io/tx/0xbddb0cc8bc9949321e1748f03503ed1a20dd618fbf0a51dc5734c975b1f8bdf5
- (Saldırı) EthereumPow'daki PoW İşlemi: https://www.oklink.com/en/ethw/tx/0x9c072551861ce384203516f4d705176a2d2e262d5b571d853467425f1a861fb4
Bu iki işlemin farklı olduğunu, ancak bu iki işlemin calldata'sının (veya girdi verisinin) tamamen aynı olduğunu* unutmayın:
0x23caab4900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000011500050000a7823d6f1e31569f51861e345b30c6bebf70ebe7000000000000e0f6f6a78083ca3e2a662d6dd1703c939c8ace2e268d88ad09518695c6c3712ac10a214be5109a655671000927c00101806401867f7a4d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000a6439ca0fcba1d0f80df0be6a17220fed9c9038a00000000000000000000000000000000000000000000000ad78ebc5ac62000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000001482faed2da812d2e5cced3c12b3baeb1a522dc67700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000105041c1b1c1c981df6cdaf073d55b78d7f0c7e2b421a569bff677a9464d1d5203672d7b5a3d6af658d14ebc11c26f2547fd0aed01750cca58753a0a79b297bad8a62a71eb6b7ac2099611604eff316e7fe733e9981c1b3890cb04ff9d43612e6f2687227f0226cfa27e4b6cd96a10865e04aa9e0f369dda7548771a094f69bf0a9fa6c27257e22d2b1bbb84beb52ad3966592037b328d352fce375a1fa75cb3fbfd18166f4177a19ad2cc74ce67da68f5ce17b857e6382c3ebf20f76482534135f426f4a74222daa07d9f401cb8baca4339ecd44e285df0e0cb88447a31d08b673cecc67d22c7e6e0ce5afd2ac9439c5a8b68f05077b850cdfdfb79cdaefc5b103bb69360944000000000000000000000000000000000000000000000000000000
Bu, safeExecuteSignaturesWithAutoGasLimit fonksiyonunu çağırmanın girdi verisidir.

Açıkça görülmektedir ki, saldırgan (0x82fae) önce Gnosis zincirinin omni köprüsü aracılığıyla 200 WETH transfer etti ve ardından aynı mesajı PoW zincirinde yeniden oynatarak ekstra 200 ETHW elde etti. Böylece PoW zincirinde dağıtılan zincir sözleşmesinin bakiyesi tamamen boşaltılabilir.
Güvenlik Açığı Analizi
Omni köprüsünün kaynak kodunu incelediğimizde, chainId'yi doğrulayan bir mantığın MEVCUT olduğunu tespit ettik.
function _isDestinationChainIdValid(uint256 _chainId) internal returns (bool res) {
return _chainId == sourceChainId();
}
Ne yazık ki, bu sözleşmede kullanılan doğrulanmış chainId, unitStorage adlı depolama alanında saklanan değerden gelmektedir:
/**
* Kaynak ağ için zincir kimliğini alan dahili fonksiyon
* @return mevcut ağ için zincir kimliği
*/
function sourceChainId() public view returns (uint256) {
return uintStorage[SOURCE_CHAIN_ID];
}
Bu, EIP-1344'te önerilen CHAINID opcode'u aracılığıyla alınan gerçek chainId değil. Bunun nedeni muhtemelen kodun oldukça eski olmasıdır (Solidity 0.4.24 kullanıyor). Kod, PoW zincirinin çatallanmasına kadar her zaman sorunsuz çalıştı.
Kısacası, saldırının temel nedeni, ETHW zincirindeki Omni köprüsünün eski chainId'yi kullanması ve zincirler arası mesajın gerçek chainId'sini doğru biçimde doğrulamamasıdır. Ayrıca benzer sorunlar diğer protokollerde de mevcut olabilir.
Etki
Doğrudan etkisi, saldırgan(lar)ın çok miktarda ETHW (ve PoW zincirindeki köprüye ait diğer tokenler) elde edebilmesi ve bunları bazı pazaryerlerinde (örneğin, bazı CEX'lerde) takas edebilmesidir. Bu şekilde, likiditenin artması nedeniyle ETHW'nin fiyatı etkilenebilir. Bu nedenle kullanıcılar/yatırımcılar PoW zincirindeki bu tokenlerin ticareti konusunda dikkatli olmalıdır.
Sonuç
Solidity geliştiricileri, sözleşmenin kendisi tarafından yönetilmek üzere tasarlanan chainId ile çalışırken özellikle dikkat etmelidir.
BlockSec Hakkında
BlockSec, 2021 yılında dünya genelinde tanınan bir grup güvenlik uzmanı tarafından kurulan öncü bir blokzincir güvenlik şirketidir. Şirket, kitlesel benimsenmesini kolaylaştırmak amacıyla gelişmekte olan Web3 dünyasının güvenliğini ve kullanılabilirliğini artırmaya adanmıştır. Bu doğrultuda BlockSec; akıllı sözleşme ve EVM zinciri güvenlik denetim hizmetleri, güvenlik geliştirme ve tehditleri proaktif biçimde engellemeye yönelik Phalcon platformu, fon takibi ve soruşturma için MetaSleuth platformu ve kripto dünyasında verimli gezinen web3 geliştiricileri için MetaDock eklentisi sunmaktadır.
Bugüne kadar şirket, MetaMask, Uniswap Foundation, Compound, Forta ve PancakeSwap gibi 300'den fazla saygın müşteriye hizmet vermiş; Matrix Partners, Vitalbridge Capital ve Fenbushi Capital dahil önde gelen yatırımcılardan iki finansman turunda on milyonlarca ABD doları almıştır.
Resmi web sitesi: https://blocksec.com/
Resmi Twitter hesabı: https://twitter.com/BlockSecTeam



