75 lines
4.4 KiB
Markdown
75 lines
4.4 KiB
Markdown
---
|
|
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]].
|