From 474f481dc6776fbd3501bfafe3a924934b72d59d Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sat, 25 Jul 2026 20:42:07 +0000 Subject: [PATCH] =?UTF-8?q?=EB=B3=B4=EC=95=88=20=ED=96=A5=EC=83=81:=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EA=B5=90=EC=B2=B4=20=EC=8B=9C=20=EA=B2=BD?= =?UTF-8?q?=EC=9F=81=20=EC=A1=B0=EA=B1=B4(Race=20Condition)=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `write_index_file` 함수에서 임시 파일을 `index.html`로 교체할 때 기존에는 `StandardCopyOption.REPLACE_EXISTING`만을 사용하여 운영체제에서 원자적이지 않은 방식으로 파일이 이동(교체)될 경우, 생성 과정에서 불완전하거나 손상된 파일이 사용자나 웹 서버에 읽힐 수 있는 경쟁 조건(Race Condition) 취약점이 발생할 가능성이 있었습니다. 이를 방지하기 위해 파일 교체 시 항상 `StandardCopyOption.ATOMIC_MOVE` 옵션을 우선적으로 시도하도록 수정했습니다. 만약 파일 시스템 환경이 원자적 이동을 지원하지 않아 `AtomicMoveNotSupportedException`이 발생할 경우에만 안전하게 `REPLACE_EXISTING` 옵션으로 폴백(Fallback)하도록 강력하고 방어적인 로직을 구현했습니다. 추가로, 이 방어 로직의 100% 테스트 커버리지를 보장하기 위해 파일 이동 함수를 주입받아 예외를 모의(mock) 발생시킬 수 있도록 구조를 개선하고 `AtomicMoveTest.kt` 테스트 코드를 추가했습니다. 또한 `.jules/sentinel.md`에 보안 학습 내용을 기록했습니다. --- .jules/sentinel.md | 5 +++ build.gradle | 2 ++ src/main/kotlin/html4tree/main.kt | 16 +++++++-- src/test/kotlin/html4tree/AtomicMoveTest.kt | 36 +++++++++++++++++++++ 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 src/test/kotlin/html4tree/AtomicMoveTest.kt diff --git a/.jules/sentinel.md b/.jules/sentinel.md index 6ecf72f1..38afa45f 100644 --- a/.jules/sentinel.md +++ b/.jules/sentinel.md @@ -83,3 +83,8 @@ **Vulnerability:** 정적 HTML 생성 도구에서 매번 다른 Nonce를 동적으로 생성하여 CSP에 적용하는 것은, 캐싱 효율을 저하시킬 뿐만 아니라 정적 배포 환경(예: GitHub Pages 등)에서 올바른 보안 정책 수립을 방해할 수 있는 안티 패턴입니다. **Learning:** 정적으로 고정된 인라인 스타일이나 스크립트에는 난수화된 Nonce보다 콘텐츠 자체의 해시(SHA-256 등)를 사용하는 것이 안전하고 일관된 방식임을 배웠습니다. **Prevention:** 자동 생성되는 정적 HTML의 콘텐츠 보안 정책(CSP)에는 `style-src 'sha256-'` 방식을 적용하고, `