Move dili referans güvenlik açığı Derinlik analizi
Son zamanlarda, Aptos Moveevm üzerinde derinlemesine araştırma yaparken yeni bir tamsayı taşma açığı keşfettik. Bu açığın tetiklenme süreci oldukça ilginçtir, aşağıda bunu derinlemesine analiz edeceğiz ve ilgili Move diline dair arka plan bilgilerini tanıtacağız. Bu makalenin açıklamaları sayesinde, okuyucuların Move dilini daha derinlemesine anlamalarını sağlayacağına inanıyoruz.
Move dili, byte kodunu yürütmeden önce kod birimi doğrulaması yapar ve bu süreç 4 adıma ayrılır. Bu yazıda tartışılan güvenlik açığı reference_safety adımında ortaya çıkmaktadır.
reference_safety modülü, süreç öznesinin referans güvenliğinin transfer fonksiyonunu doğrulamak için tanımlanmıştır. Temel olarak, askıda referansların varlığını, değişken referans erişiminin güvenli olup olmadığını, global depolama referans erişiminin güvenli olup olmadığını gibi sorunları kontrol eder.
Doğrulama süreci, güvenli doğrulama giriş fonksiyonuna yapılan bir çağrıyla başlar; bu fonksiyon analyze_function'ı çağırır. analyze_function içinde, her bir temel blok doğrulanır. Temel blok, giriş ve çıkış dışında hiçbir dal komutu olmayan bir kod dizisidir.
Move dili, byte kodunu dolaşarak, tüm dal talimatlarını ve döngü talimatı dizilerini bularak temel blokları tanımlar. Tipik bir Move IR kodu temel blok örneği, BrTrue, Branch ve Ret talimatlarıyla belirlenen 3 temel blok içerebilir.
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, değiştirilebilir referans ise verileri değiştirmek için kullanılır. Bu tasarım, kod güvenliğinin korunmasına ve okuma modüllerinin tanımlanmasına yardımcı olur.
Referans güvenliğini doğrulamanın ana süreci şunları içerir: fonksiyondaki temel blokların bayt kodu talimatlarını taramak ve tüm referans işlemlerinin yasal olup olmadığını belirlemek. Bu süreç, fonksiyondaki referans güvenliğini sağlamak için borrow graph ve locals içeren AbstractState yapısını kullanır.
Doğrulama sürecinde temel blok kodu çalıştırılacak, post state oluşturulacak, ardından pre state ve post state birleştirilerek blok durumu güncellenecek ve bu bloğun son koşulu sonraki bloklara iletilecektir. Bu süreç, V8 turbofan'daki Sea of Nodes fikrine benzer.
Açık, join_ fonksiyonunda ortaya çıkıyor. Parametre uzunluğu ile yerel değişken uzunluğunun toplamı 256'dan büyük olduğunda, local u8 türünde olduğu için tamsayı taşması meydana gelir. Move, locals sayısını kontrol eden bir sürece sahip olsa da, check bounds modülünde yalnızca locals kontrol edilmiştir, parametre uzunluğu dahil edilmemiştir.
Bu tam sayı taşma açığı, DoS saldırısına yol açabilir. Bir döngü kod bloğu oluşturarak ve taşmayı kullanarak bloğun durumunu değiştirerek, yeni locals haritasının önceki ile farklı olmasını sağlayabilirsiniz. execute_block fonksiyonu yeniden çalıştırıldığında, eğer talimatların erişmesi gereken indeks yeni AbstractState locals haritasında yoksa, bu DoS'a yol açar.
reference safety modülünde MoveLoc/CopyLoc/FreeRef opcode'larının bu hedefe ulaşabileceğini keşfettik. copy_loc fonksiyonunu örnek alırsak, LocalIndex'in olmaması panic'e yol açacak ve bu da tüm düğümün çökmesine neden olacaktır.
Bu açığı doğrulamak için bir PoC yazdık. Bu PoC içindeki kod bloğu, her seferinde son talimat yürütüldüğünde ilk talimata geri dönen bir koşulsuz dalış talimatı içerir, bu nedenle bu kod bloğu execute_block ve join fonksiyonlarını defalarca çağıracaktır.
Uygun parametreleri ayarlayarak yeni locals haritasının uzunluğunu 8'e çıkarabiliriz. execute_block fonksiyonu ikinci kez çalıştırıldığında, locals uzunluğu yetersiz olduğundan panic meydana gelecektir.
Bu açık, Move gibi güvenliğe vurgu yapan dillerin bile açıklar içerebileceğini hatırlatıyor. Move dilinin tasarımcılarına, beklenmedik durumların önlenmesi için çalıştırma zamanında daha fazla kontrol kodu eklemelerini öneriyoruz. Şu anda Move dilinde güvenlik kontrolleri esas olarak doğrulama aşamasında gerçekleştiriliyor, ancak bu yeterli olmayabilir. Doğrulama atlatıldığında, çalıştırma aşamasında yeterli güvenlik güçlendirmesi yoksa daha ciddi sorunlara yol açabilir.
Move dilinin güvenlik araştırmalarında lider olarak, Move'un güvenlik sorunlarını derinlemesine incelemeye devam edeceğiz ve gelecekte daha fazla bulgu 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.
10 Likes
Reward
10
7
Share
Comment
0/400
ChainSherlockGirl
· 2h ago
Ha! Yine bir on-chain güvenlik açığı tiyatrosu, bu sefer Move'un sahneye koyduğu tam sayı taşması gösterisi ~ Kişisel görüşlerime göre büyük ihtimalle hangi Büyük Yatırımcılar fırsattan yararlanıp kısa devre yapacak.
View OriginalReply0
SerumSquirter
· 7h ago
Bir güvenlik sorunuyla daha karşı karşıyayız, bu da sona erdi.
View OriginalReply0
rugged_again
· 7h ago
Yine delik açıldı, kayboldu kayboldu.
View OriginalReply0
LiquidatedDreams
· 7h ago
Kim hâlâ move oynuyor?
View OriginalReply0
DarkPoolWatcher
· 7h ago
aptos gerçekten güvenilmez bir sürü açık var
View OriginalReply0
MondayYoloFridayCry
· 7h ago
Yine mi siyah hareket etti? Tsk tsk tsk
View OriginalReply0
PretendingSerious
· 7h ago
Bu delik çok belirgin. Geliştirme temeli sağlam değil.
Move dilindeki güvenlik açığı: Tam sayı taşma riski ve önleme önerileri
Move dili referans güvenlik açığı Derinlik analizi
Son zamanlarda, Aptos Moveevm üzerinde derinlemesine araştırma yaparken yeni bir tamsayı taşma açığı keşfettik. Bu açığın tetiklenme süreci oldukça ilginçtir, aşağıda bunu derinlemesine analiz edeceğiz ve ilgili Move diline dair arka plan bilgilerini tanıtacağız. Bu makalenin açıklamaları sayesinde, okuyucuların Move dilini daha derinlemesine anlamalarını sağlayacağına inanıyoruz.
Move dili, byte kodunu yürütmeden önce kod birimi doğrulaması yapar ve bu süreç 4 adıma ayrılır. Bu yazıda tartışılan güvenlik açığı reference_safety adımında ortaya çıkmaktadır.
reference_safety modülü, süreç öznesinin referans güvenliğinin transfer fonksiyonunu doğrulamak için tanımlanmıştır. Temel olarak, askıda referansların varlığını, değişken referans erişiminin güvenli olup olmadığını, global depolama referans erişiminin güvenli olup olmadığını gibi sorunları kontrol eder.
Doğrulama süreci, güvenli doğrulama giriş fonksiyonuna yapılan bir çağrıyla başlar; bu fonksiyon analyze_function'ı çağırır. analyze_function içinde, her bir temel blok doğrulanır. Temel blok, giriş ve çıkış dışında hiçbir dal komutu olmayan bir kod dizisidir.
Move dili, byte kodunu dolaşarak, tüm dal talimatlarını ve döngü talimatı dizilerini bularak temel blokları tanımlar. Tipik bir Move IR kodu temel blok örneği, BrTrue, Branch ve Ret talimatlarıyla belirlenen 3 temel blok içerebilir.
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, değiştirilebilir referans ise verileri değiştirmek için kullanılır. Bu tasarım, kod güvenliğinin korunmasına ve okuma modüllerinin tanımlanmasına yardımcı olur.
Referans güvenliğini doğrulamanın ana süreci şunları içerir: fonksiyondaki temel blokların bayt kodu talimatlarını taramak ve tüm referans işlemlerinin yasal olup olmadığını belirlemek. Bu süreç, fonksiyondaki referans güvenliğini sağlamak için borrow graph ve locals içeren AbstractState yapısını kullanır.
Doğrulama sürecinde temel blok kodu çalıştırılacak, post state oluşturulacak, ardından pre state ve post state birleştirilerek blok durumu güncellenecek ve bu bloğun son koşulu sonraki bloklara iletilecektir. Bu süreç, V8 turbofan'daki Sea of Nodes fikrine benzer.
Açık, join_ fonksiyonunda ortaya çıkıyor. Parametre uzunluğu ile yerel değişken uzunluğunun toplamı 256'dan büyük olduğunda, local u8 türünde olduğu için tamsayı taşması meydana gelir. Move, locals sayısını kontrol eden bir sürece sahip olsa da, check bounds modülünde yalnızca locals kontrol edilmiştir, parametre uzunluğu dahil edilmemiştir.
Bu tam sayı taşma açığı, DoS saldırısına yol açabilir. Bir döngü kod bloğu oluşturarak ve taşmayı kullanarak bloğun durumunu değiştirerek, yeni locals haritasının önceki ile farklı olmasını sağlayabilirsiniz. execute_block fonksiyonu yeniden çalıştırıldığında, eğer talimatların erişmesi gereken indeks yeni AbstractState locals haritasında yoksa, bu DoS'a yol açar.
reference safety modülünde MoveLoc/CopyLoc/FreeRef opcode'larının bu hedefe ulaşabileceğini keşfettik. copy_loc fonksiyonunu örnek alırsak, LocalIndex'in olmaması panic'e yol açacak ve bu da tüm düğümün çökmesine neden olacaktır.
Bu açığı doğrulamak için bir PoC yazdık. Bu PoC içindeki kod bloğu, her seferinde son talimat yürütüldüğünde ilk talimata geri dönen bir koşulsuz dalış talimatı içerir, bu nedenle bu kod bloğu execute_block ve join fonksiyonlarını defalarca çağıracaktır.
Uygun parametreleri ayarlayarak yeni locals haritasının uzunluğunu 8'e çıkarabiliriz. execute_block fonksiyonu ikinci kez çalıştırıldığında, locals uzunluğu yetersiz olduğundan panic meydana gelecektir.
Bu açık, Move gibi güvenliğe vurgu yapan dillerin bile açıklar içerebileceğini hatırlatıyor. Move dilinin tasarımcılarına, beklenmedik durumların önlenmesi için çalıştırma zamanında daha fazla kontrol kodu eklemelerini öneriyoruz. Şu anda Move dilinde güvenlik kontrolleri esas olarak doğrulama aşamasında gerçekleştiriliyor, ancak bu yeterli olmayabilir. Doğrulama atlatıldığında, çalıştırma aşamasında yeterli güvenlik güçlendirmesi yoksa daha ciddi sorunlara yol açabilir.
Move dilinin güvenlik araştırmalarında lider olarak, Move'un güvenlik sorunlarını derinlemesine incelemeye devam edeceğiz ve gelecekte daha fazla bulgu paylaşacağız.