Posts categorized under: ocaml

OPAM 2 local mirrorの作り方

インターネットに接続できないクラスター用リポジトリミラー作成シリーズのOPAM版です。

opam1の頃はopam-mirrorを使って、しこしこ作ってましたが、opam2から楽になりました (https://discuss.ocaml.org/t/how-to-setup-local-opam-mirror/4423)

作業環境にはopamインストールして、リポジトリのファイルを全てダウンロードします。

$ git clone https://github.com/ocaml/opam-repository.git
$ cd opam-repository
# パッケージをダウンロードする
$ opam admin cache
# indexファイルをつくる
$ opam admin idnex

次はミラーサーバーにcacheとopam-repositoryをコピーして、httpdから見られるようにします。 ここの設定は省略します。 内部ノードから、http://mirror-server/opam-repository, http://mirror-server/opam/cacheでアクセスできるものとします。

内部ノードにopamの実行ファイルをコピーします。パスも通して使えるようにしておきます。

# base-compilerのビルドでエラー出るが無視
$ opam init http://mirror-server …

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 …

OCaml 4.04.1

OCaml 4.04.1が出ました。 Changes

Set.mapのバグも修正されているので インストールしようと思いましたが、opam updateしてもopam switch listに出てきません。

redditでも話題 になっています。 mergeしたからopam updateした?というコメントもありますが、 実際のところ、opam updateが参照しているhttps://opam.ocaml.org/urls.txtに変更が書かれていないため、リストに出てこないようです。

そうこうしているうちにhomebrewの方に4.04.1が来てたのでopam switch systemで済ませてしまいました。

Biocaml SAM header

ocaml製のバイオインフォマティクス用ライブラリで、 biocamlというのがあります。

BAMファイルを読みたかったので使ってみましたが、 @HGヘッダーにあるGO(group order)に未対応で読めなかったため、 ちょっと修正しました。

opamで落ちてくる0.6.0用です。

utop # #require "biocaml.unix";;
utop # open Biocaml_unix.Std;;
utop # Bam.read (open_in "a.bam");;
- : (Bam.Header.t * Sam.alignment Core_kernel.Std.Or_error.t Stream.t)
Core_kernel.Result_wrapper.Result.Error
 ("unexpected tag for given header item type …

macOS 10.12.1にあげたらlibcryptoが見つからない

macOSをSierraにあげました。

その後xcode8.1のインストールをして、omacのビルドをするとlibcryptoが見つからずエラーになりました。

% ocaml setup.ml -build 
Finished, 0 targets (0 cached) in 00:00:00.
+ /Users/hoge/.opam/4.03.0/bin/ocamlfind ocamlopt -g -linkpkg -package cohttp -package cohttp.lwt -package conduit -package cryptokit -package lwt -package str src/omac.cmx src/main.cmx -o src/main …

conduit with homebrew openssl

現象

cohttpでhttpsからClient.getすると (Failure "No SSL or TLS support compiled into Conduit") とエラーになった

対策

CPPFLAGS="-I$HOME/homebrew/opt/openssl/include" opam install ssl

原因

homebrewでopensslを入れており、homebrewのpathを/usr/localから$HOME/homebrewに変えていたため、 opamでsslをビルドできなかった。