Web montajı nasıl hacklenir


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.

Webassembly yapısı

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:

  1. 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.

  2. 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();
  });
};
  1. 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.

Fonksiyon testi

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ı analizi
  • wasm2c: Wasm’ı C koduna ayır
  • wasm2wat: Wasm’ı metin biçimine dönüştürün
  • wat2wasm: 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

  1. Statik analiz: WABT araçlarını kullanarak WASM dosya analizi
  2. Dinamik analiz: Tarayıcı Geliştirici Araçları aracılığıyla çalışma zamanı analizi
  3. Arayüz testi: JavaScript-Wasm arasında veri akışı analizi
  4. Bellek analizi: Doğrusal bellek erişim modeli doğrulaması

Makaleler

Referanslar



Source link