Skip to content

스폰 implementer 안전 self-verify — preload 차단 검증 래퍼 (node --check) #170

Description

@pdw96

배경

#167(PR #169)에서 스폰 implementer 의 self-verify 갭을 다루며 "검증 도구 자동허용"(Part A)을 검토했으나, Bash(node --check:*) allowlist 가 RCE 채널임이 실측 확인되어 폐기했다:

  • node preload 플래그(--require/--import/--experimental-loader)는 --check(구문검사 전용)에서도 코드를 실행한다.
  • node --check --import "data:text/javascript,…" ok.js파일 0건으로 인라인 실행, claude 가 prefix 규칙으로 무프롬프트 자동승인(실측 node v24.16.0 / claude 2.1.195).
  • prefix allow 규칙은 --require/--import/--loader 부정 제약을 표현 불가 → 구조적으로 안전화 불가.

→ 현재 implementer 는 read-only 빌트인(Read/Grep/Glob)으로만 검토하고, JS 구문/타입 self-verify 는 못 한다(품질·신뢰 갭은 by-design 잔존). 실제 verify(typecheck/lint/test)는 Fleet 이 verify/run.ts 로 별도 실행하므로 정합성 자체는 보장되나, implementer 가 편집 중 즉석 sanity-check 를 못 해 수동 코드리뷰로만 납품하는 한계가 남는다.

제안 — preload 차단 검증 래퍼

self-verify 가 실수요로 떠오르면, 안전한 유일 경로는 Fleet 번들 검증 래퍼다:

  • Fleet 이 번들한 스크립트(예: resources/verify-syntax.mjs)를 절대경로로 두고, --allowedTools "Bash(node <abs-wrapper>:*)" 만 허용.
  • 래퍼는 argv 를 sanitize: 인자는 워크스페이스 내 파일 경로 1개만 허용(선행 - 플래그·다중 인자·경로탈출 거부), 그 후 내부에서 preload 없이 node --check <file>(또는 vm 파싱)을 수행.
  • prefix 매칭상 node --import … <wrapper>node <wrapper> 프리픽스에 매칭되지 않아 차단되고, node <wrapper> --import … 는 래퍼가 인자 검증으로 거부 → preload 우회 불가.
  • 컴파운드(&&·|·;)는 claude 가 sub-command 분해 매칭, $() 명령치환은 검증단계서 거부(둘 다 #167서 실측 안전).

우선순위 / 트리거

tier:later — 트리거 = (a) dogfood 에서 implementer 자기검증 부재가 반복적 품질 저하로 실측되거나, (b) 다중 언어 워크스페이스에서 즉석 sanity-check 수요가 분명해질 때. 그 전엔 by-design 갭 유지.

수용 기준

참조

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:orchestrator오케스트레이터 실행/계획 루프enhancementNew feature or requesttier:later보류 (강등·블록·저가치)type:security보안 관련

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions