8 Aralık 2023'te OpenZeppelin önemli bir güvenlik uyarısı yayınladı. Görünüşe göre ERC-2771 standardının ve Multicall türü işlevlerin birlikte kullanımıyla adres değiştirme riski var! Bu açığı derinlemesine inceledim ve bulgularımı paylaşmak istiyorum.
Kötü niyetli kişi 5 WETH'i yaklaşık 3,455,399,346 TIME ile değiştirdi.
Ardından, karmaşık calldata parametrelerini yapılandırdı ve [Forwarder].execute çağrısını yaptı.
Bu fonksiyon TIME sözleşmesinde multicall'ı başlattı ve kalan calldata, burn() - havuzdaki tokenlerin yok edilmesi için kullanıldı!
Bu nasıl çalışır?
Bu saldırıda yıldızlar bir araya geldi: ERC-2771, Multicall ve özenle hazırlanmış veriler. TOKEN kontratı ERC2771Context'i miras alıyor ve burada en heyecan verici kısım başlıyor!
ERC-2771, sanal bir msg.sender sağlar ve işlemleri üçüncü bir tarafa devretmeye olanak tanır. Bu sırada gerçek adres calldata'ya eklenir. [Forwarder] kontratı çağırdığında, _msgSender() bu verileri kontrol eder ve son 20 baytı "gerçek" msg.sender olarak keser.
Multicall ise bir çağrıyı birden fazlasına dönüştürerek gaz tasarrufu sağlar. Bir dizi çağrıyı alır ve bunları deleGatecall() üzerinden gerçekleştirir.
Ve burada bir tuzak var! Saldırgan, calldata'yı öyle kaydırıyor ki, yeni verilerin ilk 4 baytı burn() fonksiyonuna karşılık geliyor ve parametre - devasa bir token miktarı. 0x20 satırına, "beklenen" msg.sender olan TIME-ETH likidite havuzunun adresi ekleniyor!
Sorunun kökü
ERC-2771 [Forwarder] asla multicall ile çalışması planlanmadı! Saldırgan, multicall'a dış çağrıda _msgSender() parametrelerini ekledi. multicall fonksiyonu içinde bazı fonksiyonlar da bu parametreleri ekledi, bu da herhangi bir adresden çağrı yapılmasını taklit etmelerini sağladı!
Koruma Önlemleri
OpenZeppelin Multicall'ın yeni versiyonu artık ERC-2771 bağlam uzunluğunu saklar ve her alt çağrıda bunu dikkate alır.
ThirdWeb daha ileri giderek, herhangi bir sözleşmenin multicall çağrısını yapmasını yasakladı ve [Forwarder] kullanımını engelledi.
Bu güvenlik açığı, ayrı ayrı güvenli bileşenlerin bir araya gelerek felaket bir açık yaratabileceğinin çarpıcı bir örneğidir! Tüm geliştiricilerin aklında bulundurması gereken: Farklı standartlar arasındaki etkileşimi her zaman kontrol edin.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
ERC2771 Multicall'de SharkTeam tarafından rastgele adres değiştirme zafiyetinin analizi
8 Aralık 2023'te OpenZeppelin önemli bir güvenlik uyarısı yayınladı. Görünüşe göre ERC-2771 standardının ve Multicall türü işlevlerin birlikte kullanımıyla adres değiştirme riski var! Bu açığı derinlemesine inceledim ve bulgularımı paylaşmak istiyorum.
Saldırı Analizi
Bir saldırıyı inceleyelim:
Saldırı şeması dahice basit:
Bu nasıl çalışır?
Bu saldırıda yıldızlar bir araya geldi: ERC-2771, Multicall ve özenle hazırlanmış veriler. TOKEN kontratı ERC2771Context'i miras alıyor ve burada en heyecan verici kısım başlıyor!
ERC-2771, sanal bir msg.sender sağlar ve işlemleri üçüncü bir tarafa devretmeye olanak tanır. Bu sırada gerçek adres calldata'ya eklenir. [Forwarder] kontratı çağırdığında, _msgSender() bu verileri kontrol eder ve son 20 baytı "gerçek" msg.sender olarak keser.
Multicall ise bir çağrıyı birden fazlasına dönüştürerek gaz tasarrufu sağlar. Bir dizi çağrıyı alır ve bunları deleGatecall() üzerinden gerçekleştirir.
Ve burada bir tuzak var! Saldırgan, calldata'yı öyle kaydırıyor ki, yeni verilerin ilk 4 baytı burn() fonksiyonuna karşılık geliyor ve parametre - devasa bir token miktarı. 0x20 satırına, "beklenen" msg.sender olan TIME-ETH likidite havuzunun adresi ekleniyor!
Sorunun kökü
ERC-2771 [Forwarder] asla multicall ile çalışması planlanmadı! Saldırgan, multicall'a dış çağrıda _msgSender() parametrelerini ekledi. multicall fonksiyonu içinde bazı fonksiyonlar da bu parametreleri ekledi, bu da herhangi bir adresden çağrı yapılmasını taklit etmelerini sağladı!
Koruma Önlemleri
OpenZeppelin Multicall'ın yeni versiyonu artık ERC-2771 bağlam uzunluğunu saklar ve her alt çağrıda bunu dikkate alır.
ThirdWeb daha ileri giderek, herhangi bir sözleşmenin multicall çağrısını yapmasını yasakladı ve [Forwarder] kullanımını engelledi.
Bu güvenlik açığı, ayrı ayrı güvenli bileşenlerin bir araya gelerek felaket bir açık yaratabileceğinin çarpıcı bir örneğidir! Tüm geliştiricilerin aklında bulundurması gereken: Farklı standartlar arasındaki etkileşimi her zaman kontrol edin.