PolyNetwork saldırıya uğradı ve 300 milyon dolardan fazlası çalındı. Saldırgan, saldırıyı birden fazla zincir üzerinde gerçekleştirdi. Bu blogda, saldırının olası nedenini analiz etmek için Ethereum üzerindeki saldırı işlemini (0xd8c1f7424593ddba11a0e072b61082bf3d931583cb75f7843fc2a8685d20033a) kullanıyoruz. İlk analizimiz, olası bir nedenin ya zincirler arası mesajı imzalamak için kullanılan özel anahtarın sızdırılması ya da saldırgan tarafından hazırlanmış bir mesajı imzalamak amacıyla istismar edilen PolyNetwork'ün imzalama sürecindeki bir hata olduğunu göstermektedir.
Sorumluluk Reddi: Bu blog yalnızca Ethereum üzerindeki zincir içi verilere dayanarak gerçekleştirdiğimiz ilk analizin sonuçlarını içermektedir. Poly Network'ten daha fazla bilgi almadan bulgularımızı doğrulayamayız.
Güncelleme 2021/08/12: Daha fazla bilgi, saldırının nedeninin saldırgan tarafından değiştirilen tutucu (keeper) olduğunu göstermektedir (özel anahtarın sızdırılması nedeniyle değil). Tutucuyu değiştirmeye yönelik işlemin neden ilk etapta gerçekleştirilebildiği sorusunu yanıtlamak için daha kapsamlı bir analizimiz bulunmaktadır.
İşlem ve çağrı izleme
İzlemeyi kurtarmak için işlem analiz sistemimizi kullanıyoruz.

Saldırgan -> EthCrossChainManager -> EthCrossChainData -> LockProxy -> LockProxy için managerProxyContract
- 0xc8a65fadf0e0ddaf421f28feab69bf6e2e589963: Saldırgan
- 0x838bf9e95cb12dd76a54c9f9d2e3082eaf928270: EthCrossChainManager
- 0xcf2afe102057ba5c16f899271045a0a37fcb10f2: EthCrossChainData
- 0x250e76987d838a75310c34bf422ea9f1ac4cc906: LockProxy
- 0x5a51e2ebf8d136926b9ca7b59b60464e7c44d2eb: LockProxy için managerProxyContract
Fonksiyon İmzaları:
- d450e04c (verifyHeaderAndExecuteTx)
- 69d48074 (getCurEpochConPubKeyBytes)
- 5ac40790 (getCurEpochStartHeight)
- 0586763c (checkIfFromChainTxExist)
- e90bfdcf (markFromChainTxExist(uint64,bytes32))
Saldırının ana süreci
Saldırının ana süreci, saldırganın imzalanmış verileri verifyHeaderAndExecuteTx() fonksiyonuna iletmesidir. Bu fonksiyon, verilerin kodunu çözerek verileri imzalamak için kullanılan imzaları doğrular. Bu süreç başarıyla tamamlanırsa, mesajda belirtilen yöntem (ve sözleşme adresi) yürütülür. Bu saldırı sırasında, Fei'yi saldırgana aktarmak için 0x250e76987d838a75310c34bf422ea9f1ac4cc906 akıllı sözleşmesinin unlock fonksiyonu çağrılır.
Özetle, saldırı verifyHeaderAndExecuteTx fonksiyonuna iletilen geçerli parametreler nedeniyle gerçekleşmiştir. Bu parametreler, imza doğrulama sürecini geçebilmektedir. Bunun ardından, mesajda belirtilen işlem yürütülür (yazılım güvenliğindeki keyfi komut yürütmeye benzer şekilde).
Bu süreci daha iyi anlamak için, çağrı izlemesinin kritik değerlerini kurtarıyoruz.
Fonksiyon: verifyHeaderAndExecuteTx:


verifySig

unlock

LockProxy içindeki managerProxyContract değişkeni. Bu değer, unlock fonksiyonunun çağırıcı adresiyle eşleşmektedir.

Sonuç
Kurtarılan değerlerden şunları tespit ettik:
- Saldırgan, verifyHeaderAndExecuteTx fonksiyonuna geçerli bir imzalı mesaj sağlamaktadır
- LockProxy akıllı sözleşmesindeki
onlyManagerContractdeğiştiricisi ATLANMAMAKTADIR.
Bu iki gözleme dayanarak şüpheleniyoruz ki:
- Saldırganın mesajları imzalamak için meşru anahtarlara sahip olması, imzalama anahtarlarının sızdırılmış olabileceğine işaret edebilir.
Ya da
- PolyNetwork'ün imzalama sürecinde, hazırlanmış bir mesajı imzalamak amacıyla istismar edilmiş bir hata bulunmaktadır.
Ancak, bulgularımızı doğrulamak için yeterli zincir dışı veriye sahip değiliz. Analizimizin daha ileri düzey araştırmalara katkı sağlamasını umuyoruz.
Katkıda Bulunanlar: Yufeng Hu, Siwei Wu, Lei Wu, Yajin Zhou @BlockSec
Twitter: https://twitter.com/BlockSecTeam



