Solidity Derleyici Açıkları Analizi ve Müdahale Stratejileri
Derleyici, modern bilgisayar sistemlerinin temel bileşenlerinden biridir. Bu, yüksek seviyeli programlama dillerini bilgisayarın çalıştırabileceği talimatlara dönüştüren bir programdır. Geliştiriciler ve güvenlik uzmanları genellikle uygulama kodunun güvenliğine odaklansa da, derleyicinin kendisinin güvenliği de bir o kadar önemlidir.
Derleyiciler, bilgisayar programları olarak güvenlik açıklarına sahip olabilir ve bazı durumlarda ciddi güvenlik riskleri doğurabilir. Örneğin, tarayıcılar JavaScript kodunu işlerken ve yürütürken, JavaScript motorundaki bir açığın, kullanıcıların kötü niyetli web sayfalarına erişmesi durumunda saldırıya uğramasına neden olabilmektedir. Bu durum, nihayetinde saldırganların mağdurun tarayıcısını veya hatta işletim sistemini kontrol etmesine yol açabilir.
Solidity derleyicisi de istisna değildir. Solidity geliştirme ekibinin güvenlik uyarılarına göre, birden fazla Solidity derleyici versiyonunda güvenlik açıkları bulunmaktadır.
Solidity derleyici açığı
Solidity derleyicisinin işlevi, akıllı sözleşme kodunu Ethereum sanal makinesi (EVM) talimat koduna dönüştürmektir. Bu EVM talimatları, işlemler aracılığıyla Ethereum'a yüklenir ve nihayetinde EVM tarafından yürütülür.
Solidity derleyici açıklarını ve EVM'nin kendisine ait açıklarını ayırt etmek gerekir. EVM açıkları, sanal makinenin talimatları yürütmesi sırasında meydana gelen güvenlik açıklarıdır ve bu, Ethereum ağını etkileyebilir. Solidity derleyici açıkları ise, Solidity'nin EVM koduna dönüştürülmesi sırasında ortaya çıkan sorunlardır.
Solidity derleyici açıkları, Ethereum ağına doğrudan etki etmez, ancak üretilen EVM kodunun geliştiricilerin beklentileriyle uyuşmamasına neden olabilir. Akıllı sözleşmeler genellikle kripto para varlıklarını içerdiğinden, derleyiciden kaynaklanan herhangi bir hata, kullanıcı varlıklarının kaybına yol açabilir ve bu da ciddi sonuçlar doğurabilir.
Sadece sözleşme kaynak kodunu denetlemek, derleyici açıklarını bulmayı zorlaştırır. Belirli bir derleyici sürümü ve kod modeli ile analiz yapmak gerekir, böylece sözleşmenin derleyici açıklarından etkilenip etkilenmediğini belirleyebilirsiniz.
Solidity derleyici güvenlik açığı örneği
Aşağıda, belirli biçimleri, nedenleri ve zararları gösteren birkaç gerçek Solidity derleyici açığı örneği bulunmaktadır.
SOL-2016-9 YüksekDüzenBaytTemizlemeDepolama
Bu açık, daha eski versiyonlarındaki Solidity derleyicisinde (>=0.1.6 <0.4.4) bulunmaktadir.
Aşağıdaki kodu dikkate al:
katılık
sözleşme C {
uint32 a = 0x12345678;
uint32 b = 0;
function run() returns (uint256) {
a = a + 1;
return b;
}
}
storage değişkeni b değiştirilmedi, run() fonksiyonu varsayılan değer 0'ı döndürmelidir. Ancak hatalı bir derleyici versiyonunda, run() 1 döndürecektir.
Bu beklenmedik durum, eğer b değişkeni yetkilendirme veya varlık muhasebesi gibi amaçlar için kullanılıyorsa, ciddi sonuçlara yol açabilir.
Bu fenomenin nedeni, EVM'nin 32 bayt boyutunda yığın elemanları ve depolama alanları kullanması, ancak Solidity'nin uint32 gibi daha küçük veri türlerini desteklemesidir. Derleyici bu türleri işlerken yüksek bitleri temizlemesi gerekir, ancak tam sayı taşması sırasında bunu doğru bir şekilde ele almadığı için yüksek biti 1 depolama alanına yazılmış ve b değişkeninin üzerine yazılmıştır.
SOL-2022-4 InlineAssemblyMemorySideEffects
Bu açık, >=0.8.13 <0.8.15 sürümlerindeki derleyicilerde bulunmaktadır.
Aşağıdaki kodu düşünün:
katılık
sözleşme C {
function f() public pure returns (uint) {
derleme {
mstore(0, 0x42)
}
uint x;
derleme {
x := mload(0)
}
return x;
}
}
Bu açık, derleme optimizasyonundan kaynaklanmaktadır. Derleyici, görünüşte gereksiz bellek yazma işlemlerini kaldırmaya çalışırken, yanlış bir şekilde assembly bloğunun üzerinden geçerek analiz yapmıştır. Açık olan versiyonda, f() fonksiyonu 0 döndürecek, doğru olan 0x42 yerine.
Bu güvenlik açığı >= 0.5.8 < 0.8.16 sürümlerindeki derleyicileri etkilemektedir.
Aşağıdaki kodu dikkate al:
katılık
sözleşme C {
function f(string[1] calldata a) external pure returns (string memory) {
return abi.decode(abi.encode(a), (string[1]))[0];
}
}
Normal şartlarda, bu kod a değişkeninin değerini "aaaa" olarak döndürmelidir. Ancak, hatalı sürümde boş bir dize "" döndürecektir.
Bu, Solidity'nin calldata türündeki diziler üzerinde abi.encode işlemi yaparken bazı verileri yanlışlıkla temizlemesinden kaynaklanıyor; bu da bitişik verilerin değiştirilmesine ve kodlama ile çözümlenen verilerin tutarsız olmasına yol açıyor.
Dikkate değer bir husus, Solidity'nin external call ve emit event işlemleri sırasında abi.encode'yi örtük olarak gerçekleştirmesidir; bu nedenle bu tür açıkların etkisi beklenenden daha geniş olabilir.
Güvenlik Önerileri
Solidity derleyici açıklarının tehdit modeli analizi ve geçmiş açıkların derlenmesine dayanarak, geliştiricilere ve güvenlik personeline aşağıdaki önerilerde bulunulmuştur:
Geliştiricilere:
Daha yeni bir Solidity derleyici sürümü kullanın. Yeni sürümler genellikle bilinen güvenlik sorunlarını düzeltir.
Birim testlerini geliştirin. Çoğu derleyici düzeyindeki hata, kodun çalıştırma sonuçlarının beklenenle uyuşmamasına neden olur; kod kapsamını artırarak bu tür sorunları test aşamasında tespit edebilirsiniz.
Entegre montaj, karmaşık abi kodlama ve kod çözme gibi işlemlerden kaçının. Çoğu tarihsel güvenlik açığı bu karmaşık özelliklerle ilgilidir.
Güvenlik Personeline:
Denetim sırasında, derleyicinin potansiyel güvenlik risklerini göz ardı etmeyin. İlgili Smart Contract Zayıflık Sınıflandırması(SWC) kontrol maddesi SWC-102'dir.
İçerideki SDL sürecinde, geliştirme ekibini Solidity derleyici sürümünü güncellemeye teşvik edin, CI/CD'ye otomatik kontrol eklemeyi düşünün.
Derleyici açıkları konusunda aşırı endişelenmeye gerek yoktur. Çoğu açık sadece belirli kod kalıpları altında tetiklenir, gerçek etkileri değerlendirmek için duruma göre bakmak gerekir.
Pratik Kaynaklar:
Solidity ekibi tarafından yayımlanan güvenlik uyarısı:
Solidity resmi hata listesi:
Tüm sürümlerin derleyici hata listesi:
Etherscan kontrat kodu sayfasının sağ üst köşesindeki uyarı simgesi, mevcut sürüm derleyicisinde var olan güvenlik açıklarını gösterebilir.
Özet
Bu makale, Solidity derleyici açıklarının kavramını tanıtmakta, bunların gerçek Ethereum geliştirmeleri sırasında neden olabileceği güvenlik risklerini analiz etmekte ve geliştiriciler ile güvenlik uzmanları için pratik güvenlik önerileri sunmaktadır. Derleyici açıklarının özelliklerini ve etkilerini anlayarak, akıllı sözleşmelerin güvenliğini daha iyi koruyabiliriz.
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.
12 Likes
Reward
12
3
Share
Comment
0/400
DataBartender
· 17h ago
Güvenliğin bir sonu yok, geçici yamanın dayanma gücü yok.
Solidity Derleyici Açığı Analizi ve Güvenlik Önleme Stratejileri
Solidity Derleyici Açıkları Analizi ve Müdahale Stratejileri
Derleyici, modern bilgisayar sistemlerinin temel bileşenlerinden biridir. Bu, yüksek seviyeli programlama dillerini bilgisayarın çalıştırabileceği talimatlara dönüştüren bir programdır. Geliştiriciler ve güvenlik uzmanları genellikle uygulama kodunun güvenliğine odaklansa da, derleyicinin kendisinin güvenliği de bir o kadar önemlidir.
Derleyiciler, bilgisayar programları olarak güvenlik açıklarına sahip olabilir ve bazı durumlarda ciddi güvenlik riskleri doğurabilir. Örneğin, tarayıcılar JavaScript kodunu işlerken ve yürütürken, JavaScript motorundaki bir açığın, kullanıcıların kötü niyetli web sayfalarına erişmesi durumunda saldırıya uğramasına neden olabilmektedir. Bu durum, nihayetinde saldırganların mağdurun tarayıcısını veya hatta işletim sistemini kontrol etmesine yol açabilir.
Solidity derleyicisi de istisna değildir. Solidity geliştirme ekibinin güvenlik uyarılarına göre, birden fazla Solidity derleyici versiyonunda güvenlik açıkları bulunmaktadır.
Solidity derleyici açığı
Solidity derleyicisinin işlevi, akıllı sözleşme kodunu Ethereum sanal makinesi (EVM) talimat koduna dönüştürmektir. Bu EVM talimatları, işlemler aracılığıyla Ethereum'a yüklenir ve nihayetinde EVM tarafından yürütülür.
Solidity derleyici açıklarını ve EVM'nin kendisine ait açıklarını ayırt etmek gerekir. EVM açıkları, sanal makinenin talimatları yürütmesi sırasında meydana gelen güvenlik açıklarıdır ve bu, Ethereum ağını etkileyebilir. Solidity derleyici açıkları ise, Solidity'nin EVM koduna dönüştürülmesi sırasında ortaya çıkan sorunlardır.
Solidity derleyici açıkları, Ethereum ağına doğrudan etki etmez, ancak üretilen EVM kodunun geliştiricilerin beklentileriyle uyuşmamasına neden olabilir. Akıllı sözleşmeler genellikle kripto para varlıklarını içerdiğinden, derleyiciden kaynaklanan herhangi bir hata, kullanıcı varlıklarının kaybına yol açabilir ve bu da ciddi sonuçlar doğurabilir.
Sadece sözleşme kaynak kodunu denetlemek, derleyici açıklarını bulmayı zorlaştırır. Belirli bir derleyici sürümü ve kod modeli ile analiz yapmak gerekir, böylece sözleşmenin derleyici açıklarından etkilenip etkilenmediğini belirleyebilirsiniz.
Solidity derleyici güvenlik açığı örneği
Aşağıda, belirli biçimleri, nedenleri ve zararları gösteren birkaç gerçek Solidity derleyici açığı örneği bulunmaktadır.
SOL-2016-9 YüksekDüzenBaytTemizlemeDepolama
Bu açık, daha eski versiyonlarındaki Solidity derleyicisinde (>=0.1.6 <0.4.4) bulunmaktadir.
Aşağıdaki kodu dikkate al:
katılık sözleşme C { uint32 a = 0x12345678; uint32 b = 0; function run() returns (uint256) { a = a + 1; return b; } }
storage değişkeni b değiştirilmedi, run() fonksiyonu varsayılan değer 0'ı döndürmelidir. Ancak hatalı bir derleyici versiyonunda, run() 1 döndürecektir.
Bu beklenmedik durum, eğer b değişkeni yetkilendirme veya varlık muhasebesi gibi amaçlar için kullanılıyorsa, ciddi sonuçlara yol açabilir.
Bu fenomenin nedeni, EVM'nin 32 bayt boyutunda yığın elemanları ve depolama alanları kullanması, ancak Solidity'nin uint32 gibi daha küçük veri türlerini desteklemesidir. Derleyici bu türleri işlerken yüksek bitleri temizlemesi gerekir, ancak tam sayı taşması sırasında bunu doğru bir şekilde ele almadığı için yüksek biti 1 depolama alanına yazılmış ve b değişkeninin üzerine yazılmıştır.
SOL-2022-4 InlineAssemblyMemorySideEffects
Bu açık, >=0.8.13 <0.8.15 sürümlerindeki derleyicilerde bulunmaktadır.
Aşağıdaki kodu düşünün:
katılık sözleşme C { function f() public pure returns (uint) { derleme { mstore(0, 0x42) } uint x; derleme { x := mload(0) } return x; } }
Bu açık, derleme optimizasyonundan kaynaklanmaktadır. Derleyici, görünüşte gereksiz bellek yazma işlemlerini kaldırmaya çalışırken, yanlış bir şekilde assembly bloğunun üzerinden geçerek analiz yapmıştır. Açık olan versiyonda, f() fonksiyonu 0 döndürecek, doğru olan 0x42 yerine.
SOL-2022-6 AbiReencodingHeadOverflowWithStaticArrayCleanup
Bu güvenlik açığı >= 0.5.8 < 0.8.16 sürümlerindeki derleyicileri etkilemektedir.
Aşağıdaki kodu dikkate al:
katılık sözleşme C { function f(string[1] calldata a) external pure returns (string memory) { return abi.decode(abi.encode(a), (string[1]))[0]; } }
Normal şartlarda, bu kod a değişkeninin değerini "aaaa" olarak döndürmelidir. Ancak, hatalı sürümde boş bir dize "" döndürecektir.
Bu, Solidity'nin calldata türündeki diziler üzerinde abi.encode işlemi yaparken bazı verileri yanlışlıkla temizlemesinden kaynaklanıyor; bu da bitişik verilerin değiştirilmesine ve kodlama ile çözümlenen verilerin tutarsız olmasına yol açıyor.
Dikkate değer bir husus, Solidity'nin external call ve emit event işlemleri sırasında abi.encode'yi örtük olarak gerçekleştirmesidir; bu nedenle bu tür açıkların etkisi beklenenden daha geniş olabilir.
Güvenlik Önerileri
Solidity derleyici açıklarının tehdit modeli analizi ve geçmiş açıkların derlenmesine dayanarak, geliştiricilere ve güvenlik personeline aşağıdaki önerilerde bulunulmuştur:
Geliştiricilere:
Daha yeni bir Solidity derleyici sürümü kullanın. Yeni sürümler genellikle bilinen güvenlik sorunlarını düzeltir.
Birim testlerini geliştirin. Çoğu derleyici düzeyindeki hata, kodun çalıştırma sonuçlarının beklenenle uyuşmamasına neden olur; kod kapsamını artırarak bu tür sorunları test aşamasında tespit edebilirsiniz.
Entegre montaj, karmaşık abi kodlama ve kod çözme gibi işlemlerden kaçının. Çoğu tarihsel güvenlik açığı bu karmaşık özelliklerle ilgilidir.
Güvenlik Personeline:
Denetim sırasında, derleyicinin potansiyel güvenlik risklerini göz ardı etmeyin. İlgili Smart Contract Zayıflık Sınıflandırması(SWC) kontrol maddesi SWC-102'dir.
İçerideki SDL sürecinde, geliştirme ekibini Solidity derleyici sürümünü güncellemeye teşvik edin, CI/CD'ye otomatik kontrol eklemeyi düşünün.
Derleyici açıkları konusunda aşırı endişelenmeye gerek yoktur. Çoğu açık sadece belirli kod kalıpları altında tetiklenir, gerçek etkileri değerlendirmek için duruma göre bakmak gerekir.
Pratik Kaynaklar:
Özet
Bu makale, Solidity derleyici açıklarının kavramını tanıtmakta, bunların gerçek Ethereum geliştirmeleri sırasında neden olabileceği güvenlik risklerini analiz etmekte ve geliştiriciler ile güvenlik uzmanları için pratik güvenlik önerileri sunmaktadır. Derleyici açıklarının özelliklerini ve etkilerini anlayarak, akıllı sözleşmelerin güvenliğini daha iyi koruyabiliriz.