libdes.soとlibcrypto.soをくっつける

 opensslのライブラリ(libcrypto)にはlibdes互換機能がついていたが、openssl-0.9.7からそれがdes_old.hによる置換マクロのみの対応となり、libdes互換のためのシンボルは存在しなくなった。このため、libcryptoを共有ライブラリ(libcrypto.so)の形で動的リンクしてlibdes互換機能を利用していたプログラムの場合、openssl-0.9.6からopenssl-0.9.7以降に更新するとバイナリ互換性が失われ、des_cbc_encryptなどいくつかのシンボルが見つからないというエラーが発生するようになった。
 当方の場合、opensslをアップデートしたところ、OS(古いRedHat)にバイナリでインストールされているcyrus-saslパッケージに入っているlibdigestmd5.soが参照しているdes_cbc_encryptなどがundefined symbolとなってしまった。これを使っているpostfixのsmtpdがdlopenするときに、/var/log/messagesに「unable to dlopen /usr/lib/sasl2/libdigestmd5.so.2: libcrypto.so.2: cannot open shared object file: No such file or directory」というエラーを吐く。
 LD_PRELOADで逃げる手も試したがdlopenには効かないようであった。opensslには深刻な脆弱性が見つかっているので、0.9.6のまま使い続けるというわけにもいかないし、そうかといって、再コンパイルしようとすると依存しているバイナリやライブラリを芋づる式にコンパイルしていかなければならなくなりそうで手がつけられない。
 メジャーバージョンアップでもないのにまったくとんでもない仕様変更をしてくれたものだが、変わってしまっているものは仕方がないので、以下のようにしてなんとか強引に対処した。

openssl-0.9.8r:
% ./config shared -DOPENSSL_DES_LIBDES_COMPATIBILITY
% make
% make test
# make install
# cd /lib
# ln -s /usr/local/ssl/lib/libcrypto.so.0.9.8
# ln -s /usr/local/ssl/lib/libssl.so.0.9.8

libdes-4.04b:
% patch < des.Makefile.diff # libdes.so.3を作りたいときのみ。
% make

適当なディレクトリで:
% gcc -shared -Wl,-soname,libcrypto.so.2 -o libcrypto.so.2 -Wl,--whole-archive libdes.aへのパス libcrypto.aへのパス -Wl,--no-whole-archive -ldl -Wl,-noinhibit-exec
# cp libcrypto.so.2 /usr/lib/sasl2
# cp smtpd.libdes /usr/libexec/postfix
# chown root.root /usr/libexec/postfix/smtpd.libdes
# chmod 755 /usr/libexec/postfix/smtpd.libdes
# vi /etc/postfix/master.cf

smtp inet n – n – – smtpd
とある行(chrootの列は標準ではyだけど)を
smtp inet n – n – – smtpd.libdes
に変更。

# /sbin/service postfix restart

 若干の間違いはあるかもしれないが、大体こんな感じ。
 要するにlibdes.aとlibcrypto.aをくっつけて一つの共有ライブラリを作っているのだけど、シンボルが重複してエラーになるのを-noinhibit-execで無理やり無視させたりして、かなり強引。なんとなく動いているように見えるだけで、実は中の動作はめちゃくちゃかも。
 こんな怪しいライブラリを標準のライブラリのサーチパスに入れておくのは危険なので、上記の通り、smtpdだけに適用するsmtpd.libdesというスクリプトを作った。

注: この記事は個人的なメモです。真似するのは自由ですが無保証です。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください