技術・開発

【CentOS 8】yum/dnfが「libcurl.so.4 Not Found」で動かない!ClamAVの誤検知からRPM手動復旧までの道のり

2021年11月22日

サーバーのソフトウェアのバージョンアップ確認を行うため、いつものように yum update を実行したところ、突然 libcurl.so.4 が見つからないというエラーが発生し、yumdnf)が全く起動しなくなってしまいました。

パッケージ管理ツール自体が壊れると非常に焦りますが、原因調査から手動での復旧までを行ったので備忘録として残します。

現象:yum実行時に ImportError が発生

実行時のトレースバックは以下の通りです。

# yum update
Traceback (most recent call last):
  File "/usr/lib64/python3.6/site-packages/libdnf/error.py", line 14, in swig_import_helper
    return importlib.import_module(mname)
# (中略)
ImportError: libcurl.so.4: cannot open shared object file: No such file or directory

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/bin/yum", line 57, in <module>
    from dnf.cli import main
# (中略)
ModuleNotFoundError: No module named '_error'

見事に libcurl.so.4 が読み込めず、モジュールエラーで落ちています。

原因調査:消えた libcurl.so.4 の行方

1. ファイルの存在確認

まずはファイルが本当にないのか探ってみます。

# locate libcurl.so.4
/usr/lib64/libcurl.so.4

# ll /usr/lib64/libcurl.so.4
ls: '/usr/lib64/libcurl.so.4' にアクセスできません: No such file or directory

locate のDB上には残っていますが、実体が存在しません。updatedb を実行した後に再度 locate するとヒットしなくなりました。どこかのタイミングで物理的に消されたようです。

2. シンボリックリンクの確認

/usr/lib64/libcurl.so を確認すると、libcurl.so.4.5.0 へのシンボリックリンクは残っていました。しかし、リンク先の本体がありません。

# ll /usr/lib64/libcurl.so
lrwxrwxrwx 1 root root 16 11月  3 01:31 /usr/lib64/libcurl.so -> libcurl.so.4.5.0

3. 犯人はアンチウイルスソフト「ClamAV」

/var/log/messages などを見ても手掛かりがなく途方に暮れていたところ、ClamAVのログに以下の記述を発見しました!

Nov 18 02:28:48 kaede CROND[2710289]: (root) CMDOUT (/usr/lib64/libcurl.so.4.5.0: Unix.Trojan.Coinminer-9910195-0 FOUND)

どうやら、libcurl の本体ファイルが**「トロイの木馬(Coinminer)」としてClamAVに誤検知(False Positive)され、隔離または削除されてしまった**ようです。

復旧手順:RPMを手動でダウンロードして再インストール

libcurl を再インストールすれば直りますが、肝心の yum コマンドが使えません。 仕方がないので、他のPC(ブラウザ)を使ってCentOSのリポジトリサイトから直接 libcurl のRPMパッケージを取得し、サーバーへアップロードして手動更新します。

ステップ1:OSと現在のパッケージバージョンの確認

最新の libcurl を入れても良いのですが、依存関係のエラーを引き起こすリスクを避けるため、現在インストールされているものと全く同じバージョンを上書きインストールします。

# OSバージョンの確認
# cat /etc/redhat-release 
CentOS Linux release 8.4.2105

# インストールされているlibcurlのバージョン確認
# rpm -qa | grep libcurl
libcurl-devel-7.61.1-18.el8_4.2.x86_64
libcurl-7.61.1-18.el8_4.2.x86_64

ステップ2:CentOS VaultからRPMをダウンロード

CentOS 8は既にサポートが終了しているバージョンもあるため、通常のリポジトリではなく「Vault」を参照します。

  1. ブラウザで http://vault.centos.org/ へアクセスします。
  2. OSバージョン「8.4.2105」を選択。
  3. libcurl は標準パッケージなので、BaseOS/x86_64/os/Packages/ と辿ります。
  4. 先ほど調べたバージョンと完全一致するRPMファイル(例:libcurl-7.61.1-18.el8_4.2.x86_64.rpm)を探してダウンロードします。

ステップ3:rpmコマンドで強制上書きインストール

ダウンロードしたRPMファイルをサーバーへ転送し、rpm コマンドに --replacepkgs(強制上書き)オプションを付けて実行します。

# rpm -ivh --replacepkgs libcurl-7.61.1-18.el8_4.2.x86_64.rpm 
Verifying...                          ################################# [100%]
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:libcurl-7.61.1-18.el8_4.2        ################################# [100%]

ファイルが正しく配置されたか確認します。

# ll /usr/lib64/libcurl*
lrwxrwxrwx 1 root root     16 11月  3 01:31 /usr/lib64/libcurl.so -> libcurl.so.4.5.0
lrwxrwxrwx 1 root root     16 11月  3 01:31 /usr/lib64/libcurl.so.4 -> libcurl.so.4.5.0
-rwxr-xr-x 1 root root 592320 11月  3 01:31 /usr/lib64/libcurl.so.4.5.0

これで無事に yumdnf)コマンドが息を吹き返しました!


補足:ClamAVのシグネチャ更新で誤検知は解消

復旧後、念のためClamAVのパターンファイル(シグネチャ)を最新にアップデートして再スキャンしたところ、ウイルスとしては検知されなくなりました。

# freshclam
# (アップデート処理...)

# clamscan --remove -r /usr/lib64/libcurl.so.4.5.0 
/usr/lib64/libcurl.so.4.5.0: OK

----------- SCAN SUMMARY -----------
Known viruses: 8579047
Engine version: 0.103.3
Scanned directories: 0
Scanned files: 1
Infected files: 0

2021年11月18日頃に配信された検知パターンに、たまたま誤検知を引き起こすデータが混ざってしまっていたようですね。重要なシステムライブラリが消されると焦りますが、落ち着いて手動でRPMを当て直せばリカバリ可能です。

-技術・開発
-, , , , , , , ,