ERC777 ve isteğe bağlı çağrı sözleşmeleriyle ilgili olası güvenlik sorunları

Son zamanlarda, müşterilerimizden biriyle çalışırken, bazı DeFi projeleri için bir saldırı vektörü olma potansiyeline sahip ilginç bir hata keşfettik. Bu hata, özellikle iyi bilinen ERC777 belirteç standardı ile ilgilidir. Ayrıca, tanınmış bilgisayar korsanları arasında yaygın olan basit bir yeniden giriş sorunu değildir.

Bu makale, gerekli tüm ayrıntıları kapsayan kapsamlı bir ERC777 açıklaması sağlar. ERC777 belirteçlerinin özelliklerini incelemek için çok az kaynak vardır ve bu makale, ERC777 belirteçleri hakkında daha fazla bilgi edinmek isteyen herkes için değerli, ayrıntılı bir kılavuzdur.

Makalenin son bölümünde ise son bulgularımız açıklanacaktır.

Saldırı vektörünün kısa bir açıklaması

Bu güvenlik açığı, ERC777'nin özelliklerinden yararlanır ve bir Kanca alma işlevi ayarlayabilir. Kötü niyetli bir arayan, hedef sözleşmede rastgele arama yapma yeteneğini kullanarak ERC777 kayıt sözleşmesini arayabilir ve hedef sözleşmeye belirli bir Hook adresi atayabilir. Bu nedenle, hedef sözleşme gelecekte ERC777 belirteçlerini aldığında, saldırganın Hook sözleşmesi tetiklenir. Bu kancadan çeşitli şekillerde yararlanılabilir: belirteçleri çalmak için yeniden giriş saldırıları için veya yalnızca işlemleri geri alarak hedef sözleşmenin ERC777 belirteçleri göndermesini veya almasını engellemek için.

ERC777 ve Kancası

ERC777 nedir

ERC777, transfer Hook'lu token standartlarından biridir. İşte EIP açıklaması: ve işte bir ERC777 uygulaması [4] .

ERC777 belirteçlerini uygulamanın ana motivasyonu, yerel belirteç transferlerinin davranışını taklit etmektir. Belirteçler alındığında akıllı sözleşmeleri tetikleyen geliştiriciler, işlevselliği geliştirmek ve daha dinamik belirteç etkileşimleri oluşturmak için belirli bir mantık yürütebilir.

Ancak transfer sürecindeki bu ekstra aramalar, ERC777'yi ERC20 tokenlerinden farklı kılıyor. Bu kancalar, belirteç aktarımları sırasında ek çağrıları işlemek için tasarlanmamış akıllı sözleşmeleri etkileyebilecek yeni bir saldırı vektörü sunar. Bu tür beklenmedik davranışlar, bu sözleşmeler için güvenlik riskleri oluşturur.

Aşağıda, Ethereum ana ağında bir miktar likiditeye sahip bazı ERC777 belirteçlerinin bir listesi bulunmaktadır:

Kp6OQ2xMxjKs5X4G5V33hmMqR8TSwawzldCaPOtL.png

Kanca oluştuğunda

ERC20 belirteçleri, transferler sırasında bakiyeleri basitçe günceller. Ancak ERC777 belirteçleri bunu yapar:

  1. Belirteç başlatıcısının adresine bir Hook araması yapın

  2. Bakiyeyi güncelleyin

  3. Belirteç alıcı adresine bir Hook araması yapın

Bu, VRA belirtecinde iyi bir şekilde gösterilmiştir:

kaynak kodu:

Şimdi bu çağrıların kodunu inceleyelim:

Gördüğün gibi:

  1. Bu işlev, _ERC1820_REGISTRY'den uygulayıcı adlı bir sözleşmeyi okur.
  2. Fonksiyon bir uygulayıcı bulursa, o uygulayıcı çağrılır.

Bu kayıt defterini inceleyelim ve uygulayıcıların ne olduğunu görelim.

Kayıt defteri ve uygulayıcılar

Tüm ERC777 belirteçleri Tescil sözleşmesiyle ilgilidir:

Bu adres, ayarlanan Hook alıcılarını saklamak için ERC777 belirteçleri tarafından kullanılır. Bu Hook alıcılarına "arayüz uygulayıcıları" denir.

Bu, Alice'in arayüz uygulayıcısı olarak Bob'u seçebileceği anlamına gelir. Alice, ERC777 belirteçlerini alır veya gönderirse, Bob Kancayı alacaktır.

Alice, farklı Hook türlerini yönetebilir. Bu nedenle, Alice belirteçleri gönderdiğinde, arayüzün uygulayıcısı olarak Bob'u seçebilir ve yalnızca Alice belirteçleri aldığında, uygulayan olarak Tom'u seçer.

Çoğu durumda farklı belirteçler için farklı arayüz uygulayıcıları da seçebilir.

Bu tercihler, bu eşlenen kayıt defterinde depolanır:

_interfaceHash, Alice tarafından bir olay için seçilen arabirim uygulayıcısının kimliğidir.

Ve herkes bu işlevle Alice'in arayüz uygulayıcısını okuyabilir:

Gördüğünüz gibi bu, daha önce VRA kodunda karşılaştığımız işlevdir.

_TOKENS_SENDER_INTERFACE_HASH değişkeni, herhangi bir bayt olabilen _interfaceHash olarak kullanılır. Ancak VRA belirteci, bu tür Hook'u tanımlamak için şu baytları kullanır:

Alma Kancası

Bir Kanca alma işlevi ayarlamak için, Alice'in yalnızca kayıt defterinde bu işlevi çağırması ve _implementer parametresi olarak Bob'un adresini girmesi gerekir.

Ayrıca bir _interfaceHash belirtmesi gerekir. Bu _TOKENS_SENDER_INTERFACE_HASH'ı VRA belirteç kodundan alacak.

Bir önemli detay daha var.

Yukarıdaki VRA için uygulayıcıyı ayarladıktan sonra Alice, diğer ERC777 belirteçleri aktarılsa bile Bob'un çağrıyı alacağını da bilecektir. imBTC gibi [5] , imBTC, gönderilen belirteçlerde aynı _interfaceHash değerine sahiptir.

Bunun nedeni, tüm ERC777 belirteçlerinin Hook tercihlerini depolamak için aynı kayıt defteri sözleşmesini paylaşmasıdır. Ancak Hook'larına isim atamak ERC777 jetonlarına bağlıdır ve bazen benzer olsalar da her zaman değil.

ERC777 belirteçleri nasıl bulunur?

Kayıt defterinin çağrılması, tüm ERC777'lerin bir özelliğidir. Böylece dune.com'u deneyebiliriz [6] kayıt defterini çağıran tüm akıllı sözleşmeleri çağırmak için.

Bu SQL betiğini kullanabiliriz. Aslında belirteç adreslerini ek olarak filtrelemeliydik ama en azından mükemmel bir başlangıç yaptık ve 78 adresle bitirdik.

Çevirmenin notu: kumul izleri tablosu [7] İşlemin dahili arama kaydını kaydeder.

Tek olasılık bu kayıt mı?

Teorik olarak, hiç kimse bazı belirteçlerin bu 0x1820 sözleşmesini kayıt defteri olarak kullanacağını garanti edemez. Ama dune.com'u kullanabiliriz [8] gel kontrol et

bu adresleri döndürür

0x1820a4b7618bde71dce8cdc73aab6c95905fad24 0xc0ce3461c92d95b4e1d3abeb5c9d378b1e418030 0x820c4597fc3e4193282576750ea4fcfe34ddf0a7

Kontrol ettik ve 0x1820, değerli ERC777 belirteçlerine sahip tek kayıt defteri. Diğer kayıtların belirteçleri o kadar değerli değildir.

Hookable belirteçlerinin genel durumu

ERC777 sadece Kancalı bir standart değildir. Ayrıca ERC223, ERC995 veya ERC667. O kadar da sıra dışı değiller. ERC667'yi uygulayan LINK jetonunu duymuş olmalısınız. [9] .

Rastgele çağrı kullanarak saldırı vektörü

Bu, müşterilerimizden biri için yakın zamanda keşfedilen bir saldırı vektörüdür.

Araştırmacılar genellikle ERC777 belirteçlerinin arayanlara ve alıcılara çağrı yaptığını varsayar. Ama aslında, başlatıcı ve alıcı, Hook alıcısı olarak herhangi bir "Bob" seçebilir.

Öyleyse, herhangi bir veriyle herhangi bir adrese keyfi çağrı yapan sözleşmelerle birleştiğinde ne olduğunu hayal edin?

DEX toplayıcılarında, cüzdanlarında ve çoklu arama sözleşmelerinde yaygın olarak kullanılabilen isteğe bağlı arama işlevleri vardır.

Çevirmenin Notu: Keyfi çağrı fonksiyonu, sözleşmede şöyle bir fonksiyon olduğu anlamına gelir:

işlev ute(adres hedefi, uint değeri, dize bellek imzası, bayt bellek verileri, uint eta) kamuya ödenebilir;

Başka herhangi bir yöntemi çağırabilir.

Saldırı yöntemi:

  1. Saldırgan, keyfi işlev çağrılarına izin veren bir hedef sözleşmesi (Target) bulur.
  2. Saldırgan hedefe seslenir:
  3. registy1820.setInterfaceImplementer(Target, hookHash, Saldırgan)
  4. Artık Saldırganımız Target'ın uygulayıcısıdır.
  5. Saldırgan, ERC777 belirtecinde kullanılan hookHash ile çağrılacaktır.
  6. Hedef sözleşme (Target) ERC777 belirteçlerini aldığında, Saldırgan bir Hook çağrısı alacaktır.
  7. Aşağıdaki saldırılar Hedef koduna göre değişir:
  • Saldırgan, bazı kullanıcılar hedef sözleşmedeki işlevleri yürüttüğünde yeniden giriş yapabilir
  • Saldırgan doğrudan geri alabilir, böylece kullanıcının işlemi doğrudan geri yüklenir

DEX toplayıcı, en iyi dönüşüm yolunun ERC777 belirteçleriyle bir DEX ticaret çifti üzerinden olduğunu hesaplarsa sorunlarla karşılaşabilir.

Korumak

Müşterilerle saatlerce süren tartışmalardan sonra, keyfi çağrıları bozmayan bir çözüm bulduk.

Proje tarafının herhangi bir çağrının adresi olarak Registry1820 kullanımını sınırlaması en iyisidir. Bu nedenle, hiçbir saldırgan arayüz uygulayıcıyı ayarlamak için rasgele çağrılardan yararlanamaz.

Tecrübeden konuşuyor

Projeler ve denetçiler, ERC777'de açıklanan Kanca davranışına dikkat etmelidir. Bu belirteçler, yalnızca alıcılara ve başlatıcılara değil, aynı zamanda diğer bazı Hook alıcılarına da çağrı yapar.

Bu anlamda, keyfi çağrılara izin veren projeler özel dikkat göstermeli ve ERC777 için başka bir saldırı vektörü düşünmelidir.

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
  • Share
Comment
0/400
No comments
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)