web-dev-qa-db-ja.com

Webアプリケーションにおける異常ベースのマルウェア検出

私は、膨大な数のホスティングアカウントのセキュリティとマルウェアの検出(一般的に)を担当しています。私たちの方法は、ClamAVによって提供されるシグネチャベースの検出に大きく依存しています。ClamAVについても、かなり適切なシグネチャデータベースを作成しています(500以上のサンプル)。

悪意のあるコードがユーザーのアカウントで発見された場合、毎日最大30〜40通の通知が届きます。時間の経過とともに、ハッカーはより直感的になり、脆弱性を悪用しようとする試みをやめようとするとき、常に私たち(ホワイトハットコミュニティ全体)の進歩についていくことができます。しかし、悪意のあるコードの署名ベースの検出はますます不十分になっているようです-私たちはスキャンが最初に検出できなかった新しいマルウェアのサンプルを見つけ続けています。したがって、私は自由をもって、厳密な異常検出のためのシステムを設計しました。

このような作業に取り組むのは初めてなので、現在の計画が妥当であると見なすことができるかどうかについてアドバイスを求めています。

ファイルをチェックする条件が多いほど、良い結果が得られると思います(誤検知を可能な限り排除します)。これまでのところ、次の条件リストを作成しました。

  • ファイルの場所(5%)
  • ファイル名(10%)
  • コード整頓/整列(5%)
  • 繰り返しパターン(5%)
  • データ構造の奇妙な/非論理的な名前(10%)
  • 複数の関数のスタック(3%)
  • エラー報告が無効になっています(5%)
  • 使用されるエラー抑制(2%)
  • 16進数を含む(つまり、\ x73)(3%)

それぞれの条件がファイルに特定の割合のファイルを与える場合、潜在的に悪意があるか、または悪意のあるコンテンツが内部にあります。 私の質問は

  1. これは、厳密な異常に基づく検出システムを開発するための良い/正しいアプローチですか?そうでない場合、なぜですか?
  2. 他にファイルをチェックできる例を教えていただけますか?ヒントや役立つ情報はありますか?

それを考慮してください:

  1. Webアプリケーションを対象としており、主にPHPファイル;
  2. 多くのクライアントがCMSを使用しています。たぶん、システムを特定のCMSに基づいた方が良いでしょうか?

ありがとうございました。

8
McJohnson

現在、ネットワークセキュリティの分野でいくつかの調査を行っています。このトピックでは、ログメッセージの異常検出を取り上げています。しかし、私はあなたの問題についていくつかの洞察を提供することができることを願っています。

(1)署名は醜いですが、機能します。誰もが異常検出や同様のトピックについて話しているが、今日では、署名が悪意のあるコード/アクティビティなどを検出するための最も信頼できる方法であり続けている。したがって、それらを引き続き使用する必要がありますが、一部の異常検出でそれを完全に置き換えることができるとは思わないでください。

(2)もちろん、シグネチャは非常に限定されており、悪意のあるコード/攻撃などの新しい種類を識別することはできません。次に、異常検出でこの問題を解決する試みがあります。異常検出の主な欠点は、常に処理してフィルターで除外する必要がある偽陽性アラートを生成することです。現在の傾向は、ハイブリッドシステムを構築することです。最初に署名と、場合によってはいくつかのクエリを適用してから、それに加えて異常検出を実行します。

(3)いくつかの機械学習手法に基づいて(条件のリストに基づいて、問題の異常検出アプローチを作成することは間違いなく可能です。理論的には、PHPコード、つまり静的コード異常検出を実行しますが、これはかなり複雑で大きなプロジェクトになる可能性があります。ただし、すべての悪意のあるコードをキャッチすることは期待できません。現実的な数値は、10で70-80%の検出率のようなものです。 20%の誤検知率。1000個のファイルをチェックし、そのうちの10個が悪意のあるものである場合、おそらく最良の場合、100個のアラートを返すシステムを開発でき、10個中8個の悪意のあるファイルが検出されますが、残り(たとえば、92個のその他のアラート)は誤検知になりますまた、シグネチャとクエリですでに検出されている可能性があるこれらの8個のうち6〜7個。

ここであまり悲観的にならないことを願っています。場合によっては、特定のユースケースで、1〜2%の偽陽性率で98〜99%の真陽性率を達成することが可能ですが、あなたのケースでこれほどの幸運があるかどうかはわかりません。また、私はあなたのユースケースについて予測を行うのに十分な詳細を知りません。

(4)ただし、結果をランク付けできる場合、異常検出出力の上部には、より多くの真陽性アラートとより少ない偽陽性アラートが含まれます。たとえば、システムが100のランク付けされたアラートを返す場合、上位30のアラートのみを確認できます。また、これらの30には6つの真陽性結果と24の偽陽性のみが含まれます(これは、8つの真陽性と92の偽陽性よりもある程度優れています)。次に、最もランクの高い5つのアラートを見ると、1〜2個の真陽性と3〜4個の偽陽性が含まれている可能性があります。これは、署名ベースの検出結果に加えて、日常的に確認できるものです。

データマイニング/機械学習の専門家を雇って、そのようなシステムを構築するか、十分なスキルがあれば自分で試してみることができます。

あまり関連性の高い研究論文は見つかりませんでしたが(これは良い兆候ではありません)、次の情報が比較的役に立つことを願っています。

最後に、この問題に対するいくつかの代替ソリューションがあるはずです。私はそれをググってみました、そしてここに私がこれまでに見つけたものがあります:

また、それほど多くはありませんが(リンクは1つだけです)、もっと検索してみてください。サンドボックスのようないくつかのテクニックがあるはずです。多分あなたは関連情報について this pdf をチェックすることができます。

1
Andrey Sapegin

これはあなたの質問に対する完全な回答を意味するものではありませんが、コメントに収まるものより長いので、ここに行きます:

どのような基準を設定しても問題を回避できるため、すべてのマルウェアを確実に検出することができないことを知っている限り、これは興味深いアプローチだと思います。

たとえば、最後の「hexを含む」は、hex値を10進数の配列またはbase64エンコードされた文字列として指定することで簡単に回避できます。「code tidyness」は、 xxxtidyを介してファイルを作成します。ここで、xxxは、お好みのプログラミング言語のコード整頓のバージョンを表します。

また、「データ構造の奇妙で非論理的な名前」をどのように検出するかについてもわかりません。それは私には不可能な問題のようです。そして、「複数の関数のスタッキング」が何を意味するのかわかりません。私がそれを正しく理解していれば、それは膨大な数の誤検知を生成するものです。

それでも、私がこのアプローチを興味深いと思う理由は、完璧ではありませんが、jslint、pylintなどが通常のコードの問題を特定するのと同じように、疑わしいプログラムの検出に役立つ可能性があるためです。

処理しているプログラミング言語がわかっている場合は、システムシェルを起動しようとする呼び出し、ネットワークソケットを開こうとする呼び出し、入力または出力のリダイレクト、evalの呼び出し、呼び出しを試行する呼び出しなどの疑わしい呼び出しを確認することもできます。読み取りや書き込みなどのために外部ファイルを開く.

実装

これは、少なくとも個々のphpファイルをスキャンすることに基づいている場合は、困難に直面すると思います。上記の基準をすべて確実に検出できるパーサーを作成したくありません。大変な作業のように思えます。

オルタナティブ

PHPファイルで特定のコードパターンを探す代わりに、実行されているそのようなコードパターンの特定の結果を探すこともできます。たとえば、ネットワークソケットを開こうとするコードを探している場合、おそらく検出はかなり困難ですが、nmapまたはnetstatを定期的に実行し、開かないはずのポートを確認するのは簡単です。外部ファイルに書き込むコードを確認することは困難ですが、たとえば、/ tmpの下にあるすべての実行可能ファイル、または/ usr/local/binの下に最近のタイムスタンプを持つファイルのリストを作成するのは簡単です。アクティブなルートシェルプロセスなどを探すこともできます。

従来技術

すでにその一部を行っているさまざまなプログラムがあります。たとえば、linuxの下のrkhunterはファイルシステムへの疑わしい変更を探します。tripwireとsnortは、チェックする他の2つのソリューションになります。

クイックグーグルセッションも https://github.com/nbs-system/php-malware-Finder および https://www.decalage.info/python/balbuzard 、どちらもあなたが提案していることを正確に実行しているようです。

0
Out of Band