
Java Secure Coding – 자바에서 Logger 사용 시 CRLF(Carriage Return Line Feed) 취약점은 로그 주입 공격(Log Injection Attack)을 통해 발생할 수 있습니다. 이 문제는 공격자가 로그 메시지에 CRLF 문자를 포함시켜 악의적인 로그 내용을 추가하거나 로그의 구조를 왜곡하는 취약점을 악용하는 것입니다. 이를 방지하기 위해 다음과 같은 조치를 취할 수 있습니다.
CRLF 취약점 조치 방법
입력 값 검증 및 필터링
입력 값에서 CRLF 문자(\r, \n)를 제거하거나 이스케이프 처리하여 로그에 포함되지 않도록 합니다.
public String sanitizeInput(String input) {
if (input == null) {
return null;
}
// CRLF 문자 제거
return input.replaceAll("[\r\n]", "");
}
// 로그 기록 예시
logger.info("User input: {}", sanitizeInput(userInput));
Logger의 Placeholder 사용
Logger에서 메시지를 생성할 때 문자열 연결 대신 Placeholders를 사용하면, 입력 값이 자동으로 이스케이프 처리됩니다. 이를 통해 공격을 방지할 수 있습니다.
// 올바른 사용법: Placeholder 사용
logger.info("User input: {}", userInput);
// 잘못된 사용법: 문자열 연결
logger.info("User input: " + userInput);
안전한 로그 포맷 설정
로그를 기록할 때 JSON과 같은 구조화된 포맷을 사용하는 것이 안전합니다. 이를 통해 입력 데이터를 분리된 필드로 저장하고, CRLF 삽입 가능성을 최소화할 수 있습니다.
import org.json.JSONObject;
public void logUserAction(String userInput) {
JSONObject logData = new JSONObject();
logData.put("event", "UserAction");
logData.put("input", sanitizeInput(userInput));
logger.info(logData.toString());
}
로그 프레임워크 설정 강화
로그 프레임워크(Logback, Log4j, SLF4J 등)의 설정을 강화하여 출력에 대한 추가 보호를 제공할 수 있습니다
Logback 설정 예제
logback.xml에 아래와 같이 Pattern Layout을 사용해 CRLF 문자 제거
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
최신 Logger 프레임워크 사용
취약점이 수정된 최신 버전의 로그 프레임워크를 사용하십시오. 예를 들어, Log4j의 특정 버전에서 알려진 취약점(Log4Shell 등)이 존재했기 때문에 항상 최신 버전을 유지해야 합니다.
- Log4j: 2.17.1 이상
- Logback: 최신 안정 버전
권한 관리
로그 파일이 불필요하게 노출되지 않도록 파일 권한을 적절히 설정하십시오. 공격자가 로그 파일에 접근할 수 없도록 설정하면 추가적인 보안 계층을 제공합니다.
WAF(Web Application Firewall) 활용
애플리케이션 레벨에서 보안 조치와 더불어 WAF를 사용하여 로그 주입 공격을 사전에 차단할 수 있습니다
결론
CRLF 취약점 방지를 위해 입력값 검증, Logger의 Placeholder 사용, 포맷 개선, 최신 버전 사용 등의 방법을 결합해 보안을 강화하는 것이 중요합니다.




