로그 인젝션(개행 문자 미처리로 인한 로그 위조)
Log Injection
설명
로그 인젝션은 사용자 입력을 정제(뉴트럴라이즈)하지 않고 로그에 기록할 때 발생합니다. 입력에 포함된 개행 문자(\n, \r\n)나 제어문자, HTML이 그대로 저장되면 공격자가 새로운 로그 줄을 만들어 납득하기 어려운 메시지를 끼워 넣거나(로그 위조/스푸핑), 뷰어에서 HTML/스크립트가 실행되도록 만들 수 있습니다. 예를 들어 "\n[ERROR] admin logged in" 같은 페이로드로 이전/다음 줄처럼 보이게 만들어 탐지와 포렌식을 교란할 수 있습니다.
잠재적 영향
Log Forgery (로그 위조): 개행/제어문자를 악용해 가짜 로그 라인을 삽입하거나 심각도/형식을 바꿔 보이게 만듭니다.
Alert/Monitoring Bypass (모니터링 우회): 경고 패턴을 분할/조작하여 SIEM 규칙을 회피하거나 잘못된 알림을 유발합니다.
Incident Response Confusion (포렌식 교란): 타임라인 분석과 사용자 추적을 어렵게 만들어 원인 분석과 대응을 지연시킵니다.
Stored XSS in Log Viewer (로그 뷰어 XSS): 웹 UI로 표시되는 로그에 HTML/스크립트가 포함될 경우, 뷰어에서 실행되어 추가 공격이 발생할 수 있습니다.
해결 방법
CR/LF 제거 또는 치환: 로그로 출력하기 전 입력에서 \r, \n, \r\n 등 제어문자를 제거하거나 안전한 문자로 치환합니다.
화이트리스트 검증: 기대 형식(예: 영문/숫자/특정 기호만)으로 정규식 검증하고, 최대 길이를 제한합니다.
Structured Logging 사용: 문자열 연결 대신 키-값 형태(extra, JSON logger 등)로 필드를 분리해 기록합니다.
HTML 표시 시 인코딩: 로그를 웹에 표시한다면 django.utils.html.escape 또는 equivalent HTML escape를 적용합니다.
공통 Sanitizer 구성: 로거에 logging.Filter를 등록해 모든 record.msg/변수를 중앙에서 정제합니다.
민감정보 최소화: 토큰/비밀번호 등은 로깅하지 않거나 마스킹합니다.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: 사용자 입력 term에 \n, \r 같은 개행/제어문자가 포함되면 로그가 여러 줄로 분리되어 새로운 로그 항목처럼 보입니다. 공격자는 심각도 태그나 다른 메시지를 끼워 넣어 탐지와 포렌식을 교란할 수 있습니다.
안전한 코드: 로깅 전에 CR/LF 등 제어문자를 제거하고, 허용 문자 기반 검증과 길이 제한을 적용해 로그 위조를 차단합니다. 또한 포맷 파라미터를 사용해 메시지와 데이터를 분리하여 분석/표시 단계에서 혼동을 줄입니다.
참조
Last updated