CVE-2017-9772の脆弱性

OCaml4.04.0,4.04.1にローカル権限昇格の脆弱性があったので4.04.2が出てます。

0007557: local privilege escalation issue with ocaml binaries

影響を受けるのは以下の状況ですが、かなり限定的だと思います。詳しくは上のmantisの方に再現手順があります。

  1. ocamlコンパイラで生成され、setuid, setgidされた実行ファイルが実行される際に
  2. CAML_CPLUGINS, CAML_NATIVE_CPLUGINS, CAML_BYTE_CPLUGINS環境変数に共有ライブラリへのパスを設定された場合
  3. 共有ライブラリ内でのsetreuidによって権限昇格が可能になる

注入される共有ライブラリは既存のランタイム内hookが利用可能で、 この件とは直接関係ありませんが環境変数から注入可にしては強力すぎるように見えます。

/* Load dynamic plugins indicated in the CAML_CPLUGINS environment
   variable. These plugins can be used to set currently existing
   hooks, such as GC hooks and system calls tracing (see misc.h).
 */

https://github.com/ocaml/ocaml/pull/668/files#diff-867452b8e2d255275b14ba707321e78cR569

脆弱性が埋め込まれた経緯は、

  • 4.04.0からocamlランタイムにCAML_CPLUGINS環境変数に設定された共有ライブラリを自動でロードする機能が追加されたが(プルリク)、 ドキュメント化されずデフォルトで有効な状態だった。
  • 環境変数の読み込み時に、secure_getenvのようなset-user-IDチェックが存在しなかったため、 素通ししてしまった。

対策として、secure_getenvがある場合は使用して、なければ自前でチェックするようにしたようです。

Sys.getenvUnix.getenvも変更の影響を受けるので、以前の動作が欲しい場合はSys.unsafe_getenv が使用できます。

また、ocamlコンパイラ自体のビルド時に-no-cpluginsフラグを指定するとこの機能自体を無効化できます。 対策でuidはチェックされるようになりましたが、 実行時に環境変数に指定されたファイルが自動ロードされてランタイムを変更できてしまう、 というのはどうも筋が良くない気がします。無効化しておいたほうが無難な印象です。