2025. 1. 17. 15:10ㆍProject/Javascript isolation bypass
javascript 격리 기술에 대해서 설명해보고자 한다.
client 혹은 server 단에서 자바스크립트를 많이 사용한다. 이때 많은 라이브러리를 참조하는데, 참조한 라이브러리가 안전한 라이브러리인지 판단하기 힘들다. 예시로 참조한 라이브러리가 오류로 무한 로딩되는 문제가 있는데 이를 서버단의 코드로 import하여 사용했다간 서버가 멈출 수 있다. 이외에도 악의적으로 악성 라이브러리가 존재하여 서버 단을 망가트리는 코드가 존재할 수 있다.
이러한 경우를 방지하기 위해서 javascript 격리 기술을 사용한다. javascript 격리 라이브러리는 많이 존재한다. isolate-vm, vm2 등등이 있다. 방법에 따라 달라지는데 런타임 격리 기술과 언어 기반 격리 기술이 있다.
이런한 격리 기술 알아보기전에 격리 기술들이 무엇을 막아야 하는지 알아보자.
Security objective
막아야 하는 부분은 총 4가지로 보여진다.
1. 내장 객체 변경(호스트의 내장 객체와 게스트의 내장 객체가 분리되어야 함)
2. 높은 권한의 API(require 함수) 게스트에서 제한
3. 게스트 코드로 인한 호스트 코드 지연 방지 : 무한루프를 이용 등
4. 게스트 코드로 인한 호스트 코드 중지 방지 : 크래쉬를 이용 등
위와 같이 4가지는 게스트 코드가 호스트 코드에 영향을 줄 수 있는 부분이고, 이러한 부분을 적절히 막아야 한다.
그렇다면 어떻게 막는지 런타임 격리 기술과 언어기반 격리 기술을 살펴보면 알아보겠다.
런타임 격리 기술
런타임 격리기술은 프로세스, 쓰레드 등을 나뉜 뒤 실행시키는 방식으로 호스트 코드와 게스트 코드를 격리시킨다. 만약 호스트 코드와 게스트 코드간의 상호작용이 필요한 경우, 객체가 상용작용하는 것을 허용하기 보다는 결과값을 복사해서 넘겨주는 방식으로 격리를 한다. 이렇게 되다보면 개발자들은 개발하기 힘들어지는게 사실이고, 언어기반 격리 기술에 비해 런타임 격리 기술은 많이 사용되지 않는다 .
아래는 런타임 격리 기술이 방어하는 목록이다.
1. 내장 객체 변경(호스트의 내장 객체와 게스트의 내장 객체가 분리되어야 함)
2. 높은 권한의 API(require 함수) 게스트에서 제한
3. 게스트 코드로 인한 호스트 코드 지연 방지 : 무한루프를 이용 등
4. 게스트 코드로 인한 호스트 코드 중지 방지 : 크래쉬를 이용 등
언어 기반 격리 기술
언어 기반 격리 기술을 사용하여는 다양한 샌드박스들은 아래 취약점을 대체적으로 고려하지 않았다.
3. 게스트 코드로 인한 호스트 코드 지연 방지 : 무한루프를 이용 등
4. 게스트 코드로 인한 호스트 코드 중지 방지 : 크래쉬를 이용 등
그리고 다양한 언어 기반 격리 기술들은 아래의 취약점을 방어하기 위해서 VM과 같은 내장 라이브러리들을 사용하였다. 이에 샌드박스 탈출 취약점을 알기 위해서 VM과 같은 라이브러리를 살펴볼 필요가 있다.
일단 아래는 언어기반 격리 기술이 방어하는 목록이다.
1. 내장 객체 변경(호스트의 내장 객체와 게스트의 내장 객체가 분리되어야 함)
2. 높은 권한의 API(require 함수) 게스트에서 제한
VM(node.js : version 14)
VM 모듈은 nodejs 어플리케이션 내부에 가상머신 컨텍스트로 스크립트를 실행하는 환경을 제공합니다. 주요 장점 중 하나는 보다 안전한 환경에서 신뢰되지 않은 코드(Untrusted Code)를 실행하게 만들 수 있다는 점입니다. (물론 완벽히 방어를 하지 않고 방어를 위한 라이브러리가 아니다) VM 모듈은 가상머신 내 샌드박스 환경으로 코드를 실행시켜 실제 호스트 시스템과 메인 스크립트에는 접근하는 위험을 선제적으로 방어할 수 있습니다.
이를 구체적으로 이해하기 위해서 아래 소스코드를 보면 이해할 수 있다. 파일 시스템 접근, 메인 프로세스 접근 자체가 내부 샌드박스에서는 진행되지 않는다.
VM의 원리
VM 모듈은 자바스크립트를 코드를 다른 context에서 작동하게 만든다. 이는 다시 말해, JS 코드가 다른 전역 객체를 가진다.
몇 가지 테스트 해본 결과 다음과 같다.
1. 내장 객체 변경(호스트의 내장 객체와 게스트의 내장 객체가 분리되어야 함)
위의 원리를 지키기 위해서 객체를 분리하였다.
2. 높은 권한의 API(require 함수) 게스트에서 제한
위의 원리를 지키기 위해서 객체 및 함수를 삭제 혹은 접근 제안 하였다.
VM bypass
아래 사진은 VM을 bypass 하는 코드이다.
일단 vm은 방어를 위한 라이브리가 아니다.!! 그렇기에 vm에 membrane(추가적인 방어막)을 덮어씌운 라이브러리가 존재한다. 그것 vm2이다.
참고
https://nodejs.org/api/vm.html#what-does-it-mean-to-contextify-an-object
VM (executing JavaScript) | Node.js v23.6.0 Documentation
VM (executing JavaScript)# Source Code: lib/vm.js The node:vm module enables compiling and running code within V8 Virtual Machine contexts. The node:vm module is not a security mechanism. Do not use it to run untrusted code. JavaScript code can be compiled
nodejs.org
https://core-research-team.github.io/2023-03-29/Nodejs-VM-Sandbox-Breakout
Nodejs VM Sandbox Breakout
라온화이트햇 핵심연구2팀 유병일
core-research-team.github.io
https://javascript.plainenglish.io/node-js-vm-5727c269f8ec
Exploring the Possibilities of Node’s Virtual Machine Module
Understanding context, execution, and use cases
javascript.plainenglish.io
'Project > Javascript isolation bypass' 카테고리의 다른 글
VM2와 문제점 (0) | 2025.01.18 |
---|