로그 인젝션 (Log Injection)

Log Injection

설명

로그 인젝션은 신뢰되지 않은 입력값을 그대로 로그에 기록할 때 발생합니다. 공격자는 개행 문자(\n, \r), 탭, ANSI 이스케이프, HTML 태그 등을 주입해 로그 라인을 분리하거나 새로운 로그처럼 보이게 만들 수 있습니다. 그 결과 실제 이벤트를 숨기거나 위조된 메시지를 섞어 운영자를 혼란스럽게 할 수 있으며, 웹 UI에서 로그를 렌더링하는 경우 XSS로 악용될 수 있습니다.

잠재적 영향

  • Log Forgery (로그 위조/오염): 개행 및 제어문자를 넣어 여러 줄을 생성해 새로운 이벤트처럼 보이게 하거나 원본 로그의 의미를 바꿀 수 있음.

  • Alert/Detection Evasion (경보·탐지 우회): SIEM/파서가 라인 기반으로 수집할 때 레코드를 깨뜨려 규칙 매칭·경보를 우회할 수 있음.

  • Incident Response Delay (사고 대응 지연): 위조된 로그로 분석이 어려워져 원인 파악과 대응이 늦어짐.

  • XSS in Log Viewer (로그 뷰어 XSS): HTML로 렌더링되는 콘솔/대시보드에서 스크립트가 실행될 수 있음.

  • Compliance/Audit Issues (감사 무결성 훼손): 감사 추적(로그 무결성)이 손상되어 규정 준수와 포렌식에 문제 발생.

해결 방법

  • 개행/제어문자 제거: 로그에 넣기 전 문자열에서 \n, \r(필요 시 기타 제어문자) 제거. 예: value.replace(/[\r\n]/g, '').

  • 고정 포맷 사용: console.log('%s', value)처럼 고정된 포맷 문자열과 placeholder를 사용하고, 문자열 연결/템플릿 리터럴로 직접 섞지 않기.

  • HTML 렌더링 시 인코딩: 로그를 웹에서 보여줄 경우 반드시 HTML 이스케이프(&, <, >, ") 후 표시.

  • 길이 제한: 과도한 입력으로 로그 Flooding을 방지하기 위해 최대 길이 제한(예: 256자) 적용.

  • 공통 로깅 헬퍼: sanitizeForLog 같은 중앙화된 함수로 모든 입력을 정규화하고 재사용.

  • 민감정보 최소화: 계정비밀번호, 토큰 등 민감값은 원칙적으로 로깅 금지.

취약한 코드 및 안전한 코드 예시

취약한 코드

안전한 코드

설명:

  • 취약한 코드: 사용자 입력(agent, q)을 그대로 로그 메시지에 삽입했습니다. 공격자가 \n, \r, HTML 태그, ANSI 이스케이프 등을 주입하면 로그 라인이 분리되거나 위조 로그가 섞여 탐지/분석을 교란할 수 있습니다.

  • 안전한 코드: 로그에 기록하기 전 sanitizeForLog로 줄바꿈 및 제어문자를 제거하고 길이를 제한했습니다. 또한 console.info에 고정 포맷 문자열과 placeholder를 사용하여 입력이 로그 구조를 깨뜨리지 못하게 했습니다. 이렇게 하면 로그 위조/오염과 UI 렌더링 시 XSS 위험을 줄일 수 있습니다.

참조

Last updated