Bir yarış durumu güvenlik açığı nasıl birden fazla oy verebilir?


Yarış durumu güvenlik açıkları, Hackerone platformundaki raporların% 0,3’ünden daha azını oluşturur. Bununla birlikte, araştırmacılar son zamanlarda James Kettle’ın 2023’te Blackhat’ta sunduğu “devlet makinesi” araştırması sonucunda yarış durumu güvenlik açıklarını denemekle ilgileniyorlar.

Bu blog, bu araştırmayı Dünya Kimlik Yazılım Geliştirme Kitine (SDK) nasıl uyguladığımın hikayesini anlatıyor ve bir saldırganın bulut tabanlı bir uygulamada önceden ayarlanmış doğrulama sınırını atlamasını sağlayacak bir yarış koşulu belirledi. Bu kırılganlığın sömürülmesi, bir kullanıcının yapabileceği eylem sayısını kısıtlamak için dünya kimliğine dayanan bir projeyi etkileyecektir (örneğin, bir proje SDK’yı bir kullanıcının yalnızca bir oy kullanabilmesini sağlamak için kullanıyorsa, bir saldırgan 20 oy kullanma kırılganlığından yararlanabilir).

Yarış durumu nedir?

Bir yarış koşulu, yazılım davranışı kontrol edilemeyen olayların sırasına veya zamanlamasına bağlı olduğunda ortaya çıkar. Bu kusur, birden fazla işlemin veya iş parçacığının uygun senkronizasyon olmadan eşzamanlı olarak paylaşılan kaynaklara eriştiği ve değiştirdiği ve öngörülemeyen sonuçlara yol açtığı ortamlarda ortaya çıkar.

Yarış koşullarının tanıtımı genellikle eşzamanlılık (örneğin – eşzamanlı olarak işleme sırasında yeterli önlemlerin eksikliği) ve paylaşılan verilere erişim kontrollerinin uygulanmasına ilişkin yetersiz tasarım değerlendirmesine atfedilir. Ortak bir senaryo, işlemlerin atomik olmasını sağlamadan hem paylaşılan bir değişkene okuyan hem de yazan iki iş parçacığını içerir. Uygun kilitleme mekanizmaları veya atom operasyonları olmadan, paylaşılan kaynağın son durumu yürütme sırasına bağlı hale gelir, bu da tutarsızlıklara yol açar ve sistemin bütünlüğünü ve güvenliğini tehlikeye atar.

Bu güvenlik açıkları, yetkisiz eylemlere, veri bozulmasına ve hatta sistem çökmelerine neden olmak için kullanılabilir. En kötü senaryolarda, saldırganlar güvenlik mekanizmalarını atlamak, hassas verilere yetkisiz erişim elde etmek veya rasgele kod yürütmek için yarış koşullarından yararlanabilir ve organizasyonel güvenlik ve veri bütünlüğüne önemli riskler oluşturabilirler. Yarış koşullarının ele alınması, tasarım ve test için titiz bir yaklaşım gerektirir, eşzamanlılık kontrolünü vurgulamak ve paylaşılan kaynaklar üzerindeki kritik işlemlerin atomik olarak gerçekleştirilmesini sağlar.

Worldcoin’de arka plan

2019’da blockchain sahnesini vurduğundan beri Worldcoin ile ilgileniyorum. Worldcoin, a) benzersiz insanları biyometrik olarak doğrulamak ve b) evrensel temel gelir (UBI) için bir dağıtım mekanizması için bir temel oluşturmayı amaçlayan bir kripto para birimi projesidir. Çoğu insan muhtemelen sadece içine bakarsanız kripto para birimi verecek bir küre oluşturan şirket olarak bilir.

İnsanların göz kürelerini taraması ve merkezi bir varlığa biyometrik veri verme fikri kesinlikle tartışmalıdır, ancak Worldcoin’in yaklaşımı, internetin bugün karşılaştığı en zor problemlerden biri olan Sybil direnci sunar (Sybil saldırısının bir çoklu yarattığı bir güvenlik tehdididir. Bir ağ üzerinde orantısız olarak büyük bir etki kazanmak için sahte kimlikler.) Herkesin yüzlerce yapay zeka destekli bot yaratabileceği bir dünyaya yaklaştıkça, Sybil direnci çözmek için kritik bir sorun haline gelecektir (Sam Altman’ın Worldcoin) ve Worldcoin, bu konu üzerinde anlamlı bir şekilde çalışan tek projelerden biridir.

Worldcoin’e bakmaya başlamadan önce, bunun tamamen bir kripto para dağıtım mekanizması olduğunu varsaymıştım, ancak daha derine indiğimde biyometrik kimlik doğrulama etrafında bir yazılım geliştirme kiti (SDK) inşa ettiklerini gördüm. Bu, diğer uygulamaların bir kullanıcı = bir insan olduğunu doğrulamak için WorldCoin SDK’yı kullanabileceği anlamına gelir. Bu çok büyük bir anlaşma gibi gelmeyebilir, ancak oylama, hava geçirme ve bot koruması gibi kullanım durumlarına sahip uygulamalar için bir oyun değiştiricidir. Örneğin, benzersiz bir insanın belirli bir sorunda sadece bir kez oy kullanabilmesi için bir uygulama yapmak istersem, tüm kullanıcılarımı esasen bir kimlik sağlayıcısı olarak hareket edecek WorldCoin SDK aracılığıyla kimlik doğrulamasını sağlayabilirim ) ve öngördüğüm sınırlama için uygulayıcı (yani bir kez oy kullanın).

Bir kripto para birimi olarak Worldcoin, (EVM uyumlu) blok zincirleri ve herhangi bir blockchain’e dokunmayı gerektirmeyen bulut tabanlı bir sürüm için çalışan bir SDK uygulamasına sahiptir. Her iki versiyon da, tanıdık değilseniz okumaya değer işlemlerin kurcalamaya dayanıklı bir günlüğü oluşturmak için gerçekten harika bir Merkle Tree tabanlı kriptografi kullanır.

Worldcoin üzerinde test

Geliştiricilerin WorldCoin iş akışını test etmelerine yardımcı olmak için Worldcoin, işlemleri ve doğrulamaları test etmek için bir simülatör sunar (buradaki bağlantı). Bir geliştirme hesabı oluşturursam, “eylemler” (örneğin “bu teklifi oy”) oluşturabilir ve maksimum sayıda “doğrulama” belirleyebilirim (örneğin “bir insan bir teklife oy verebilir). Tüm bunların nasıl çalıştığına dair kaputun altına bakmak için, testimin çoğunu bu simülatörde yaptım ve istekleri geğirme süitinden çalıştırdım.

Yarış koşulu kodu

“Kimlik Bilgisi Türü” (“Orb” veya “Cihaz” veya “Zincir” gibi şeyleri değiştirebilirken, isteklerin hepsi çok benzerdi. Akışı ve imzaları kırmaya çalışmak için saatler geçirdim, ancak ilginç bir şey elde etmede başarısız oldum, bu yüzden birkaç hafta vazgeçtim.

Def Con 31’e doğru ilerleyin ve James Kettle, devlet makinesini parçalama konusundaki araştırmasını sundu. Blogunu okur okur okur, bunun Worldcoin’de deneyebileceğim bir şey olduğunu fark ettim. Burp Tekrarlayıcı sekmesini açtım, “Paralel Gönder” özelliğine sahip güdümlü güncellemeyi indirdiğimden emin oldum ve daha önce tarif ettiğim Worldcoin akışında bir şans verdim.

Özellikle, adımlar:

  1. İsteği yakalayın ve tekrarlayıcıya gönderin
  2. Talep için yeni bir “sekme” yapın
  3. Yeni “sekmede” orijinal isteği ~ 20 kez çoğaltın
  4. Hepsini “paralel” olarak gönderin

Yarış koşulu kodu

İsteklere baktığımda işe yaradı! “Benzersiz insan” ın sadece iki doğrulamasını görmeliydim, 20 gördüm!

Yarış Durumu Kullanıcıları

Bunu yalnızca uygulamanın “bulut” sürümünde test ettim, çünkü “blockchain” versiyonunda çalışmayacağından emindim, çünkü bu bir işlemin tamamlanmasını gerektirecek.

Worldcoin projesi açık kaynak olduğundan, kodu inceledim ve “ CanVerifyforaction ” Util’de kırmızı bir bayrak gördüm:

Dışa Aktar Canverifyforaction = (
Nuliferlar:
| Dizi <{
nullifier_hash: String;
}>
| tanımsız,
max_verifications_per_person: numara
): boolean => {
if (! Nullifiers? .Length) {
// kişi daha önce doğrulanmadı, her zaman ilk kez doğrulayabilir
true döndür;
} else if (max_verifications_per_person <= 0) {
// `0` veya` -1 ‘sınırsız doğrulamalar anlamına gelir
true döndür;
}

// başka, yalnızca maksimum doğrulama sayısının karşılanmadıysa doğrulanabilir
return (nullifericers? .Length ?? 0) }

Özellikle, “ nullicifier ” yolu, kod tabanının diğer kısımlarında, “kilit” olmayan bir diziye eklendiği için bir yarış koşulu için izin verilen, paralel isteklerin eşit olarak ele alınacağı anlamına gelir.

Azaltma

WorldCoin ekibi, yapay bir kilit oluşturmak için veritabanını kullanarak bunu ele aldı, böylece iki istek aynı anda gelse bile, düzgün bir şekilde ele alınacak. Bu çekme isteğinde, artık “ nulifiers ” için yeni veritabanı tablolarına sahip olduklarını görebilirsiniz ve sadece uzunluk yerine “ nulifier ” kullanım sayısına başvurmak için “ CanVerifyforaction ‘kodunu güncellediler:

Dışa Aktar Canverifyforaction = (
Nullianifier:
| {
Kullanımları: sayı;
nullifier_hash: String;
}
| tanımsız,
max_verifications_per_person: numara
): boolean => {
if (! Nullier) {
// kişi daha önce doğrulanmadı, her zaman ilk kez doğrulayabilir
true döndür;
} else if (max_verifications_per_person <= 0) {
@@ -146,7 +147,7 @@ Export Const CanVerifyforaction = (
}

// başka, yalnızca maksimum doğrulama sayısının karşılanmadıysa doğrulanabilir
nullifier.uses };

İnsanlar bir “blockchain” veya “Web3” projesi düşündüklerinde, genellikle güvenlik açıklarının ağ veya akıllı sözleşme ile sınırlı olacağını varsayarlar – bu genellikle böyle değildir. Bugün, Web3 hala Web2’ye güveniyor ve bu çok çeşitli yaratıcı saldırı vektörleri açıyor. Bir JavaScript uzmanı iseniz ve Web3 projelerinde hata avını denemediyseniz, o zaman masaya para bırakıyorsunuz!

Dünya ekibine bu sorunu özenle çözdüğü ve bana hacktiviteye açıklama izni verdiği için teşekkür ediyorum.

Yarış Koşullarının ele alınması:

Yarış durumu güvenlik açıklarını önlemek veya azaltmak için, geliştiriciler ve mimarlar aşağıdakiler gibi çeşitli stratejiler kullanabilirler:

  • Paylaşılan kaynaklara erişimi yönetmek için uygun senkronizasyon tekniklerinin uygulanması.
  • Eşzamanlılık göz önünde bulundurularak sistemleri tasarlamak, paylaşılan kaynaklar üzerindeki işlemlerin atomik olmasını sağlar.
  • Eşzamanlılığı güvenli bir şekilde işlemek için tasarlanmış yüksek seviyeli soyutlamalar ve programlama yapıları kullanma.
  • Potansiyel yarış koşullarını ortaya çıkarmak ve düzeltmek için stres testleri ve eşzamanlılık testleri dahil kapsamlı testlerin yapılması.



Source link