CentOS でバイナリが自発的に変更される

CentOS でバイナリが自発的に変更される

これは少し心配です。私はアフィックCentOS 6 サーバーのファイルとディレクトリの変更を監視します。バイナリ ファイルの変更、サーバーに密かに侵入している PHP スクリプト、変更された構成ファイルなどを検出します。これは毎日実行され、検出された変更を記載したメールが届きます。通常、ログ ファイルと、Web コードを更新した後や新しいソフトウェアをインストールした後の変更のみが含まれます。今日は大当たりしたようですが、確信はありません。

数百のファイルの MD5 チェックサムが変更されたが、タイムスタンプやサイズは変更されていないというメールを受け取りました。これには、 などの実行可能ファイルだけで/bin/gawkなく、 などのライブラリも含まれます/lib/libasound.so.2.0.0。これはすべて、1 月 1 日の 4:00 から 1 月 2 日の 4:00 の間に発生しました (afick は 4:00 に実行されます)。

テストとして、バックアップから /bin/gawk を復元し、手動で md5 チェックサムを実行しました。確かにファイルは変更されています。ただし、2 つのバイナリ間の差分は、決定的なものではありません。

--- old.gawk.hex        2017-01-02 15:56:06.000000000 +0100
+++ new.gawk.hex        2017-01-02 15:56:14.000000000 +0100
@@ -881,12 +881,12 @@
 00003700  a6 03 00 00 00 00 00 00  d1 04 00 00 12 00 0d 00  |................|
 00003710  f0 6d 42 00 00 00 00 00  2a 10 00 00 00 00 00 00  |.mB.....*.......|
 00003720  01 00 00 00 b0 6b 5a 56  65 fd 1b 6d 00 00 00 00  |.....kZVe..m....|
-00003730  00 00 00 00 44 00 00 00  b0 6b 5a 56 b2 04 c4 e2  |....D....kZV....|
+00003730  00 00 00 00 44 00 00 00  56 e5 5d 58 82 a0 c7 cf  |....D...V.]X....|
 00003740  00 00 00 00 00 00 00 00  62 00 00 00 b0 6b 5a 56  |........b....kZV|
 00003750  58 97 65 11 00 00 00 00  00 00 00 00 97 10 00 00  |X.e.............|
 00003760  b0 6b 5a 56 30 fb 60 86  00 00 00 00 00 00 00 00  |.kZV0.`.........|
 00003770  b0 2f 40 83 34 00 00 00  01 00 00 00 00 00 00 00  |./@.4...........|
-00003780  e0 08 65 00 00 00 00 00  e0 1f c8 83 34 00 00 00  |..e.........4...|
+00003780  e0 08 65 00 00 00 00 00  e0 1f 88 0a 35 00 00 00  |..e.........5...|
 00003790  01 00 00 00 00 00 00 00  08 09 65 00 00 00 00 00  |..........e.....|
 000037a0  50 2d 15 83 34 00 00 00  01 00 00 00 00 00 00 00  |P-..4...........|
 000037b0  d0 ff ff ff ff ff ff ff  58 2d 15 83 34 00 00 00  |........X-..4...|
@@ -19806,13 +19806,13 @@
 *
 000501e0  28 00 65 00 00 00 00 00  1e 59 40 00 00 00 00 00  |(.e......Y@.....|
 000501f0  00 00 00 00 00 00 00 00  00 b1 e8 82 34 00 00 00  |............4...|
-00050200  10 cd ec 82 34 00 00 00  50 32 a2 83 34 00 00 00  |....4...P2..4...|
-00050210  80 79 e6 82 34 00 00 00  e0 2f a2 83 34 00 00 00  |.y..4..../..4...|
+00050200  10 cd ec 82 34 00 00 00  50 32 62 0a 35 00 00 00  |....4...P2b.5...|
+00050210  80 79 e6 82 34 00 00 00  e0 2f 62 0a 35 00 00 00  |.y..4..../b.5...|
 00050220  20 87 e7 82 34 00 00 00  20 bc e8 82 34 00 00 00  | ...4... ...4...|
 00050230  20 9f e7 82 34 00 00 00  b0 05 e8 82 34 00 00 00  | ...4.......4...|
 00050240  d0 af e9 82 34 00 00 00  20 5e ed 82 34 00 00 00  |....4... ^..4...|
 00050250  40 7e ee 82 34 00 00 00  40 71 ec 82 34 00 00 00  |@[email protected]...|
-00050260  10 9d e9 82 34 00 00 00  30 6f a1 83 34 00 00 00  |....4...0o..4...|
+00050260  10 9d e9 82 34 00 00 00  30 6f 61 0a 35 00 00 00  |....4...0oa.5...|
 00050270  f0 d7 ec 82 34 00 00 00  60 19 e3 82 34 00 00 00  |....4...`...4...|
 00050280  e0 b1 e9 82 34 00 00 00  10 85 ee 82 34 00 00 00  |....4.......4...|
 00050290  30 84 ec 82 34 00 00 00  40 20 e6 82 34 00 00 00  |0...4...@ ..4...|
(etc)

もちろん、最初に考えたのはハッキングでしたが、差分を見ると疑問に思いました。実際のコードは変更されていないようです。私は ELF バイナリの専門家ではありませんが、これらは共有ライブラリの再配置オフセット テーブルだけだと思います。

では、実際に何が起こったと思いますか? ハッキング以外で考えられる唯一の可能性は、共有ライブラリのオフセットがランダム化され、リンクされたバイナリも更新する必要がある「セキュリティ」対策です。しかし、なぜ今なのでしょうか? 最後にソフトウェアをインストールしたのは 12 月 23 日で、その間に奇妙なことは何も起こりませんでした。関連する可能性がある唯一の cronjob は /etc/cron.daily/prelink ですが、そうだとしたらなぜ今なのでしょうか?

答え1

あなたが説明したバイナリチェックサムの違いは、おそらくプレリンクによるものです。CentOSやFedoraなどのRHELベースのLinuxディストリビューションでは、プレリンクがデフォルトで有効になっています。2009年版では、LWN.netの記事プレリンクの背後にある概念を説明します。

Linux プログラムは通常、複数の共有ライブラリを参照するバイナリ実行ファイルで構成されています。これらのライブラリは一度メモリにロードされ、複数の実行ファイルによって共有されます。これを実現するには、動的リンカー (つまり ld.so) がメモリ内のバイナリを変更して、ライブラリ オブジェクトのアドレスがメモリ内の正しい場所を指すようにする必要があります。多数の共有ライブラリを持つアプリケーション (GUI プログラムなど) の場合、このプロセスには時間がかかることがあります。

事前リンクの背後にある考え方は非常に単純です。動的リンカーがこれらのアドレス再配置に費やす時間を短縮するために、事前に実行して結果を保存しておくのです。事前リンク プログラムは、ld.so とほぼ同じ方法で ELF バイナリと共有ライブラリを処理し、再配置を記述するファイルに特別な ELF セクションを追加します。ld.so は、事前リンクされたバイナリまたはライブラリをロードするときにこれらのセクションをチェックし、ライブラリが期待される場所にロードされ、ライブラリが変更されていない場合は、はるかに迅速に処理できます。

ただし、ライブラリが常に同じメモリ位置にロードされると、攻撃者は悪意のあるコードでこれらの位置を狙う可能性があります。そのため、Redhat ディストリビューションは、アドレス空間レイアウトのランダム化を実現するため、オプションを使用しprelinkて定期的に実行-Rされます。メモリ位置を変更すると、バイナリ実行ファイルのチェックサムが変更されます。したがって、AIDE などのファイル整合性チェッカーを使用している場合、実際に発生した変更が による ASLR のみである場合でも、「変更された」バイナリについて警告されますprelink -R

参考文献: https://en.wikipedia.org/wiki/Prelink#Linux

関連情報