Move dilinde referans güvenliği doğrulama içindeki tam sayı taşması açığı analizi
Son zamanlarda, Move dilini derinlemesine araştırırken, yeni bir tam sayı taşma açığı keşfettik. Bu açık, referans güvenlik doğrulama sürecinde bulunmaktadır ve tetiklenme süreci oldukça ilginçtir. Bu makalede, bu açığı derinlemesine analiz edecek ve Move diline dair bazı ilgili arka plan bilgilerini inceleyeceğiz.
Move dili, byte kodunu çalıştırmadan önce kod birimi doğrulaması yapar ve bu dört aşamaya ayrılır. Bu açık, reference_safety aşamasında ortaya çıkmaktadır.
Atıf güvenlik modülü, süreç öznesinin atıf güvenliğini doğrulamak için bir transfer fonksiyonu tanımlar. Kontrol edilen içerikler arasında, askıda atıf olmadığının doğrulanması, değişken atıflara erişimin güvenli olup olmadığının kontrolü, küresel depolama atıflarına erişimin güvenli olup olmadığının kontrolü gibi unsurlar bulunmaktadır.
Güvenlik doğrulama giriş fonksiyonu, her temel bloğu doğrulamak için analyze_function'ı çağıracaktır. Temel blok, giriş ve çıkış dışında hiçbir dal komutu olmayan bir kod dizisidir. Move dili, temel bloğu belirlemek için bayt kodunu tarayarak tüm dal komutları ve döngü komutu dizilerini bulur.
Move dili, iki tür referansı destekler: değiştirilemez referans & ve değiştirilebilir referans &mut. Değiştirilemez referans, verileri okumak için kullanılırken, değiştirilebilir referans verileri değiştirmek için kullanılır. Referans türlerinin uygun kullanımı, güvenliği sağlamak ve okuma modüllerini tanımlamak için yardımcı olur.
Referans güvenlik modülü, fonksiyon düzeyinde çalışarak, fonksiyon içindeki temel blokların bayt kodu komutlarını tarar ve tüm referans işlemlerinin geçerli olup olmadığını doğrular. Doğrulama süreci esas olarak AbstractState yapısını içerir; bu yapı, fonksiyondaki referans güvenliğini sağlamak için borrow graph ve locals içerir.
Doğrulama sürecinde, temel blok öncesi ve sonrası durumu karşılaştıracak, join_result'un değişip değişmediğine bakarak pre state ve post state'i birleştirecektir. Eğer değişiklik olursa ve mevcut blok kendisine geri bağlantı yönlendiren bir kenar varsa (bu bir döngü olduğunu gösterir), döngü başına geri dönecek ve bu temel bloğu çalıştırmaya devam edecektir, ta ki post state pre state'e eşit olana veya bir hata nedeniyle durana kadar.
Hata, join sonucunun değişip değişmediğini kontrol etme sürecinde ortaya çıkmaktadır. Parametre uzunluğu ile yerel değişken uzunluğunun toplamı 256'dan büyük olduğunda, u8 türüyle locals üzerinde yineleme yapılması, tam sayı taşmasına yol açmaktadır. Move'un locals sayısını kontrol etme süreci olmasına rağmen, sınır kontrolü modülü yalnızca locals'i kontrol etmekte, parametre uzunluğunu dahil etmemektedir.
Bu tamsayı taşma açığı, hizmet reddi (DoS) saldırısına neden olabilir. Saldırgan, döngü kod blokları oluşturarak ve taşmayı kullanarak bloğun durumunu değiştirerek yeni yerel haritanın öncekinden farklı olmasını sağlayabilir. execute_block fonksiyonu tekrar çalıştırıldığında, temel bloğun bytecode talimat dizisini analiz etmek yeni yerel haritaya erişecektir. Eğer talimatların erişmesi gereken indeks yeni AbstractState yerel haritasında yoksa, bu DoS'a neden olacaktır.
Bu açığı doğrulamak için git'te PoC'yi yeniden üretebilirsiniz. PoC'deki kod bloğu, her seferinde son talimatı çalıştırdığında ilk talimata geri dönen koşulsuz bir dal komutu içerir; bu, execute_block ve join fonksiyonlarının birden çok kez çağrılmasına neden olur.
Bu açık, güvenliğe önem veren Move gibi dillerin bile güvenlik riskleri taşıyabileceğini göstermektedir. Bu, kod denetiminin önemini vurgulamakta ve aynı zamanda Move dili tasarımcılarına, çalıştırma anında beklenmedik durumları önlemek için daha fazla kontrol kodu eklemelerini önermektedir. Şu anda Move, güvenlik kontrollerini esas olarak doğrulama aşamasında gerçekleştirmektedir, ancak doğrulama aşıldığında, çalışma aşamasında yeterli güvenlik takviyesinin olmaması daha ciddi sorunlara yol açabilir.
Move dilinin güvenlik araştırmalarının lideri olarak, Move'un güvenlik sorunlarını derinlemesine incelemeye devam edeceğiz ve ilerleyen zamanlarda daha fazla bulguyu paylaşacağız.
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.
20 Likes
Reward
20
6
Share
Comment
0/400
BagHolderTillRetire
· 07-22 09:41
Bu hata gerçekten harika, taşma çökmesine neden oldu.
View OriginalReply0
MetaverseVagabond
· 07-21 19:40
Taşma açığı tekrar geldi, fena
View OriginalReply0
HeavenAndEarthAreBle
· 07-20 02:27
Anasını satayım
View OriginalReply0
MemeTokenGenius
· 07-20 00:50
Aman, bu hata gerçekten patladı.
View OriginalReply0
GamefiHarvester
· 07-20 00:43
Hala zamanında onarmıyor musunuz? Demir enayiler beni beklesin, insanları enayi yerine koymak.
View OriginalReply0
SerumSurfer
· 07-20 00:40
Aman Tanrım, bir hata daha çıktı. Kaçıyorum, kaçıyorum~
Move dilinde referans güvenliği doğrulamasında yeni bir tam sayı taşma açığı bulundu.
Move dilinde referans güvenliği doğrulama içindeki tam sayı taşması açığı analizi
Son zamanlarda, Move dilini derinlemesine araştırırken, yeni bir tam sayı taşma açığı keşfettik. Bu açık, referans güvenlik doğrulama sürecinde bulunmaktadır ve tetiklenme süreci oldukça ilginçtir. Bu makalede, bu açığı derinlemesine analiz edecek ve Move diline dair bazı ilgili arka plan bilgilerini inceleyeceğiz.
Move dili, byte kodunu çalıştırmadan önce kod birimi doğrulaması yapar ve bu dört aşamaya ayrılır. Bu açık, reference_safety aşamasında ortaya çıkmaktadır.
Atıf güvenlik modülü, süreç öznesinin atıf güvenliğini doğrulamak için bir transfer fonksiyonu tanımlar. Kontrol edilen içerikler arasında, askıda atıf olmadığının doğrulanması, değişken atıflara erişimin güvenli olup olmadığının kontrolü, küresel depolama atıflarına erişimin güvenli olup olmadığının kontrolü gibi unsurlar bulunmaktadır.
Güvenlik doğrulama giriş fonksiyonu, her temel bloğu doğrulamak için analyze_function'ı çağıracaktır. Temel blok, giriş ve çıkış dışında hiçbir dal komutu olmayan bir kod dizisidir. Move dili, temel bloğu belirlemek için bayt kodunu tarayarak tüm dal komutları ve döngü komutu dizilerini bulur.
Move dili, iki tür referansı destekler: değiştirilemez referans & ve değiştirilebilir referans &mut. Değiştirilemez referans, verileri okumak için kullanılırken, değiştirilebilir referans verileri değiştirmek için kullanılır. Referans türlerinin uygun kullanımı, güvenliği sağlamak ve okuma modüllerini tanımlamak için yardımcı olur.
Referans güvenlik modülü, fonksiyon düzeyinde çalışarak, fonksiyon içindeki temel blokların bayt kodu komutlarını tarar ve tüm referans işlemlerinin geçerli olup olmadığını doğrular. Doğrulama süreci esas olarak AbstractState yapısını içerir; bu yapı, fonksiyondaki referans güvenliğini sağlamak için borrow graph ve locals içerir.
Doğrulama sürecinde, temel blok öncesi ve sonrası durumu karşılaştıracak, join_result'un değişip değişmediğine bakarak pre state ve post state'i birleştirecektir. Eğer değişiklik olursa ve mevcut blok kendisine geri bağlantı yönlendiren bir kenar varsa (bu bir döngü olduğunu gösterir), döngü başına geri dönecek ve bu temel bloğu çalıştırmaya devam edecektir, ta ki post state pre state'e eşit olana veya bir hata nedeniyle durana kadar.
Hata, join sonucunun değişip değişmediğini kontrol etme sürecinde ortaya çıkmaktadır. Parametre uzunluğu ile yerel değişken uzunluğunun toplamı 256'dan büyük olduğunda, u8 türüyle locals üzerinde yineleme yapılması, tam sayı taşmasına yol açmaktadır. Move'un locals sayısını kontrol etme süreci olmasına rağmen, sınır kontrolü modülü yalnızca locals'i kontrol etmekte, parametre uzunluğunu dahil etmemektedir.
Bu tamsayı taşma açığı, hizmet reddi (DoS) saldırısına neden olabilir. Saldırgan, döngü kod blokları oluşturarak ve taşmayı kullanarak bloğun durumunu değiştirerek yeni yerel haritanın öncekinden farklı olmasını sağlayabilir. execute_block fonksiyonu tekrar çalıştırıldığında, temel bloğun bytecode talimat dizisini analiz etmek yeni yerel haritaya erişecektir. Eğer talimatların erişmesi gereken indeks yeni AbstractState yerel haritasında yoksa, bu DoS'a neden olacaktır.
Bu açığı doğrulamak için git'te PoC'yi yeniden üretebilirsiniz. PoC'deki kod bloğu, her seferinde son talimatı çalıştırdığında ilk talimata geri dönen koşulsuz bir dal komutu içerir; bu, execute_block ve join fonksiyonlarının birden çok kez çağrılmasına neden olur.
Bu açık, güvenliğe önem veren Move gibi dillerin bile güvenlik riskleri taşıyabileceğini göstermektedir. Bu, kod denetiminin önemini vurgulamakta ve aynı zamanda Move dili tasarımcılarına, çalıştırma anında beklenmedik durumları önlemek için daha fazla kontrol kodu eklemelerini önermektedir. Şu anda Move, güvenlik kontrollerini esas olarak doğrulama aşamasında gerçekleştirmektedir, ancak doğrulama aşıldığında, çalışma aşamasında yeterli güvenlik takviyesinin olmaması daha ciddi sorunlara yol açabilir.
Move dilinin güvenlik araştırmalarının lideri olarak, Move'un güvenlik sorunlarını derinlemesine incelemeye devam edeceğiz ve ilerleyen zamanlarda daha fazla bulguyu paylaşacağız.