Skip to archived posts

CVE-2015-3900 RubyGems 2.4.6 이전의 요청 가로채기 취약점

published 14 May 2015

RubyGems에서는 gem을 가져오고 api 호출을 하는데 사용하는 도메인을 클라이언트에서 별도 호스트를 지정하게 할 수 있습니다. 이 방식은 DNS, 특히 원래 요청된 도메인의 SRV 레코드인 _rubygems._tcp를 사용하여 구현되었습니다.

예를 들어, rubygems.org를 이용하는 사용자들에게는 이렇게 보입니다.

  > dig _rubygems._tcp.rubygems.org SRV

  ;; ANSWER SECTION:
  _rubygems._tcp.rubygems.org. 600 IN	SRV	0 1 80 api.rubygems.org.

RubyGems는 요청을 하기 전에 SRV 레코드 안의 호스트 이름을 검증하지 않습니다.

이 남겨진 클라이언트는 DNS 가로채기 공격이 가능하며, 공격자는 직접 고른 SRV를 반환하고 클라이언트가 그것을 사용하게 할 수 있습니다. 예를 들어,

  > dig _rubygems._tcp.rubygems.org SRV

  ;; ANSWER SECTION:
  _rubygems._tcp.rubygems.org. 600 IN	SRV	0 1 80 gems.nottobetrusted.wtf

수정의 자세한 내용은 github에서 보실 수 있으며, 이제 레코드가 원래 도메인에 있는지 검증합니다. 이렇게 함으로써 그렇지 않았던 클라이언트가 원래 믿을 수 있고 안전한 도메인을 사용하도록 강제할 수 있습니다.

RubyGems 2.0에서 2.4.6까지의 버전은 취약합니다.

RubyGems 2.0.16, 2.2.4, 2.4.7 버전이 이 문제를 해결하기 위해 릴리스되었습니다.

루비 1.9.0에서 2.2.0 버전의 내장된 RubyGems는 취약합니다.

모든 버전에서 쓸 수 있는 패치입니다.

이 취약점은 Jonathan Claudius JClaudius@trustwave.com에 의해 보고되었습니다.

Evan Phoenix Evan Phoenix