パソコン鳥のブログ

アクセスカウンタ

zoom RSS chkrootkit のSuckit誤検知の修正

<<   作成日時 : 2013/06/29 21:01   >>

ブログ気持玉 0 / トラックバック 4 / コメント 1

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ファイルサイズが異なっている
5MD5チェックサムが異なる
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

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(4件)

タイトル (本文) ブログ名/日時
rpmコマンドの便利な使い方
パッケージの情報を表示する rpm -qi パッケージ名 ...続きを見る
パソコン鳥のブログ
2013/11/30 21:28
CentOSで使える rootkit検知ツール Rootkit Hunter
CentOSで使える rootkit検知ツールに、Rootkit Hunter があります。 2012年5月以降更新の無かった Rootkit Hunter ですが、先月バージョン1.4.2 がリリースされました。 以降で CentOS6 での Rootkit Hunter について説明します。 ...続きを見る
パソコン鳥のブログ
2014/03/20 19:18
chkrootkit のSuckit誤検知の修正(Ubuntu版)
以前、rootkit検知ツール chkrootkit でルートキット Suckit を誤検出する件を修正しました。 ...続きを見る
パソコン鳥のブログ
2014/10/07 20:41
今週のCentOSのupstart更新で chkrootkit がルートキットを誤検出する
今週、CentOSのパッケージ upstart が更新されました。 これにより、rootkit検出ツール chkrootkit で Suckit による /sbin/init の改ざんが誤検知されます。 ...続きを見る
パソコン鳥のブログ
2016/05/28 10:12

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(1件)

内 容 ニックネーム/日時
情報掲載ありがとうございます。助かりました!
ぱたじろう
2014/03/13 10:03

コメントする help

ニックネーム
本 文
chkrootkit のSuckit誤検知の修正 パソコン鳥のブログ/BIGLOBEウェブリブログ
文字サイズ:       閉じる