CVE-2017-9772の脆弱性
OCaml4.04.0,4.04.1にローカル権限昇格の脆弱性があったので4.04.2が出てます。
0007557: local privilege escalation issue with ocaml binaries
影響を受けるのは以下の状況ですが、かなり限定的だと思います。詳しくは上のmantisの方に再現手順があります。
- ocamlコンパイラで生成され、setuid, setgidされた実行ファイルが実行される際に
CAML_CPLUGINS, CAML_NATIVE_CPLUGINS, CAML_BYTE_CPLUGINS
環境変数に共有ライブラリへのパスを設定された場合- 共有ライブラリ内での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.getenv
とUnix.getenv
も変更の影響を受けるので、以前の動作が欲しい場合はSys.unsafe_getenv
が使用できます。
また、ocamlコンパイラ自体のビルド時に-no-cplugins
フラグを指定するとこの機能自体を無効化できます。
対策でuidはチェックされるようになりましたが、
実行時に環境変数に指定されたファイルが自動ロードされてランタイムを変更できてしまう、
というのはどうも筋が良くない気がします。無効化しておいたほうが無難な印象です。