diff --git a/.jules/sentinel.md b/.jules/sentinel.md index 012c3f5..b3829aa 100644 --- a/.jules/sentinel.md +++ b/.jules/sentinel.md @@ -27,3 +27,8 @@ **Vulnerability:** `File(path).canonicalFile`를 사용하여 심볼릭 링크 여부를 검사하면, `canonicalFile` 함수 내부에서 심볼릭 링크를 이미 대상(target) 파일의 실제 경로로 해석(resolve)해 버리기 때문에, 이후에 진행되는 `Files.isDirectory(..., LinkOption.NOFOLLOW_LINKS)` 등의 심볼릭 링크 제한 검사가 완전히 무력화되는 취약점이 발견되었습니다. **Learning:** `canonicalFile`은 보안 검사(경로 조작 등)를 위해 절대 경로를 얻을 때 유용할 수 있지만, 심볼릭 링크 자체의 특성(심볼릭 링크인지 아닌지)을 보존해야 하는 맥락에서는 사용하면 안 됩니다. **Prevention:** 심볼릭 링크 여부를 검사해야 하거나 심볼릭 링크 자체를 제한해야 하는 경우에는 `canonicalFile` 대신 `absoluteFile.toPath().normalize().toFile()`과 같이 심볼릭 링크를 해석하지 않고 경로만 정규화하는 방식을 사용해야 합니다. + +## 2024-07-07 - [CSP 개선: unsafe-inline 제거 및 nonce 적용] +**Vulnerability:** HTML 생성 시 ``에 `style-src 'unsafe-inline'`이 설정되어 있어, 악의적인 사용자가 스타일 인젝션을 통해 XSS 공격을 수행할 위험이 존재했습니다. +**Learning:** `unsafe-inline`은 브라우저에서 인라인 스크립트와 스타일을 허용하기 때문에 보안상 취약합니다. 동적으로 생성되는 HTML에 인라인 스타일을 적용해야 할 경우, CSS 클래스로 분리하고 스타일 태그에 동적으로 생성된 `nonce`를 사용하는 것이 더 안전하다는 것을 배웠습니다. +**Prevention:** 향후 HTML 생성 시 인라인 스타일 속성(`style="..."`)의 사용을 지양하고, CSS 클래스와 `nonce` 기반의 CSP를 엄격하게 적용해야 합니다. diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt index 1710d99..871dcf8 100644 --- a/src/main/kotlin/html4tree/main.kt +++ b/src/main/kotlin/html4tree/main.kt @@ -154,13 +154,23 @@ fun write_index_file(curr_dir: File, content: String) { fun process_dir(curr_dir: File){ val exclude: Set = process_ignore_file(curr_dir) + val nonce = java.util.UUID.randomUUID().toString().replace("-", "") val css = """ -