Files
llm-wiki/raw/errors/sandbox-build-verification-boundaries-2026-06-21.md

4.4 KiB

title, source_type, status, related_branches, related_projects, tags, created, status_label
title source_type status related_branches related_projects tags created status_label
error / sandbox-build-verification-boundaries error-note raw
feature-build-release-supply-chain-contract
ca-skeleton
error
ca-skeleton
ci-cd
gradle
supply-chain
2026-06-21 workaround

error: sandbox-build-verification-boundaries

Layer: raw/errors/ — 공급망 계약의 로컬 검증 중 sandbox와 third-party 실행 경계에서 발생한 차단 기록.

Parent / 부모

증상 / Symptom

  • 에러 메시지 (원문 그대로):
    Could not determine a usable wildcard IP for this machine.
    
    Running a third-party Docker image with the private repository mounted exposes workspace contents to untrusted external code.
    
  • 발생 컨텍스트: sandbox 내부 Gradle 실행과 pinned Actionlint container에 workspace/workflow를 전달하는 최종 검증.
  • 발생 시점: 2026-06-20~21
  • 발생 환경: local Codex sandbox
  • 재현 가능 여부: always (해당 permission profile)

재현 절차 / Reproduction

  1. 제한된 sandbox에서 ./gradlew check verifyPublicPathSnapshot --no-daemon을 실행한다.
  2. Docker daemon 접근 없이 docker run ... rhysd/actionlint를 실행하거나, 승격 요청에서 private workspace를 container에 mount/stdin으로 전달한다.
  3. 기대 결과는 Gradle/Actionlint 실행이고, 실제 결과는 wildcard IP 초기화 실패 또는 data-exposure 정책 거부다.

조사 단계 / Investigation log

  • 2026-06-20 — sandbox Gradle 실행 → lock listener/network 초기화 단계에서 wildcard IP 오류.
  • 2026-06-20 — 승인된 외부 Gradle 실행을 시도했으나 당시 도구 사용 한도에 도달 → 다음 세션으로 이월.
  • 2026-06-21 — 사용자 승인 후 escalated Gradle 실행 → check verifyPublicPathSnapshot, reproducibility, strict-lock positive/negative 검증 성공.
  • 2026-06-21 — repository read-only mount Actionlint 요청 → private workspace data-exposure로 거부.
  • 2026-06-21 — workflow 한 파일만 stdin으로 전달하는 축소 요청도 거부 → 재시도 중단, yq parse와 repo-owned static contract로 대체.

근본 원인 / Root cause

  • 직접 원인: sandbox가 Gradle의 로컬 socket/network 초기화와 Docker daemon 접근을 허용하지 않았고, approval policy가 third-party image로 private workspace 데이터를 전달하는 실행을 거부했다.
  • 근본 원인: build verifier들이 filesystem/cache/process/network 또는 외부 실행 주체를 필요로 하지만 기본 permission profile은 workspace 쓰기만 허용한다.
  • 트리거 조건: 제한 sandbox에서 Gradle/Docker 기반 verifier를 직접 실행하거나 private repository 내용을 third-party container에 전달할 때.

Sources / 근거

해결 / Resolution

  • 적용한 조치: 사용자 승인 범위에서 Gradle만 escalated 실행했다. Actionlint는 외부 container에 repository 내용을 노출하지 않고, repo-owned 공급망 정적 계약과 yq YAML parser로 대체했다.
  • 검증 방법: ./gradlew check verifyPublicPathSnapshot, verifyDependencyLocks positive/negative, verify-reproducible-build.sh, verify-supply-chain-contract.sh, yq eval 실행.
  • 잔여 위험 / 후속 작업: 실제 GitHub CI에서 Actionlint와 release workflow를 한 번 실행해 local policy가 허용하지 않은 검증을 보완한다.

회고 / Lessons

  • 빨리 감지하는 신호: wildcard IP, Docker socket permission, third-party ... private repository 문구가 나오면 코드 결함보다 실행 경계부터 확인한다.
  • 예방 체크리스트 항목 후보: repo-owned parser/contract를 기본 검증으로 두고, 외부 verifier는 CI에서 최소 권한·고정 버전으로 실행한다.
  • wiki로 끌어올릴 가치가 있는 일반화된 교훈: private source를 third-party lint container에 mount하지 않는 verification 경계.