Daha önce, CertiK ekibi Sui blok zincirinde bir dizi hizmet reddi güvenlik açığı keşfetti. Bu güvenlik açıkları arasında yeni ve etkisi yüksek bir güvenlik açığı öne çıkıyor. Bu güvenlik açığı, Sui ağ düğümlerinin yeni işlemleri işleyememesine neden olabilir ve bu etki, tüm ağın tamamen kapanmasına eşdeğerdir.
Daha geçen Pazartesi CertiK, bu büyük güvenlik açığını keşfettiği için SUI'den 500.000 dolarlık bir hata ödülü aldı. ABD endüstrisindeki yetkili bir medya olan CoinDesk olayı bildirdi ve ardından büyük medya da bu haberin ardından ilgili haberleri yayınladı.
Bu güvenlik açığı, canlı bir şekilde "Hamster Wheel" olarak adlandırılır: benzersiz saldırı yöntemi, şu anda bilinen saldırılardan farklıdır. Saldırganın, Sui doğrulama düğümünde sonsuz bir döngüyü tetiklemek için yalnızca yaklaşık 100 baytlık bir yük göndermesi yeterlidir. yeni işlemlere
Ek olarak, saldırının neden olduğu hasar, ağ yeniden başlatıldıktan sonra da devam edebilir ve Sui ağında otomatik olarak yayılabilir, bu da tüm düğümlerin tekerlek üzerinde sonsuz çalışan hamsterler gibi yeni işlemleri işleyemez hale gelmesine neden olur. Bu nedenle, bu benzersiz saldırı türüne "hamster çarkı" saldırısı diyoruz.
CertiK, hatayı keşfettikten sonra, Sui'nin hata ödül programı aracılığıyla bunu Sui'ye bildirdi. Sui ayrıca ilk seferde etkili bir şekilde yanıt verdi, güvenlik açığının ciddiyetini onayladı ve ana ağ başlatılmadan önce sorunu onarmak için aktif olarak ilgili önlemleri aldı. Sui, bu güvenlik açığını düzeltmenin yanı sıra, bu güvenlik açığının neden olabileceği olası hasarı azaltmak için önleyici hafifletmeler de uygulamıştır.
CertiK ekibine sorumlu açıklamalarından dolayı teşekkür etmek için Sui, CertiK ekibine 500.000 $ ödül verdi.
Bu kritik güvenlik açığının ayrıntıları aşağıda teknik düzeyde açıklanacak ve güvenlik açığının temel nedeni ve olası etkisi açıklığa kavuşturulacaktır.
Güvenlik Açığı Açıklaması
Doğrulayıcıların Sui'deki kilit rolü
Sui ve Aptos gibi Move diline dayalı blok zincirleri için, kötü niyetli yük saldırılarını önlemeye yönelik koruma mekanizması esas olarak statik doğrulama teknolojisidir. Statik doğrulama teknolojisi sayesinde Sui, sözleşme düzenlenmeden veya yükseltilmeden önce kullanıcı tarafından gönderilen yükün geçerliliğini kontrol edebilir. Doğrulayıcı, yapının ve anlambilimin doğruluğunu sağlamak için bir dizi denetleyici sağlar. Yalnızca kontrol doğrulamasını geçtikten sonra, sözleşme yürütülmek üzere Move sanal makinesine girer.
Hareket Zincirindeki Kötü Amaçlı Yük Tehditleri
Sui zinciri, orijinal Move sanal makinesinin üzerinde yeni bir dizi depolama modeli ve arabirim sağlar, böylece Sui, Move sanal makinesinin özelleştirilmiş bir sürümüne sahip olur. Yeni depolama ilkellerini desteklemek için Sui ayrıca, nesne güvenliği ve küresel depolama erişimi işlevleri gibi güvenilmeyen yüklerin güvenlik doğrulaması için bir dizi ek ve özelleştirilmiş denetim yöntemi sunar. Bu özel kontroller, Sui'nin benzersiz özelliklerine uygundur, bu nedenle bu özel kontrollere Sui doğrulayıcıları diyoruz.
Sui'nin yükleri kontrol etme sırası
Yukarıdaki şekilde gösterildiği gibi, doğrulayıcıdaki kontrollerin çoğu CompiledModule'a karşı yapısal güvenlik doğrulaması gerçekleştirir (kullanıcı tarafından sağlanan sözleşme yükünün yürütülmesini temsil eder). Örneğin, çalışma zamanı yükünde yinelenen giriş olmadığından emin olmak için "Yinelenen Denetleyici"yi kullanın; çalışma zamanı yükündeki her bir alanın uzunluğunun izin verilen maksimum giriş sınırı içinde olduğundan emin olmak için "Sınır Denetleyicisi"ni kullanın.
Yapısal kontrollere ek olarak, doğrulayıcının statik kontrolleri, anlamsal düzeyde güvenilmeyen yüklerin sağlamlığını sağlamak için hala daha karmaşık analiz yöntemleri gerektirir.
Move'un Soyut Yorumlayıcısını Anlamak: Doğrusal ve Yinelemeli Analiz
Move tarafından sağlanan soyut yorumlayıcı, soyut yorumlama yoluyla bayt kodu üzerinde karmaşık güvenlik analizi gerçekleştirmek için özel olarak tasarlanmış bir çerçevedir. Bu mekanizma, doğrulama sürecini daha ayrıntılı ve doğru hale getirir ve her doğrulayıcının, analiz için benzersiz soyut durumunu tanımlamasına izin verilir.
Başlangıçta, soyut yorumlayıcı derlenmiş modüllerden bir kontrol akış grafiği (CFG) oluşturur. Bu CFG'lerdeki her temel blok, bir dizi durumu, bir "sipariş öncesi durumu" ve bir "sipariş sonrası durumu" korur. "Ön sipariş durumu", temel bloğun yürütülmesinden önceki program durumunun bir anlık görüntüsünü sağlarken, "sipariş sonrası durumu", temel bloğun yürütülmesinden sonraki program durumunun bir açıklamasını sağlar.
Soyut yorumlayıcı, kontrol akış grafiğinde bir geri atlama (veya döngü) ile karşılaşmadığında, basit bir doğrusal yürütme ilkesini izler: her temel blok sırayla analiz edilir ve önceki komut, her komutun semantiğine göre hesaplanır. sıralı durum ve ardışık durum. Sonuç, bir programın yürütülmesi sırasında her bir temel bloğun durumunun doğru bir anlık görüntüsüdür ve programın güvenlik özelliklerinin doğrulanmasına yardımcı olur.
Move soyut yorumlayıcısının iş akışı
Ancak, kontrol akışında döngüler olduğunda süreç daha karmaşık hale gelir. Bir döngünün görünümü, kontrol akış grafiğinin bir geri atlama kenarı içerdiği anlamına gelir. Geri atlama kenarının kaynağı, mevcut temel bloğun sonraki durumuna ve atlamanın hedef temel bloğuna (döngü başı) karşılık gelir. Bu nedenle, soyut yorumlayıcının geri atlamayla ilgili iki temel bloğun durumlarını dikkatli bir şekilde birleştirmesi gerekir.
Birleştirilmiş durumun loop head temel bloğunun mevcut ön sipariş durumundan farklı olduğu tespit edilirse, abstract yorumlayıcı loop head temel bloğunun durumunu günceller ve analizi bu temel bloktan başlayarak yeniden başlatır. Bu yinelemeli analiz süreci, döngü ön durumu stabilize olana kadar devam edecektir. Başka bir deyişle, bu işlem, döngü başı temel bloğunun ön sipariş durumu artık yinelemeler arasında değişmeyene kadar tekrarlanır. Sabit bir noktaya ulaşmak, döngü analizinin tamamlandığını gösterir.
Sui IDLeak Doğrulayıcı: Özelleştirilmiş Soyut Yorumlama Analizi
Orijinal Move tasarımından farklı olarak, Sui'nin blockchain platformu, benzersiz bir "hedef" merkezli küresel depolama modeli sunar. Bu modelin dikkate değer bir özelliği şudur: anahtar özelliğine sahip (zincirde bir dizin olarak depolanan) herhangi bir veri yapısının, yapının ilk alanı olarak kimlik tipine sahip olması gerekir. Kimlik alanı sabittir ve her nesnenin global olarak benzersiz bir kimliği olması gerektiğinden diğer nesnelere aktarılamaz. Bu özellikleri sağlamak için Sui, soyut yorumlayıcının üzerine bir dizi özel analiz mantığı oluşturdu.
id_leak_verifier olarak da bilinen IDLeak doğrulayıcı, analiz için soyut yorumlayıcı ile birlikte çalışır. AbstractState adlı kendi benzersiz AbstractDomain'ine sahiptir. Her AbstractState, birden çok yerel değişkene karşılık gelen AbstractValue'dan oluşur. Her yerel değişkenin durumu, bir ID değişkeninin yepyeni olup olmadığını izlemek için AbstractValue tarafından izlenir.
Yapı paketleme sürecinde, IDLeak doğrulayıcı yalnızca yepyeni bir kimliğin bir yapıya paketlenmesine izin verir. IDLeak doğrulayıcıları, yorumlama analizini soyutlayarak, mevcut hiçbir kimliğin diğer yapı nesnelerine aktarılmadığından emin olmak için yerel veri akış durumunu kapsamlı bir şekilde izleyebilir.
Sui IDLeak doğrulayıcı durumu bakım tutarsızlığı
IDLeak doğrulayıcı, AbstractState::join işlevini uygulayarak Move abstract yorumlayıcısıyla entegre edilmiştir. Bu işlev, durum yönetiminde, özellikle durum değerlerinin birleştirilmesinde ve güncellenmesinde ayrılmaz bir rol oynar.
Çalışmalarını anlamak için bu işlevleri ayrıntılı olarak inceleyin:
AbstractState::join'de işlev başka bir AbstractState'i girdi olarak alır ve onun yerel durumunu geçerli nesnenin yerel durumuyla birleştirmeye çalışır. Giriş durumundaki her yerel değişken için, o değişkenin değerini yerel durumdaki mevcut değeriyle karşılaştırır (bulunmazsa varsayılan olarak AbstractValue::Other olur). İki değer eşit değilse, son durum birleştirme sonucunun değişip değişmediğine temel olarak bir "değişti" bayrağı koyacak ve AbstractValue::join'i çağırarak yerel durumdaki yerel değişken değerini güncelleyecektir.
AbstractValue::join'de işlev, değerini başka bir AbstractValue ile karşılaştırır. Eşitlerse, girilen değeri döndürür. Eşit değilse, AbstractValue::Other döndürür.
Ancak bu durum bakım mantığı, gizli bir tutarsızlık sorunu içermektedir. AbstractState::join, yeni ve eski değerler arasındaki farka bağlı olarak birleştirilmiş durumun değiştiğini (JoinResult::Changed) belirten bir sonuç döndürse de, birleştirilmiş güncellenmiş durum değeri yine de değişmeden kalabilir.
Bu tutarsızlık sorunu, işlemlerin sırasından kaynaklanır: AbstractState::join'de durumu değiştirme kararı, durum güncellemesinden (AbstractValue::join) önce verilir ve bu karar, gerçek durum güncelleme sonucunu yansıtmaz.
Ayrıca, AbstractValue::join'de, AbstractValue::Other birleştirmenin sonucunda belirleyici bir rol oynar. Örneğin, eski değer AbstractValue::Other ve yeni değer AbstractValue::Fresh ise, güncellenen durum değeri yine AbstractValue::Other olur, eski ve yeni değerler farklı olsa bile durumun kendisi değişmez güncellemeden sonra.
Örnek: Durum Bilgili Bağlantıların Tutarsızlığı
Bu bir tutarsızlık ortaya çıkarır: temel bir bloğun durumunun birleştirilmesinin sonucunun "değişmiş" olduğu yargısına varılır, ancak birleştirilmiş durum değerinin kendisi değişmemiştir. Soyut yorum analizi sürecinde bu tür tutarsızlıklar ciddi sonuçlar doğurabilir. Kontrol akış grafiğinde (CFG) bir döngü oluştuğunda soyut bir yorumlayıcının davranışını gözden geçiriyoruz:
Bir döngü ile karşılaşıldığında, soyut yorumlayıcı geri atlama hedefi temel bloğunun ve mevcut temel bloğun durumunu birleştirmek için yinelemeli bir analiz yöntemi kullanır. Birleştirilmiş durum değişirse, soyut yorumlayıcı atlama hedefinden başlayarak yeniden analiz eder.
Bununla birlikte, soyut yorumlama analizinin birleştirme işlemi, durum birleştirme sonucunu yanlışlıkla "değişim" olarak işaretlerse, aslında durumun iç değişkeninin değeri değişmediğinde, sonsuz yeniden analize yol açacak ve sonuçta bir sonsuz döngü.
Tutarsızlıklardan daha fazla yararlanma, Sui IDLeak doğrulayıcıda sonsuz bir döngüyü tetikler
Bu tutarsızlığı kullanan bir saldırgan, IDLeak doğrulayıcılarını kandırarak sonsuz bir döngüye sokan kötü amaçlı bir kontrol akış grafiği oluşturabilir. Dikkatlice oluşturulmuş bu kontrol akış grafiği üç temel bloktan oluşur: BB1 ve BB2, BB3. Bir döngü oluşturmak için kasıtlı olarak BB3'ten BB2'ye bir geri atlama kenarı getirdiğimizi belirtmekte fayda var.
Kötü amaçlı CFG+ durumu, IDLeak doğrulayıcıda dahili bir sonsuz döngüye yol açabilir
Süreç, belirli bir yerel değişkenin AbstractValue değerinin ::Other olarak ayarlandığı BB2 ile başlar. BB2 çalıştırıldıktan sonra akış, aynı değişkenin ::Fresh olarak ayarlandığı BB3'e aktarılır. BB3'ün sonunda, BB2'ye atlayan bir geri atlama kenarı vardır.
Söz konusu tutarsızlıklar, bu örneğin soyut yorumlanmasında kilit rol oynamaktadır. Geri atlama kenarı işlendiğinde, soyut yorumlayıcı BB3'ün sipariş sonrası durumunu ("::Fresh" değişkeni ile) BB2'nin ön sipariş durumu ("::Other" değişkeni ile) ile bağlamaya çalışır. AbstractState::join işlevi, eski ve yeni değerler arasındaki farkı fark eder ve BB2'nin yeniden analiz edilmesi gerektiğini belirtmek için "değiştir" bayrağını ayarlar.
Ancak, AbstractValue::join içindeki "::Other" öğesinin baskın davranışı, AbstractValue birleştirildikten sonra BB2 durum değişkeninin gerçek değerinin hala "::Other" olduğu ve durum birleştirme sonucunun değişmediği anlamına gelir. .
Dolayısıyla, bu döngüsel süreç bir kez başladığında, yani doğrulayıcılar BB2'yi ve tüm ardıl temel blok düğümlerini (bu durumda BB3) yeniden analiz etmeye devam ettikçe, süresiz olarak devam eder. Sonsuz döngü, mevcut tüm CPU döngülerini tüketerek, doğrulayıcı yeniden başlatmalarında devam eden yeni işlemleri işleyemez ve bunlara yanıt veremez hale getirir.
Doğrulama düğümleri, bu güvenlik açığından yararlanarak sonsuz bir döngüde tekerlek üzerindeki hamsterlar gibi sonsuz bir şekilde çalışır ve yeni işlemleri işleyemez. Bu nedenle, bu benzersiz saldırı türüne "hamster çarkı" saldırısı diyoruz.
"Hamster tekerleği" saldırısı, Sui doğrulayıcılarını etkili bir şekilde durma noktasına getirebilir ve bu da tüm Sui ağını çökertebilir.
Güvenlik açığının nedenini ve tetiklenme sürecini anladıktan sonra aşağıdaki Move bytecode simülasyonunu kullanarak somut bir örnek oluşturduk ve güvenlik açığını gerçek ortamda simülasyonda başarıyla tetikledik:
Bu örnek, güvenlik açığının gerçek bir ortamda dikkatlice oluşturulmuş bayt kodu aracılığıyla nasıl tetikleneceğini gösterir. Spesifik olarak, bir saldırgan, IDLeak doğrulayıcısında sonsuz bir döngüyü tetikleyerek, yalnızca yaklaşık 100 baytlık bir yük ile bir Sui düğümünün tüm CPU döngülerini tüketerek yeni işlem işlemeyi etkili bir şekilde engelleyebilir ve Sui ağında hizmet reddine neden olabilir.
Sui ağında "Hamster Wheel" saldırısı kalıcı hasar
Sui'nin hata ödül programı, güvenlik açığı düzeylerinin değerlendirilmesine ilişkin, esas olarak tüm ağın zarar görme derecesine dayalı katı düzenlemelere sahiptir. "Kritik" derecelendirmeyi karşılayan güvenlik açıkları, tüm ağı kapatmalı ve yeni işlem onaylarını etkili bir şekilde önlemeli ve sorunu çözmek için bir hard fork gerektirmelidir; (orta)” veya “yüksek riskli (yüksek)” güvenlik açıkları.
CertiK Skyfall ekibi tarafından keşfedilen "hamster tekerleği" güvenlik açığı, tüm Sui ağını kapatabilir ve yükseltme ve onarım için yeni bir sürümün resmi olarak yayınlanmasını gerektirir. Sui nihayetinde güvenlik açığını kritikliğine göre "Kritik" olarak derecelendirdi. "Hamster çarkı" saldırısının neden olduğu ciddi etkiyi daha iyi anlayabilmek için, Sui'nin arka uç sisteminin karmaşık mimarisini, özellikle de zincir üzerindeki işlemleri yayınlama veya yükseltme sürecinin tamamını anlamamız gerekiyor.
Sui'de işlem göndermek için etkileşimlere genel bakış
Başlangıçta, kullanıcı işlemleri ön uç RPC aracılığıyla gönderilir ve temel doğrulamanın ardından arka uç hizmetlere aktarılır. Sui arka uç hizmeti, gelen işlem yüklerini daha fazla doğrulamaktan sorumludur. Kullanıcının imzası başarıyla doğrulandıktan sonra, işlem bir işlem sertifikasına dönüştürülür (işlem bilgilerini ve Sui'nin imzasını içerir).
Bu işlem sertifikaları, Sui ağının işleyişinin temel bir parçasıdır ve ağdaki çeşitli doğrulama düğümleri arasında dağıtılabilir. Sözleşme oluşturma/yükseltme işlemleri için, bunlar zincire yüklenmeden önce, doğrulama düğümü, bu sertifikaların sözleşme yapısının/anlamının geçerliliğini kontrol etmek ve doğrulamak için Sui doğrulayıcıyı arayacak. "Sonsuz döngü" güvenlik açığı bu kritik doğrulama aşamasında tetiklenebilir ve kullanılabilir.
Güvenlik açığı tetiklendiğinde, doğrulama sürecinin süresiz olarak kesintiye uğramasına neden olarak, sistemin yeni işlemleri gerçekleştirme yeteneğini etkili bir şekilde engelledi ve ağın tamamen kapanmasına neden oldu. Yaralanmaya hakaret eklemek için, düğüm yeniden başlatıldıktan sonra durum devam etti, bu da geleneksel hafifletme yöntemlerinin yeterli olmaktan uzak olduğu anlamına geliyordu. Güvenlik açığı tetiklendiğinde, "sürekli hasar" olacak ve tüm Sui ağı üzerinde kalıcı bir etki bırakacaktır.
Sui'nin çözümü
CertiK'ten gelen geri bildirimin ardından Sui, güvenlik açığını zamanında doğruladı ve kritik açığı gidermek için bir düzeltme yayınladı. Düzeltme, "hamster çarkı" saldırısının kritik etkisini ortadan kaldırarak durum değişiklikleri ve değişiklik sonrası bayraklar arasında tutarlılık sağlar.
Yukarıda bahsedilen tutarsızlığı ortadan kaldırmak için Sui'nin düzeltmesi, AbstractState::join işlevinde küçük ama kritik bir ince ayar içeriyor. Bu yama, AbstractValue::join çalıştırmadan önce durum birleştirme sonucunu belirleme mantığını ortadan kaldırır. Bunun yerine, önce durum birleştirme için AbstractValue::join işlevini yürütün ve son güncelleme sonucunu orijinal durum değeriyle (eski) karşılaştırarak birleştirmeyi ayarlayın. _value) Değişiklikler için bir bayrak.
Bu sayede durum birleştirme sonucu gerçek güncelleme sonucu ile tutarlı olacak ve analiz sürecinde sonsuz bir döngü oluşmayacaktır.
Sui, bu özel güvenlik açığını düzeltmenin yanı sıra, gelecekteki doğrulayıcı güvenlik açıklarının etkisini azaltmak için hafifletmeler de devreye aldı. Sui'nin hata raporundaki yanıtına göre, hafifletme, Reddetme Listesi adlı bir özelliği içeriyor.
"Ancak, doğrulayıcılar, belirli işlem sınıflarını geçici olarak reddetmelerine izin veren bir düğüm yapılandırma dosyasına sahiptir. Bu yapılandırma, sürümlerin işlenmesini ve paket yükseltmelerini geçici olarak devre dışı bırakmak için kullanılabilir. Bu hata nedeniyle, bir sürümü veya paket yükseltme tx'i imzalamadan önce Sui çalışıyor. doğrulayıcılar için, reddetme listesi doğrulayıcının çalışmasını durduracak ve kötü amaçlı tx'i bırakacaktır, ancak bu tx türlerinin geçici olarak reddedilenlerin listesine alınması %100 etkili bir hafifletmedir (ancak kod yayınlamaya veya yükseltmeye çalışan kişiler için hizmeti geçici olarak kesintiye uğratacaktır).
Bu arada, bir süredir bu TX reddetme listesi yapılandırma dosyasına sahibiz, ancak daha önce bildirilen "doğrulayıcı döngüsü" güvenlik açığınızı azaltmak için sertifikalar için benzer bir mekanizma ekledik. Bu mekanizma ile, bu saldırıya karşı daha fazla esnekliğe sahip olacağız: doğrulayıcıların kötü sertifikaları unutmasını sağlamak için (sonsuz döngüyü kırarak) sertifika reddetme listesi yapılandırmasını ve yayınlamayı/yükseltmeleri yasaklamak için TX reddetme listesi yapılandırmasını kullanacağız, böylece yeni kötü amaçlı saldırı işlemleri. Bunu düşünmemizi sağladığın için teşekkürler!
Bir doğrulayıcı, bir işlemi imzalamadan önce bayt kodu doğrulaması için sınırlı sayıda "tik"e (gazdan farklı) sahiptir ve bir işlemde verilen tüm bayt kodu bu kadar çok onayda doğrulanamazsa, doğrulayıcı işlemi imzalamayı reddederek önleyecektir. ağ üzerinde yürütülmekten. Daha önce, ölçüm yalnızca seçilen bir dizi karmaşık doğrulayıcı geçişine uygulanıyordu. Bununla mücadele etmek için, her onaylayıcının doğrulama işlemi sırasında bir doğrulayıcının gerçekleştirdiği iş üzerinde bir kısıtlamayı garanti etmek için ölçümü her doğrulayıcıya genişletiyoruz. Kimlik sızıntısı doğrulayıcısında olası bir sonsuz döngü hatasını da düzelttik. "
--Sui geliştiricilerinden hata düzeltmeleri hakkında talimatlar
Sonuç olarak, Denylist, doğrulayıcıların doğrulayıcılardaki güvenlik açıklarından yararlanmaktan geçici olarak kaçınmasına ve sürüm veya yükseltme sürecini devre dışı bırakarak bazı kötü amaçlı işlemlerin neden olduğu potansiyel zararı etkili bir şekilde önlemesine olanak tanır. Denylist'in hafifletme önlemleri yürürlüğe girdiğinde, düğümler kendi yayınlama/güncelleme sözleşmesi işlevlerinden ödün vererek çalışmaya devam edebilmelerini sağlar.
Özetle
Bu yazımızda, CertiK Skyfall ekibi tarafından keşfedilen "Hamster Wheel" saldırısının teknik detaylarını paylaşıyor, bu yeni saldırı türünün nasıl önemli güvenlik açıklarını kullanarak Sui ağının tamamen kapanmasına neden olduğunu açıklıyoruz. Ek olarak, Sui'nin bu kritik sorunu çözmek için zamanında yanıtını da dikkatlice inceledik ve güvenlik açığı düzeltmesini ve benzer güvenlik açıkları için müteakip azaltma yöntemlerini paylaştık.
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.
Sui kamu zincirinin en son güvenlik açığı "hamster tekerleği" teknik detaylarının derinlemesine analizi
Daha önce, CertiK ekibi Sui blok zincirinde bir dizi hizmet reddi güvenlik açığı keşfetti. Bu güvenlik açıkları arasında yeni ve etkisi yüksek bir güvenlik açığı öne çıkıyor. Bu güvenlik açığı, Sui ağ düğümlerinin yeni işlemleri işleyememesine neden olabilir ve bu etki, tüm ağın tamamen kapanmasına eşdeğerdir.
Daha geçen Pazartesi CertiK, bu büyük güvenlik açığını keşfettiği için SUI'den 500.000 dolarlık bir hata ödülü aldı. ABD endüstrisindeki yetkili bir medya olan CoinDesk olayı bildirdi ve ardından büyük medya da bu haberin ardından ilgili haberleri yayınladı.
Bu güvenlik açığı, canlı bir şekilde "Hamster Wheel" olarak adlandırılır: benzersiz saldırı yöntemi, şu anda bilinen saldırılardan farklıdır. Saldırganın, Sui doğrulama düğümünde sonsuz bir döngüyü tetiklemek için yalnızca yaklaşık 100 baytlık bir yük göndermesi yeterlidir. yeni işlemlere
Ek olarak, saldırının neden olduğu hasar, ağ yeniden başlatıldıktan sonra da devam edebilir ve Sui ağında otomatik olarak yayılabilir, bu da tüm düğümlerin tekerlek üzerinde sonsuz çalışan hamsterler gibi yeni işlemleri işleyemez hale gelmesine neden olur. Bu nedenle, bu benzersiz saldırı türüne "hamster çarkı" saldırısı diyoruz.
CertiK, hatayı keşfettikten sonra, Sui'nin hata ödül programı aracılığıyla bunu Sui'ye bildirdi. Sui ayrıca ilk seferde etkili bir şekilde yanıt verdi, güvenlik açığının ciddiyetini onayladı ve ana ağ başlatılmadan önce sorunu onarmak için aktif olarak ilgili önlemleri aldı. Sui, bu güvenlik açığını düzeltmenin yanı sıra, bu güvenlik açığının neden olabileceği olası hasarı azaltmak için önleyici hafifletmeler de uygulamıştır.
CertiK ekibine sorumlu açıklamalarından dolayı teşekkür etmek için Sui, CertiK ekibine 500.000 $ ödül verdi.
Bu kritik güvenlik açığının ayrıntıları aşağıda teknik düzeyde açıklanacak ve güvenlik açığının temel nedeni ve olası etkisi açıklığa kavuşturulacaktır.
Güvenlik Açığı Açıklaması
Doğrulayıcıların Sui'deki kilit rolü
Sui ve Aptos gibi Move diline dayalı blok zincirleri için, kötü niyetli yük saldırılarını önlemeye yönelik koruma mekanizması esas olarak statik doğrulama teknolojisidir. Statik doğrulama teknolojisi sayesinde Sui, sözleşme düzenlenmeden veya yükseltilmeden önce kullanıcı tarafından gönderilen yükün geçerliliğini kontrol edebilir. Doğrulayıcı, yapının ve anlambilimin doğruluğunu sağlamak için bir dizi denetleyici sağlar. Yalnızca kontrol doğrulamasını geçtikten sonra, sözleşme yürütülmek üzere Move sanal makinesine girer.
Hareket Zincirindeki Kötü Amaçlı Yük Tehditleri
Sui zinciri, orijinal Move sanal makinesinin üzerinde yeni bir dizi depolama modeli ve arabirim sağlar, böylece Sui, Move sanal makinesinin özelleştirilmiş bir sürümüne sahip olur. Yeni depolama ilkellerini desteklemek için Sui ayrıca, nesne güvenliği ve küresel depolama erişimi işlevleri gibi güvenilmeyen yüklerin güvenlik doğrulaması için bir dizi ek ve özelleştirilmiş denetim yöntemi sunar. Bu özel kontroller, Sui'nin benzersiz özelliklerine uygundur, bu nedenle bu özel kontrollere Sui doğrulayıcıları diyoruz.
Sui'nin yükleri kontrol etme sırası
Yukarıdaki şekilde gösterildiği gibi, doğrulayıcıdaki kontrollerin çoğu CompiledModule'a karşı yapısal güvenlik doğrulaması gerçekleştirir (kullanıcı tarafından sağlanan sözleşme yükünün yürütülmesini temsil eder). Örneğin, çalışma zamanı yükünde yinelenen giriş olmadığından emin olmak için "Yinelenen Denetleyici"yi kullanın; çalışma zamanı yükündeki her bir alanın uzunluğunun izin verilen maksimum giriş sınırı içinde olduğundan emin olmak için "Sınır Denetleyicisi"ni kullanın.
Yapısal kontrollere ek olarak, doğrulayıcının statik kontrolleri, anlamsal düzeyde güvenilmeyen yüklerin sağlamlığını sağlamak için hala daha karmaşık analiz yöntemleri gerektirir.
Move'un Soyut Yorumlayıcısını Anlamak: Doğrusal ve Yinelemeli Analiz
Move tarafından sağlanan soyut yorumlayıcı, soyut yorumlama yoluyla bayt kodu üzerinde karmaşık güvenlik analizi gerçekleştirmek için özel olarak tasarlanmış bir çerçevedir. Bu mekanizma, doğrulama sürecini daha ayrıntılı ve doğru hale getirir ve her doğrulayıcının, analiz için benzersiz soyut durumunu tanımlamasına izin verilir.
Başlangıçta, soyut yorumlayıcı derlenmiş modüllerden bir kontrol akış grafiği (CFG) oluşturur. Bu CFG'lerdeki her temel blok, bir dizi durumu, bir "sipariş öncesi durumu" ve bir "sipariş sonrası durumu" korur. "Ön sipariş durumu", temel bloğun yürütülmesinden önceki program durumunun bir anlık görüntüsünü sağlarken, "sipariş sonrası durumu", temel bloğun yürütülmesinden sonraki program durumunun bir açıklamasını sağlar.
Soyut yorumlayıcı, kontrol akış grafiğinde bir geri atlama (veya döngü) ile karşılaşmadığında, basit bir doğrusal yürütme ilkesini izler: her temel blok sırayla analiz edilir ve önceki komut, her komutun semantiğine göre hesaplanır. sıralı durum ve ardışık durum. Sonuç, bir programın yürütülmesi sırasında her bir temel bloğun durumunun doğru bir anlık görüntüsüdür ve programın güvenlik özelliklerinin doğrulanmasına yardımcı olur.
Move soyut yorumlayıcısının iş akışı
Ancak, kontrol akışında döngüler olduğunda süreç daha karmaşık hale gelir. Bir döngünün görünümü, kontrol akış grafiğinin bir geri atlama kenarı içerdiği anlamına gelir. Geri atlama kenarının kaynağı, mevcut temel bloğun sonraki durumuna ve atlamanın hedef temel bloğuna (döngü başı) karşılık gelir. Bu nedenle, soyut yorumlayıcının geri atlamayla ilgili iki temel bloğun durumlarını dikkatli bir şekilde birleştirmesi gerekir.
Birleştirilmiş durumun loop head temel bloğunun mevcut ön sipariş durumundan farklı olduğu tespit edilirse, abstract yorumlayıcı loop head temel bloğunun durumunu günceller ve analizi bu temel bloktan başlayarak yeniden başlatır. Bu yinelemeli analiz süreci, döngü ön durumu stabilize olana kadar devam edecektir. Başka bir deyişle, bu işlem, döngü başı temel bloğunun ön sipariş durumu artık yinelemeler arasında değişmeyene kadar tekrarlanır. Sabit bir noktaya ulaşmak, döngü analizinin tamamlandığını gösterir.
Sui IDLeak Doğrulayıcı: Özelleştirilmiş Soyut Yorumlama Analizi
Orijinal Move tasarımından farklı olarak, Sui'nin blockchain platformu, benzersiz bir "hedef" merkezli küresel depolama modeli sunar. Bu modelin dikkate değer bir özelliği şudur: anahtar özelliğine sahip (zincirde bir dizin olarak depolanan) herhangi bir veri yapısının, yapının ilk alanı olarak kimlik tipine sahip olması gerekir. Kimlik alanı sabittir ve her nesnenin global olarak benzersiz bir kimliği olması gerektiğinden diğer nesnelere aktarılamaz. Bu özellikleri sağlamak için Sui, soyut yorumlayıcının üzerine bir dizi özel analiz mantığı oluşturdu.
id_leak_verifier olarak da bilinen IDLeak doğrulayıcı, analiz için soyut yorumlayıcı ile birlikte çalışır. AbstractState adlı kendi benzersiz AbstractDomain'ine sahiptir. Her AbstractState, birden çok yerel değişkene karşılık gelen AbstractValue'dan oluşur. Her yerel değişkenin durumu, bir ID değişkeninin yepyeni olup olmadığını izlemek için AbstractValue tarafından izlenir.
Yapı paketleme sürecinde, IDLeak doğrulayıcı yalnızca yepyeni bir kimliğin bir yapıya paketlenmesine izin verir. IDLeak doğrulayıcıları, yorumlama analizini soyutlayarak, mevcut hiçbir kimliğin diğer yapı nesnelerine aktarılmadığından emin olmak için yerel veri akış durumunu kapsamlı bir şekilde izleyebilir.
Sui IDLeak doğrulayıcı durumu bakım tutarsızlığı
IDLeak doğrulayıcı, AbstractState::join işlevini uygulayarak Move abstract yorumlayıcısıyla entegre edilmiştir. Bu işlev, durum yönetiminde, özellikle durum değerlerinin birleştirilmesinde ve güncellenmesinde ayrılmaz bir rol oynar.
Çalışmalarını anlamak için bu işlevleri ayrıntılı olarak inceleyin:
AbstractState::join'de işlev başka bir AbstractState'i girdi olarak alır ve onun yerel durumunu geçerli nesnenin yerel durumuyla birleştirmeye çalışır. Giriş durumundaki her yerel değişken için, o değişkenin değerini yerel durumdaki mevcut değeriyle karşılaştırır (bulunmazsa varsayılan olarak AbstractValue::Other olur). İki değer eşit değilse, son durum birleştirme sonucunun değişip değişmediğine temel olarak bir "değişti" bayrağı koyacak ve AbstractValue::join'i çağırarak yerel durumdaki yerel değişken değerini güncelleyecektir.
AbstractValue::join'de işlev, değerini başka bir AbstractValue ile karşılaştırır. Eşitlerse, girilen değeri döndürür. Eşit değilse, AbstractValue::Other döndürür.
Ancak bu durum bakım mantığı, gizli bir tutarsızlık sorunu içermektedir. AbstractState::join, yeni ve eski değerler arasındaki farka bağlı olarak birleştirilmiş durumun değiştiğini (JoinResult::Changed) belirten bir sonuç döndürse de, birleştirilmiş güncellenmiş durum değeri yine de değişmeden kalabilir.
Bu tutarsızlık sorunu, işlemlerin sırasından kaynaklanır: AbstractState::join'de durumu değiştirme kararı, durum güncellemesinden (AbstractValue::join) önce verilir ve bu karar, gerçek durum güncelleme sonucunu yansıtmaz.
Ayrıca, AbstractValue::join'de, AbstractValue::Other birleştirmenin sonucunda belirleyici bir rol oynar. Örneğin, eski değer AbstractValue::Other ve yeni değer AbstractValue::Fresh ise, güncellenen durum değeri yine AbstractValue::Other olur, eski ve yeni değerler farklı olsa bile durumun kendisi değişmez güncellemeden sonra.
Örnek: Durum Bilgili Bağlantıların Tutarsızlığı
Bu bir tutarsızlık ortaya çıkarır: temel bir bloğun durumunun birleştirilmesinin sonucunun "değişmiş" olduğu yargısına varılır, ancak birleştirilmiş durum değerinin kendisi değişmemiştir. Soyut yorum analizi sürecinde bu tür tutarsızlıklar ciddi sonuçlar doğurabilir. Kontrol akış grafiğinde (CFG) bir döngü oluştuğunda soyut bir yorumlayıcının davranışını gözden geçiriyoruz:
Bir döngü ile karşılaşıldığında, soyut yorumlayıcı geri atlama hedefi temel bloğunun ve mevcut temel bloğun durumunu birleştirmek için yinelemeli bir analiz yöntemi kullanır. Birleştirilmiş durum değişirse, soyut yorumlayıcı atlama hedefinden başlayarak yeniden analiz eder.
Bununla birlikte, soyut yorumlama analizinin birleştirme işlemi, durum birleştirme sonucunu yanlışlıkla "değişim" olarak işaretlerse, aslında durumun iç değişkeninin değeri değişmediğinde, sonsuz yeniden analize yol açacak ve sonuçta bir sonsuz döngü.
Tutarsızlıklardan daha fazla yararlanma, Sui IDLeak doğrulayıcıda sonsuz bir döngüyü tetikler
Bu tutarsızlığı kullanan bir saldırgan, IDLeak doğrulayıcılarını kandırarak sonsuz bir döngüye sokan kötü amaçlı bir kontrol akış grafiği oluşturabilir. Dikkatlice oluşturulmuş bu kontrol akış grafiği üç temel bloktan oluşur: BB1 ve BB2, BB3. Bir döngü oluşturmak için kasıtlı olarak BB3'ten BB2'ye bir geri atlama kenarı getirdiğimizi belirtmekte fayda var.
Kötü amaçlı CFG+ durumu, IDLeak doğrulayıcıda dahili bir sonsuz döngüye yol açabilir
Süreç, belirli bir yerel değişkenin AbstractValue değerinin ::Other olarak ayarlandığı BB2 ile başlar. BB2 çalıştırıldıktan sonra akış, aynı değişkenin ::Fresh olarak ayarlandığı BB3'e aktarılır. BB3'ün sonunda, BB2'ye atlayan bir geri atlama kenarı vardır.
Söz konusu tutarsızlıklar, bu örneğin soyut yorumlanmasında kilit rol oynamaktadır. Geri atlama kenarı işlendiğinde, soyut yorumlayıcı BB3'ün sipariş sonrası durumunu ("::Fresh" değişkeni ile) BB2'nin ön sipariş durumu ("::Other" değişkeni ile) ile bağlamaya çalışır. AbstractState::join işlevi, eski ve yeni değerler arasındaki farkı fark eder ve BB2'nin yeniden analiz edilmesi gerektiğini belirtmek için "değiştir" bayrağını ayarlar.
Ancak, AbstractValue::join içindeki "::Other" öğesinin baskın davranışı, AbstractValue birleştirildikten sonra BB2 durum değişkeninin gerçek değerinin hala "::Other" olduğu ve durum birleştirme sonucunun değişmediği anlamına gelir. .
Dolayısıyla, bu döngüsel süreç bir kez başladığında, yani doğrulayıcılar BB2'yi ve tüm ardıl temel blok düğümlerini (bu durumda BB3) yeniden analiz etmeye devam ettikçe, süresiz olarak devam eder. Sonsuz döngü, mevcut tüm CPU döngülerini tüketerek, doğrulayıcı yeniden başlatmalarında devam eden yeni işlemleri işleyemez ve bunlara yanıt veremez hale getirir.
Doğrulama düğümleri, bu güvenlik açığından yararlanarak sonsuz bir döngüde tekerlek üzerindeki hamsterlar gibi sonsuz bir şekilde çalışır ve yeni işlemleri işleyemez. Bu nedenle, bu benzersiz saldırı türüne "hamster çarkı" saldırısı diyoruz.
"Hamster tekerleği" saldırısı, Sui doğrulayıcılarını etkili bir şekilde durma noktasına getirebilir ve bu da tüm Sui ağını çökertebilir.
Güvenlik açığının nedenini ve tetiklenme sürecini anladıktan sonra aşağıdaki Move bytecode simülasyonunu kullanarak somut bir örnek oluşturduk ve güvenlik açığını gerçek ortamda simülasyonda başarıyla tetikledik:
Bu örnek, güvenlik açığının gerçek bir ortamda dikkatlice oluşturulmuş bayt kodu aracılığıyla nasıl tetikleneceğini gösterir. Spesifik olarak, bir saldırgan, IDLeak doğrulayıcısında sonsuz bir döngüyü tetikleyerek, yalnızca yaklaşık 100 baytlık bir yük ile bir Sui düğümünün tüm CPU döngülerini tüketerek yeni işlem işlemeyi etkili bir şekilde engelleyebilir ve Sui ağında hizmet reddine neden olabilir.
Sui ağında "Hamster Wheel" saldırısı kalıcı hasar
Sui'nin hata ödül programı, güvenlik açığı düzeylerinin değerlendirilmesine ilişkin, esas olarak tüm ağın zarar görme derecesine dayalı katı düzenlemelere sahiptir. "Kritik" derecelendirmeyi karşılayan güvenlik açıkları, tüm ağı kapatmalı ve yeni işlem onaylarını etkili bir şekilde önlemeli ve sorunu çözmek için bir hard fork gerektirmelidir; (orta)” veya “yüksek riskli (yüksek)” güvenlik açıkları.
CertiK Skyfall ekibi tarafından keşfedilen "hamster tekerleği" güvenlik açığı, tüm Sui ağını kapatabilir ve yükseltme ve onarım için yeni bir sürümün resmi olarak yayınlanmasını gerektirir. Sui nihayetinde güvenlik açığını kritikliğine göre "Kritik" olarak derecelendirdi. "Hamster çarkı" saldırısının neden olduğu ciddi etkiyi daha iyi anlayabilmek için, Sui'nin arka uç sisteminin karmaşık mimarisini, özellikle de zincir üzerindeki işlemleri yayınlama veya yükseltme sürecinin tamamını anlamamız gerekiyor.
Sui'de işlem göndermek için etkileşimlere genel bakış
Başlangıçta, kullanıcı işlemleri ön uç RPC aracılığıyla gönderilir ve temel doğrulamanın ardından arka uç hizmetlere aktarılır. Sui arka uç hizmeti, gelen işlem yüklerini daha fazla doğrulamaktan sorumludur. Kullanıcının imzası başarıyla doğrulandıktan sonra, işlem bir işlem sertifikasına dönüştürülür (işlem bilgilerini ve Sui'nin imzasını içerir).
Bu işlem sertifikaları, Sui ağının işleyişinin temel bir parçasıdır ve ağdaki çeşitli doğrulama düğümleri arasında dağıtılabilir. Sözleşme oluşturma/yükseltme işlemleri için, bunlar zincire yüklenmeden önce, doğrulama düğümü, bu sertifikaların sözleşme yapısının/anlamının geçerliliğini kontrol etmek ve doğrulamak için Sui doğrulayıcıyı arayacak. "Sonsuz döngü" güvenlik açığı bu kritik doğrulama aşamasında tetiklenebilir ve kullanılabilir.
Güvenlik açığı tetiklendiğinde, doğrulama sürecinin süresiz olarak kesintiye uğramasına neden olarak, sistemin yeni işlemleri gerçekleştirme yeteneğini etkili bir şekilde engelledi ve ağın tamamen kapanmasına neden oldu. Yaralanmaya hakaret eklemek için, düğüm yeniden başlatıldıktan sonra durum devam etti, bu da geleneksel hafifletme yöntemlerinin yeterli olmaktan uzak olduğu anlamına geliyordu. Güvenlik açığı tetiklendiğinde, "sürekli hasar" olacak ve tüm Sui ağı üzerinde kalıcı bir etki bırakacaktır.
Sui'nin çözümü
CertiK'ten gelen geri bildirimin ardından Sui, güvenlik açığını zamanında doğruladı ve kritik açığı gidermek için bir düzeltme yayınladı. Düzeltme, "hamster çarkı" saldırısının kritik etkisini ortadan kaldırarak durum değişiklikleri ve değişiklik sonrası bayraklar arasında tutarlılık sağlar.
Yukarıda bahsedilen tutarsızlığı ortadan kaldırmak için Sui'nin düzeltmesi, AbstractState::join işlevinde küçük ama kritik bir ince ayar içeriyor. Bu yama, AbstractValue::join çalıştırmadan önce durum birleştirme sonucunu belirleme mantığını ortadan kaldırır. Bunun yerine, önce durum birleştirme için AbstractValue::join işlevini yürütün ve son güncelleme sonucunu orijinal durum değeriyle (eski) karşılaştırarak birleştirmeyi ayarlayın. _value) Değişiklikler için bir bayrak.
Bu sayede durum birleştirme sonucu gerçek güncelleme sonucu ile tutarlı olacak ve analiz sürecinde sonsuz bir döngü oluşmayacaktır.
Sui, bu özel güvenlik açığını düzeltmenin yanı sıra, gelecekteki doğrulayıcı güvenlik açıklarının etkisini azaltmak için hafifletmeler de devreye aldı. Sui'nin hata raporundaki yanıtına göre, hafifletme, Reddetme Listesi adlı bir özelliği içeriyor.
"Ancak, doğrulayıcılar, belirli işlem sınıflarını geçici olarak reddetmelerine izin veren bir düğüm yapılandırma dosyasına sahiptir. Bu yapılandırma, sürümlerin işlenmesini ve paket yükseltmelerini geçici olarak devre dışı bırakmak için kullanılabilir. Bu hata nedeniyle, bir sürümü veya paket yükseltme tx'i imzalamadan önce Sui çalışıyor. doğrulayıcılar için, reddetme listesi doğrulayıcının çalışmasını durduracak ve kötü amaçlı tx'i bırakacaktır, ancak bu tx türlerinin geçici olarak reddedilenlerin listesine alınması %100 etkili bir hafifletmedir (ancak kod yayınlamaya veya yükseltmeye çalışan kişiler için hizmeti geçici olarak kesintiye uğratacaktır).
Bu arada, bir süredir bu TX reddetme listesi yapılandırma dosyasına sahibiz, ancak daha önce bildirilen "doğrulayıcı döngüsü" güvenlik açığınızı azaltmak için sertifikalar için benzer bir mekanizma ekledik. Bu mekanizma ile, bu saldırıya karşı daha fazla esnekliğe sahip olacağız: doğrulayıcıların kötü sertifikaları unutmasını sağlamak için (sonsuz döngüyü kırarak) sertifika reddetme listesi yapılandırmasını ve yayınlamayı/yükseltmeleri yasaklamak için TX reddetme listesi yapılandırmasını kullanacağız, böylece yeni kötü amaçlı saldırı işlemleri. Bunu düşünmemizi sağladığın için teşekkürler!
Bir doğrulayıcı, bir işlemi imzalamadan önce bayt kodu doğrulaması için sınırlı sayıda "tik"e (gazdan farklı) sahiptir ve bir işlemde verilen tüm bayt kodu bu kadar çok onayda doğrulanamazsa, doğrulayıcı işlemi imzalamayı reddederek önleyecektir. ağ üzerinde yürütülmekten. Daha önce, ölçüm yalnızca seçilen bir dizi karmaşık doğrulayıcı geçişine uygulanıyordu. Bununla mücadele etmek için, her onaylayıcının doğrulama işlemi sırasında bir doğrulayıcının gerçekleştirdiği iş üzerinde bir kısıtlamayı garanti etmek için ölçümü her doğrulayıcıya genişletiyoruz. Kimlik sızıntısı doğrulayıcısında olası bir sonsuz döngü hatasını da düzelttik. "
--Sui geliştiricilerinden hata düzeltmeleri hakkında talimatlar
Sonuç olarak, Denylist, doğrulayıcıların doğrulayıcılardaki güvenlik açıklarından yararlanmaktan geçici olarak kaçınmasına ve sürüm veya yükseltme sürecini devre dışı bırakarak bazı kötü amaçlı işlemlerin neden olduğu potansiyel zararı etkili bir şekilde önlemesine olanak tanır. Denylist'in hafifletme önlemleri yürürlüğe girdiğinde, düğümler kendi yayınlama/güncelleme sözleşmesi işlevlerinden ödün vererek çalışmaya devam edebilmelerini sağlar.
Özetle
Bu yazımızda, CertiK Skyfall ekibi tarafından keşfedilen "Hamster Wheel" saldırısının teknik detaylarını paylaşıyor, bu yeni saldırı türünün nasıl önemli güvenlik açıklarını kullanarak Sui ağının tamamen kapanmasına neden olduğunu açıklıyoruz. Ek olarak, Sui'nin bu kritik sorunu çözmek için zamanında yanıtını da dikkatlice inceledik ve güvenlik açığı düzeltmesini ve benzer güvenlik açıkları için müteakip azaltma yöntemlerini paylaştık.