Log Injection
해당 취약점은 무엇인가?
사용자의 입력값으 로그파일에 기록될 때 발생 할 수 있는 취약점으로 공격자가 로그 기록을 조작하여 데이터 탈취 및 서비스중단까지도 발생할 수 있다.
일어날 수 있는 피해는?
- 로그 항목 위조 : 임의로 삽입된 입력값이 로그파일에 삽입되어, 로그항목을 위조한다 공격자가 해당 시스템에 침투 후 보안 침해를 숨기거나 피해랄 악화시킬 수 있다. 이 경우 로그파일에 대한 신뢰를 떯어 뜨리고 보안 사고 조사를 어렵게 만든다.
- 로그파일 손상 : 로그파일에 기록되는 입력값에 매우 많은양의 데이터를 삽입시켜 로그파일을 손상시킬 수 있다.
- 정보 탈취 : 로그파일에 저장된 민감 정보를 탈취할 수 있다.
어떻게 발생하는가?
사용자의 입력값이 로그파일에 추가되는 로직이 구현되어 있을 경우 일어날 수 있다.
- 신뢰할 수 없는 소스에서 데이터가 응용 프로그램에 입력된다.
- 응용 프로그램 또는 시스템 로그 파일에 데이터가 작성된다.
String val = request.getParameter("val");
try {
int value = Integer.parseInt(val);
}
catch (NumberFormatException nfe) {
log.info("Failed to parse val = " + val);
}
- 입력값이 정수값이 아닌 경우 해당 문제점을 나타내는 오류코드와 입력값이 함께 로깅되는 코드가 존재한다.
- 정수값이 아닌 “test” 라는 문자열을 입력할 경우 아래와 같이 출력 된다.
INFO: Failed to parse val
INFO: test
- 공격자가 입력값을 test%0d%0a%0d%0aINFO: success login 을 입력할 경우 아래와같은 로그가 생성되게 된다.
INFO: Failed to parse val
INFO: test
INFO: success login
이때 공격은 CRLF(\r\n) 문자를 이용하여 이루어진다.
- 로그 인젝션에 취약한 서버측 코드는 아래 사이트에서 확인이 가능하다.
https://www.notion.so/Log-Injection-b7b4ee265f62490d889e72bb7dd58464?pvs=4#f0e218f80168433c85ba414f862042dc
대응책
- 입력 필터링 - 사용자 입력값을 로그파일에 기록 전 악성코드 및 데이터를 필터링하여 사전에 차단한다.
- 코드 검토 - 로그를 기록하는 코드에 대한 오류를 검사한다.
- 보안 모니터링 - 로그 파일과 시스템을 모니터링하여 의심스러운 활동이 있는지 확인한다
References
https://vulncat.fortify.com/ko/detail?id=desc.dataflow.abap.log_forging#Ruby
Leave a comment