What's New in each Release

v1.7의 새로운 기능

번들러 1.7은 의도치 않은 소스 서버에서 gem이 설치될 수 있는 취약점을 개선한 보안 릴리스입니다. 변경은 이 취약성을 개선한는 것뿐입니다. 1.7의 전체 changelog

개요

번들러는 항상 여러 gem 서버에서 gem을 가져오도록 지원 했지만, 어떤 gem이 어떤 소스에서 오는지 항상 확실하지는 않았습니다. 더욱이 번들러는 버전업할 때 소스의 우선순위에 일관성이 없었습니다.

이런 이유로, 여러 최상위 source를 가진 Gemfile은 특정 gem이 어떤 gem 서버에서 가져올지를 확실하게 제어할 수 없었습니다. 이는 예상치 못한 소스에서 gem 코드를 설치하는 결과를 만들 수 있습니다.

Gemfile에 하나의 source만 가지는 애플리케이션은 영향이 없습니다.

소스 선택

Gemfile:source 옵션이나 source 블록을 이용해 명시적으로 한 개 이상의 다른 루비젬스 저장소를 선택할 수 있습니다. 여러 최상위 gem 소스를 사용하는 것은 이제 권장하지 않습니다.
자세한 내용은: Gemfiles

모호한 소스 탐지

Gemfile이 여러 최상위 gem 소스를 가지고 있다면, bundle install이 하나 이상의 소스를 가진 gem을 발견할 때 경고를 합니다. 이는 예상한 서버가 아닌 다른 gem 서버에서 "가로채는" 상황을 방지하기 위해 만들었습니다. 하위 호환성을 위해, gem은 여전히 설치 되지만, 번들러가 사용된 gem 서버 URL과 같은 이름의 gem이 발견된 다른 서버의 목록을 경고로 표시합니다. 명시적인 소스 선택으로 이 경고를 없앨 수 있습니다.

전역 소스 순서

최상위 소스는 마지막에 추가된 것부터 검색하는 것으로 문서화 되어있지만, 1.7.0 이전 버전에서는 자동화된 테스트가 없었고, 버전 1.5.0에서 1.6.5까지는 부주의하게 거꾸로 되어있었습니다. 문서화된 순서는 이 버전에서 복원되었고, 회귀를 방지하기 위해 테스트 스위트에도 포함되었습니다.

업그레이드 하기

번들러는 유의적 버전을 엄격하게 사용하고, 버전 1.7.0은 이전 버전에서 동작하던 모든 Gemfile에 대해 완벽하게 하위 호환성이 있습니다. Gemfile에서 여러 gem 서버를 사용하는 애플리케이션을 가지고 있다면, 업그레이드 이후 모호한 gem 소스에 대한 경고를 보게될 수 있습니다. 경고가 나오건 나오지 않건, 번들러 팀은 여러 gem 서버를 사용하는 유저에게 Gemfile에서 새로운 구문을 사용하는 것을 강력히 권합니다.
Gemfile에서 새로운 source 구문을 사용하면 1.7.0 이전 버전의 번들러와 호환하지 않을 수 있습니다. 이 작업은 사용하는 모든 환경의 번들러를 업데이트한 이후에 해야 합니다.
  1. 주 gem 소스(보통은 https://rubygems.org)를 고르고 Gemfile의 제일 위에 둡니다.
  2. 다른 gem 소스는 각각 source 줄에 블록으로 추가하고 관련된 gem의 선언을 그 안으로 옮깁니다.

    예를 들어, 이 Gemfile

    source 'https://rubygems.org'
    source 'https://gems.example.com'
    
    gem 'rails', '4.1.4'
    gem 'sqlite3'
    gem 'my_gem', '1.0'
    gem 'another_gem', '1.2.1'

    이렇게 바뀔 수 있습니다.

    source 'https://rubygems.org'
    
    gem 'rails', '4.1.4'
    gem 'sqlite3'
    
    source 'https://gems.example.com' do
      gem 'my_gem', '1.0'
      gem 'another_gem', '1.2.1'
    end
    

해결책

모든 환경을 지금 즉시 1.7으로 업그레이드 할 수 없다면, Gemfile에서 부차적인 소스를 제거해 이 위험성을 완화하는 방법이 있습니다.
  • 먼저, 부가적인 gem 소스가 정말 필요한지 재평가합니다. 애플리케이션이 gems.github.comgems.rubyforge.org 같은 오래된 공개 gem 서버를 사용 중이라면, 모든 요구된 gem은 rubygems.org에 동기되어 있어야 합니다. 부가적인 소스를 지워 보세요.
  • rubygems.org에는 없는 gem을 사용하지만, git 소스로 사용 가능하다면, gem 선언에서 :git 옵션을 사용해서 gem 서버가 아닌 git 저장소에서 가져오도록 할 수 있습니다.
  • 이런 해결책이 적용 불가능 하다면, gem을 vendor 디렉터리에 언팩해서 Gemfile에서 gem을 선언할 때, :path 옵션을 사용해 언팩해둔 gem 디렉터리를 지정할 수 있습니다. 이 경우 소스 관리 시스템에 vendor해둔 gem을 커밋해야 합니다.
Fork me on GitHub
Docs: Previous Version (v1.10) Current Version (v1.11)