--- title: error / sandbox-build-verification-boundaries source_type: error-note status: raw related_branches: [feature-build-release-supply-chain-contract] related_projects: [ca-skeleton] tags: [error, ca-skeleton, ci-cd, gradle, supply-chain] created: 2026-06-21 status_label: workaround --- # error: sandbox-build-verification-boundaries > Layer: `raw/errors/` — 공급망 계약의 로컬 검증 중 sandbox와 third-party 실행 경계에서 발생한 차단 기록. ## Parent / 부모 - [[raw/branch-notes/feature-build-release-supply-chain-contract]] — D8/D10 build 검증과 workflow lint 증거를 수집하던 작업. ## 증상 / Symptom - 에러 메시지 (원문 그대로): ```text Could not determine a usable wildcard IP for this machine. ``` ```text 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 / 근거 - [[raw/official-docs/supply-chain-gradle-vs-maven-dependency-locking]] — Gradle strict dependency locking 검증 목적. - [[raw/official-docs/gradle-reproducible-archives-working-with-files]] — 두 clean build 재현성 검증 근거. ## 해결 / 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 경계. ## Related / 관련 - 관련 branch: [[raw/branch-notes/feature-build-release-supply-chain-contract]]. - 관련 blog topic: [[raw/blog-topics/digest-first-java-release-pipeline-2026-06-21]].