From b4eaee043436373f3faf1c1dd64c0e8095caf966 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Tue, 30 Jun 2026 20:56:28 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A1=EF=B8=8F=20Sentinel:=20[CRITICAL]?= =?UTF-8?q?=20=EB=84=90=20=EB=B0=94=EC=9D=B4=ED=8A=B8(Null=20Byte)=20?= =?UTF-8?q?=EC=9D=B8=EC=A0=9D=EC=85=98=20=EC=B7=A8=EC=95=BD=EC=A0=90=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🚨 심각도: CRITICAL πŸ’‘ 취약점: 파일 μ—…λ‘œλ“œ μ‹œ 파일λͺ… 검증 κ³Όμ •μ—μ„œ 널 λ°”μ΄νŠΈ(`\u0000`) μΈμ μ…˜ 검증 λˆ„λ½ 🎯 영ν–₯: μ•…μ˜μ μΈ μ‚¬μš©μžκ°€ 널 λ°”μ΄νŠΈλ₯Ό ν¬ν•¨ν•œ 파일λͺ…(예: `malware.hwp\u0000.pdf`)을 μ—…λ‘œλ“œν•˜μ—¬ ν™•μž₯자 차단 우회 및 μ ˆμ‚­ 우회 곡격(Truncation bypass)을 μ‹œλ„ν•  수 있음. πŸ”§ μˆ˜μ • 사항: `DefaultDocumentValidationService`μ—μ„œ `MultipartFile`의 원본 파일λͺ…에 널 λ°”μ΄νŠΈκ°€ ν¬ν•¨λœ 경우 `IllegalArgumentException`을 던져 κ±°λΆ€ν•˜λ„λ‘ 변경함. `.jules/sentinel.md`에 λ³΄μ•ˆ κ΄€λ ¨ λ‚΄μš©μ„ 기둝함. βœ… 검증: 널 λ°”μ΄νŠΈκ°€ ν¬ν•¨λœ 파일λͺ…에 λŒ€ν•΄ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” λ‹¨μœ„ ν…ŒμŠ€νŠΈ(`rejectsFilenameWithNullByte`)λ₯Ό μΆ”κ°€ 및 톡과 확인함. --- .jules/sentinel.md | Bin 685 -> 1511 bytes .../DefaultDocumentValidationService.java | 4 ++++ .../DefaultDocumentValidationServiceTest.java | 16 ++++++++++++++++ 3 files changed, 20 insertions(+) diff --git a/.jules/sentinel.md b/.jules/sentinel.md index 76a9742572c7e5ef7c5abc5be4545bfde07e08d9..274df498615381a15c09110665d197c3f0409891 100644 GIT binary patch literal 1511 zcmZ`(OK;ma5Y9QjVt^d#1hx=#fgW`^o|vZkg#M`sJ&|^{d4n*R-IIk+`KL=_} zGequNGQOjtkbrBYk7mOytyrP51V5+UAa)?*T-YVzuWXCHr_j^JII$8+qNh)HiJYvN z+An5nl8rLvo0dYPwlmq>v<(>Cvx#2(N}GQR!YGX&vklVWEzmts|9X6X-_D<#PMouz zK7G1hRD_fx{wE~?y~t$zUzV(FB@dxw8e_=821i>o2zYH*AXey##WmG-3q?Xq4LuGF z`SvcDj;!&t_=;z!i$AguCRF-#}(eXyDMd?=3 zgX#Gxx)%6Rda+Y)eet$72}Hsjckp3V2*NUJu;gE*DxGbZIxynLS^rP`dHU1-!3oEg66}b)_B@A=KHo=}SYtKnnMr3Dnr{L0Y(g2|g zqLaSIKJnVpa!*~@dE8)AmrgnkMHuVm0B+i2Ic validationService.validateOrThrow( + new MockMultipartFile("file", "contract\u0000.pdf", "application/octet-stream", new byte[] {1}) + ) + ); + + assertEquals("Invalid filename containing null byte.", ex.getMessage()); + } + @Test void rejectsNullFilename() { ConversionProperties conversionProperties = new ConversionProperties();