Derleyici, modern bilgisayar sistemlerinin temel bileşenlerinden biridir ve işlevi, yüksek seviyeli programlama dili kaynak kodunu bilgisayarın çalıştırabileceği talimat koduna dönüştürmektir. Geliştiriciler ve güvenlik uzmanları genellikle uygulama kodunun güvenliğine odaklansalar da, derleyici kendisi bir bilgisayar programı olarak güvenlik açıklarına sahip olabilir ve bazı durumlarda ciddi güvenlik riskleri doğurabilir.
Örneğin, bir tarayıcı JavaScript kodunu derleyip çalıştırırken, analiz motorundaki bir güvenlik açığı nedeniyle uzaktan kod yürütme gerçekleşebilir ve bu da saldırganların mağdurun tarayıcısı veya hatta işletim sistemi üzerinde kontrol elde etmesine neden olabilir. Ayrıca, araştırmalar C++ derleyicilerindeki hataların da uzaktan kod yürütme gibi ciddi sonuçlara yol açabileceğini göstermektedir.
Solidity derleyicisinde de güvenlik açıkları bulunmaktadır. Geliştirme ekibinin güvenlik uyarılarına göre, birden fazla sürümde Solidity derleyicisinde güvenlik sorunları tespit edilmiştir.
Solidity derleyicisinin görevi, akıllı sözleşme kodunu Ethereum Sanal Makinesi (EVM) talimat koduna dönüştürmektir. Solidity derleyici açıklarını EVM'nin kendi açıklarından ayırmak gerekir. EVM açıkları, sanal makinenin talimatları yürütmesi sırasında oluşan güvenlik sorunlarıdır ve tüm Ethereum ağını etkileyebilir. Öte yandan, Solidity derleyici açıkları, Solidity'nin EVM koduna dönüştürülmesi sırasında meydana gelen sorunlardır; bunlar doğrudan Ethereum ağını etkilemez, ancak üretilen EVM kodunun geliştiricinin beklediği ile uyuşmamasına yol açabilir.
Akıllı sözleşmeler genellikle kullanıcı kripto para varlıklarını içerdiğinden, derleyici kaynaklı herhangi bir hata ciddi sonuçlara yol açabilir. Sözleşme kaynak kodunu denetleyerek, derleyici hatalarını tespit etmek zordur; belirli bir sürüm ve kod modeli ile analiz yapılması gerekir.
Aşağıda birkaç gerçek vaka ile, Solidity derleyici açıklarının belirli biçimlerini, nedenlerini ve zararlarını göstermektedir.
SOL-2016-9 YüksekDüzenByteTemizlemeDeposu
Bu güvenlik açığı daha eski Solidity derleyici sürümlerinde bulunmaktadır (>=0.1.6 <0.4.4).
Aşağıdaki kodu düşünün:
katılık
contract C {
uint32 a = 0x1234;
uint32 b = 0;
function f() public {
a += 1;
}
function run() public view returns (uint) {
return b;
}
}
Değişken b değiştirilmeden, run() fonksiyonu varsayılan değer 0'ı döndürmelidir. Ancak, açık sürüm derleyicisi tarafından üretilen kodda, run() 1 döndürecektir.
Bu, EVM'nin 32 bayt boyutunda yığın öğeleri kullanmasından ve Solidity'nin uint32 gibi 32 baytın altındaki türleri desteklemesinden kaynaklanmaktadır. Derleyici, veri doğruluğunu sağlamak için yüksek bitleri temizleme işlemi yapmalıdır. Toplama taşması durumunda, derleyici yüksek bitleri düzgün bir şekilde temizleyemediği için taşan 1 bit storage'a yazılır ve b değişkenini üzer.
SOL-2022-4 InlineAssemblyMemoryYanEtkileri
Bu güvenlik açığı >=0.8.13 <0.8.15 sürümündeki derleyicilerde bulunmaktadır.
Aşağıdaki kodu düşünün:
katılık
sözleşme C {
function f() public pure returns (uint) {
montaj {
mstore(0, 0x42)
}
uint x;
derleme {
x := mload(0)
}
return x;
}
}
Derleyici, optimizasyon sürecinde kontrol akışını ve veri akışını analiz ederek kod boyutunu küçültür ve gaz tüketimini optimize eder. Ancak bu tür bir optimizasyon hatalara yol açabilir.
Bu örnekte, derleyici ilk assembly bloğundaki bellek 0'a yazmayı gereksiz olarak düşündü ve bunu kaldırdı, bu da f() fonksiyonunun doğru olan 0x42 yerine 0 döndürmesine neden oldu.
Bu güvenlik açığı, >= 0.5.8 < 0.8.16 sürümlerindeki derleyicileri etkilemektedir.
Aşağıdaki kodu düşünün:
katılık
kontrat C {
function f(string[1] calldata a) public pure returns (string memory) {
return abi.decode(abi.encode(a), (string[1]))[0];
}
}
Normal şartlarda, bu kod a değişkeninin değerini "aaaa" döndürmelidir. Ancak, açık olan sürümde boş bir dize "" döndürür.
Bu, Solidity'nin calldata türündeki diziler üzerinde abi.encode işlemi yaparken bazı verileri yanlışlıkla temizlemesi ve bunun da yan verilerin değiştirilmesine yol açması nedeniyle, kodlama ve kod çözme sonrası verilerin tutarsız olmasına neden olmaktadır.
Dikkate değer bir nokta, external call ve emit event işlemlerinin implicit olarak abi.encode gerçekleştirmesidir, bu nedenle bu tür bir açığın ortaya çıkma olasılığı oldukça yüksektir.
Güvenlik Önerileri
Geliştiriciler için:
Daha yeni bir Solidity derleyici sürümü kullanmak, bilinen güvenlik sorunlarının genellikle daha az olmasını sağlar.
Birim test senaryolarını geliştirmek, kod kapsama oranını artırmak, derleyicinin neden olduğu sorunları keşfetmeye yardımcı olur.
İç içe montaj, karmaşık abi kodlama ve kod çözme gibi işlemlerden kaçının, yeni özellikleri ve deneysel işlevleri körü körüne kullanmayın.
Güvenlik personeline:
Denetim sırasında derleyicinin getirebileceği riskleri göz ardı etmeyin, bu SWC-102 kontrol maddesine karşılık gelir.
SDL sürecinde, derleyici sürümünü yükseltmeyi teşvik edin, otomatik kontrol getirmeyi düşünün.
Derleyici açıklarının gerçek etkisini değerlendirin, aşırı panik yapmanıza gerek yok.
Bazı pratik kaynaklar:
Solidity resmi güvenlik uyarı blogu
Solidity deposundaki hata listesi
Tüm sürümlerin derleyici hata listesi
Etherscan sözleşme sayfasındaki derleyici açığı uyarısı
Sonuç olarak, Solidity derleyici hataları akıllı sözleşmelerin gerçek davranışının beklentilerle uyuşmamasına neden olabilir, bu nedenle geliştiricilerin ve güvenlik uzmanlarının bu konuda dikkatli olmaları ve riskleri azaltmak için gerekli önlemleri almaları gerekmektedir.
This page may contain third-party content, which is provided for information purposes only (not representations/warranties) and should not be considered as an endorsement of its views by Gate, nor as financial or professional advice. See Disclaimer for details.
16 Likes
Reward
16
5
Repost
Share
Comment
0/400
ColdWalletGuardian
· 08-06 10:09
Hala eski derleyiciyi kullanmaya cesaret eden demir beyinler
View OriginalReply0
LayerZeroHero
· 08-06 02:28
Derleyici de pek stabil değil.
View OriginalReply0
RektRecorder
· 08-03 12:34
Bu kadar tehlikeli, absürt fam
View OriginalReply0
BearMarketGardener
· 08-03 12:30
Derleyici de birçok hataya sahip, bir uyku süresinde varlıklar kayboldu.
Solidity derleyici güvenlik açığı analizi: Göz ardı edilemeyecek akıllı sözleşmeler tehlikesi
Solidity Derleyici Açığı Analizi ve Önlemler
Derleyici, modern bilgisayar sistemlerinin temel bileşenlerinden biridir ve işlevi, yüksek seviyeli programlama dili kaynak kodunu bilgisayarın çalıştırabileceği talimat koduna dönüştürmektir. Geliştiriciler ve güvenlik uzmanları genellikle uygulama kodunun güvenliğine odaklansalar da, derleyici kendisi bir bilgisayar programı olarak güvenlik açıklarına sahip olabilir ve bazı durumlarda ciddi güvenlik riskleri doğurabilir.
Örneğin, bir tarayıcı JavaScript kodunu derleyip çalıştırırken, analiz motorundaki bir güvenlik açığı nedeniyle uzaktan kod yürütme gerçekleşebilir ve bu da saldırganların mağdurun tarayıcısı veya hatta işletim sistemi üzerinde kontrol elde etmesine neden olabilir. Ayrıca, araştırmalar C++ derleyicilerindeki hataların da uzaktan kod yürütme gibi ciddi sonuçlara yol açabileceğini göstermektedir.
Solidity derleyicisinde de güvenlik açıkları bulunmaktadır. Geliştirme ekibinin güvenlik uyarılarına göre, birden fazla sürümde Solidity derleyicisinde güvenlik sorunları tespit edilmiştir.
Solidity derleyicisinin görevi, akıllı sözleşme kodunu Ethereum Sanal Makinesi (EVM) talimat koduna dönüştürmektir. Solidity derleyici açıklarını EVM'nin kendi açıklarından ayırmak gerekir. EVM açıkları, sanal makinenin talimatları yürütmesi sırasında oluşan güvenlik sorunlarıdır ve tüm Ethereum ağını etkileyebilir. Öte yandan, Solidity derleyici açıkları, Solidity'nin EVM koduna dönüştürülmesi sırasında meydana gelen sorunlardır; bunlar doğrudan Ethereum ağını etkilemez, ancak üretilen EVM kodunun geliştiricinin beklediği ile uyuşmamasına yol açabilir.
Akıllı sözleşmeler genellikle kullanıcı kripto para varlıklarını içerdiğinden, derleyici kaynaklı herhangi bir hata ciddi sonuçlara yol açabilir. Sözleşme kaynak kodunu denetleyerek, derleyici hatalarını tespit etmek zordur; belirli bir sürüm ve kod modeli ile analiz yapılması gerekir.
Aşağıda birkaç gerçek vaka ile, Solidity derleyici açıklarının belirli biçimlerini, nedenlerini ve zararlarını göstermektedir.
SOL-2016-9 YüksekDüzenByteTemizlemeDeposu
Bu güvenlik açığı daha eski Solidity derleyici sürümlerinde bulunmaktadır (>=0.1.6 <0.4.4).
Aşağıdaki kodu düşünün:
katılık contract C { uint32 a = 0x1234; uint32 b = 0; function f() public { a += 1; } function run() public view returns (uint) { return b; } }
Değişken b değiştirilmeden, run() fonksiyonu varsayılan değer 0'ı döndürmelidir. Ancak, açık sürüm derleyicisi tarafından üretilen kodda, run() 1 döndürecektir.
Bu, EVM'nin 32 bayt boyutunda yığın öğeleri kullanmasından ve Solidity'nin uint32 gibi 32 baytın altındaki türleri desteklemesinden kaynaklanmaktadır. Derleyici, veri doğruluğunu sağlamak için yüksek bitleri temizleme işlemi yapmalıdır. Toplama taşması durumunda, derleyici yüksek bitleri düzgün bir şekilde temizleyemediği için taşan 1 bit storage'a yazılır ve b değişkenini üzer.
SOL-2022-4 InlineAssemblyMemoryYanEtkileri
Bu güvenlik açığı >=0.8.13 <0.8.15 sürümündeki derleyicilerde bulunmaktadır.
Aşağıdaki kodu düşünün:
katılık sözleşme C { function f() public pure returns (uint) { montaj { mstore(0, 0x42) } uint x; derleme { x := mload(0) } return x; } }
Derleyici, optimizasyon sürecinde kontrol akışını ve veri akışını analiz ederek kod boyutunu küçültür ve gaz tüketimini optimize eder. Ancak bu tür bir optimizasyon hatalara yol açabilir.
Bu örnekte, derleyici ilk assembly bloğundaki bellek 0'a yazmayı gereksiz olarak düşündü ve bunu kaldırdı, bu da f() fonksiyonunun doğru olan 0x42 yerine 0 döndürmesine neden oldu.
SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup
Bu güvenlik açığı, >= 0.5.8 < 0.8.16 sürümlerindeki derleyicileri etkilemektedir.
Aşağıdaki kodu düşünün:
katılık kontrat C { function f(string[1] calldata a) public pure returns (string memory) { return abi.decode(abi.encode(a), (string[1]))[0]; } }
Normal şartlarda, bu kod a değişkeninin değerini "aaaa" döndürmelidir. Ancak, açık olan sürümde boş bir dize "" döndürür.
Bu, Solidity'nin calldata türündeki diziler üzerinde abi.encode işlemi yaparken bazı verileri yanlışlıkla temizlemesi ve bunun da yan verilerin değiştirilmesine yol açması nedeniyle, kodlama ve kod çözme sonrası verilerin tutarsız olmasına neden olmaktadır.
Dikkate değer bir nokta, external call ve emit event işlemlerinin implicit olarak abi.encode gerçekleştirmesidir, bu nedenle bu tür bir açığın ortaya çıkma olasılığı oldukça yüksektir.
Güvenlik Önerileri
Geliştiriciler için:
Güvenlik personeline:
Bazı pratik kaynaklar:
Sonuç olarak, Solidity derleyici hataları akıllı sözleşmelerin gerçek davranışının beklentilerle uyuşmamasına neden olabilir, bu nedenle geliştiricilerin ve güvenlik uzmanlarının bu konuda dikkatli olmaları ve riskleri azaltmak için gerekli önlemleri almaları gerekmektedir.