KOROMOON

착한 사마리아인이 되고 싶습니다.

5/09/2018

[CVE-2018-7600] Drupalgeddon2 분석


( 1 ) 취약점 정의
Drupal 보안팀은 2018년 03월 28일 SA-CORE-2018-002 보안 권고를 발표하였으며 Drupalgeddon2 이름으로 명명할 정도로 드루팔의 치명적인 원격 코드 실행 취약점임.

여기서 Drupal 은 PHP 로 작성된 오픈소스 콘텐츠 관리 프레임워크, 콘텐츠 관리 시스템, 블로그 엔진임.
Drupal 에 대한 자세한 정보는 아래 홈페이지를 참고하길 바람.
홈페이지 : https://www.drupal.org/drupal-7.0/ko

해당 취약점은 CVE-2018-7600 으로 Drupal 의 Form API Ajax 요청 프로세스에서 입력값 검증이 제대로 이루어지지 않아 공격자로부터 악의적인 코드를 내부 양식 구조에 삽입할 수 있음.
이로 인해 인증되지 않은 공격자가 웹사이트 통제권을 가져올 수 있는 것으로 확인됨.



( 2 ) 취약점 분석

이 취약점의 근본 원인은 Drupal 시스템의 양식 렌더링에 있음.
Form API 처리가 Drupal 6 버전에서 도입되었으며 양식 렌더링 프로세스 중에 양식 데이터를 변경할 수 있음.
Drupal 7 버전의 Form API 는 이제 "Renderable Arrays" 로 일발화되었으며 이 확장된 API 는 페이지, 블록, 노드 등 Drupal 의 UI 요소 대부분의 구조를 나타내는 데 사용됨.
이는 연관 배열에 의해 구현되며 마크업 및 UI 요소를 의미있는 방식으로 렌더링하기 위해 키와 값을 쌍으로 표현하여 함수 인수 또는 양식 데이터로 전달함.
Renderable Arrays 에 대한 자세한 정보는 아래 링크를 참고하길 바람.
https://www.drupal.org/docs/7/api/render-arrays/render-arrays-overview
취약한 Drupal 에서 주입한 배열을 요소가 아닌 값으로 취급하도록 랜더링을 설정하면 악의적인 코드를 삽입할 수 있음.


< 매개 변수가 있는 입력에서 # 기호를 제거하는 패치 >

이번 취약점에 대한 위 Drupal 보안 패치를 살펴보면 DrupalRequestSanitizer 라는 클래스가 stripDangerousValues 메소드와 함께 추가되어 # 기호로 시작하는 키에 대한 입력 배열의 모든 항목을 설정 해제함.
(위치 : /includes/request-sanitizer.inc 파일)
이 방법은 Drupal 의 부트 스크랩 초기 단계(사이트 구성을 로드한 직후)에 $_GET, $_POST, $_COOKIES 의 입력 데이터를 삭제함.



( 3 ) 취약점 공격

아래는 현재까지 확인된 공격자가 악의적인 코드를 주입할 수 있는 취약한 Form API 함수 리스트임.

#access_callback
현재 사용자가 요소에 액세스 할 수 있는지 여부를 결정하기 위해 Drupal 에서 사용함.
#pre_render
렌더링하기 전에 렌더링 배열을 조작함.
#lazy_builder
렌더링 프로세스의 맨 마지막에 요소를 추가하는 데 사용됨.
#post_render
렌더링 프로세스의 결과를 받고 주위에 래퍼를 추가함.


< Drupal 7 버전에서의 POC, 출처 - researchcenter.paloaltonetworks.com >


< Drupal 8 버전에서의 POC > 

그리고 현재까지 발표된 보고서에 따르면 Drupal 8 버전은 사용자 등록 페이지(/user/register)에 POC 실행 시 효과가 있으며 Drupal 7 버전에서는 사용자 암호 페이지(/user/password)에 POC 실행 시 효과가 있는 것으로 확인됨.
거의 모든 공개 POC 샘플은 [#post_render][] 의 렌더링 배열 키값을 위혐한 PHP 명령어 함수명(ex. exec, system, passthru 등)을 입력함.
그리고 위험한 PHP 명령어 함수에 입력할 인자값(즉, 부가적인 명령어로 pwd, curl hxxp://url 등)을 두 번째 키-값 쌍 [#markup] 의 값으로 입력되어 악의적인 코드를 실행시킴.



( 4 ) 취약점 방어

아래 버전별로 패치할 것!!!
Drupal 7.x 버전대 -> 7.58 버전 패치
Drupal 8.3.x 버전대 -> 8.3.9 버전 패치
Drupal 8.4.x 버전대 -> 8.4.6 버전 패치
Drupal 8.5.x 버전대 -> 8.5.1 버전 패치

그리고 버전에 따라 POC 가 다르므로 Snort 룰을 아래와 같이 적용시켜 탐지할 것!!!

- Drupal v7 버전용
alert tcp any any -> any any (msg:"KOROMOON_CVE-2018-7600_Drupalgeddon2_v7_POC"; uricontent:"password"; nocase; pcre:"/(%23|#)(access_callback|pre_render|post_render|lazy_builder)/i";)

- Drupal v8 버전용
alert tcp any any -> any any (msg:"KOROMOON_CVE-2018-7600_Drupalgeddon2_v8_POC"; uricontent:"register?element_parents=account"; nocase; pcre:"/(%23|#)(access_callback|pre_render|post_render|lazy_builder)/i";)



참고 사이트 : 
https://www.drupal.org/sa-core-2018-002
https://research.checkpoint.com/uncovering-drupalgeddon-2/
https://researchcenter.paloaltonetworks.com/2018/05/unit42-exploit-wild-drupalgeddon2-analysis-cve-2018-7600/
http://blog.nsfocus.net/cve-2018-7600-analysis/
https://github.com/nixawk/labs/issues/19
https://github.com/dreadlocked/Drupalgeddon2
https://github.com/ptresearch/AttackDetection/blob/master/CVE-2018-7600/cve-2018-7600.rules



============================================================
본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.

댓글 없음:

댓글 쓰기