chkrootkit のSuckit誤検知の修正

ALL
スポンサーリンク

CentOS6のサーバで rootkit検知ツール chkrootkit を導入していますが、最近 chkrootkitが、Suckit による /sbin/init の改ざんを検知しました。
結果として誤検知だったのですが、なぜ誤検知するのか調べ、誤検知を回避するように chkrootkitを修正してみました。

ファイルが改ざんされているかのチェック方法

chkrootkit が、Suckit による /sbin/init の改ざんを検知した際のメッセージは下記です。

 for Suckit rootkit... Warning: /sbin/init INFECTED

同様の事例を探すと誤検出のようです。
rootkit検知ツール「chkrootkit」からのメールについて | Public-T
自宅サーバー構築メモ(CentOS) –
サーバーが改竄された!?chrootkitの誤検知でした。 « パソコンやホームページに関するITの部屋

先日、CentOS6の upstartパッケージが更新されました。
それに伴い init も更新されたので、この更新を Suckit による /sbin/init の改ざんと検知したようです。

実際に改ざんされていないかの確認は、rpm -V `rpm -qf /sbin/init` の実行で判断します。
なにも表示されなかったら、改ざんはされていないと判断します。
実行結果は何も出力無しで、改ざんは無く、一安心でした。

なお、rpm -qf /sbin/init で /sbin/init がどのパッケージに含まれているかを出力します。
こちらの環境では upstart-0.6.5-12.el6_4.1.x86_64 でした。

rpm -V パッケージ名 では、指定したパッケージのファイルの MD5 チェックサム等を、rpm データベースに格納されているパッケージ情報と比較します。

改ざんがあった場合、下記のような表示がなされます。

..5....T.    /sbin/init

最初の8文字は、比較の結果を示します。表示される文字は、次を意味しています。

S ファイルサイズが異なっている
5 MD5チェックサムが異なる
L シンボリックリンクが変更されている
T ファイルの更新時刻が変更されている
D デバイスファイルが変更されている
U ファイルの所有者が変更されている
G ファイルの所有グループが変更されている
M ファイルのパーミッションが変更されている

例えば、上記の例では、5とTが表示されているので、MD5チェックサムが異なり(=ファイルの中身が異なっている)、ファイルの更新時刻も変更されている、となります。

なぜ誤検知するのか

さて、なぜ chkrootkit は誤検知するのでしょうか?

chkrootkit(ファイル名が chkrootkit です)で Warning: /sbin/init INFECTED と出力している箇所は以下のようです。

if [ ${SYSTEM} != "HP-UX" ] && ( ${strings} ${ROOTDIR}sbin/init | ${egrep} HOME  || \
  cat ${ROOTDIR}/proc/1/maps | ${egrep} "init." ) >/dev/null 2>&1
then
  echo "Warning: ${ROOTDIR}sbin/init INFECTED"
else

cat ${ROOTDIR}/proc/1/maps | ${egrep} “init.” の実行結果が何か出力されていれば、 INFECTED と出力しています。

/proc/1/maps の 1 はプロセス番号を示し、最初に起動されるプロセスです。
最初に起動されるのは init なので、/proc/1/maps は init のメモリマップです。

こちらの環境では、cat ${ROOTDIR}/proc/1/maps | ${egrep} “init.” は cat /proc/1/maps | egrep “init.” でした。

ここで、yum update upstart で upstartを更新すると、リブート前では、

# cat /proc/1/maps | /bin/egrep "init."
7f23e2d70000-7f23e2d93000 r-xp 00000000 fd:00 524842                     /sbin/init (deleted)
7f23e2f92000-7f23e2f94000 r--p 00022000 fd:00 524842                     /sbin/init (deleted)
7f23e2f94000-7f23e2f95000 rw-p 00024000 fd:00 524842                     /sbin/init (deleted)

となりました。
/sbin/init (deleted) と deleted が付いていますが、ロードしたファイルが、その後、削除された時にメモリマップの出力では deleted になるようです。

upstartパッケージの更新により、initファイルの更新(削除->作成)が行われた為、メモリマップの出力で deleted の表記が付いたようです。
そのため、/bin/egrep “init.” で /sbin/init (deleted) の行がひっかかるようになり、chkrootkit で誤検知したようです。

ここでリブートした後では、cat /proc/1/maps | egrep “init.” の結果は何も表示されません。
/proc/1/maps の /sbin/init が含まれる行は下記で、initの後に何も文字が無いので、/bin/egrep “init.” でひっかかりません。

7f38aca32000-7f38aca55000 r-xp 00000000 fc:03 131100                     /sbin/init
7f38acc54000-7f38acc56000 r--p 00022000 fc:03 131100                     /sbin/init
7f38acc56000-7f38acc57000 rw-p 00024000 fc:03 131100                     /sbin/init

そのため、リブートすると rootkit での誤検知が無くなるのです。

そもそも、検出しようとした rootkit の SucKit は、init を改ざんするようです。
その為、chkrootkit では、先述のように、/proc/1/maps ファイルをチェックすることで init が置き換わっていないかチェックしていますが、これが、アップデートによる init の更新でも該当している為、誤検知となったようです。

chkrootkitの修正

リブートすれば誤検知はなくなるものの、 このままでは upstartパッケージの更新で init が置き換わる度に、一度は検知のメッセージが出ることになります。
また、手動でチェックするまでは本当に誤検知か判断できず、 実際に rootkit に感染した場合は発見が遅れることになります。

そこで、chkrootkit を修正することにします。
誤検知をしないようにするには、SucKit の識別方法を変更する必要がありますが、探してみたところ、SucKit が動作しているかの判別方法は見つかりませんでした。
その為、現状の判定方法は変更できないので、条件判定をもう1つ加えて、rpm -V `rpm -qf /sbin/init` で何も出力されなければ、未検出、としました。

chkrootkit(ファイル名が chkrootkit です)の
### Suckit
で始まる箇所を下記のように修正します。赤字の箇所が追加箇所です。
こちらの環境では、EPELリポジトリよりchkrootkitを yum –enablerepo=epel install chkrootkit でインストールしましたので、/usr/lib64/chkrootkit-0.49/chkrootkit を修正しました。

chkrootkit

### Suckit
if [ -f ${ROOTDIR}sbin/init ]; then
  if [ "${QUIET}" != "t" ];then printn "Searching for Suckit rootkit... "; fi
  if [ ${SYSTEM} != "HP-UX" ] && ( ${strings} ${ROOTDIR}sbin/init | ${egrep} HOME  || \
          cat ${ROOTDIR}/proc/1/maps | ${egrep} "init." ) >/dev/null 2>&1
    then
      if ! rpm -V `rpm -qf /sbin/init` >/dev/null 2>&1;
      then
          echo "Warning: ${ROOTDIR}sbin/init INFECTED"
      fi
  else
     if [ -d ${ROOTDIR}/dev/.golf ]; then
        echo "Warning: Suspect directory ${ROOTDIR}dev/.golf"
     else
        if [ "${QUIET}" != "t" ]; then echo "nothing found"; fi
     fi
  fi
fi

これで、今後も upstartパッケージの更新で init が置き換わっても誤検知することはありません。
当然ですが、本当に改ざんされた場合は、問題なく検知はなされます。

参考

Pangeia Informática – Página Inicial
rootkit検知ツール「chkrootkit」からのメールについて | Public-T
自宅サーバー構築メモ(CentOS) –
サーバーが改竄された!?chrootkitの誤検知でした。 « パソコンやホームページに関するITの部屋
Man page of RPM
Man page of PROC

コメント

  1. ぱたじろう より:

    情報掲載ありがとうございます。助かりました!