bibimbap/.atp/work-session/20260629-142115/implementation/ownership-hardening.md

3.1 KiB

phase agent agent_version generated_at session_id
implementation implementation-advisor 1 2026-06-29T14:30:00+09:00 20260629-142115

파일 소유권 맵 — 보안 하드닝 b1/b2

파일 담당 worker worker id 변경 유형 의존
src/main/java/com/pandoli365/bibimbap/security/SsrfSafeFetcher.java code-writer w-h01 modify -
src/test/java/com/pandoli365/bibimbap/security/SsrfSafeFetcherTest.java code-writer w-h01 modify SsrfSafeFetcher.java (동일 worker로 묶음)
src/main/resources/application.properties implementation-advisor (직접) - modify -

concern 기록

b1: DNS 캐시 TTL @PostConstruct 런타임 반영 한계

  • sun.net.InetAddressCachePolicy 는 최초 InetAddress 조회 시 Security property를 lazy 하게 읽는다.
  • @PostConstruct 가 첫 DNS 조회 전에 실행되면 정상 반영되나, 다른 빈이 먼저 조회했다면 런타임 반영이 보장되지 않는다.
  • 이것은 best-effort 하드닝이다. 결정적 보장이 필요하면 JVM 레벨($JAVA_HOME/conf/security/java.securitynetworkaddress.cache.ttl=30)이 정본.
  • verification-advisor 는 L3 스모크(실제 앱 기동 후 ttl property 확인)로 반영 여부를 검증해야 한다.

b1: 테스트 전역상태(Security.setProperty) 복원 미적용 결정

  • Security.setProperty("networkaddress.cache.ttl","30") 은 JVM 전역 상태를 바꾼다. 동일 클래스의 다른 SSRF 테스트는 resolve() 를 stub 으로 주입(TestableFetcher)하거나 IP literal 차단을 검증하므로 차단 판정이 IP 기반이다. TTL 값 변경은 차단 결과를 바꾸지 않는다 → @AfterEach 복원 미적용(불필요한 복잡성 회피).
  • jakarta vs javax: pom.xml spring-boot.version=3.5.14-SNAPSHOT (Jakarta EE 10) 확인 → @jakarta.annotation.PostConstruct 정확. javax 교체 불필요.

env: Java 런타임 부재로 advisor 컴파일 검증 불가

  • 현재 셸 환경에 JDK 미설치(/usr/libexec/java_home 실패) → advisor 측 mvnw compile/LSP 컴파일 점검 불가.
  • 변경은 FQN(java.security.Security, @jakarta.annotation.PostConstruct)만 사용하여 import 무변경, 기존 클래스패스 의존만 사용 → 컴파일 가능성 높음. 실제 컴파일·테스트 게이트는 verification-advisor 영역.

b2: @Value 기본값 유지 결정

  • 기본값 src/main/resources/static 은 변경하지 않는다.
  • 근거: GameUploadControllerSecurityTest@TempDir + ReflectionTestUtils.setField 로 경로를 격리하므로 기본값과 무관하지만, 기본값을 홈경로로 바꾸면 IDE 로컬 실행 시 명시 설정 없이 홈 디렉토리에 파일이 생성되는 부작용이 있다. application.properties 명시 설정으로만 오버라이드하는 것이 최소 변경·테스트 안전 기준에 부합한다.

worker 계획 주석

  • w-h01: SsrfSafeFetcher + 단위테스트 — 파일 간 강한 의존(테스트가 소스를 참조) → 동일 worker로 묶어 순차 처리
  • application.properties: 1줄 추가, 단순 — advisor 직접 처리(파일 수 1, 예상 줄수 <5)