An Analysis of Modern Web Security Vulnerabilities Inside WebAssembly Applications

이 논문은 웹어셈블리 (WASM) 모듈 내의 바이너리 취약점이 웹 애플리케이션의 보안 메커니즘을 무력화하여 SQL 주입이나 XS-Leaks 와 같은 웹 보안 위협으로 이어질 수 있음을 증명하고, 이를 완화하기 위한 최선의 실천 방안과 방어 전략을 제시합니다.

Lorenzo Corrias, Lorenzo Pisu, Davide Maiorca, Giorgio Giacinto

게시일 Wed, 11 Ma
📖 3 분 읽기☕ 가벼운 읽기

Each language version is independently generated for its own context, not a direct translation.

이 논문은 **"웹어셈블리 (WebAssembly, WASM)"**라는 최신 웹 기술이 가진 숨겨진 위험에 대해 경고하는 연구입니다.

쉽게 비유하자면, 이 논문은 **"웹사이트에 '초고속 엔진'을 달았더니, 그 엔진이 고장 나면서 차 전체가 불타버리는 일이 생길 수 있다"**는 이야기입니다.

자세한 내용을 일상적인 언어와 비유로 설명해 드릴게요.


1. 배경: 왜 웹어셈블리 (WASM) 가 필요한가요?

과거 웹사이트는 '자바스크립트'라는 언어로만 만들었습니다. 하지만 자바스크립트는 무거운 작업 (예: 3D 게임, 고화질 영상 편집) 을 할 때 조금 느립니다.
그래서 개발자들은 C 나 C++ 같은 강력한 언어로 만든 프로그램을 웹사이트에서도 바로 실행할 수 있게 만들었는데, 이것이 바로 **웹어셈블리 (WASM)**입니다.

  • 비유: 웹사이트를 '택시'라고 생각해보세요. 자바스크립트는 일반 택시이고, WASM 은 '포뮬러 1 레이싱카'입니다. 레이싱카는 훨씬 빠르고 강력하지만, 조금만 잘못 다루면 큰 사고가 납니다.

2. 문제: 레이싱카의 치명적인 결함

이 논문은 레이싱카 (WASM) 가 가진 치명적인 약점을 지적합니다. WASM 은 원래 C/C++ 언어로 만들어졌기 때문에, **기존의 C/C++ 프로그램이 가진 '고장 (버그)'**을 그대로 가지고 옵니다.

  • 주요 고장 유형:
    • 버퍼 오버플로우 (Buffer Overflow): 물통에 물을 너무 많이 부으면 넘쳐서 바닥을 적십니다. 프로그램도 메모리 공간보다 많은 데이터를 넣으면, 옆에 있는 중요한 데이터까지 덮어씌웁니다.
    • Use After Free (사용 후 해제): 쓰레기통에 버린 쓰레기를 다시 꺼내 쓰는 것 같습니다. 메모리를 비운 뒤에도 그 주소를 계속 쓰려고 하면, 그 자리에 다른 쓰레기 (해커의 악성 코드) 가 들어와서 엉뚱한 일이 일어납니다.

3. 핵심 발견: "엔진 고장이 차 전체를 망친다"

기존에는 "WASM 이 고장 나면 WASM 안에서만 문제가 생기겠지?"라고 생각했습니다. 하지만 이 논문은 WASM 의 고장이 웹사이트 전체를 해치는 새로운 방식을 발견했습니다.

해커는 WASM 의 고장을 이용해 웹사이트를 공격합니다. 마치 레이싱카의 브레이크가 고장 나서, 그 충격으로 차 안의 운전석 (웹사이트) 을 파괴하는 것과 같습니다.

구체적인 공격 사례 3 가지:

① SQL 주입 (데이터베이스 해킹)

  • 상황: 웹사이트는 "이름을 입력하세요"라고 물어봅니다. WASM 은 이 이름을 데이터베이스에 저장합니다.
  • 공격: WASM 내부의 메모리 고장을 이용해, "이름"을 저장하는 공간에 "비밀번호를 모두 삭제해라"라는 명령을 덮어씁니다.
  • 결과: 웹사이트는 "안전하게 준비된 명령"을 실행한다고 믿고 있지만, 실제로는 해커가 명령을 바꿔치기한 것입니다. 안전장치가 무용지물이 됩니다.

② 서버 측 템플릿 주입 (SSTI - 서버 장악)

  • 상황: WASM 이 "안전한 인증 번호 (Nonce)"를 만들어 웹사이트에 보냅니다. 웹사이트는 이 번호를 믿고 HTML 을 만듭니다.
  • 공격: 해커는 WASM 의 메모리 고장을 이용해, 그 인증 번호 자리에 "서버를 해킹하는 코드"를 심어둡니다.
  • 결과: 웹사이트는 "안전한 번호"라고 믿고 그 코드를 실행해버립니다. 웹사이트가 해커의 손에 넘어갑니다.

③ XS-Leaks (시간을 이용한 정보 탈취)

  • 상황: 해커는 직접 데이터를 훔쳐볼 수 없습니다. 하지만 WASM 이 특정 작업을 할 때 걸리는 '시간'을 재면 됩니다.
  • 공격: 해커는 WASM 에 "특정 패턴을 찾아라"라는 복잡한 명령을 보냅니다. 만약 비밀번호가 맞으면 WASM 이 더 오래 걸립니다.
  • 결과: 해커는 "아, 0.5 초 걸렸네? 비밀번호 앞글자가 'A'구나"라고 추측합니다. 시간 차이를 이용해 비밀번호를 하나씩 알아냅니다.

4. 결론 및 해결책: 어떻게 방어할까요?

이 논문은 **"WASM 이라고 해서 완전히 안전하다고 생각하면 안 된다"**고 말합니다. WASM 은 C/C++ 의 위험한 버그를 그대로 물려받기 때문입니다.

개발자를 위한 조언 (방어 전략):

  1. 신뢰하지 마세요: 자바스크립트와 WASM 이 데이터를 주고받을 때, "이 데이터가 안전할 거야"라고 믿지 말고 반드시 다시 검사하세요. (예: 숫자가 너무 크지 않은지, 글자 수가 너무 많지 않은지)
  2. 문제를 미리 잡으세요: 프로그램을 만들 때 (컴파일할 때), 고장을 미리 잡아주는 도구들을 켜두세요. 속도가 조금 느려질 수 있지만, 해킹 위험은 훨씬 줄어듭니다.
  3. 최소한의 권한: WASM 이 웹사이트와 대화할 수 있는 창구 (인터페이스) 를 최소한으로 줄이세요. 문이 적을수록 해커가 들어올 틈이 적습니다.

요약

이 논문은 **"빠른 속도 (WASM) 를 쫓다가, 안전장치 (보안) 를 잃어버리면 큰일 난다"**는 교훈을 줍니다.
웹어셈블리는 강력한 도구이지만, 개발자들은 그것이 가진 '고장 난 엔진'의 위험성을 인지하고, 웹사이트 전체를 보호하기 위한 이중, 삼중의 안전장치를 마련해야 한다고 강조합니다.