Blok zinciri güvenlik sorunlarına yanıt olarak Chengdu Lianan Teknoloji Ekibi, programcıların sorunları oluşmadan önlemek için daha güvenli ve sağlam sözleşmeler yazmalarına yardımcı olmayı umarak her hafta bir dizi akıllı sözleşme güvenlik açıkları analizi yayınlayacak.
Kuralları uygulayın ve ocağı utandırın. Han YuÖzet
Geçen sefer bahsedildiği gibi,Blockchain oyunları pitoresktir,
Güvenlik koruması planlanmamıştır,
Batan güneşin bir parçası batıda asılı.
Bir önceki sayıdaki blockchain oyununun güvenlik açıklarının özetinde ve analizinde, mevcut oyun sözleşmesindeki sorunları, önceki sorunların güvenlik açıklarının seri analizi ile ilişkilendirdik ve oyun sözleşmesinin güvenlik açıklarının büyük bir kısmının önceki token sözleşmelerinde tekrarlandığını gördük. Büyük hatalar. Parlak bir paltoyla sarılı oyun sözleşmesi daha fazla dikkat çekerken, daha uzun vadeli bir gelişme sağlamak için güvenlik konularına da daha fazla dikkat etmesi gerekiyor.
Bu sorunun konusu
Yedinci kez, yerel değişken depolama gafil avlandı ve kazara değişken kapsam bayrağı değiştirdi.
Son günlerde haberlerde yer alan "koltuk zorbalığı" olayı toplumda güçlü bir tepki uyandırdı. Bazı kişilerin zor durumda olması durumunda arabada oturması gereken bir yolculuk ortamı, bileti alan yolcuların koltuklarının olmamasına ve vagonun olmasına neden oldu. Düzen kaotik.
Chengdu Lianan Technology'nin arkadaşları ofiste olay hakkındaki görüşlerini dile getirdiler, coşkuyla tartıştılar ve bu mantıksız davranışa oybirliğiyle karşı çıktılar. Ancak tartışma sonrası check-in eksikliğinden kaynaklanan kafa karışıklığı sorununu da düşündüm. Aslında akıllı kontrat zafiyet probleminde de benzer bir durum var.
Temel bilgi Herkesin bildiği gibi, depolama söz konusu olduğunda, bir değişken depolandığında bir depolama konumu tahsis edilir. Bu pozisyon, sürüş sırasındaki koltuk olarak anlaşılabilir.
Akıllı sözleşme dili Solidity'de iki farklı kavram vardır: Depolama ve Bellek. Depolama değişkenleri, blok zincirinde kalıcı olarak depolanan değişkenleri ifade eder. Bellek değişkenleri geçicidir, bu değişkenler harici aramanın bitiminden sonra kaldırılacaktır.
Bununla birlikte, Solidity şu anda Storage'da varsayılan olarak işlevlerde yerel değişkenler olarak diziler ve yapılar gibi karmaşık veri türlerini depolar.
Ek olarak, Solidity için, durum değişkenlerinin saklama sırası genellikle görünüm sırasına göre düzenlenir. Bu durum değişkenlerinin konumları, koltuklarına eşdeğerdir.
Sorun ne
Storage ile ilgili bir referansın tanımlanmasına izin vermesi bakımından Solidity ile geleneksel diller arasında bariz bir fark vardır. Başlatılmamış harici işaretçi (referans) varsayılan olarak başlangıç adresini gösterecektir.Eğer başlatılmamışsa ve değer doğrudan atanmışsa, adres 0'daki durum değişkeninin üzerine yazılacaktır.
Örnek olarak treni ele alalım: İlk yolcu grubu trene bindiğinde, ilgili koltuk numarası ayarlanmadığı için herkes biniş sırasına göre treni önden arkaya aldı. Yeni hedefe vardıklarında, ikinci yolcu grubuna otobüse bindiklerinde bir koltuk numarası verilmemişti. Kalan koltukları alıp önden arkaya oturmak istediler. İlk yolcu grubu başlangıçta koltuklarında oturuyordu, ancak şimdi "koltuk zorbası" tarafından uzaklaştırıldılar. Oturacak yer yok.
Sözleşmedeki "Sit Ba" örnekleri
Gelişimdeki eksik el
Chengdu Lian'an Technology'nin teknik ekibi, önceki güvenlik açığı vaka kitabını açtı ve yukarıdakilerden bu güvenlik açığının, bir güvenlik şirketi tarafından keşfedilen BancorLender ile ilgili bir işaretçi sorunu gibi saldırgan tarafından kötüye kullanılan geliştiricinin ihmalinin bıraktığı bir güvenlik açığı olarak somutlaştığını keşfetti.
Şekilde gösterildiği gibi, durum değişkeni anlaşmaları başlangıçta ilk sarı kutuda bildirilir ve başlangıç konumu yuvasına 0x00 girer.
İkinci sarı kutu, offerToLend işlevinde yeni bir yerel değişken anlaşması bildirme girişimidir, ancak başlatılmamıştır, bu nedenle başlangıç konumu aralığı 0x00, yeni yerel değişken anlaşması tarafından kullanılacaktır. Daha spesifik olarak, pembe çizgiden başlayan aşağıdaki üç atama işlemi, 0x00 yuvasından 0x03 yuvasına orijinal değerlerin üzerine yazacaktır.
Son olarak, kod mantığı bozuktur ve işlev normal şekilde uygulanamaz.
Bal kabında kalın
Ayrıca önceki sayıda bahsettiğimiz oyun sözleşmesi ile iletişime geçersek, bu boşluk oyun sözleşmesinde de ortaya çıktı, ancak bir bal küpü şeklinde ortaya çıktı, daha önce de bahsettiğimiz gibi, bal küpüne kasıtlı olarak bariz bir kusur yerleştirildi. Biraz teknoloji bilgisine sahip oyuncular, bundan yararlanma fırsatı bulduklarını düşünürler ama aslında sözleşme sahibinin daha derinlere bıraktığı haksız bir kar operasyon alanı vardır. Bu nedenle, bu durumu, bu tür güvenlik açığının ikinci özel durumu olarak sınıflandırıyoruz.
Durum, OpenAddressLottery adlı bir bahis sözleşmesinden gelir.
Kodun bu kısmındaki "s" bildirilir ancak karşılık gelen başlatma işlemi yapılmaz, bu nedenle aslında sonraki atama işlemleri orijinal adresteki önemli değerin üzerine yazacaktır.
Hangi değerlerin yerini alacak? Bakalım ilk Depolama adresinde kim "oturuyor":
Sözde öngörülebilir son cevap LuckyNumber ilk pozisyonu kaplar, bu yüzden aslında tx.gasprice * 7 tarafından kapsanacak ve adres sahibi msg.sender ile değiştirilecektir, ancak iki değer aslında aynıdır .
LuckyNumberOfAddress'in sonucu modulo 8 (ikili) şeklinde hesaplandığından ve tx.gasprice * 7'nin üzerine yazıldıktan sonraki gerçek sonucu 7'den büyük olması gerektiğinden, bir oyuncunun kazanması kesinlikle imkansızdır.
Bunların arasında, bir noktaya da dikkat etmeliyiz.Kodun ilk bölümünde, zorunlu (msg.send == owner), yalnızca sözleşme sahibinin orijinal değerin üzerine yazabilen bu işlevi arayabileceği anlamına gelir, bu nedenle sözleşmenin bal kabı niyeti çok açıktır.
Nihai sonuç, çıkarımımızı da karşılamaktadır:
Sözleşmeyi oluşturan kişi tüm katılımcıların fonlarını aktardıktan sonra, kendi kendini imha etmeye başladı ve kaçtı.
Belirtilerin özeti ve onarım önerileri
Yukarıdaki özel durumların durumunu özetleyerek şunu söyleyebiliriz:
Başlatılmamış bellek yerel değişkenleri, sözleşmedeki durum değişkenlerine işaret ederek kasıtlı (yani, geliştiricilerin kasıtlı olarak onları oraya saldırmaya koymalarına) veya kasıtsız güvenlik açıklarına yol açabilir.
Hata örneklerini göstermek için Depolama'da depolanan bazı tipik değişkenleri varsayılan olarak yapı (yapı) ve dizi (Dizi) olarak böleriz.
Tipik yapı hatası örnekleri:
Girdi _name = "0x0000000000000000000000000000000000000000000000000000000000000001" (63 sıfır) olduğunda, adres herhangi bir adres olacak, kilidi açılmış değerin üzerine yazılacaktır.
Tipik Dizi hatalarına örnekler:
Elemanlar girilirken = (63 sıfır), donmuş değerin üzerine yazılır.
Hata düzeltme önerileri
Remix-ide gibi derleyiciler, başlatılmamış bellek yerel değişkenleri hakkında uyarır Geliştiriciler bu uyarıyı göz ardı edemezler.Değişkenleri bildirirken, bu bellek yerel değişkenleri kullanıma göre başlatılmalı veya geçici depolamada düzenlenmelidir. Bellekteki güvenlik açıklarından kaçının.
İyi düzen, iyi davranış Bu sorunda ortaya çıkan güvenlik açıkları, Solidity dilinin varsayılan depolama kurallarından ve başlatılmamış değişkenlere referans verme özelliğinden kaynaklanmaktadır. Geleneksel dillerde bu durum derleyicide bir hata olarak rapor edilecek ve geçilemez. Solidity'nin mevcut sürümü (0.4.24) aynı katı yasağı uygulamaz ve yalnızca derleyicide bir uyarı verir.
Bu nedenle, Chengdu Lian'an Teknoloji Ekibi, akıllı sözleşmelerin geliştirilmesini ve kullanılmasını iki açıdan bir kez daha vurgulamaktadır:
Mevcut blok zinciri, geliştirilmesi gereken olgunlaşmamış bir endüstridir.Fırsatların peşinde koşarken, sakin düşünme ve iç huzuru başarı için temel niteliklerdir.Lütfen değişkenlere pozisyon atayın ve zihniyetinizi ayarlayın. .
Pekala, bu güvenlik açığı analizi sorunu burada bitiyor, ne olacağını tahmin etmek için lütfen bir dahaki sefere bakın:
Transfer süreci karmaşıktırHer ihlale güvenle müdahale edin
Alıntı:
: Sağlamlık kusurları, sözleşme durumunu kolaylıkla kontrolden çıkarabilir
https://zhuanlan.zhihu.com/p/41412333: Bu bal küpü nasıl çalışır?
https://www.reddit.com/r/ethdev/comments/7wp363/how_does_this_honeypot_work_it_seems_like_a/: Oluşturucu kontrolden çıktı, başlatılmamış depolama işaretçisi