Sıfır Katmanını Atlamak

Jan 05 2023
L2BEAT'in başından beri, L2 protokolleriyle ilişkili riskleri analiz etmek ve anlamak için çok çaba sarf ettik. Kullanıcıların ve ekosistemin çıkarlarına en uygun şekilde hareket eden, tarafsız, bağımsız bir bekçi köpeği olmak için elimizden gelenin en iyisini yapıyoruz.

L2BEAT'in başından beri, L2 protokolleriyle ilişkili riskleri analiz etmek ve anlamak için çok çaba sarf ettik. Kullanıcıların ve ekosistemin çıkarlarına en uygun şekilde hareket eden, tarafsız, bağımsız bir bekçi köpeği olmak için elimizden gelenin en iyisini yapıyoruz. Proje veya dahil olan ekip için kişisel tercihlerimizin yolumuza çıkmasına izin vermeyiz. Bu nedenle, belirli ekiplerin projelerine harcadıkları zamana ve çalışmaya değer versek de, kırmızı alarmları açmamız veya çeşitli protokollerde endişelerimizi belirtmemiz yaygın bir durumdur. Güvenlikle ilgili tartışmaların erkenden yapılması, tüm ekosistemin olası risklere karşı daha iyi hazırlanmasına ve herhangi bir şüpheli davranışa daha erken tepki vermesine olanak tanır.

Bugün, zincirler arası uygulamaların paylaşılan güvenlik modelleri hakkında bir tartışma başlatmak istiyoruz. Şu anda iki yaklaşım vardır: paylaşılan güvenlik ve uygulama başına güvenlik. İlki, paylaşılan güvenlik, örneğin tüm toplamalar tarafından kullanılır. İkincisi, uygulama başına güvenlik, “omnichain” projeleri tarafından kullanılır. Böyle bir projenin başlıca örneği LayerZero'dur.

Paylaşılan güvenlik ve Yalıtılmış güvenlik

Paylaşılan güvenlik derken, belirli bir altyapı üzerinde çalışan belirli belirteçlerin veya uygulamaların kendi güvenlik modellerini özgürce seçmediklerini kastediyoruz. Bunun yerine, altyapının dayattığı güvenlik gereksinimleri ne olursa olsun uymak zorundadırlar. Örneğin, iyimser toparlamalar genellikle 7 günlük bir kesinlik penceresi dayatıyor — bu tür toparlamalarda çalışan uygulamalar bu süreyi basitçe yok sayamaz veya kısaltamaz. Bir engel gibi görünebilir, ancak bir sebeple konulan bir engeldir. Uygulamaların dahili güvenlik politikası ne olursa olsun, kullanıcılara o toplamada kullandıkları uygulama tarafından tutulmayı bekleyebilecekleri bir güvenlik garantisi sağlamaya olanak tanır. Uygulama, toplamaların politikasını yalnızca güçlendirebilir, zayıflatamaz.

Yalıtılmış güvenlik derken, altyapı tarafından herhangi bir şekilde kısıtlanmayan her uygulamanın kendi güvenliğini tanımlamaktan sorumlu olduğunu kastediyoruz. İlk başta, iyi bir fikir gibi görünebilir. Sonuçta, uygulamanın hangi güvenlik önlemlerine ihtiyaç duyabileceğini en iyi uygulama geliştiricileri bilir. Ancak aynı zamanda, her uygulamanın güvenlik politikasıyla ilişkili riskleri değerlendirme sorumluluğunu son kullanıcıya devreder. Ayrıca, uygulama geliştiricileri uygulama politikalarını seçmekte özgürse, istedikleri zaman değiştirmeyi de seçebilirler. Bu nedenle, riskleri her uygulama için bir kez değerlendirmek yeterli değildir, uygulamaların politikası her değiştiğinde değerlendirilmelidir.

Sorun

Her uygulamanın kendi güvenlik politikasını özgürce tanımlayabildiği izole edilmiş güvenlik modelinin ciddi güvenlik endişeleri oluşturduğunu düşünüyoruz. Her şeyden önce, kullanmayı düşündükleri her aplikasyonla ilgili riskleri ayrı ayrı doğrulamak zorunda oldukları için son kullanıcılar için riskleri artırıyor.

Ayrıca böyle bir modeli kullanan uygulamalar için riski artırır. Yalıtılmış güvenlik, güvenlik politikası değişikliğiyle ilgili ek risk ekler — saldırgan, uygulamanın güvenlik modelini değiştirirse, fonları boşaltma veya başka herhangi bir şekilde kötüye kullanma olasılığı sağlayarak, uygulamayı devre dışı bırakabilir. Uygulamanın üzerinde kötüye kullanıma karşı koruma sağlayacak ek bir güvenlik katmanı yoktur.

Ayrıca, her an anında değişebilen güvenlik politikalarıyla, uygulamaları günlük olarak izlemek ve kullanıcıları riskler hakkında bilgilendirmek neredeyse imkansız hale geliyor.

Akıllı sözleşmelerin yükseltilebilirliğine benzer buluyoruz. L2BEAT'te zaten buna karşı uyarıda bulunuyoruz . Kullanıcıları, akıllı sözleşmelerinde yükseltilebilirlik mekanizmalarına sahip olan toplamalar ve köprüler ile her durumda yükseltilebilirliği yöneten kesin mekanizma hakkında bilgilendiririz. Bu zaten oldukça karmaşık ve yalıtılmış bir güvenlik modeliyle bu, her uygulama için çoğalarak etkili bir şekilde izlemeyi neredeyse imkansız hale getiriyor.

Bu nedenle, yalıtılmış bir güvenlik modelini kendi başına bir güvenlik riski olarak görüyoruz ve böyle bir modeli kullanan her uygulamaya, aksi kanıtlanana kadar varsayılan olarak riskli davranacağımızı varsayıyoruz.

plan

Varsayımlarımızı gerçek dünyada, ana ağda test etmeye karar verdik. Deney için LayerZero çerçevesi, temelinde yalıtılmış güvenlik kullanan en popüler çözümlerden biri olduğu için seçildi. Güvenli bir omnichain belirteci dağıttık ve daha sonra güvenlik yapılandırması güncellendi, bu da kötü niyetli belirteçlerin çekilmesine izin verdi. Jetonun kodu, LayerZero tarafından sağlanan örneklere dayanmaktadır ve üretimde dağıtılan diğer birçok omnichain jetonuna ve uygulamasına çok benzer veya aynıdır.

Ancak ayrıntılara derinlemesine dalmadan önce, LayerZero güvenlik modelinin nasıl göründüğüne kısaca bir göz atalım.

LayerZero'nun teknik incelemesinde açıkça belirtildiği gibi, "zincirler arası güvene dayalı olmayan iletişim", protokolün güvenliğini sağlamak için birlikte hareket eden iki bağımsız aktöre (kahin ve aktarıcı) dayanmaktadır.

LayerZero'nun web sitesinde belirttiği gibi, temel konsepti, "bir ULN (UltraLightNode) çalıştıran, zincir üzerinde yapılandırılabilir bir kullanıcı uygulaması" olmasıdır. LayerZero'nun zincir üstü bileşenleri, mesajları zincirler arasında iletmek için iki harici zincir dışı tarafa (Oracle ve Relayer) güvenir.

A zincirinden B zincirine herhangi bir M mesajı gönderildiğinde, aşağıdaki iki eylem gerçekleşir:

  • ilk olarak Oracle, A zincirinde M mesajını gönderen işlem tamamlanana kadar bekler ve ardından B zincirine mesaj paketi taahhüdünü yazar, örneğin, blok başlığının hash'i (tam biçim, farklı zincirler/oracle'lar arasında değişebilir) M mesajını içeren A zincirinde
  • daha sonra Relayer, zincir B'ye saklanan başlığın M mesajını içerdiğine dair bir "kanıt" (örneğin bir Merkle Kanıtı) gönderir.

LayerZero, "LayerZero'nun tasarımının gizli anlaşma olasılığını ortadan kaldırdığını" iddia ediyor. Ancak gerçekte, her kullanıcı uygulaması kendi Relayer ve Oracle'ını tanımlayabildiğinden, bu ifade doğru değildir (aşağıda gösterilen deneyde bunu kanıtlıyoruz). LayerZero, tasarım gereği bu bileşenlerin bağımsız olduğunu ve gizli anlaşma yapamayacaklarını garanti etmez. Bu garantileri sağlamak kullanıcı uygulamasına bağlıdır. Ve uygulama bunları bozmayı seçerse, LayerZero mekaniğinde bunu yapmasını engelleyebilecek hiçbir şey yoktur.

Ayrıca, varsayılan olarak tüm kullanıcı uygulamaları, güvenlik varsayımlarını tamamen yeniden tanımlayarak Relayer ve Oracle'ı herhangi bir zamanda değiştirebilir. Bu nedenle, deneyimizde göstereceğimiz gibi, kontrolden sonra herhangi bir zamanda değişmiş olabileceğinden, söz konusu uygulamanın güvenliğini bir kez kontrol etmek yeterli değildir.

Deney

Deneyimizde, her iki zincir arasında iletişim kurmak için ZeroLayer kullanarak hem Ethereum hem de Optimism üzerinde çalışan basit bir omnichain belirteci olan CarpetMoon oluşturmaya karar verdik.

Jetonumuz başlangıçta LayerZero tarafından sağlanan varsayılan güvenlik modelini kullanır, bu nedenle şu anda dağıtılan LayerZero uygulamalarının çoğu (tümü değilse de) ile tamamen aynı görünür. Bu nedenle, genellikle LayerZero kullanan diğer herhangi bir belirteç kadar güvenlidir.

İlk olarak, token sözleşmelerimizi hem Ethereum hem de Optimism üzerine kuruyoruz:
https://ethtx.info/mainnet/0xf4d1cdabb6927c363bb30e7e65febad8b9c0f6f76f1984cd74c7f364e3ab7ca9/
https://optimistic.etherscan.io/tx/0xf41389d71fa3942de5225efb067072728c6c6de56c241574187781db7c73d221

Yönlendirmeyi, LayerZero'nun her iki zincirde de hangi sözleşmeye karşılık geldiğini bilmesi için ayarladık:
https://ethtx.info/mainnet/0x19d78abb03179969d6404a7bd503148b4ac14d711f503752495339c96a7776e9/
https://optimistic.etherscan.io/tx/0x037b1bad33faa5607bb5835460a1d5caaf3a147dc3a09762ac7703befcdb3c3c

Belirteç kuruldu, LayerZero kullanan diğer tüm omnichain belirteçleri gibi görünüyor, varsayılan yapılandırma ile, şüpheli bir şey yok.

Test kullanıcımıza, hadi ona Alice diyelim, test belirteçleri sağlıyoruz, böylece Alice'in Ethereum'da 1 milyar CarpetMoon belirteci var:
https://ethtx.info/mainnet/0x7e2faa8426dacae92830efbf356ca2da760833eca28e652ff9261fc03042b313/

Şimdi Alice, LayerZero'yu kullanarak bu belirteçleri İyimserlik ile birleştiriyor.

Belirteçleri Ethereum'daki bir emanete kilitliyoruz:
https://ethtx.info/mainnet/0xe4dc3757b86bfda8e7baddc088fb1a599e083ed77034c29e5dd8bd11f1e17771/

İşlemi içeren mesaj, Optimism'e LayerZero aracılığıyla iletiliyor:
https://layerzeroscan.com/101/address/0xc6005ccc1de4b300d538903b74848bff881d5dc5/message/111/address/0x201fe0d843b546f2e24d4c8444318d1c71b7d10d/nonce/1

Ve Optimism üzerine köprülü jetonlar basılıyor, Alice artık Optimism üzerine 1 milyar MoonCarpet jetonuna sahip:
https://optimistic.etherscan.io/tx/0x5388ced88cf562acafff82d6798f791b0b38b90ee106df9bf91c0d86306ec302

Tamam, her şey beklendiği gibi çalıştı, Alice jetonlarını köprüledi ve Ethereum emanetinde 1 milyar MoonCarpet jetonu ve Optimism'deki hesabında 1 milyar MoonCarpet jetonu olduğunu gördü. Ancak her şeyin doğru çalıştığından emin olmak için jetonların yarısını (500M MoonCarpet) Ethereum'a geri aktarır.

İyimserlikte 500 milyon token yakma işlemiyle başlıyoruz:
https://optimistic.etherscan.io/tx/0x118a57106488ad0bae1f3b920b1fd98b187752ad966f3a901fc53cff47f2097f

Bu işlemle ilgili bilgiler Ethereum'a iletilir:
https://layerzeroscan.com/111/address/0x201fe0d843b546f2e24d4c8444318d1c71b7d10d/message/101/address/0xc6005ccc1de4b300d538903b74848bff881d5dc5/nonce/1

Ve beklendiği gibi, 500 milyon MoonCarpet jetonu emanetten Alice'in adresine geri teslim ediliyor:
https://etherscan.io/tx/0x27702e07a65a9c6a7d1917222799ddb13bb3d05159d33bbeff2ca1ed414f6a18

Şimdiye kadar, her şey tam olarak varsayıldığı gibi iyi çalışıyor. Alice, belirteçleri Ethereum'dan Optimism'e aktarabileceğini kontrol etti ve tekrar geri döndü, MoonCarpet belirteçlerinden korkması için hiçbir neden yok.

Ancak bir şeylerin ters gittiğini varsayalım - örneğin, jetonumuzun arkasındaki ekibin güvenliği ihlal edildi ve kötü oyuncu Bob, uygulamamız için LayerZero yapılandırmasına erişim kazandı.

Bu tür bir erişimle Bob, Oracle ve Relayer'ı varsayılandan kendi kontrolü altındakilere değiştirebilir.

Lütfen bunun, LayerZero'nun mimarisine yerleşmiş, LayerZero kullanan her uygulamaya sağlanan bir mekanizma olduğunu, herhangi bir arka kapı değil, standart bir mekanizma olduğunu unutmayın.

Bob, Oracle'ı kontrolü altındaki bir EOA'ya değiştirir:
https://ethtx.info/mainnet/0x4dc84726da6ca7d750eef3d33710b5f63bf73cbe03746f88dd8375c3f4672f2f/

Relayer ile aynı şeyi yapar:
https://ethtx.info/mainnet/0xc1d7ba5032af2817e95ee943018393622bf54eb87e6ff414136f5f7c48c6d19a/

Ve şimdi garip şeyler oluyor. Oracle ve Relayer artık Bob'un tam kontrolü altında olduğundan, Alice'in jetonlarını çalabilir. İyimserlik üzerinde herhangi bir işlem yapılmamasına rağmen (MoonCarpet belirteçleri hala Alice'in cüzdanındadır) Bob, Ethereum üzerindeki MoonCarpet akıllı sözleşmesini (LayerZero mekanizmalarını kullanarak) diğer zincirdeki belirteçleri yaktığına ve MoonCarpet belirteçlerini çekebileceğine ikna edebilir. Ethereum'da.

İlk olarak, haydut Oracle kullanarak Ethereum'daki blokhash'ı günceller:
https://ethtx.info/0xde2edee2cc7f070120e96c9df90d86696970befcfc221e18c6ac4168bb5b1d92/

Ve şimdi kalan jetonları emanetten çekebilir:
https://ethtx.info/0xda695f374b375d5372efeca37aae4c5a17f114d5a76db1e86edebb0924bcdcc7/

Sonuç

Alice neden ve ne zaman yanlış bir şey olduğunu bile anlamayacak. Aniden Optimism'deki MoonCarpet jetonları artık Ethereum'daki jetonlarla desteklenmiyor.

Akıllı sözleşmeler yükseltilemez ve amaçlandığı gibi hareket eder. Tek şüpheli aktivite, Oracle ve Relayer'daki değişikliktir, ancak bu, LayerZero'da yerleşik olan normal bir mekanizmadır, bu nedenle Alice, bu değişikliğin kasıtlı olup olmadığını bile bilemez. Ve Alice bu değişikliği öğrenmiş olsa bile çok geç olacaktır - saldırgan, o tepki bile veremeden fonları tüketebilir.

Ve LayerZero burada da yardımcı olamadı — bunların hepsi, artık kontrol edemedikleri mekanizmalarının geçerli uygulamalarıydı. Teorik olarak, uygulamanın kendisi Oracle ve Relayer'ı değiştirmesini engelleyebilir, ancak bildiğimiz kadarıyla zaten dağıtılan uygulamalardan hiçbiri bunu yapmadı.

Bu deneyi kimsenin fark edip etmediğini kontrol etmek için yaptık ama beklediğimiz gibi kimse fark etmedi. Güvenlik politikalarının değişip değişmediğini kontrol etmek ve bu olursa kullanıcıları uyarmak için LayerZero ile oluşturulan tüm uygulamaları etkin bir şekilde izlemek neredeyse imkansızdır.

Oracle ve Relayer'ın güvenlik riskleri oluşturacak şekilde değiştiğini fark edebilsek bile, bu gerçekleştiğinde artık çok geçtir. Yeni Oracle ve Relayer artık zincirler arasındaki iletişimi sansürlemeyi veya basitçe devre dışı bırakmayı özgürce seçebileceğinden, kullanıcılar genellikle bu konuda hiçbir şey yapamaz. Bu, deneyimizde açıkça gösterilmiştir, Alice uygulama yapılandırmasındaki değişikliği fark etse bile, köprülenmiş belirteçleriyle fazla bir şey yapamaz - yeni Oracle ve Relayer artık orijinal zinciri dinlemediği için aktarmazlar. mesajlar Ethereum'a geri döner.

Sonuçlar ve CTA

Yukarıda da görebileceğimiz gibi, belirtecimiz LayerZero kullanılarak oluşturulmuş ve mekaniğini amaçlandığı gibi kullanmış olsa da, belirteçlerin emanetinden para çalmayı başardık. Tabii ki bu, LayerZero'nun kendisi değil, uygulamanın (bizim durumumuzda CarpetMoon belirteci) hatasıydı, ancak bu, LayerZero'nun kendi başına herhangi bir güvenlik garantisi sağlamadığını kanıtlıyor .

LayerZero, Oracle ve Relayer ile ilgili güvenlik modelini açıkladığında, uygulama sahiplerinin (veya özel anahtarlarına sahip birinin) mantıksız bir şey yapmayacağını varsayar. Ancak bu varsayım, düşmanca bir ortamda yanlıştır. Ayrıca, kullanıcıların güvenilir bir üçüncü taraf olarak uygulama sahiplerine güvenmelerini gerektirir.

Uygulamada, bunun bir sonucu olarak, LayerZero kullanılarak oluşturulan uygulamaların güvenliği hakkında herhangi bir varsayımda bulunulamaz - aksi kanıtlanana kadar her uygulama riskli kabul edilmelidir.

Aslında bizim için tüm hikaye, tüm omnichain tokenlerini L2BEAT sitesine dahil etmeyi planladığımız bir PR ile başladı — risklerini nasıl değerlendireceğimizi bulmakta zorlandık. Risk vektörlerini analiz ederken deneyimiz için fikir bulduk.

L2BEAT için bunun sonuçları, LayerZero kullanılarak oluşturulan her uygulamanın üzerine olası güvenlik riskleri hakkında uyarılar koymak zorunda olmamızdır. Ancak, izole edilmiş güvenliğin özellikle bizim alanımızda kaçınılması gereken bir anti-kalıp olduğuna inandığımız için güvenlik modelleri hakkında daha geniş bir tartışma başlatmak istiyoruz.

LayerZero'daki gibi yalıtılmış güvenlik modelleri giderek daha popüler hale geldikçe, onları kötüye kullanan, çok fazla hasara neden olacak ve tüm endüstri hakkında belirsizliği artıracak daha fazla proje olacağına eminiz.