Skip to content

fs 능력 유출 경로의 잔여 형태 — 정적 가드의 한계 정리와 남은 형태 봉쇄 #286

Description

@pdw96

PR #282ApprovalGate 예외 열거를 기계 계약으로 만들면서 fs 능력 경계를 여덟 층으로 닫았다(ADR 없음 — AGENTS.md 「예외 = 엔진 인프라 쓰기」 불릿이 계약 본문). Codex 리뷰 17 라운드를 거치며 「이름 열거 → 형태 금지」 전환을 다섯 번 했고, 매 라운드 지적은 실제 우회였다.

이 이슈는 #282 에서 의도적으로 남긴 것을 추적한다. #282 의 목적은 「예외 열거가 실제와 어긋나지 않게 한다」였지 적대적 샌드박스가 아니고, 레포는 tools/(#174)에서 이미 "이 가드는 회귀 트립와이어이지 적대적 샌드박스가 아니다" 로 선을 그어뒀다.

1. Codex 17R 이 짚은 잔여 형태 2건 (실체 확인됨)

1-1. 내보내는 컨테이너의 중첩 항목

export const raw = { nested: { writeFileSync } }

현재 셀렉터는 ExportNamedDeclaration > VariableDeclaration > VariableDeclarator > ObjectExpression > Property[value.type=…]직계 자식만 본다. 중첩 깊이 무제한이므로 자손 결합자로 바꾸는 것이 후보이나, 정상 상수(중첩 설정 객체가 식별자를 참조하는 경우)의 마찰이 얼마나 되는지 먼저 측정해야 한다 — #282 에서 얕은 형태만으로도 이미 ignored-baseline.ts 에 인라인 예외가 필요했다.

1-2. CommonJS 전역 module 을 통한 로더

// .cjs 코어 모듈에서
module.constructor._load('node:fs')  // 쓰기 가능한 fs 반환

#282node:module import 를 막았지만 CJS 는 module 을 전역으로 준다. 후보: _load·_resolveFilename 을 로더 이름 집합에 추가, 또는 코어에서 CommonJS 모듈 자체를 기계적으로 배제. 후자가 형태 기반이라 더 낫지만 확장자 사각(#282 8R)과의 상호작용을 봐야 한다.

2. 정적 분석의 원리적 한계 (봉쇄 대상이 아니라 명시 대상)

할 일

  • 1-1·1-2 각각 정상 코드 마찰 비용을 먼저 측정하고, 비용 0 이면 형태 금지로 닫는다
  • 비용이 0 이 아니면 「닫지 않고 한계로 명시」를 선택하고 그 판단 근거를 AGENTS.md 에 남긴다
  • 2 의 한계 목록을 AGENTS.md 계약 불릿에 명시적으로 적는다(현재는 소스 주석에만 있다)
  • 이 가드 계열의 정지 조건을 문서화한다 — 「형태를 하나 더 막을 때마다 정상 코드 마찰을 측정하고, 마찰이 생기면 한계로 전환한다」

배경

Metadata

Metadata

Assignees

Labels

area:orchestrator오케스트레이터 실행/계획 루프tier:next착수 대기 (다음 백로그주)type:security보안 관련

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions