개발자를 위한 보안 정복: 공유 및 학습 시리즈 - CRLF 인젝션

이와 같은 블로그나 기사를 읽을 때 독자들은 문장 부호의 도움을 받습니다. 예를 들어, 마침표는 문장이 끝나는 지점을 알려주고, 쉼표는 목록의 항목을 구분하거나 잠시 멈춤을 유도하여 아이디어를 명확히 구분하게 합니다. 잘 작성된 블로그(이 글처럼)에서 문장 부호는 거의 눈에 띄지 않으며, 우리가 오래전부터 익숙하게 처리해 온 표준 배경 코드의 일부와 같습니다.
하지만 해커가 이 기사에 침입하여 엉뚱한 곳에 이상한 문장 부호를 삽입한다면 어떻게 될까요? 예를 들어 이런 식이죠:
내용,은! 바꾸지. 않았지만, 문장. 부호가? 정보를. 이해하기! 훨씬? 어렵게. 만들! 수, 있습니다!
이것이 바로 CRLF 인젝션 공격에서 일어나는 현상입니다. CRLF는 줄 바꿈을 나타내기 위해 단독 또는 함께 사용되는 캐리지 리턴(Carriage Return)과 라인 피드(Line Feed)의 약자입니다. 공격자가 기존 애플리케이션에 CR 또는 LF 코드를 삽입하면 때때로 애플리케이션의 동작을 변경할 수 있습니다. 그 영향은 다른 공격들에 비해 예측하기 어렵지만, 대상 조직에 미치는 위험성은 결코 작지 않습니다.
이번 에피소드에서는 다음 내용을 배웁니다:
- 공격자가 CRLF 인젝션을 실행하는 방법
- CRLF 인젝션이 위험한 이유
- 이 취약점을 해결하는 기술.
공격자는 어떻게 CRLF 인젝션을 실행할까요?
기존 코드에 CRLF 문자를 삽입하여 특정 결과를 만들어내는 것은 불가능하지는 않지만 꽤 어려운 일입니다. 공격자가 대상 시스템의 운영 체제나 기타 환경에 따라 서로 다른 CRLF 조합을 사용해야 하기 때문에 더욱 까다롭습니다. 예를 들어, 최신 Windows 시스템은 줄 끝을 표시하기 위해 CR과 LF가 모두 필요하지만, Linux에서는 LF 코드만 있으면 됩니다. HTTP 요청은 줄을 끝내기 위해 항상 정확한 CRLF 코드를 요구합니다.
CRLF 공격은 구현하기 어렵고 결과를 예측하기는 더 어렵지만, 다른 인젝션 공격과 거의 같은 방식으로 시작됩니다. 악의적인 사용자가 웹사이트나 애플리케이션에서 입력을 허용하는 영역에 일반적인 입력 데이터 대신, 혹은 입력 데이터 뒤에 CRLF 코드를 입력하기만 하면 됩니다.
예를 들어, 공격자는 HTTPS 헤더 끝에 캐리지 리턴을 나타내는 ASCII 코드(%0d)와 라인 피드(%0a)를 입력할 수 있습니다. 그러면 전체 쿼리는 다음과 같은 형태가 됩니다:
https://validsite.com/index.php?page=home%0d%0a
데이터가 적절히 정제되거나 필터링되지 않으면, 위 코드로 인해 대상 애플리케이션이나 웹사이트에서 이상한 현상이 발생할 수 있습니다.
CRLF 인젝션은 왜 위험할까요?
CRLF 인젝션 공격은 다른 공격보다 정밀도는 떨어지지만, 때로는 상당히 위험할 수 있습니다. 가벼운 경우, 불필요한 줄을 추가하여 로그 파일을 엉망으로 만들 수 있으며, 이는 자동 보안 시스템이 관리자에게 허위 경고를 보내도록 유도할 수 있습니다. 하지만 이는 동시에 발생하는 실제 침입으로부터 관리자의 주의를 분산시키는 용도로 악용될 수 있습니다.
또한 CRLF 공격은 직접적인 피해를 줄 수도 있습니다. 예를 들어, 애플리케이션이 명령을 받아 특정 파일을 검색하도록 설계된 경우, 쿼리에 CRLF 코드를 추가하면 애플리케이션이 해당 프로세스를 숨기지 않고 화면에 표시하게 만들 수 있으며, 이는 공격자에게 귀중한 정보를 제공할 수 있습니다.
CRLF 인젝션은 '응답 분할(response splitting)' 공격을 수행하는 데 사용될 수도 있습니다. 줄 바꿈 코드를 이용해 유효한 응답을 여러 조각으로 나누는 방식입니다. 이를 통해 해커는 CRLF 코드 이후의 헤더를 제어하여 추가 코드를 삽입할 수 있습니다. 또한 공격자가 자신의 코드를 완전히 삽입할 수 있는 통로를 만들고, CRLF 공격으로 분할된 이후의 줄에서 다른 형태의 공격을 유도할 가능성도 있습니다.
CRLF 인젝션 취약점 제거하기
이번 시리즈에서 기억해야 할 핵심 메시지가 하나 있다면, 그것은 '사용자 입력을 절대 신뢰하지 말라'는 것입니다. 이번 시리즈에서 다룬 대부분의 취약점은 어떤 방식으로든 사용자 입력 영역과 관련이 있었으며, CRLF 인젝션 결함도 예외는 아닙니다.
사용자가 입력을 할 수 있는 모든 지점에는 애플리케이션이나 서버가 잘못 해석할 수 있는 무단 코드 삽입을 방지하기 위한 필터가 적용되어야 합니다. CRLF 공격의 경우 HTTP 헤더를 엄격히 관리하는 것이 특히 중요하지만, GET 및 POST 매개변수나 쿠키도 간과해서는 안 됩니다. CRLF 코드가 추가적인 인젝션 공격으로 이어지는 것을 막는 좋은 방법 중 하나는 사용자의 브라우저로 전송되는 모든 데이터에 HTML 인코딩을 적용하는 것입니다.
CRLF 인젝션에 대한 추가 정보
더 자세한 내용은 CRLF 인젝션에 대한 OWASP의 설명을 참고하시기 바랍니다. 또한, 사이버 보안 팀을 최고의 사이버 전사로 양성하는 Secure Code Warrior 플랫폼의 무료 데모를 통해 방금 습득한 방어 지식을 직접 테스트해 볼 수 있습니다. 이 취약점과 다양한 위협을 방어하는 방법에 대해 더 알아보려면 Secure Code Warrior 블로그를 방문해 주세요.
배포 전 AI 기반 개발 거버넌스 확보
AI 기반 위험을 측정하고, 커밋 시점에 보안 코딩 정책을 적용하며, SDLC 전반에 걸쳐 안전한 소프트웨어 제공 속도를 높이세요.
더 많은 블로그 살펴보기
보안 코딩, AI 거버넌스, 소프트웨어 리스크 관리에 관한 전문가 콘텐츠를 확인해 보세요.
%252520%252520(3).avif)
Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

Security as culture: How Blue Prism cultivates world-class secure developers
Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed
배포 전 AI 기반 개발 보안 확보
소프트웨어 개발 수명 주기 전반에서 개발자 리스크를 파악하고, 정책을 시행하며, 취약점을 예방하세요.



.avif)