Aptos Moveevm üzerinde derinlemesine araştırma yaptıktan sonra, yeni bir tamsayı taşma açığı keşfettik. Bu açığın tetiklenme süreci oldukça ilginçtir, aşağıda bu açığı detaylı bir şekilde analiz edecek ve Move diline dair bazı temel bilgileri tanıtacağız. Bu makalenin açıklamalarıyla, Move dilini daha derinlemesine anlayacağınıza inanıyorum.
Move dili, byte kodunu çalıştırmadan önce kod birimlerini doğrular. Doğrulama süreci 4 adıma ayrılır ve bu açık reference_safety adımında ortaya çıkar.
Move'daki referans güvenliği
Move dili iki tür referansı destekler: değiştirilemez referans (&) ve değiştirilebilir referans (&mut). Değiştirilemez referans, yapıdan veri okumak için kullanılırken, değiştirilebilir referans veriyi değiştirmek için kullanılır. Uygun referans türlerini kullanmak, güvenliğin korunmasına ve okuma modüllerinin tanınmasına yardımcı olur.
Move'un referans güvenliği modülünde, fonksiyonlar bazında temel blokların bytecode talimatları taranarak tüm referans işlemlerinin geçerliliği doğrulanır. Referans güvenliğini doğrulama süreci, temel blokların yürütülmesi, son durumların üretilmesi, önceki ve sonraki durumların birleştirilmesi gibi adımları içerir.
Açık Analizi
Açık, güvenlik modülünü referans alan join_ fonksiyonunda ortaya çıkmaktadır. Fonksiyon parametre uzunluğu ile yerel değişken uzunluğunun toplamı 256'dan büyük olduğunda, local değişkenleri u8 tipi ile temsil edildiği için tam sayı taşması meydana gelir.
Move'un locals sayısını kontrol eden bir süreci olmasına rağmen, check bounds modülünde yalnızca locals kontrol edilmiştir, parametre uzunluğu dahil edilmemiştir. Geliştiricilerin parametreler ve yerel değerlerin toplamını kontrol etmesi gerektiğini fark ettikleri anlaşılıyor, ancak kod yalnızca yerel değişkenlerin sayısını kontrol etmiştir.
Tam Sayı Taşmasından DoS Saldırısına
Bu tam sayı taşma açığını kullanarak, saldırgan bir döngü kod bloğu oluşturabilir ve bloğun durumunu değiştirebilir. execute_block fonksiyonu tekrar çalıştırıldığında, eğer talimatın erişmesi gereken indeks yeni AbstractState locals haritasında yoksa, DoS saldırısına yol açacaktır.
reference safety modülünde, MoveLoc/CopyLoc/FreeRef gibi işlem kodları bu durumu tetikleyebilir. Örneğin, copy_loc fonksiyonunda, LocalIndex mevcut değilse panic ile sonuçlanabilir ve bu da tüm düğümün çökmesine neden olabilir.
Açıkların Yeniden Üretilmesi
Bu güvenlik açığını git'te aşağıdaki PoC kodu ile yeniden oluşturabilirsiniz:
hareket
public fun test(a: u64, b: u64, c: u64, d: u64) {
let x = 0;
döngü {
if (x == 1) {
kırmak
};
x = x + 1;
}
}
DoS'u tetikleme adımları şunlardır:
execute_block fonksiyonu ilk kez çalıştırıldığında, parameters ve locals her ikisi de SignatureIndex(0) olarak ayarlandığı için num_locals 264 oldu. join_ fonksiyonu çalıştırıldıktan sonra, yeni locals haritasının uzunluğu 8'e dönüştü.
execute_block fonksiyonu ikinci kez çalıştırıldığında, move kodunun ilk komutu olan copyloc(57) çalıştırılır. Bu noktada locals yalnızca 8 uzunluğundadır, offset 57 mevcut değildir, bu nedenle get(57).unwrap() fonksiyonu None döndürür ve nihayetinde panic'e neden olur.
Özet
Bu açık, mutlak güvenli bir kodun olmadığını gösteriyor. Move dilinin kod yürütmeden önce statik bir kontrol gerçekleştirmesine rağmen, yine de taşma açıkları tarafından aşılabilir. Bu, kod denetiminin önemini bir kez daha vurguluyor.
Move dili için, beklenmeyen durumların önlenmesi amacıyla çalışma sırasında daha fazla kontrol kodu eklenmesini öneriyoruz. Şu anda Move, güvenlik kontrollerini doğrulama aşamasında gerçekleştiriyor, ancak doğrulama aşıldığında, çalışma aşamasındaki yetersiz güvenlik güçlendirmesi 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 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.
18 Likes
Reward
18
4
Repost
Share
Comment
0/400
PretendingToReadDocs
· 08-15 17:34
move yine boğa, bu da sorun çıkarır
View OriginalReply0
WalletDetective
· 08-14 07:06
Biraz inceledim, bu açık gerçekten ilginç.
View OriginalReply0
ponzi_poet
· 08-14 07:00
Samimi mi yoksa para kazanma amacıyla mı move taşması
View OriginalReply0
ForkTongue
· 08-14 06:52
Güvenlik hatalarını yazmaya devam ediyorsunuz, öyle mi?
Move dilindeki tam sayı taşma açığı analizi: Referans güvenliğinden DoS saldırısına
Move dilindeki tam sayı taşma açığı analizi
Giriş
Aptos Moveevm üzerinde derinlemesine araştırma yaptıktan sonra, yeni bir tamsayı taşma açığı keşfettik. Bu açığın tetiklenme süreci oldukça ilginçtir, aşağıda bu açığı detaylı bir şekilde analiz edecek ve Move diline dair bazı temel bilgileri tanıtacağız. Bu makalenin açıklamalarıyla, Move dilini daha derinlemesine anlayacağınıza inanıyorum.
Move dili, byte kodunu çalıştırmadan önce kod birimlerini doğrular. Doğrulama süreci 4 adıma ayrılır ve bu açık reference_safety adımında ortaya çıkar.
Move'daki referans güvenliği
Move dili iki tür referansı destekler: değiştirilemez referans (&) ve değiştirilebilir referans (&mut). Değiştirilemez referans, yapıdan veri okumak için kullanılırken, değiştirilebilir referans veriyi değiştirmek için kullanılır. Uygun referans türlerini kullanmak, güvenliğin korunmasına ve okuma modüllerinin tanınmasına yardımcı olur.
Move'un referans güvenliği modülünde, fonksiyonlar bazında temel blokların bytecode talimatları taranarak tüm referans işlemlerinin geçerliliği doğrulanır. Referans güvenliğini doğrulama süreci, temel blokların yürütülmesi, son durumların üretilmesi, önceki ve sonraki durumların birleştirilmesi gibi adımları içerir.
Açık Analizi
Açık, güvenlik modülünü referans alan join_ fonksiyonunda ortaya çıkmaktadır. Fonksiyon parametre uzunluğu ile yerel değişken uzunluğunun toplamı 256'dan büyük olduğunda, local değişkenleri u8 tipi ile temsil edildiği için tam sayı taşması meydana gelir.
Move'un locals sayısını kontrol eden bir süreci olmasına rağmen, check bounds modülünde yalnızca locals kontrol edilmiştir, parametre uzunluğu dahil edilmemiştir. Geliştiricilerin parametreler ve yerel değerlerin toplamını kontrol etmesi gerektiğini fark ettikleri anlaşılıyor, ancak kod yalnızca yerel değişkenlerin sayısını kontrol etmiştir.
Tam Sayı Taşmasından DoS Saldırısına
Bu tam sayı taşma açığını kullanarak, saldırgan bir döngü kod bloğu oluşturabilir ve bloğun durumunu değiştirebilir. execute_block fonksiyonu tekrar çalıştırıldığında, eğer talimatın erişmesi gereken indeks yeni AbstractState locals haritasında yoksa, DoS saldırısına yol açacaktır.
reference safety modülünde, MoveLoc/CopyLoc/FreeRef gibi işlem kodları bu durumu tetikleyebilir. Örneğin, copy_loc fonksiyonunda, LocalIndex mevcut değilse panic ile sonuçlanabilir ve bu da tüm düğümün çökmesine neden olabilir.
Açıkların Yeniden Üretilmesi
Bu güvenlik açığını git'te aşağıdaki PoC kodu ile yeniden oluşturabilirsiniz:
hareket public fun test(a: u64, b: u64, c: u64, d: u64) { let x = 0; döngü { if (x == 1) { kırmak }; x = x + 1; } }
DoS'u tetikleme adımları şunlardır:
execute_block fonksiyonu ilk kez çalıştırıldığında, parameters ve locals her ikisi de SignatureIndex(0) olarak ayarlandığı için num_locals 264 oldu. join_ fonksiyonu çalıştırıldıktan sonra, yeni locals haritasının uzunluğu 8'e dönüştü.
execute_block fonksiyonu ikinci kez çalıştırıldığında, move kodunun ilk komutu olan copyloc(57) çalıştırılır. Bu noktada locals yalnızca 8 uzunluğundadır, offset 57 mevcut değildir, bu nedenle get(57).unwrap() fonksiyonu None döndürür ve nihayetinde panic'e neden olur.
Özet
Bu açık, mutlak güvenli bir kodun olmadığını gösteriyor. Move dilinin kod yürütmeden önce statik bir kontrol gerçekleştirmesine rağmen, yine de taşma açıkları tarafından aşılabilir. Bu, kod denetiminin önemini bir kez daha vurguluyor.
Move dili için, beklenmeyen durumların önlenmesi amacıyla çalışma sırasında daha fazla kontrol kodu eklenmesini öneriyoruz. Şu anda Move, güvenlik kontrollerini doğrulama aşamasında gerçekleştiriyor, ancak doğrulama aşıldığında, çalışma aşamasındaki yetersiz güvenlik güçlendirmesi 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 bulguyu paylaşacağız.