Concept

[Wasm] Wasm 바이너리 취약점 테스트: Double Free, Integer Overflow

wermut 2025. 3. 1. 14:34

 

이전 글에 이어 Wasm에서의 Integer Overflow, Double Free취약점을 테스트해 보았다.

 


 

Prob

 

 

 

 

https://github.com/f10vv3r/Wasm_Binary_Vulnerable_test

 

GitHub - f10vv3r/Wasm_Binary_Vulnerable_test

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

github.com

 

이전 글에 이어 Integer Overflow, DFB 취약점을 추가로 테스트하는 파일은 위와 같으며,  Wasm 컴파일 명령어와 수정된  C 코드는 아래와 같다.

 

// wasm_vuln.c

#include <limits.h>

EMSCRIPTEN_KEEPALIVE
void double_free() {
    printf("wasm dfb test\n");

    char *ptr = (char *)malloc(32);
    if (!ptr) {
        printf("malloc failed\n");
        return;
    }

    free(ptr); 
    free(ptr);  

    printf("test complete\n");
}

EMSCRIPTEN_KEEPALIVE
void integer_overflow( ) {
    printf("wasm integer overflow  test\n");

    int max = INT_MAX;
    int min = INT_MIN;

    printf("INT_MAX: %d\n", max);
    printf("INT_MIN: %d\n", min);

    int overflow = max + 1;
    printf("Overflow (INT_MAX + 1): %d\n", overflow);

    int underflow = min - 1;
    printf("Underflow (INT_MIN - 1): %d\n", underflow);
}

 

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

 

위 소스코드에선 DFB, Integer Overflow,  총 2가지의 취약점을 유도하였다.

 

 python3 -m http.server 8000

 

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

 


1. DFB

DFB 취약점을 트리거한 모습

 

DFB 취약점을 트리거하였을 때, 예상과 달리 큰 문제없이 페이지가 정상 작동되는 것을 확인 가능했다.

 

2. Integer Overflow

Integer Overflow 취약점을 트리거한 모습

 

Integer Overflow 취약점을 트리거하였을 때, Overflow취약점이 발생하는 것을 확인 가능했다.

 


 

결론

 

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

 

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