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
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은 아래와 같다.

Test
- BOF

BOF 취약점을 트리거하였을 때, 예상과 달리 BOF 취약점이 발생하지 않고, 정상적으로 처리되는 모습을
확인 가능했다.
- FSB

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

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

UAF 취약점을 트리거하였을 때, UAF 취약점이 발생해 이미 free 한 문자열이 출력되는 것을 확인 가능했다.
결론
본 글에서 테스트 한 방법으론 BOF, FSB, OOB, UAF 취약점 중, FSB, UAF 바이너리 취약점을 브라우저에서 트리거하는 것이 실제로 가능함을 입증하였다.
다만 본 글에서 안내하는 방법 외에 다른 방식으로 BOF, OOB 등의 취약점이 Wasm에 존재하지 않다는 것을 의미하는 것은 아니며, 전통적인 바이너리 취약점이 부분적으로 발생한다는 점에서 다른 방식을 통해 BOF, OOB 취약점은 충분히 발생 가능함을 시사한다.
'Concept' 카테고리의 다른 글
| [JS] 자바스크립트 기본 개념 / 동기, 비동기 (2) | 2025.03.25 |
|---|---|
| [Wasm] Wasm 바이너리 취약점 테스트: Double Free, Integer Overflow (0) | 2025.03.01 |
| [Wasm] Dev-tool의 override 기능을 통한 웹 페이지 Crash (5) : figma.com의 OOM 에러 재현 (0) | 2025.03.01 |
| [Wasm] Dev-tool의 override 기능을 통한 웹 페이지 Crash (4) : STATUS_ACCESS_VIOLATION 에러의 재현, emcc 툴과 직접 파일 빌드 비교 (0) | 2025.03.01 |
| [Wasm] Wasm 브라우저에서 실행하기 (0) | 2025.03.01 |