2011-07-31 25 views
15

私はウェブホストで働き、私の仕事はハッキングされたアカウントを見つけてクリーンアップすることです。私がshells \ malware \ injectionsの90%を見つけたのは、 "不在"のファイルを探すことです。たとえば、eval(base64_decode(.......))のようになります。「.....」は、base64のテキスト全体が一杯になっているのが普通です。私がキーストリング用のファイルをgrepすると、奇妙なファイルが飛び出します。Pythonを使用した異常検出

これらのファイルが人間として私に飛び出した場合、私はPythonでプロファイラーを構築して、統計的に「不在」なものを探し、手動でレビューすることができます。私は、キー文字列(evalbase64_decodeexecgunzipgzinflatefwrite751、preg_replaceなど)を含むphpファイルの行の長さを比較し、平均から2標準偏差を逸脱している行を探すことができると考えました。

回線の長さが大きく異なります。これは、使用する統計情報が適切かどうかわかりません。別のアプローチは、重み付けされたルールをクレチンのものに割り当てることです(行の長さを超える、またはしきい値以下のX点、単語upload = Y点を含みます)が、私は実際に得点で何ができるか、属性。私の統計は少し錆びています。

統計プロファイリングの正しい方向(ガイド、チュートリアル、ライブラリ)を教えてもらえますか?ここで

+3

この提案は、実際には便利ではありませんが、ベイジアンのアプローチを試してみるとよいでしょう。 "良い"コードのコーパスと "悪い"コードのコーパスを構築し、新しいコードの特定の部分が(おそらく、さまざまなスパムフィルタの1つを使用する可能性が高い) 「良い」または「悪い」コーパスのメンバーになる。 Google for Bayesianの学習、スパムフィルタリングなど。ゼロから何かを書くのではなく、スパムフィルタリングプロジェクトを直接使用することができます。 –

+1

@ Joe、Josh - ベイジアンのアプローチを選択した場合、私は過去にも同様の問題が成功したことで敬意を表しました。データセットを正しく取得できれば、合理的な結果を得るのは簡単です。 http://reverend.sourceforge.net/ –

答えて

5

は、問題への単純な機械学習アプローチだ、と私は、この問題を始めるために行うと、ベースライン分類器を開発したいものです。

は、いずれかの「良いスクリプトのコーパスを構築し、ラベルを付けます'(label = 0)または' bad '(label = 1)の方が良いでしょう。 「悪い」スクリプトが総コーパスの合理的な部分であることを確認し、50-50良い/悪い方が理想的です。

疑わしいスクリプトまたは悪いスクリプトを示すバイナリ機能を開発します。たとえば、 'eval'の存在、 'base64_decode'の存在。包括的であり、「良い」スクリプトをキャプチャする可能性があることを恐れることはありません。これを行うのを助ける1つの方法は、2つのクラスのスクリプトの単語の頻度カウントを計算し、「悪い」で顕著に現れるが、「良い」ではそれほど顕著ではない単語を特徴として選択することであろう。

コーパス上でフィーチャジェネレータを実行し、ラベル付きのフィーチャのバイナリマトリックスを構築します。

コーパスを列車(例の80%)とテストセット(20%)に分割します。 scikitラーニングライブラリを使用して、トレーニングセットでいくつかの異なる分類アルゴリズム(ランダムフォレスト、サポートベクターマシン、ナイーブベイなど)をトレーニングし、目に見えないテストセットでそのパフォーマンスをテストします。

私はベンチマークに対して妥当な分類精度があることを望みます。次に、フィーチャの改善、監督されていない方法(ラベルなし)、およびより優れたパフォーマンスを得るためのより特殊化されたアルゴリズムを見ていきたいと思います。

リソースとしては、機械学習に関するAndrew NgのCourseraコース(迷惑メール分類の例を含む)は良いスタートです。

関連する問題