FreeBSDでrubyを更新する

FreeBSDの持つ脆弱性チェックのために更新できない portsのrubyを無理矢理更新する方法を紹介します。 主目的は自分用の備忘録です。

FreeBSD+rubyについて私が書いている時点で「またruby disかよ」と思われるかもしれませんが、今回の主犯はFreeBSDのports管理と脆弱性情報管理のズレだと考えています。

問題となる現象

FreeBSD において Ruby 2.0 系列をインストールしていると

$ portmaster -d lang/ruby20

で本来はできるはずの更新ができません。

というのも Ruby の脆弱性FreeBSD のデータベースに登録されており、更新時にそれを見てこんな感じで止まってしまいます。

===>  ruby20-2.0_4,1 has known vulnerabilities:
ruby20-2.0_4,1 is vulnerable:
ruby -- Heap Overflow in Floating Point Parsing
CVE: CVE-2013-4164
WWW: http://portaudit.FreeBSD.org/cc9043cf-7f7a-426e-b2cc-8d1980618113.html
=> Please update your ports tree and try again.
*** [check-vulnerable] Error code 1

解決方法

portsをmakeするときに DISABLE_VULNERABILITIES=yes オプションを渡してあげましょう。portmasterを使っているならば

$ portmaster -m DISABLE_VULNERABILITIES=yes -d lang/ruby20

これで更新できます。

原因の推定

Ruby には浮動小数点関係の脆弱性があり修正版 2.0.0.353 がリリースされました。FreeBSDではそれを受けて脆弱性情報データベースに登録しました。そこには ruby20 については 2.0.0.353,1 未満のバージョンにはこの問題があるよ、と書かれています。

Affects:

  • ruby19 < 1.9.3.484,1
  • ruby20 < 2.0.0.353,1

しかし ports 上でのバージョン表記はさっきの出力例からわかるように 2.0_4,1 となっています。なんだか表記のルールがズレていそうです。そのために 2.0_4,1 < 2.0.0.353,1 と判断して止まっているのでしょう。これは悲しい。

なお ports の ruby20 の 2.0_4,1 の中身は Ruby 本家の 2.0.0.353 相当であり、この脆弱性についてはきちんと解消されているので、無視して更新しても大丈夫だと考えられます。


2014/04/05 11:40 追記

オプション名に誤りがありましたので訂正しました。

正: DISABLE_VULNERABILITIES=y 誤: DISABLE_VULNERABILITY=y