WebAssembly, Web’de ikili formatları işleyebilen düşük seviyeli bir montaj dilidir. Web’de çalışır, ancak yerel yürütme gibi hisseder ve hem yüksek performanslı işleme hem de hızlı uygulama elde etmek için JavaScript ile birlikte çalışabilir.
Bu belge, WebAssembly uygulamalarında güvenlik açıklarını test etme ve bulma yöntemlerini özetlemektedir.
Yapı
WebAssembly Genel Bakış
WebAssembly, Web’de ikili formatları işleyebilen düşük seviyeli bir montaj dilidir. JavaScript ile birlikte çalışır ve aşağıdaki özelliklere sahiptir:
- Yerli performans
- JavaScript ile birlikte çalışabilirlik
- Tarayıcı Sandbox ortamlarında güvenli yürütme
- C, C ++, pas, vb. Gibi çeşitli dillerden derlenebilir.
Temel Örnek
#include
#include
#define WASM_EXPORT __attribute__((visibility("default")))
WASM_EXPORT
int main(void) {
printf("Hello World\n");
}
/* External function that is implemented in JavaScript. */
extern void putc_js(char c);
/* Basic implementation of the writev sys call. */
WASM_EXPORT
size_t writev_c(int fd, const struct iovec *iov, int iovcnt) {
size_t cnt = 0;
for (int i = 0; i < iovcnt; i++) {
for (int j = 0; j < iov[i].iov_len; j++) {
putc_js(((char *)iov[i].iov_base)[j]);
}
cnt += iov[i].iov_len;
}
return cnt;
}
API belgeleri
Hack mekanizması
WebAssembly, her tarayıcıda aynı şekilde çalışır ve hem geleneksel ikili saldırıların hem de web hackleme tekniklerinin uygulanabileceği bir ortam oluşturur.
Güvenlik Test Noktaları
WebAssembly uygulamaları aşağıdaki güvenlik test noktalarına sahiptir:
- Geleneksel ikili ile ilgili saldırılar: BOF, FSB, OOB gibi bilinen teknikler uygulanabilir, ancak WebAssembly, ROP gibi yerleşik güvenlik mantığı oluşturma tekniklerine sahiptir.
- Web saldırıları: Mevcut Web saldırılarından elde edilen fark, web yüklerinin veya saldırı kodunun C katmanından geçebilmesidir.
- Dolaylı işlev çağrıları: XSS aracılığıyla JS kontrolü kazanırken, saldırı vektörleri önemli ölçüde genişler.
Kod Denetimi
WebAssembly dosyaları tipik olarak bir .wasm
uzatma ve ikili formatta sağlanır. Analiz için, bunları ayırmanız ve ilgili JavaScript kodunu birlikte incelemeniz gerekir.
Wasm dosyalarını bul
WebAssembly dosyalarını bulma yöntemleri:
-
JavaScript’te WebAssembly örneklerini bulmak: SWF ve Activex gibi, sonuçta JS’de ele alındığından, işlev veya adres bilgileri kodda kalır.
-
WebAssembly Yükleme İşlevlerini İzleme:
// Using instantiateStreaming
WebAssembly.instantiateStreaming(fetch('simple.wasm'), importObject)
.then(results => {
// Do something with the results!
});
// Using XMLHttpRequest
request = new XMLHttpRequest();
request.open('GET', 'simple.wasm');
request.responseType = 'arraybuffer';
request.send();
request.onload = function() {
var bytes = request.response;
WebAssembly.instantiate(bytes, importObject).then(results => {
results.instance.exports.exported_func();
});
};
- Tarayıcı Geliştirici Araçları: Kaynaklar sekmesindeki WASM dosyalarını doğrudan kontrol edebilirsiniz.
Wasm Dosya Yapısı
Wasm Dosya Başlıkları ile başlar .asm
:
hexdump -C fail.wasm
00000000 00 61 73 6d 01 00 00 00 01 85 80 80 80 00 01 60 |.asm...........`|
00000010 00 01 7f 03 82 80 80 80 00 01 00 06 81 80 80 80 |................|
00000020 00 00 07 8b 80 80 80 00 01 07 66 61 69 6c 5f 6d |..........fail_m|
00000030 65 00 00 0a 8d 80 80 80 00 01 87 80 80 80 00 00 |e...............|
00000040 41 01 41 00 6d 0b |A.A.m.|
00000046
Wasm ve Bilgi Bulun
WASM ayrışması için araçlar yükleme:
git clone --recursive https://github.com/WebAssembly/wabt
apt install clang # (if clang is not available)
make
Nesne dökümü:
./wasm-objdump -xd fail.wasm
fail.wasm: file format wasm 0x1
Section Details:
Type[1]:
- type[0] () -> i32
Function[1]:
- func[0] sig=0
Global[0]:
Export[1]:
- func[0] -> "fail_me"
Code Disassembly:
00003a :
000040: 41 01 | i32.const 1
000042: 41 00 | i32.const 0
000044: 6d | i32.div_s
000045: 0b | end
C’ye ayrıştırma:
./wasm2c fail.wasm
Canlı denetim
Devtools ile test edin
WebAssembly nesnelerine tarayıcının geliştirici araçlarında erişebilirsiniz:
// Check WebAssembly object
WebAssembly
// CompileError: function CompileError()
// Global: function Global()
// Instance: function Instance()
// LinkError: function LinkError()
// Memory: function Memory()
// Module: function Module()
// RuntimeError: function RuntimeError()
// Table: function Table()
// compile: function compile()
// compileStreaming: function compileStreaming()
// instantiate: function instantiate()
// instantiateStreaming: function instantiateStreaming()
// validate: function validate()
Fonksiyon testi
Test için JavaScript’ten WASM işlevlerini doğrudan arayabilirsiniz. Bu SWF veya Activex analiz yöntemleriyle aynıdır.
Büyük bir zayıflık
Bellek Güvenliği Sorunları
WebAssembly bellek güvenliği sağlarken, aşağıdaki güvenlik açıkları hala ortaya çıkabilir:
- Doğrusal bellekte arabellek taşması
- Tamsayı taşma/alt akış
- Boundsed Hafıza Erişimi
JavaScript Arayüz Güvenlik Açıkları
WASM ve JavaScript arasındaki arayüzde meydana gelebilecek güvenlik açıkları:
- Parametre geçişinde karışıklık yazın
- Yanlış giriş doğrulaması
- Paylaşılan bellek aracılığıyla bellek bozulması
SOP (aynı orijin politikası) sorunları
Fetch vb. Kullanarak WASM dosyalarını getirirken, tarayıcının SOP zorla uygulanır:
fetch('https://www.hahwul.com')
// Cross-origin request blocked: Same-origin policy blocks remote resources
Ancak, Wasm verileri JavaScript’e aktarabildiğinden:
- Potansiyel SOP bypass için CORS Uygulama Kapsamını Kontrol Edin
- Aynı etki alanında dosya yüklemesinin mümkün olup olmadığını doğrulayın (saldırgan yeniden yapılandırılmış WASM dosyalarını yükleme olasılığı)
Temel Araçlar
WABT (Webassembly İkili Araç Seti):
git clone --recursive https://github.com/WebAssembly/wabt
make
Dahil araçlar:
wasm-objdump
: WASM dosya yapısı analiziwasm2c
: Wasm’ı C koduna ayırwasm2wat
: Wasm’ı metin biçimine dönüştürünwat2wasm
: Metin formatını Wasm’a dönüştürün
Emis:
git clone https://github.com/emscripten-core/emsdk.git
cd emsdk
./emsdk install latest
./emsdk activate latest
Tarayıcı Devtools: Tüm büyük tarayıcılar WebAssembly Hata Ayıklamayı Destekleyin
Test Metodolojisi
- Statik analiz: WABT araçlarını kullanarak WASM dosya analizi
- Dinamik analiz: Tarayıcı Geliştirici Araçları aracılığıyla çalışma zamanı analizi
- Arayüz testi: JavaScript-Wasm arasında veri akışı analizi
- Bellek analizi: Doğrusal bellek erişim modeli doğrulaması