From 93c92ec206e3c8c3d1748fe5aff1b9047d06a6f6 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Thu, 9 Jul 2026 21:14:46 +0000 Subject: [PATCH 1/7] =?UTF-8?q?=EB=B3=B4=EC=95=88=20=EA=B0=95=ED=99=94:=20?= =?UTF-8?q?=EC=A0=95=EC=A0=81=20HTML=20=EC=83=9D=EC=84=B1=EA=B8=B0?= =?UTF-8?q?=EC=97=90=20CSP=20Nonce=20=EA=B8=B0=EB=B0=98=20=EC=9D=B8?= =?UTF-8?q?=EB=9D=BC=EC=9D=B8=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=B3=B4?= =?UTF-8?q?=EC=95=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .jules/sentinel.md | 4 ++++ src/main/kotlin/html4tree/main.kt | 21 ++++++++++++++++----- src/test/kotlin/html4tree/MainTest.kt | 3 ++- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/.jules/sentinel.md b/.jules/sentinel.md index 52a9445..cdb5e23 100644 --- a/.jules/sentinel.md +++ b/.jules/sentinel.md @@ -31,3 +31,7 @@ **Vulnerability:** 정적 HTML 디렉토리 인덱서(`html4tree`)가 민감한 시스템 및 설정 파일(`.git`, `.env`, `.ssh`, `.htpasswd` 등)을 포함하여 모든 파일과 디렉토리를 무분별하게 나열하여, 생성된 HTML이 공개적으로 호스팅될 경우 심각한 정보 노출로 이어질 수 있었습니다. **Learning:** 디렉토리 구조를 자동 생성하는 도구는 반드시 "기본적으로 안전한(secure by default)" 정책을 채택해야 합니다. 사용자 제공 무시 파일(`.html4ignore`)에만 의존하는 것은 사용자가 설정을 잊거나 어떤 파일이 민감한지 모를 수 있기 때문에 불충분합니다. **Prevention:** 출력에서 기본적으로 제외되는 보편적으로 민감한 파일 및 디렉토리의 하드코딩된 기준 목록을 항상 포함하십시오. 이는 우발적인 정보 유출을 방지하기 위한 강력한 심층 방어(defense-in-depth) 조치로 작용합니다. +## 2024-05-27 - [html4tree] CSP 우회 방지를 위한 Nonce 기반 스타일 적용 +**Vulnerability:** CSP(Content-Security-Policy) 헤더에 `style-src 'unsafe-inline'`이 포함되어 있어, 공격자가 HTML 인젝션을 통해 임의의 CSS 속성을 적용하거나 스크립트 우회(예: data URI)를 시도할 수 있는 잠재적 위험이 존재했습니다. +**Learning:** `unsafe-inline`을 허용하면 CSP의 방어 효과가 크게 저하됩니다. 정적 생성 도구라 할지라도 동적인 랜덤 Base64 Nonce를 생성하여 `style` 태그 및 CSP 헤더에 주입하는 방식으로 보다 엄격한 보안을 유지해야 합니다. +**Prevention:** 런타임에 16-byte 랜덤 Base64 문자열을 생성하여 CSP 메타 태그(`style-src 'nonce-...'`)와 ` """ @@ -197,7 +208,7 @@ fun process_dir(curr_dir: File){ - + ${curr_dir.getName().escapeHtml()} ${css} @@ -206,7 +217,7 @@ fun process_dir(curr_dir: File){

${curr_dir.getName().escapeHtml()}