Clear Sky Science · tr

Geçerli alt ikili dosyalar üretebilmek için yığın tabanlı statik WebAssembly ikili dilimleme ve mutasyon

· Dizine geri dön

Kodu daha küçük parçalara ayırmanın önemi

Modern web uygulamaları giderek daha fazla WebAssembly’e dayanıyor; bu, C, C++ veya Rust ile yazılmış programların tarayıcılarda, bulutlarda ve hatta küçük gömülü cihazlarda neredeyse yerel hızda çalışmasını sağlayan kompakt, makine-benzeri bir dil. Daha fazla sistem WebAssembly çalıştırdıkça, bu çalıştırma motorlarını hatalar ve güvenlik açıkları için güvenli ve kapsamlı biçimde test edecek yöntemlere ihtiyaç duyuyoruz. Gerçek dünya WebAssembly programları büyük, karmaşık ve yeterli çeşitlilikte toplaması zor. Bu makale, mevcut WebAssembly programlarını birçok küçük, kendi kendine yeten mini-programa bölmenin ve ardından bunları akıllıca değiştirmenin yeni bir yolunu tanıtıyor. Bunun sonucu, bugün kullanılan araçlardan çok daha etkili biçimde WebAssembly motorlarını zorlama imkânı veren, geçerli ve küçük boyutlu zengin bir test örnekleri kaynağıdır.

Figure 1
Figure 1.

Tek bir büyük programdan birçok küçük program oluşturmak

Yazarlar, rastgele WebAssembly kodu üretmenin neredeyse hiç işe yaramadığı gözleminden hareket ediyor: dil sıkı biçimde denetleniyor, özellikle geçici değerleri tutan yığının kullanımı söz konusu olduğunda. Baştan kod oluşturmak yerine, mevcut bir "temel" WebAssembly ikiliden başlıyorlar ve program dilimleme adlı bir teknik kullanıyorlar. Bir dilim, belirli bir ilgi noktasını —örneğin bir fonksiyon içindeki belirli bir talimatı— etkileyen kod parçalarını koruyan azaltılmış bir program versiyonudur. Veri akışı, bellek kullanımı ve kontrol akışını o noktadan geriye doğru izleyerek, yöntem hesaplama açısından hâlâ “anlamlı” olan kompakt bir parça çıkarıyor; rastgele gürültü olmaktan ziyade.

Görünmez yığını dengede tutmak

WebAssembly programları katı bir yığın disiplinine dayanır: her talimat değerleri poplar ve pushlar, yapılandırılmış bloklar ve dallanmalar bittiğinde yığını tam olarak beklenen biçimde bırakmalıdır. Programın parçalarını naifçe kesmek bu disiplini neredeyse her zaman bozar ve sonucu geçersiz kılar. Önceki çalışmalar dilimleri sabit desenlerde dolgu yapan kukla talimatlarla onarıyordu; bu onları çalıştırılabilir tutuyordu fakat çeşitliliği sınırlıyordu. Bu makale bunun yerine özel bir yığın-denge düzeltme algoritması sunuyor. Algoritma her dilim içindeki kontrol akışını analiz ediyor, dallanma ya da blok sonlarının beklenen yığın biçimini bozduğu yerleri buluyor ve gereksiz değerleri düşüren ve doğru türde yeni değerler sentezleyen uyarlanmış talimat dizilerini ekliyor. Bu küçük “aletler” doğruluğu geri getirirken basit dolgudan çok daha zengin talimat desenlerine izin veriyor.

Kontrollü karmaşıklıkla bütün mini-programlar oluşturmak

Düzeltilmiş bir dilim hâlâ yalnızca bir fonksiyon gövdesidir ve o fonksiyon başkalarını çağırabilir veya küresel değişkenler ve lineer bellek gibi modül düzeyindeki özelliklere bağlı olabilir. Bu nedenle yazarlar yöntemlerini, çalıştırılabilir tam mini-modüller oluşturacak şekilde genişletiyorlar. Rastgele seçilmiş bir giriş fonksiyonundan başlayarak, çağrılan her fonksiyonu kullanıcı tarafından seçilen bir "çağrı derinliği"ne kadar tekrar tekrar dilimliyor ve düzeltiyorlar; bu derinlik, korunacak çağrı katmanlarının sayısını kontrol ediyor. Bu derinliğin ötesinde çağrılar, daha fazla kod çekmeden doğru sayıda argüman ve sonuç taklidi yapan kısa vekillerle değiştiriliyor. Sistem ayrıca WebAssembly modülünün çevresindeki bölümleri—tipler, tablolar, bellek vb.—yeniden inşa ediyor; böylece üretilen her ikili dosya kendi içinde eksiksiz oluyor ve standart araçlar ve çalışma zamanları tarafından doğrudan çalıştırılabiliyor.

Figure 2
Figure 2.

Özenli mutasyonla çeşitlilik katmak

Dilimleme ile bile, birçok üretilmiş ikili hâlâ ana programlarına benzer kalır. Kapsamı genişletmek için yazarlar, her fonksiyon boyunca geriye doğru çalışan bir mutasyon aşaması tanıtıyorlar. Girdileri tüketen talimatlar için algoritma rastgele yeni bir sonuç türü seçiyor, o türü üreten ikame talimatlar buluyor ve sonra tüm zincirin uyumlu kalması için bu talimatın girdilerini sağlayan önceki talimatları özyinelemeli olarak değiştiriyor. Bu, yığın doğruluğunu korurken hesaplamayı yeniden şekillendiriyor. Gerçek dünya WebAssembly programlarından oluşan bir temel küme ile karşılaştırıldığında, mutasyona uğramış ikililer çok daha fazla farklı talimat deseni içeriyor ve vektör işlemleri gibi nadiren görülen özelliklerin çok daha yoğun kullanımını sağlıyor; bu özellikler WebAssembly motorlarının tam uygulamasını test etmek için önemlidir.

Deneyler ne gösteriyor

Yaklaşımlarını test etmek için yazarlar, neredeyse WebAssembly 2.0 standardının tamamını kapsayan yaklaşık 17.000 satır Python uygulamışlar. Binlerce gerçek dünya ikilisinden oluşan büyük bir genel veri kümesi kullanarak, tekniklerinin programları rutin olarak orijinal talimat sayısının bir kesrine küçültebildiğini—çoğunlukla en büyük temel boyutların %40’ının altına—ve mutasyon etkinleştirildiğinde %99’un üzerinde bir durumda bunları geçerli tuttuğunu gösterdiler. Yöntem hızlı çalışıyor; makul boyuttaki üretilen bir ikili başına tipik olarak bir saniyenin çok altında sürüyor ve hem talimat türlerinin çeşitliliğini hem de gözlemlenen benzersiz talimat dizilerinin sayısını önemli ölçüde artırıyor. Pratik açıdan bu, test uzmanları ve güvenlik araştırmacılarının mütevazı bir WebAssembly program kümesini küçük, geçerli ve çeşitli bir ikili setine dönüştürerek fuzzing, farklılaştırmalı test ve regresyon testi için ideal hale getirebileceği anlamına geliyor.

Bu, WebAssembly’nin güvenliğini nasıl artırır

Günlük ifadeyle makale, WebAssembly için akıllı bir “kod rafineri”sini tarif ediyor: büyük programları birçok daha küçük, anlamlı parçaya ayırıyor, dilin sıkı kurallarına hâlâ uymalarını sağlayacak şekilde otomatik olarak onarıyor ve ardından talimat kümesinin olağandışı köşelerini keşfetmek üzere yeniden şekillendiriyor. Bu mini-programlar gerçekçi ama kompakt kaldıkları için hızlı ve çok sayıda çalıştırılabiliyor; bu da WebAssembly çalıştıran yazılımlarda ince hata veya güvenlik sorunlarını ortaya çıkarma ihtimalini artırıyor. WebAssembly tarayıcılardan bulutlara ve cihazlara yayıldıkça, geçerli ve çeşitli test ikililerinin sistematik üretimi bu ekosistemi sağlam ve güvenli tutmak için önemli bir araç sunuyor.

Atıf: Choi, G., Jeon, S. Stack-based static WebAssembly binary slicing and mutation for generating valid sub-binaries. Sci Rep 16, 10910 (2026). https://doi.org/10.1038/s41598-026-45837-y

Anahtar kelimeler: WebAssembly testi, program dilimleme, ikili mutasyon, yazılım güvenliği, çalışma zamanı doğrulaması