보안정보

전문화된 보안 관련 자료, 보안 트렌드를 엿볼 수 있는
차세대 통합보안관리 기업 이글루코퍼레이션 보안정보입니다.

File Content Disclosure on Rails (CVE-2019-5418)

2019.06.03

7,378




1. 개요


[그림 1] 취약점 동작개요


올해 3월 Ruby기반의 웹 어플리케이션 프레임워크인 Rails(Ruby on the Rails)에서 2건의 취약점(File Content Disclosure : CVE-2019-5418, DOS : CVE-2019-5419)이 보고되었다. 두 취약점 모두 High의 위험도를 갖는 취약점으로 이번 호에서는 RCE공격이 가능한 CVE-2019-5418에 대해서 자세히 알아보고자 한다.

CVE-2019-5418은 MVC의 Controller기능 중 render함수의 file인자를 활용한 내부처리방식을 이용하여 공격이 가능하다. Rails의 render함수가 요청한 파일 탐색 시 웹 서버 경로에 존재하는 파일 이외에 공격자가 입력한 경로의 파일 실행이 가능하다. Rails는 2004년 최초 출시했으며 2019년 3월 Controller의 render 함수에서 취약점이 발견된 것은 이번이 처음이다.

CVE

영향 받는 버전

위험도

보안 패치 버전

CVE-2019-5418

<5.2.2.1, <5.1.6.2, <5.0.7.2, <4.2.11.1

High

4.2.11.1 , 5.0.7.2 , 5.1.6.2 , 5.2.2.1 , 6.0.0.beta3


[표 1] 취약점 정보


2. Rails(Rails on Ruby)

▶ Rails 취약점 발생 위치


[그림 2] Rails 구조


Rails는 웹 어플리케이션 프레임워크로 스크립트 언어인 루비를 사용하며 웹 프로그래밍을 효율적으로 구성 할 수 있도록 도움을 준다. Rails는 MVC(Model, View, Controller) 디자인 패턴을 이용해 기능화 화면을 분리하여 효율적인 코드작성이 가능하다. 이번에 발견된 취약점은 MVC의 Controller 처리과정에서 발생하였다.


3. 취약점 시연

▶ 공격 시연


[그림 3] 취약점 동작개요


해당 취약점은 Controller를 요청할 때 HTTP 헤더의 Accept 파라미터에 ‘파일경로+{{’를 입력하면 응답 값에서 요청한 파일의 내용이 출력되도록 할 수 있다. 단, 해당 공격은 ApplicationController에 Controller 요청 시 특정 파일을 출력할 수 있도록 설정해야 한다.

취약점을 시연하기 위해서 Rails의 버전은 5.2.1 버전 이하, Ruby 버전은 2.5.1p57으로 환경을 구성하였다.

프로그램

이름

버전

Language

Ruby

2.5.1p57

FrameWork

Rails

5.2.1


[표 2] 취약점 시연 환경​


4. 취약점 분석

1) 취약점 발생 코드


[그림 4] 취약점이 발생하는 Controller의 소스코드


취약점이 발생하는 Controller의 소스코드로 해당 Controller가 호출될 시 index 안의 문장이 실행된다. Render 함수의 File 옵션으로 “{Rails.root}/welcome.txt” 경로의 파일을 출력하게 되며, file 옵션처리 과정에서 취약점이 발생하게 된다. 


2) 취약점 동작방식 흐름도


[그림 5] 취약점 공격 흐름도


Controller가 실행되면서 Render File 함수를 요청 받으면 Request의 헤더 정보를 취합하여 쿼리를 작성하고 이를 이용하여 파일존재 여부확인을 실시한다. 탐색 실패 후 쿼리 수정을 하게 된다. 이 과정에서 Accept 헤더가 파일 존재 검사 시 사용이 된다. 내부 작동 방식에 의해 Accept 문장으로 파일검색을 수행하게 된다. 그 결과 해당 파일 검색에 성공하고 내용 출력을 하게 된다.


3) 쿼리 수정 함수 분석


[그림 6] 취약점이 발생하는 build_query 함수


취약점이 일어나는 쿼리수정 함수 내용이다. 처음 생성된 쿼리 문장이 파일 탐색에 실패할 시 진입한다. escape_entry함수를 통해 파일경로를 검증 및 수정하며 Ruby 매소드인 gsub를 활용해 Query문장을 치환하고 쿼리를 완성하게 된다. 이 과정에서 기존의 쿼리와 Accept 문장을 이용한다.​


4) 쿼리 분석


[그림 7] 취약점으로 만들어진 쿼리


[그림 7]은 그림 [그림 6]의 쿼리 수정 과정에서 변조된 Accept로 만든 쿼리이며 파일탐색에 사용된다. 정상쿼리의 경우 “welcome.txt”가 맨 앞에 노출되지만 쿼리 수정 과정에서 “.. /.. /.. /.. /”에 의해 이전부분이 삭제되고 “/ etc/ passwd” 부분으로 시작하게 된다. 

해당 쿼리를 이용하여 경로(“/ etc/ passwd”)에 대해 파일탐색을 실시하게 되는데 이 공격 쿼리의 특징은 “{{“를 삽입해서 오른쪽의 대괄호를 닫힌 상태로 만들어주어 화면 출력 에러를 방지한다. 이에 따른 결과로 해당 경로의 파일 내용을 응답하게 된다. ​


5. 대응방안

1) 웹 서버 로그 확인


[그림 8] 웹 서버 Puma 정상 콘솔로그


Rails에 사용되는 기본 웹 서버 Puma의 정상 콘솔 로그이다. 사용자의 접속요청 및 결과에 대한 상황을 기록한다. 이때 Controller, Accept로 요청한 파일형식과 그에 대한 응답결과를 기록한다. [그림 8]을 보면 igloosec_leebh Controller에 HTML형식으로 응답 요청을 보내면 welcome.txt파일을 찾아서 보여주는 정상 콘솔로그이다.


[그림 9] 웹 서버 Puma 비정상 콘솔로그


[그림 9]는 igloosec_leebh Controller에 파일형식을 .. /.. /.. /.. /.. /.. /.. /.. / etc/ passwd{{로 응답결과를 요청하고 이에 따른 서버의 응답으로 / etc/ passwd 파일을 보여 주는 콘솔로그이다. 이처럼 웹 서버의 콘솔로그에서 as이후의 accept 파라미터를 확인하면 Accept 파라미터에 대한 공격여부를 알 수 있다.


2) MIME 필터문구 삽입


[그림 10] MIME 제한 소스코드 추가


[그림 10]은 Accept 패킷의 Mime 타입을 지정하는 소스코드이며 취약점 패치 후의 코드이다. 해당 파일의 경로는 actionpack/ lib/ action_dispatch/ http/mime_negotiation.rb이며, 소스코드 81번 줄 아래에 MIME 타입을 제한하는 소스코드를 추가한다. 해당 코드는 등록된 MIME 타입 또는 * / * 형식을 확인한다. 서버 측 소스코드에서 해당구문을 추가함으로써 Accept 공격 구문을 방지 할 수 있다. 


3) 업데이트 실시


[그림 11] Rails 보안패치 공지


해당 취약점은 버전 업데이트를 통해 2019년 3월 13일에 패치 공지가 업로드 되었다. 2004년 Rails가 출시된 이후로 2019년 3월에 Controller의 Render file에 대해 취약점이 처음 보고되었기 때문에 이전 모든 버전이 해당 취약점에 노출된다. 해당 취약점을 예방하기 위하여 보안패치가 된 4.2.11.1 , 5.0.72 , 5.1.6.2 , 5.2.2.1 , 6.0.0.beta3로 업데이트를 실시해야 한다.


6. 참고자료

[1] [rails] 레일즈란?  https://jinbroing.tistory.com/18
[2] Rails 4.2.11.1, 5.0.7.2, 5.1.6.2, 5.2.2.1, and 6.0.0.beta3 have been released!
https://weblog.rubyonrails.org/2019/3/13/Rails-4-2-5-1-5-1-6-2-have-been-released/
[3] Ruby on Rails 路径穿越与任意文件读取漏洞分析 - 【CVE-2019-5418】
https://xz.aliyun.com/t/4448
[4] CVE-2019-5418 - File Content Disclosure on Rails, Github https://github.com/mpgn/CVE-2019-5418