Blok zincirinin değişmezliğini kırmak: Proxy modeli akıllı sözleşme yükseltmelerini nasıl başarabilir?

Proxy modeli, akıllı sözleşmelerin zincir üzerindeki adreslerini ve durum değerlerini korurken mantıklarını yükseltmelerini sağlar. Proxy sözleşmesine yapılan çağrı, proxy sözleşmesinin durumunu değiştirmek için delegasyon çağrısı yoluyla mantık sözleşmesindeki kodu yürütür.

Bu makale, proxy sözleşmelerinin türleri, ilgili güvenlik olayları ve tavsiyeleri ve proxy sözleşmelerini kullanmaya yönelik en iyi uygulamalar hakkında genel bir bakış sağlayacaktır.

Yükseltilebilir Sözleşmelere ve Proxy Moduna Giriş

Blok zincirinin "kurcalanamaz" özelliğini hepimiz biliyoruz ve akıllı sözleşme kodu, blok zincirine yerleştirildikten sonra değiştirilemez.

Bu nedenle geliştiriciler, mantık yükseltmeleri, hata düzeltmeleri veya güvenlik güncellemeleri için sözleşme kodunu güncellemek istediklerinde, yeni bir sözleşme dağıtmaları gerekir ve yeni bir sözleşme adresi oluşturulur.

Bu sorunu çözmek için proxy modunu kullanabilirsiniz.

Proxy modu, şu anda en yaygın sözleşme yükseltme modu olan sözleşmenin dağıtım adresini değiştirmeden sözleşmenin yükseltilebilirliğini gerçekleştirir.

Proxy modu, proxy sözleşmesi ve mantıksal uygulama sözleşmesi dahil olmak üzere yükseltilebilir bir sözleşme sistemidir.

Proxy sözleşmesi, kullanıcı etkileşimini ve verileri ve sözleşme durumu depolamasını yönetir. Kullanıcının proxy sözleşmesine yaptığı çağrı, delege çağrısı() aracılığıyla mantık sözleşmesinden gelen kodu yürütecek ve böylece proxy sözleşmesinin durumunu değiştirecektir. Yükseltme, proxy sözleşmesi önceden belirlenmiş depolama yuvasında kayıtlı mantıksal sözleşme adresinin güncellenmesiyle gerçekleştirilir.

Diğer üç geleneksel proxy modu, şeffaf proxy, UUPS proxy ve Beacon proxy'dir.

Şeffaf Proxy

Şeffaf proxy modunda, yükseltme işlevi proxy sözleşmesinde uygulanır. Proxy sözleşmesinin yönetici rolüne, proxy'ye karşılık gelen mantıksal uygulama adresini güncellemek için proxy sözleşmesini çalıştırma yetkisi verilir. Yönetici ayrıcalıklarına sahip olmayan arayanlar, çağrılarını uygulama sözleşmesine devredecektir.

Not: Vekil sözleşme yöneticisi, sözleşmenin mantıksal uygulamasında kilit bir rol oynayamayacağı gibi sıradan bir kullanıcı da olamaz, çünkü proxy yöneticisi uygulama sözleşmesiyle etkileşime giremez.

UUPS Proxy'si

UUPS (Evrensel Yükseltilebilir Proxy Standardı) modunda, mantık sözleşmesinde sözleşme yükseltme işlevi uygulanır. Yükseltme mekanizması mantık sözleşmesinde saklandığından, yükseltilen sürüm, gelecekteki yükseltmeleri yasaklamak için yükseltmeyle ilgili mantığı silebilir. Bu modda, proxy sözleşmesine yapılan tüm çağrılar, mantıksal uygulama sözleşmesine iletilir.

İşaret Proxy'si

Beacon proxy modu, Beacon sözleşmesine atıfta bulunarak birden çok proxy sözleşmesinin aynı mantık uygulamasını paylaşmasına izin verir. Beacon sözleşmesi, çağrılan proxy sözleşmesi için mantık uygulama sözleşmesinin adresini sağlar.Yeni bir mantık uygulama adresine yükseltirken, yalnızca Beacon sözleşmesinde kaydedilen adresin güncellenmesi gerekir.

Proxy Kötüye Kullanımı ve Güvenlik Olayları

Geliştiriciler, yükseltilebilir sözleşme sistemlerini uygulamak için proxy modu sözleşmelerinden yararlanabilir. Ancak proxy modunun da belirli çalışma eşikleri vardır, yanlış kullanıldığında projeye yıkıcı güvenlik sorunları getirebilir. Aşağıdaki bölümlerde, proxy kötüye kullanımıyla ilgili olaylar ve proxy'lerin oluşturduğu merkezileştirme riskleri gösterilmektedir.

Proxy Yönetimli Anahtar İfşası

Proxy yöneticisi, şeffaf proxy modunun yükseltme mekanizmasını kontrol eder, yöneticinin özel anahtarı sızdırılırsa, saldırgan mantık sözleşmesini yükseltebilir ve proxy durumunda kendi kötü niyetli mantığını yürütebilir.

5 Mart 2021'de PAID Ağı, zayıf özel anahtar yönetiminin neden olduğu bir "basma" saldırısına maruz kaldı. PAID Ağı, proxy yöneticisinin özel anahtarını çalan ve mantık sözleşmesini değiştirmek için bir yükseltme mekanizmasını tetikleyen bir saldırgan tarafından istismar edildi.

Yükseltmeden sonra, saldırgan kullanıcının PAID'ini yok edebilir ve kendisi için daha sonra satılabilecek bir PAID partisi basabilir. Kodun kendisinde herhangi bir güvenlik açığı yoktur, ancak saldırgan sözleşmeyi yükseltmek için özel anahtarı yöneticiden almıştır.

** Başlatılmamış UUPS proxy uygulaması **

UUPS proxy modu için, proxy sözleşmesinin başlatılması sırasında, ilk parametreler arayan tarafından proxy sözleşmesine iletilir ve ardından proxy sözleşmesi, başlatmayı gerçekleştirmek için mantık sözleşmesinde Initialize() işlevini çağırır.

Initialize() işlevi, işlevin yalnızca bir kez çağrılmasını kısıtlamak için genellikle "initializer" değiştiricisiyle korunur. Initialize() işlevi çağrıldıktan sonra, proxy sözleşmesi açısından mantık sözleşmesi başlatılır.

Bununla birlikte, mantık sözleşmesi açısından, mantık sözleşmesi başlatılmaz, çünkü mantık sözleşmesinde doğrudan başlatma() çağrılmaz. Mantık sözleşmesinin kendisinin başlatılmadığı göz önüne alındığında, herhangi biri onu başlatmak, durum değişkenini kötü amaçlı bir değere ayarlamak ve potansiyel olarak mantık sözleşmesini devralmak için initialize() işlevini çağırabilir.

Devreye alınan bir mantık sözleşmesinin etkisi, sistemdeki sözleşme koduna bağlıdır. En kötü durumda, bir saldırgan, UUPS proxy modundaki mantık sözleşmesini kötü amaçlı bir sözleşmeye yükseltebilir ve "kendi kendini imha eden" bir işlev çağrısı yürütebilir, bu da tüm proxy sözleşmesinin işe yaramaz hale gelmesine neden olabilir ve sözleşmedeki varlıklar kalıcı olarak yok edilmek, kaybolmak.

dava

① Parity Multisig Freeze: Mantık sözleşmesi başlatılmadı. Saldırgan, selfdestruct()'u çağırarak sözleşmedeki birçok cüzdan ve kilit eterin başlatılmasını tetikler.

② Harvest Finance, Teller, KeeperDAO ve Rivermen'in tümü, saldırganların sözleşmelerin başlatma parametrelerini keyfi olarak ayarlamasına ve proxy sözleşmesini yok etmek için delege çağrısı() sırasında selfdestruct() yürütmesine olanak tanıyan başlatılmamış mantık sözleşmeleri kullanır.

Depolama Çakışması

Yükseltilebilir bir sözleşme sisteminde, proxy sözleşmesi durum değişkenlerini bildirmez, ancak önemli verileri depolamak için sözde rasgele depolama yuvaları kullanır.

Proxy sözleşmeleri, mantıksal sözleşme durumu değişkenlerinin değerlerini beyan edildikleri yere göre saklar. Proxy sözleşmesi kendi durum değişkenlerini bildirirse ve hem proxy hem de mantık sözleşmesi aynı depolama yuvasını kullanmaya çalışırsa, bir depolama çakışması oluşur.

OpenZeppelin kütüphanesi tarafından sağlanan proxy sözleşmesi, sözleşmede durum değişkenlerini bildirmez, ancak EIP 1967 standardına göre, çakışmaları önlemek için saklanması gereken değeri (yönetim adresi gibi) belirli bir depolama yuvasına kaydeder.

dava

23 Temmuz 2022 Pekin saatinde merkezi olmayan müzik platformu Audius hacklendi.Olay, proxy sözleşmesinde yeni bir mantığın getirilmesinden kaynaklandı ve depolama çakışmalarına neden oldu.

Proxy sözleşmesi bir proxyAdmin adres durumu değişkeni bildirir ve mantık sözleşmesi kodu yürütüldüğünde değeri yanlış okunur.

Proje tarafı tarafından özelleştirilen proxyAdmin'in değeri, yanlışlıkla, başlatıldı ve başlatıldı değeri olarak kabul edildi, böylece başlatıcı değiştirici yanlış bir sonuç döndürdü ve bu, saldırganın yeniden başlatma() işlevini çağırmasına ve kendisine yönetme yetkisi vermesine izin verdi. sözleşme. Saldırganlar daha sonra oylama parametrelerini değiştirdiler ve Audius varlıklarını çalmak için kötü niyetli önerilerini ilettiler.

Mantık sözleşmesinde veya güvenilmeyen sözleşmede delegasyon çağrısını() arayın

Delege çağrısı()'nın mantıksal bir sözleşmede var olduğunu ve sözleşmenin çağrının hedefini uygun şekilde doğrulamadığını varsayalım. Bu durumda, bir saldırgan, kontrol ettikleri kötü amaçlı sözleşmelere çağrı yürütmek, mantık uygulamalarını bozmak veya özel mantık yürütmek için bu işlevden yararlanabilir.

Benzer şekilde, mantık sözleşmesinde kısıtlanmamış bir address.call() işlevi varsa, saldırgan adres ve veri alanlarını kötü niyetli olarak sağladığında, proxy sözleşmesi olarak kullanılabilir.

dava

Pickle Finance, Furucombo ve dYdX saldırıları.

Bu olaylarda, güvenlik açığı bulunan sözleşme, kullanıcı belirteci tarafından onaylanmıştır ve sözleşmede, sözleşme adresini ve verilerini aramak için kullanıcı tarafından sağlanan bir call()/delegatecall() vardır, saldırgan kullanıcı bakiyelerini çekmek için transferFrom() işlev sözleşmesi. dYdX olayı sırasında dYdX, fonları korumak için kendi beyaz şapka saldırısını gerçekleştirdi.

En İyi Uygulamalar

genel olarak

(1) Proxy modunu yalnızca gerektiğinde kullanın

Her sözleşmenin yükseltilmesi gerekmez. Yukarıda gösterildiği gibi, proxy modelinin kullanılmasıyla ilgili birçok risk vardır. "Yükseltilebilir" özelliği, proxy yöneticileri topluluğun izni olmadan sözleşmeleri yükseltebileceğinden, güven sorunlarına da yol açar. Proxy modelini yalnızca gerektiğinde projelere entegre etmenizi öneririz.

(2) Proxy kitaplığını değiştirmeyin

Proxy sözleşmesi kitaplığı, özellikle depolama yönetimi ve yükseltme mekanizmalarıyla ilgilenen kısım karmaşıktır. Değişiklikteki herhangi bir hata, proxy ve mantık sözleşmelerinin çalışmasını etkileyecektir. Denetimlerimiz sırasında bulduğumuz yüksek önem düzeyine sahip aracılarla ilgili çok sayıda hata, yanlış aracı kitaplığı değişikliklerinden kaynaklanıyordu. Audius olayı, acentelik sözleşmelerinin uygunsuz şekilde değiştirilmesinin sonuçlarına en iyi örnektir.

Acentelik Sözleşmesi Operasyonu ve Yönetiminin Temel Noktaları

(1) Mantık sözleşmesini başlat

Saldırgan, başlatılmamış bir mantık sözleşmesini devralabilir ve potansiyel olarak proxy sözleşme sistemini tehlikeye atabilir. Bu nedenle, lütfen dağıtımdan sonra mantık sözleşmesini başlatın veya başlatmayı otomatik olarak devre dışı bırakmak için mantık sözleşmesinin oluşturucusunda _disableInitializers() öğesini kullanın.

(2) Aracı yönetim hesabının güvenliğini sağlayın

Yükseltilebilir bir sözleşme sistemi, sözleşme yükseltmelerini yönetmek için genellikle ayrıcalıklı bir "proxy yöneticisi" rolü gerektirir. Yönetim anahtarı sızdırılırsa, saldırgan sözleşmeyi ücretsiz olarak kötü niyetli bir sözleşmeye yükseltebilir ve bu da kullanıcıların varlıklarını çalabilir. Herhangi bir olası bilgisayar korsanlığı riskinden kaçınmak için proxy yönetici hesaplarının özel anahtarlarının dikkatli bir şekilde yönetilmesini öneririz. Tek noktalı anahtar yönetimi hatalarını önlemek için çoklu imza cüzdanları kullanılabilir.

(3) Şeffaf proxy yönetimi için ayrı bir hesap kullanın

Mantık uygulamasıyla etkileşim kaybını önlemek için proxy yönetimi ve mantık yönetişimi ayrı adresler olmalıdır. Proxy yönetimi ve mantıksal yönetişim aynı adrese başvuruyorsa, ayrıcalıklı işlevleri gerçekleştirmek için hiçbir çağrı iletilmez, dolayısıyla yönetişim işlevlerinde değişiklik yapılması yasaklanır.

Proxy sözleşmesi depolamayla ilgili

(1) Proxy sözleşmelerinde durum değişkenlerini bildirirken dikkatli olun

Audius hack'inde açıklandığı gibi, proxy sözleşmeleri kendi durum değişkenlerini bildirirken dikkatli olmalıdır. Proxy sözleşmelerinde normal şekilde bildirilen durum değişkenleri, verileri okurken ve yazarken veri çakışmalarına neden olabilir. Proxy sözleşmesi bir durum değişkeni gerektiriyorsa, mantıksal sözleşme kodunu yürütürken çakışmaları önlemek için değeri EIP1967 gibi bir depolama yuvasına kaydedin.

(2) Mantık sözleşmesinin değişken bildirim sırasını ve türünü koruyun

Mantık sözleşmesinin her sürümü, durum değişkenlerinin aynı sırasını ve türünü korumalıdır ve mevcut değişkenlerin sonuna yeni durum değişkenlerinin eklenmesi gerekir. Aksi takdirde, temsilci çağrıları, proxy sözleşmelerinin yanlış saklanan değerleri okumasına veya üzerine yazmasına neden olabilir ve eski veriler, yeni açıklanan değişkenlerle ilişkilendirilebilir ve bu da uygulamalar için ciddi sorunlara neden olabilir.

(3) Depolama boşluklarını temel sözleşmeye dahil edin

Mantık sözleşmelerinin, yeni mantık uygulamalarını dağıtırken yeni durum değişkenlerini tahmin etmek için sözleşme kodunda depolama boşlukları içermesi gerekir. Yeni bir durum değişkeni ekledikten sonra boşluğun boyutunun uygun şekilde güncellenmesi gerekir.

(4) Yapıcı veya bildirim sürecinde durum değişkeninin değerini ayarlamayın

Bildirim sırasında veya yapıcıda bir durum değişkeni atamak, proxy sözleşmesini değil, yalnızca mantık sözleşmesindeki değeri etkiler. Değişmez parametreler, Initialize() işlevi kullanılarak atanmalıdır.

Sözleşme Mirası

(1) Yükseltilebilir sözleşmeler yalnızca diğer yükseltilebilir sözleşmelerden miras alınabilir

Yükseltilebilir sözleşmeler, yükseltilemez sözleşmelerden farklı bir yapıya sahiptir. Örneğin, yapıcı aracı durumunu değiştirmekle uyumlu değildir, durum değişkenlerini ayarlamak için initialize() işlevini kullanır.

Başka bir sözleşmeden devralan herhangi bir sözleşmenin, ilgili değişkenlerini atamak için devralınan sözleşmesinin Initialize() işlevini kullanması gerekir. OpenZeppelin kitaplığını kullanırken veya kendi kodunuzu yazarken, yükseltilebilir sözleşmelerin yalnızca diğer yükseltilebilir sözleşmeleri devralabileceğinden emin olun.

(2) Mantık sözleşmelerinde yeni sözleşmeler başlatma

Solidity aracılığıyla oluşturulan ve somutlaştırılan sözleşmeler yükseltilemez. Sözleşmeler ayrı ayrı dağıtılmalı ve yükseltilebilir bir duruma ulaşmak için adreslerini yükseltilebilir mantık sözleşmesine bir parametre olarak iletmelidir.

(3) Ana sözleşme başlatma riski

Ana sözleşmeyi başlatırken, __{SözleşmeAdı}_init işlevi Ana sözleşmesini başlatır. __{SözleşmeAdı}_init'e yapılan birden çok çağrı, Üst sözleşmenin ikinci kez başlatılmasıyla sonuçlanabilir. __{SözleşmeAdı}_init_unchained() öğesinin yalnızca {SözleşmeAdı} parametrelerini başlatacağını ve Üst sözleşmesinin başlatıcısını çağırmayacağını unutmayın.

Ancak, bu önerilen bir uygulama değildir çünkü tüm Ana sözleşmelerin başlatılması gerekir ve gerekli sözleşmelerin başlatılmaması gelecekte uygulama sorunlarına neden olur.

Mantık sözleşmesinin uygulanması

Güvenilmeyen sözleşmeler için selfdestruct() veya selegatecall()/call()'dan kaçının

Sözleşmede selfdestruct() veya delege çağrısı() varsa, bir saldırganın bu işlevleri kullanarak mantık uygulamasını bozması veya özel mantığı yürütmesi mümkündür. Geliştiriciler, kullanıcı girişini doğrulamalı ve sözleşmelerin güvenilmeyen sözleşmelere temsilci çağrıları/çağrıları yürütmesine izin vermemelidir. Ayrıca, çoklu sözleşmelerin temsilci zincirinde depolama düzenini yönetmek külfetli olacağından, mantık sözleşmelerinde delege çağrısı() kullanılması önerilmez.

Sonda yazılmıştır

Proxy sözleşmeleri, protokollerin dağıtımdan sonra kod mantığını güncellemesini sağlayarak blok zincirlerinin değişmez doğasını atlar. Ancak, proxy sözleşmelerinin geliştirilmesinde yine de çok dikkatli olunması gerekir ve yanlış uygulama, proje güvenliği ve mantık sorunlarına neden olabilir.

Şeffaf, UUPS ve Beacon Proxy modlarının her biri kendi kullanım durumları için kanıtlanmış yükseltme mekanizmalarına sahip olduğundan, genel olarak en iyi uygulama yetkili ve kapsamlı bir şekilde test edilmiş çözümler kullanmaktır. Buna ek olarak, saldırganların ajan mantığını değiştirmesini önlemek için, artan ajanlar için ayrıcalıklı roller de güvenli bir şekilde yönetilmelidir.

Mantık uygulama sözleşmesi, saldırganların selfdestruct() gibi bazı kötü amaçlı kodları yürütmesini engelleyebilecek olan delege çağrısı() kullanmamaya da dikkat etmelidir.

En iyi uygulamaları takip etmek, yükseltilebilir esnekliği korurken istikrarlı proxy sözleşmesi dağıtımları sağlarken, tüm kodlar projeyi tehlikeye atabilecek yeni güvenlik veya mantık sorunlarına eğilimlidir. Bu nedenle, tüm kodlar en iyi şekilde, proxy sözleşmesi protokollerini denetleme ve güvence altına alma konusunda deneyimli bir güvenlik uzmanları ekibi tarafından denetlenir.

View Original
The content is for reference only, not a solicitation or offer. No investment, tax, or legal advice provided. See Disclaimer for more risks disclosure.
  • Reward
  • Comment
  • Share
Comment
0/400
No comments
  • Pin