Akıllı sözleşmelerdeki "Zhaba" - bellek yerel değişkenleri başlatılmadı

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:

  • Sözleşme geliştirme şartnamelerine uygunluk ve güvenlik korumasının titizlikle hazırlanması, defalarca bahsettiğimiz sözleşme geliştirme ruhudur.Yalnızca, bu gelişen teknoloji olan blockchain'i uygularken, şartnamelere uyarak ve kapsamlı planlama yaparak, gelişen teknolojilerin istikrarlı bir şekilde geliştirilmesine daha iyi yardımcı olabiliriz.
  • Halkı kasıtlı olarak aldatan spekülatif sözleşmeler için, kusurlar keşfedildiğinde, sözleşme yaratıcısının bal küpü taktiklerine dikkat etmeli ve aldatılmamak için bunlara dikkat etmeliyiz.
  • 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ır

    Her 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

    Shen Yue çok değişti! Saniyeler içinde peruk takıp siyahlaşan kız uzun ve dikti.
    önceki
    Tang Yixin nihayet saç kesimini değiştirdi. Büyükannesinin yeşil ve hava patlamaları yaşını düşürdü ve o biraz tanınmıyor.
    Sonraki
    Wilber Pan moda haftasında yeni zirveler belirledi. Uçağın burnu ve güneş gözlükleri mükemmel bir uyum ve kontrast kaplama daha da havalı
    Shen Congwen: "Batı Hunan'da Çin Yeni Yılı Anıları"Ünlü Çin Yeni Yılı Anlatımı (Okuma: Liu Jing)
    War of Warcraft, Bitcoin tarihin en büyük oyunu
    Akan Çin, dünyanın yeni canlılığı
    Bu üç önemli noktaya hakim olun, güvenilir küçük bir peri olun ve peri ruhunu yakalayın
    Pekin'de tanışın 2019Ben bahçıvan Dai Silan: Anavatanda Olimpiyat krizantem açsın
    48 yaşındaki Hu Bing, Xiao Xianrou'yu öldürmek için podyumda yürüyor! İki stil grubu isteğe göre değiştirilebilir ve erkek stili aynı kalır
    Su kalitesi izleme endüstrisi hakkında derinlemesine araştırma raporu
    Her yıl aynı anda, bitmek bilmeyen bin yıl
    Yi Nengjing'in 50 yaşında değişen stili? Yeni kapak içbükey ve retro, havalı ve yakışıklı bir patrona, gerçekten ölümsüz bir yüze dönüşüyor
    Saksafon Köyü
    Liti Chungun kızı 21. doğum gününde stilisteydi. Karamel ceket İngiliz tarzıydı ve tüm güzel kıyafetler ona verildi.
    To Top