HTTPoxy - CGI에서 "HTTP_PROXY" 변수 이름 충돌 결함

Public Date: July 18, 2016, 11:44
갱신됨 July 18, 2016, 11:44 - Chinese, Simplified 영어 (English) French Japanese

이 정보가 도움이 되었나요?

Resolved 상태
Important Impact

PHP, Go, Python, 기타 다른 스크립트 언어를 사용하는 Red Hat 제품의 CGI 스크립트 사용 방법에서 취약점이 발견되었습니다.


여러 웹 서버, 웹 프레임워크 및 프로그래밍 언어 (가장 일반적으로 CGI 환경에서)는 수신 요청 (예: 사용자 제공 데이터와 함께 “Proxy”라 불리는 요청 헤더)의 데이터를 기반으로 환경 변수 “HTTP_PROXY”를 설정합니다. 환경 변수 “HTTP_PROXY”는 HTTP 및 일부 경우 HTTPS 요청에 사용할 원격 프록시 서버를 지정하기 위해 다양한 웹 클라이언트 소프트웨어 패키지에서 사용됩니다. 결과적으로 웹 애플리케이션을 실행할 때 공격자는 애플리케이션이 다음번 발신 요청에 사용하는 프록시 서버를 지정할 수 있게 되어 "메시지 가로채기(Man-in-the-Middle)" 공격을 허용하게 됩니다. 본 결함은 HTTPoxy 라고 부릅니다.

배경 정보

CGI 및 환경 변수

HTTP 서버는 여러 환경 변수를 사용하여 CGI 스크립트에 정보를 전달합니다. 이러한 환경 변수 중 일부는 컨텐츠 유형, TCP 포트, 호스트이름, 요청 방식 (예: GET 또는 POST)과 같은 특정 HTTP 요청을 전달하는데 사용됩니다. RFC (Request for Comments)에서 "Protocol-Specific Meta-Variables (특정 프로토콜 메타 매개 변수)"라고 부르는 다른 환경 변수는 HTTP 헤더 값을 CGI 스크립트에 전달하는데 사용됩니다. HTTP 헤더에서 환경 변수 매핑은 다음과 같은 표준 절차를 따릅니다. 즉, HTTP 헤더 이름은 대문자로 변환되고 "-"은 "_"로 대체되며 "HTTP_"가 접두어가 됩니다.

예를 들어, "Cookie" 헤더는 "HTTP_COOKIE" 환경 변수를 사용하여 전달되고 "Proxy" 헤더는 "HTTP_PROXY" 환경 변수를 사용하여 전달됩니다. "Proxy" 헤더는 공식적인 표준 헤더나 임시적인 헤더 레지스트리 대상이 아님에 유의합니다. "Proxy" 헤더는 표준 호환 애플리케이션이나 클라이언트에서 사용할 수 없습니다.

HTTP_PROXY "system" 환경 변수

"HTTP_PROXY"라는 일반적인 시스템 환경 변수가 있으며 이는 내보내는 HTTP 프록시의 HTTP (및 경우에 따라 HTTPS) 프록시 설정을 애플리케이션에 전송하는데 사용할 수 있습니다. 이러한 변수는 HTTP 서버 스크립트 변수와는 완전히 다른 목적 및 맥락을 갖습니다. 애플리케이션, 언어 라이브러리, 스크립트 모듈은 이러한 환경 변수를 사용하여 내보내는 HTTP 트래픽의 프록시를 설정합니다.

CGI 표준

CGI (Common Gateway Interface)는 웹 페이지를 생성하기 위해 Apache 또는 nginx와 같은 HTTP 웹 서버가 실행 가능한 스크립트 또는 바이너리와 인터페이스에 연결을 허용하기 위해 고안된 표준입니다. 이는 RFC 3875 에 문서화되어 있습니다. CGI 스크립트는 PHP, Python, Perl, Ruby, golang과 같은 다양한 스크립트 언어로 작성될 수 있으며 바이너리 파일을 컴파일할 수 있습니다.

HTTP 서버 및 CGI 스크립트는 다음과 같은 방식으로 작동합니다:

1. HTTP 서버가 HTTP 요청을 수신 및 분석하여 필요한 환경 변수를 설정합니다.
2. HTTP 서버는 CGI스크립트를 호출하고 스크립트의 표준 입력을 통해 요청 데이터를 전달합니다.
3. CGI 스크립트는 환경 변수 및 환경 변수의 입력을 처리하고 스크립트의 표준 출력을 사용하여 HTTP 서버로 다시 응답을 전송합니다.
4. HTTP 서버는 클라이언트에게 다시 CGI 스크립트에 의해 생성된 응답을 전송합니다.

문제: HTTP_PROXY 변수 이름 충돌 결함

CGI 스크립트는 HTTP 요청의 "Proxy" 헤더 값이 들어 있는 CGI의 "Protocol-Specific Meta-Variable"과 HTTP 프록시 설정이 포함된 "system" 환경 변수 HTTP_PROXY를 구별할 수 없습니다. CGI 스크립트, 모듈, 라이브러리는 "HTTP_PROXY" 환경 변수를 읽고 이에 "system" HTTP 프록시 설정이 포함되어 있다고 판단하게 됩니다. 잘못 해석된 값은 현재 HTTP 요청을 처리하는 동안 생성된 CGI 스크립트 (및 호출 가능한 기타 다른 스크립트 및 프로그램)에 의해 새로운 HTTP 요청을 처리하는 방법으로 변조됩니다.

실행할 작업

PHP, Go, Python을 이용해서 CGI 스크립트를 사용하는 모든 Red Hat 고객은 시스템에 완화 방법을 적용할 것을 강력히 권장합니다. 영향을 받는 패키지와 이미지 버전 그리고 권장 완화 방법은 해결 방법 탭에서 확인하실 수 있습니다.

감사의 말

Red Hat은 본 문제에 대해 보고 및 도움을 주신 VendHQ의 Dominic Scheirlinck에게 감사의 말씀을 전합니다.

Red Hat 제품 보안팀은 본 취약점이 이번 업데이트에서 중요한 보안 영향 을 미치는 것으로 평가하고 있습니다.

해결방법 탭을 통해 사용자 환경에서 본 취약점이 영향을 미치는 지를 확인할 수 있습니다.

영향을 받는 제품

  • Red Hat Enterprise Linux 7.x
  • Red Hat Enterprise Application Platform 6.x

  • Red Hat Enterprise Web Server 2.x

  • Red Hat JBoss Web Server 3.x

  • Red Hat Satellite

공격 내용 및 영향

공격 내용

공격은 아주 간단합니다. 공격자는 특수하게 조작된 HTTP 요청을 취약한 CGI 스크립트에 전송합니다. 요청에는 호스트 이름 또는 IP 주소와 함께 공격자 제어 프록시 포트를 헤더 값으로 갖는 "Proxy" 헤더가 포함되어 있습니다. HTTP 서버는 요청을 수신하고 CGI 스크립트를 호출하기 전 일반적인 프로세스의 일부로 "Proxy" 헤더 및 헤더 값을 "HTTP_PROXY" 메타 데이터 변수로 전환합니다. 다음으로 CGI 스크립트는 HTTP_PROXY 변수를 읽고 이를 나가는 HTTP 프록시 설정을 전송하는데 사용되는 "system" 변수로 혼동하여 지정된 프록시를 사용하도록 설정합니다. CGI 스크립트가 HTTP 요청을 실행하는 경우 이러한 요청은 공격자가 제어하는 프록시를 통해 전송되어 공격자는 HTTP 트래픽 전체에서 "메세지 가로채기 공격 (Man-in-the-Middle)"을 가능하게 합니다.

영향 및 중요성

HTTP_PROXY 변수를 잘못 해석함은 물론 HTTP (경우에 따라 HTTPS) 요청을 전송할 경우 CGI 스크립트는 이러한 취약점으로 인한 공격을 받기 쉽습니다. 이러한 작업 모두를 실행하는 스크립트는 일반적으로 CGI 스크립트 중 일부분입니다.

이는 CGI 스크립트 작동 방법에 따라 달라질 수 있기 때문에 시스템 전역에 미치는 영향 및 중요성을 기술하기 어렵습니다. 특히 최악의 시나리오는 민간함 작업 (예: REST API 스타일을 사용하는 인증)을 수행하는 CGI 스크립트가 될 수 있습니다. 이러한 경우 공격자는 공격자가 제어하는 프록시를 통해 CGI 스크립트와 (REST-스타일) HTTP 서버 간의 모든 HTTP 트래픽을 전환할 수 있습니다. 이로 인해 CGI 스크립트와 HTTP 서버 간에 전송된 요청 및 응답에 포함된 중요한 정보가 노출될 수 있습니다.

또한 공격자는 요청 및 응답 컨텐츠를 조작할 수 있습니다. CGI 스크립트가 외부 인터넷에서 접근할 수 없는 내부 서버에 요청을 전송하는 경우, 공격자의 프록시는 내부 서버와 통신할 수 없게 되어 공격자는 내부 서버 응답을 가로챌 수 없습니다. 하지만 여전히 공격자는 CGI 스크립트 요청을 가로채기하여 가짜 응답을 전송할 수 있습니다.

진단

문제를 진단하기 위해 임시적으로 다음과 같은 CGI 스크립트를 서버에 설치하여 실행합니다:


test.cgi:

#!/bin/sh
echo "Content-Type:text/plain"
​echo ""
echo "HTTP_PROXY='$HTTP_PROXY'"
											

“Proxy:”요청 헤더로 CGI 스크립트를 호출합니다:

curl -H ‘Proxy: AFFECTED’ http://my-server-name/cgi-bin/test.cgi
												

다음과 같은 출력 결과가 표시될 경우 서버는 영향을 받지 않은 것입니다:

HTTP_PROXY="
													

다음과 같은 출력 결과가 표시될 경우 서버는 영향을 받은 것으로 아래의 완화 방법 중 하나를 적용해야 합니다:

HTTP_PROXY='AFFECTED'
														

완화 방법

보다 자세한 완화 방법은 해당 서버의 지식베이스 문서에서 확인하십시오:

HTTPoxy - JBoss/tomcat은 영향을 받습니까?

HTTPoxy - Apache mod_cgi는 영향을 받습니까?

HTTPoxy - nginx는 영향을 받습니까?

HTTPoxy - Apache mod_fcgid는 영향을 받습니까?

HTTPoxy - PHP 애플리케이션은 영향을 받습니까?

HTTPoxy - Go 애플리케이션은 영향을 받습니까?

영향을 받는 제품 업데이트

영향을 받는 모든 제품의 수정 사항은 2016년 7월 18일에 릴리즈되었습니다.

제품 패키지 권고/업데이트
Red Hat Enterprise Linux 5.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 6.x httpd RHSA-2016:1421
Red Hat Enterprise Linux 7.x httpd RHSA-2016:1422
Red Hat Enterprise Application Platform 6.x httpd 패치 보류 중
Red Hat Enterprise Web Server 2.x httpd 패치 보류 중
Red Hat JBoss Web Server 3.x httpd 패치 보류 중
Red Hat Software Collections httpd24 RHSA-2016:1420

Comments