Concept

[Wasm] Wasm 바이너리 취약점 테스트: BOF, FSB, OOB, UAF

wermut 2025. 3. 1. 14:33

 

Wasm

 

WebAssembly(이하 Wasm)는 C/C++ 혹은 Rust 등으로 컴파일되어 JS와 함께 사용되는 저수준 언어로, JS의 부족한 속도를 Wasm을 통해 크게 향상할 수 있다. 

 

이 Wasm은 C/C++ 등의 프로그래밍 언어를 컴파일한 언어이기에 Wasm을 사용하는 웹 사이트에선 웹상에서 발생 가능한 취약점(XSS, SQL Injection 등) 뿐 아닌 전통적인 바이너리 취약점(Bof, FSB 등)이 발생 가능할 수 있다.

 

따라서 전통적인 메모리 관련 취약점 중 Buffer Overflow(BOF), Format String Bug(FSB), Out Of Bound(OOB), Use After Free(UAF) 취약점을 의도적으로 유도하는 C언어 소스코드를 Wasm으로 컴파일하여 Wasm환경에서 해당 취약점들이 트리거 될 수 있는지를 확인해 보았다.

 


 

Prob

 

Prob.zip
0.04MB

 

 

 

https://github.com/f10vv3r/Wasm_Binary_Vulnerable_test.git

 

GitHub - f10vv3r/Wasm_Binary_Vulnerable_test

Contribute to f10vv3r/Wasm_Binary_Vulnerable_test development by creating an account on GitHub.

github.com

 

최종적으로 작성한 파일은 위와 같으며, 바이너리상의 취약점을 트리거하는 C소스코드와 Wasm 컴파일 명령어는 아래와 같다.

 

// wasm_vuln.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
void buffer_overflow(char* input) {
    printf("wasm bof test\n");

    char buffer[8];
    strcpy(buffer, input);
    printf("%s", buffer);
    printf("\n");
}

EMSCRIPTEN_KEEPALIVE
void format_string_bug(char* input) {
    printf("wasm fsb test\n");

    printf(input);
    printf("\n");
}

EMSCRIPTEN_KEEPALIVE
void out_of_bound(int input) {
    printf("wasm oob test\n");

    char buffer[8] = "CERTCERT";
    printf("%c", buffer[input]);
    printf("\n");
}

EMSCRIPTEN_KEEPALIVE
void use_after_free(char* input) {
    printf("wasm uaf test\n");

    char *ptr = (char*)malloc(8);
    strcpy(ptr, input);
    free(ptr);  

    printf("%s", ptr);  
    printf("\n");
}

 

emcc wasm_vuln.c -o wasm_vuln.js \
    -sEXPORTED_FUNCTIONS="['_buffer_overflow', '_format_string_bug', '_out_of_bound', '_use_after_free']" \
    -sEXPORTED_RUNTIME_METHODS='["cwrap"]' \
    -sALLOW_MEMORY_GROWTH=1

 

위 소스코드에선 BOF, FSB, OOB, UAF, 총 4가지의 취약점을 유도하였다.

 

 python3 -m http.server 8000

 

위 명령어로 확인한 index.html은 아래와 같다.

index.html

 


 

Test

 

  1. BOF

BOF 취약점을 트리거한 모습

 

BOF 취약점을 트리거하였을 때, 예상과 달리 BOF 취약점이 발생하지 않고, 정상적으로 처리되는 모습을

확인 가능했다.

 

  1. FSB

FSB 취약점을 트리거한 모습

 

FSB 취약점을 트리거하였을 때, FSB 취약점이 제한적으로 발생하는 것을 확인 가능했다.

 

  1. OOB

OOB 취약점을 트리거한 모습

 

OOB 취약점을 트리거하였을 때, 예상과 달리 OOB 취약점이 발생하지 않고, 인덱스를 넘어선 입력엔 출력하지 않는 것을 확인 가능했다.

 

  1. UAF

UAF 취약점을 트리거한 모습

 

UAF 취약점을 트리거하였을 때, UAF 취약점이 발생해 이미 free 한 문자열이 출력되는 것을 확인 가능했다.

 


 

결론

 

본 글에서 테스트 한 방법으론 BOF, FSB, OOB, UAF 취약점 중, FSB, UAF 바이너리 취약점을 브라우저에서 트리거하는 것이 실제로 가능함을 입증하였다. 

 

다만 본 글에서 안내하는 방법 외에 다른 방식으로 BOF, OOB 등의 취약점이 Wasm에 존재하지 않다는 것을 의미하는 것은 아니며, 전통적인 바이너리 취약점이 부분적으로 발생한다는 점에서 다른 방식을 통해 BOF, OOB 취약점은 충분히 발생 가능함을 시사한다.