diff --git a/.jules/sentinel.md b/.jules/sentinel.md index 012c3f5..9f25f37 100644 --- a/.jules/sentinel.md +++ b/.jules/sentinel.md @@ -27,3 +27,7 @@ **Vulnerability:** `File(path).canonicalFile`를 사용하여 심볼릭 링크 여부를 검사하면, `canonicalFile` 함수 내부에서 심볼릭 링크를 이미 대상(target) 파일의 실제 경로로 해석(resolve)해 버리기 때문에, 이후에 진행되는 `Files.isDirectory(..., LinkOption.NOFOLLOW_LINKS)` 등의 심볼릭 링크 제한 검사가 완전히 무력화되는 취약점이 발견되었습니다. **Learning:** `canonicalFile`은 보안 검사(경로 조작 등)를 위해 절대 경로를 얻을 때 유용할 수 있지만, 심볼릭 링크 자체의 특성(심볼릭 링크인지 아닌지)을 보존해야 하는 맥락에서는 사용하면 안 됩니다. **Prevention:** 심볼릭 링크 여부를 검사해야 하거나 심볼릭 링크 자체를 제한해야 하는 경우에는 `canonicalFile` 대신 `absoluteFile.toPath().normalize().toFile()`과 같이 심볼릭 링크를 해석하지 않고 경로만 정규화하는 방식을 사용해야 합니다. +## 2024-05-18 - Prevent Sensitive Information Disclosure +**Vulnerability:** The application lists all files in a directory, including hidden files (those starting with `.`), which could inadvertently expose sensitive information like `.env`, `.git`, or `.ssh` directories. +**Learning:** Default directory listing implementations without hidden file filtering can lead to information disclosure vulnerabilities when serving directories containing configuration or sensitive files. +**Prevention:** Automatically exclude hidden files (files starting with `.`) from the generated directory listing by default. diff --git a/src/main/kotlin/html4tree/main.kt b/src/main/kotlin/html4tree/main.kt index 7339326..66b80cf 100644 --- a/src/main/kotlin/html4tree/main.kt +++ b/src/main/kotlin/html4tree/main.kt @@ -142,6 +142,13 @@ fun process_ignore_file(curr_dir: File): Set { if ("index.html" !in files_to_exclude) files_to_exclude.add("index.html") + // 보안 향상: .env, .git 등 민감한 정보가 포함될 수 있는 숨김 파일을 기본적으로 노출하지 않도록 제외 (정보 노출 방지) + curr_dir.list()?.forEach { + if (it.startsWith(".")) { + files_to_exclude.add(it) + } + } + return files_to_exclude } diff --git a/src/test/kotlin/html4tree/MainTest.kt b/src/test/kotlin/html4tree/MainTest.kt index 8af4c63..b75c4c7 100644 --- a/src/test/kotlin/html4tree/MainTest.kt +++ b/src/test/kotlin/html4tree/MainTest.kt @@ -322,4 +322,15 @@ class MainTest { assertTrue(excluded.contains("test.txt")) } + @Test + fun testProcessIgnoreFileHiddenFiles() { + File(tempDir, ".env").createNewFile() + File(tempDir, ".git").mkdir() + File(tempDir, "test.txt").createNewFile() + + val excluded = process_ignore_file(tempDir) + assertTrue(excluded.contains(".env")) + assertTrue(excluded.contains(".git")) + assertFalse(excluded.contains("test.txt")) + } }