2022年3月26日土曜日

FreeBSD で libxml2 のアップデートしたら,多くのアプリケーションが動かなくなった

 2022年3月26日に FreeBSD 上のアプリケーションのアップデートをしていたら,急に多くのアプリケーションが動かなくなった。 その顛末を書こう(まだ終わってないけど…)

 ことの起こりは FreeBSD 上で portupgrade をしたことに始まる。 まぁ,ホントは他のアプリケーションのアップデートができない,といわれてごそごそやっていたのだが…。 そのごそごそやっている時にメモを残しているのだが,そこで新しく emcas でファイルを作ろうと思った。 そしたらいきなり
ld-elf.so.1: /usr/local/lib/libxml2.so.2: version LIBXML2_2.4.30 required by /usr/local/bin/emacs not defined
と言われてしまった。

その時点での libxml2 のバージョンは
% pkg info -aI | grep libxml2
libxml2-2.9.13                 XML parser library for GNOME
py38-libxml2-2.9.13            Python interface for XML parser library for GNOME
py38-lxml-4.8.0                Pythonic binding for the libxml2 and libxslt libraries
だった。「libxml2」自体のバージョンは「2.9.13」だった。 説明を見る限りでは,この libxml2 は GNOME 上で XML のテキストファイルの解析(解釈?)をするものみたい。 なので,GNOME 上で動きそうなアプリケーションではかなり影響を受けそうな感じだった。 私の場合はそれが emacs だった。

 さすがに普段使っているエディターが使えないのはつらい。「vi」も多少使えるようになってきたが,それでもやはり使い慣れた方がいい。 そこで,いろいろ調べてみた。

 libxml2 自体は「/usr/local/lib/ 」の下にある。
% ll /usr/local/lib/libxml2*
lrwxr-xr-x 1 root wheel      17  3月 26 16:46 /usr/local/lib/libxml2.so -> libxml2.so.2.9.13*
lrwxr-xr-x 1 root wheel      17  3月 26 16:46 /usr/local/lib/libxml2.so.2 -> libxml2.so.2.9.13*
-rwxr-xr-x 1 root wheel 1657544  3月 26 16:46 /usr/local/lib/libxml2.so.2.9.13*
libxml2 のバージョン「2.4.30」がない,というので,Symbolic link で libxml2.so.2.4.30 を強引に作ってみたがだめだった。

 次に,textproc/libxml2/ をインストール(make install)し直してみた。 最後にすでにインストールされているのと被っているというエラーが出るが,それはいつものように「make deinstall」してから「make install」すればよい。 当然インストールされるのは最新バージョンの「2.9.13」。 で,emacs を起動しようとすると,やっぱり
ld-elf.so.1: /usr/local/lib/libxml2.so.2: version LIBXML2_2.4.30 required by /usr/local/bin/emacs not defined
とでる。

 ネット上で検索すると,どうやら過去にもバージョン「2.7.8」辺りでも似たようなことがあったみたい。 その際の解決方法は
ports が更新されるはずだから待て
だった。 まぁ,そのうち Maintainer の人が直してくれるとは思うけどねぇ。こんな時は自分でも FreeBSD に貢献できれば,と思うが,これが技術が伴わない…。

 それで仕方なくやったのが緊急避難的な「portdowngrade」作戦。 「portdowngrade」は,まず
# cd /usr/ports/ports-mgmt/portdowngrade/
# make install clean
で downgrade 用のアプリケーションをインストールしないといけない。
その後で
# portdowngrade textproc/libxml2
とすると downgrade 可能なバージョンの情報を教えてくれる。
# portdowngrade textproc/libxml2
Choose a revision from this list and run /usr/local/sbin/portdowngrade textproc/libxml2 revision
------------------------------------------------------------------------
r565061 | tcberner | 2021-02-13 05:27:37 +0900 (土, 13  2月 2021) | 9 lines

textproc/libxml2: rename VALID option to VALIDATION

- The option name could under some circumctances lead to issues
  with the VALID_CATEGOIRES variable of the ports framework.
- Simply rename the option, to something similar.

PR:             252933
Submitted by:   andrew@tao11.riddles.org.uk

------------------------------------------------------------------------
r556670 | tcberner | 2020-12-01 03:45:04 +0900 (火, 01 12月 2020) | 9 lines

textproc/libxml2: ship patches via files/ due to gitlab
............
ここで赤く色を付けた「r565061」とか「r556670」が downgrade での管理上の番号みたい。 今回は直前のものでいいので最初の「r565061」までバージョンを下げることにした。

# portdowngrade textproc/libxml2 r565061
すると
# portdowngrade textproc/libxml2 r565061
A    libxml2/files
A    libxml2/Makefile
A    libxml2/distinfo
A    libxml2/files/LICENSE.TRIO
A    libxml2/files/patch-CVE-2019-20388
A    libxml2/files/patch-CVE-2020-24977
A    libxml2/files/patch-CVE-2020-7595
A    libxml2/files/patch-Makefile.in
A    libxml2/files/patch-Python-39-support
A    libxml2/files/patch-config.h.in
A    libxml2/files/patch-configure
A    libxml2/files/patch-libxml-2.0-uninstalled.pc.in
A    libxml2/files/patch-libxml-2.0.pc.in
A    libxml2/files/patch-python_Makefile.in
A    libxml2/files/patch-python_libxml.c
A    libxml2/files/patch-python_tests_Makefile.in
A    libxml2/files/patch-uri.c
A    libxml2/files/patch-xml2Conf.sh.in
A    libxml2/pkg-descr
A    libxml2/pkg-plist
Checked out revision 565061.
You should be done-- now cd into libxml2 and you can run
# make deinstall install clean

Please note that portdowngrade no longer modifies the ports tree; the
checked out port is at
/root/libxml2
と出てきた。

 current directory に「libxml2」というディレクトリが作られ,その中に移動してから
# make deinstall install clean
とするように,と書いてある。

 そこで書いてあるようにやってみた。すると無事に libxml2 のバージョンを下げることができた。
# make deinstall install clean
===>  Deinstalling for libxml2
===>   Deinstalling libxml2-2.9.13
Updating database digests format: 100%
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
        libxml2: 2.9.13

Number of packages to be removed: 1

The operation will free 12 MiB.
[1/1] Deinstalling libxml2-2.9.13...
[1/1] Deleting files for libxml2-2.9.13: 100%
(ここで config がはいった)
===>  libxml2-2.9.10_3 has known vulnerabilities:
libxml2-2.9.10_3 is vulnerable:
  libxml2 -- Possible denial of service
  CVE: CVE-2021-3541
  WWW: https://vuxml.FreeBSD.org/freebsd/524bd03a-bb75-11eb-bf35-080027f515ea.html

1 problem(s) in 1 installed package(s) found.
=> Please update your ports tree and try again.
=> Note: Vulnerable ports are marked as such even if there is no update available.
=> If you wish to ignore this vulnerability rebuild with 'make DISABLE_VULNERABILITIES=yes'
*** Error code 1

Stop.
make[1]: stopped in /root/libxml2
*** Error code 1

Stop.
make: stopped in /root/libxml2
どうやらバージョン「2.9.10_3」は脆弱性があるので今回のバージョン「2.9.13」へのアップデートが行われたみたい。 しかし,今回は脆弱性があってもバージョンを下げたいので,「DISABLE_VULNERABILITIES=yes」のオプションをつけて作業した。
# make DISABLE_VULNERABILITIES=yes deinstall install clean
すると,うまくバージョン「2.9.13」をバージョン「2.9.10_3」に下げることができた。 そして emacs もうまく動いた。

もしバージョンを固定したければ
# pkg lock libxml2-2.9.10_3
とすればいいみたい。ちなみに,ロックを解除するのは
# pkg unlock libxml2-2.9.10_3

 とりあえずこれで emacs は使えるようになった。よかったよかった。
原因は「libxml2」の最新バージョンにある,ということもわかった。 本来は脆弱性に対処した最新バージョン 2.9.13 でエラーが無くなるのがよいのだが,数日(1〜2週間?)はこれで乗り切ろうと思っている。
===================================================
追記)その後いろいろいじっているが,わかったことが一つある。
一度 emacs を deinstall してから再インストールしようとした。そしたら「x11/libxkbcommon」がないと怒られた。

実は「libxkbcommon」も一度 deinstall して再インストールしようとしてだめと言われていた。 仕方ないので「x11/libxkbcommon」の再インストールに挑戦してみた。その時に言われたのが「libxml2」のバージョン 2.4.30 がない,というメッセージだった。 そこで,まず「libxml2」をダウングレードして「x11/libxkbcommon」をインストールしてみた。するとうまくインストールできた。

すると今度は emacs を再インストールする時に「libxml2」の 2.9.13 がないと言われた。そこで「libxml2」をアップデートしてから emacs を再インストールするとうまくいった。 もしや問題は「libxkbcommon」にあるのか??
うーん,わからん…。

0 件のコメント: