ERC2771 Multicall'de SharkTeam tarafından rastgele adres değiştirme zafiyetinin analizi

robot
Abstract generation in progress

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ırgan: 0xFDe0d1575Ed8E06FBf36256bcdfA1F359281455A
  • İşlem: 0xecdd111a60debfadc6533de30fb7f55dc5ceed01dfadd30e4a7ebdb416d2f6b6

Saldırı şeması dahice basit:

  1. Kötü niyetli kişi 5 WETH'i yaklaşık 3,455,399,346 TIME ile değiştirdi.
  2. Ardından, karmaşık calldata parametrelerini yapılandırdı ve [Forwarder].execute çağrısını yaptı.
  3. 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

  1. OpenZeppelin Multicall'ın yeni versiyonu artık ERC-2771 bağlam uzunluğunu saklar ve her alt çağrıda bunu dikkate alır.

  2. 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.

ETH-0.12%
View Original
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.
  • Reward
  • Comment
  • Repost
  • Share
Comment
0/400
No comments
  • Pin
Trade Crypto Anywhere Anytime
qrCode
Scan to download Gate App
Community
  • 简体中文
  • English
  • Tiếng Việt
  • 繁體中文
  • Español
  • Русский
  • Français (Afrique)
  • Português (Portugal)
  • Bahasa Indonesia
  • 日本語
  • بالعربية
  • Українська
  • Português (Brasil)