web-dev-qa-db-ja.com

ペイロードを暗号化して隠すウイルスを防ぐにはどうすればよいですか?

最近、ウイルス対策製品やその他のマルウェア対策製品のしくみについて詳しく学び始めましたが、それらのほとんどは主にマルウェアを検出して阻止するために3つの異なる手法を使用していることに気付きました。

  1. 署名ベースの検出
  2. ヒューリスティック分析
  3. サンドボックス化(1と2のフィルタリングを通過するファイル用)

最初は素晴らしいアイデア、特に遅延実行、仮想マシン対策、暗号化などを検出できるサンドボックスのスマート機能が好きだと思いました。

次に、それらの検出手法をバイパスする方法が頭に浮かんだので、私はそれをテストしましたが、試したすべてのアンチウイルスに対して、そしておそらくそれらの手法に依存しているすべてのウイルスに対して機能します。

悪意のあるコードが無害に見えるファイルで暗号化され、パスフレーズが暗号化された場合、パスフレーズはもちろん被害者(もちろん完全に知らない)だけが知っているため、悪意のあるコードを復号化して実行時に実行する必要があります。時間?

悪意のあるコードが特定のパスフレーズでAES256暗号化機能を使用して暗号化されているとしましょう。次に、暗号化された結果の文字列は、ユーザーがパスフレーズを入力してそれを実行時にeval()関数で実行すると解読する命令を含むJScriptファイルに入れられます。アンチウイルスがパスフレーズを知ったり推測したりする方法はありませんか?そして、そのJScriptファイル内に隠された悪意のあるコードがあることを知る方法はありません。また、ディスクに書き込まれることなく、実行時にのみメモリ内で復号化されるため、署名ベースの検出とヒューリスティック分析は失敗します。ユーザーがパスフレーズを入力しない限り、悪意のあるアクションはトリガーされないため、サンドボックスでも同じです。

ここで、ユーザーにパスフレーズを入力させるために、画像に表示される単語(またはASCII描画^^など)を入力するように求める単純な種類のキャプチャを使用できます。ユーザーがロボットを入力すると、悪意のあるコードが解読されて実行されます。

この種の攻撃からどのように防御しますか?おそらく、ディープラーニングテクニックを使用した高度なアンチウイルスで検出できるかもしれませんが、現在のアンチウイルスプログラムは完全に脆弱であるように思えます。

更新:上記の手法を示すコードサンプル

JScriptでの簡単な実装を次に示します。

var encryptionFunction = ; // Any encryption function, e.g. AES256 from CryptoJS

var hiddenCode = ; // Write any code here, e.g. WScript.Echo('My code has been executed !');

var passphrase = "Any pass phrase"; // It'll be used as a CAPTCHA challenge-response, e.g. picture with the passphrase or ASCII drawing

var encryptedCode = encryptionFunction(hiddenCode, passphrase); // Our hidden code will be encrypted with the passphrase

var template = "var decryptionFunction = ;" + // The decryption function is defined here

               "var passphrase = InputBox('Your CAPTCHA challenge goes here');" + // CAPTCHA in an Input Box, user's input = passphrase

               "eval(decryptionFunction('" + encryptedCode + "', passphrase))"; // Decryption of the encrypted code thanks to the user's input and run at execution time through eval()

var file = ; // Create a new JScript file (or WSF) and put the template as its content

2017年8月4日-概念実証+ウイルス対策スキャン

概念実証を追加しました:
https://Gist.github.com/Joel-L-G/6cd8aede4126e71f361aeb90eecf4999

これは基本的に、ASCII図面に隠された、パスワードを要求するウィンドウを表示する単純なWSFファイルです。ユーザーが正しいパスワードを入力すると、ファイル内に埋め込まれた暗号化されたコードが復号化され、実行時に実行され、ウィンドウ内に "マイコードが実行されました!"と表示されます。

私が思ったように、復号化ルーチンはVirusTotal(0/56)のアンチウイルスでは悪意のあるものとは見なされませんでした。これがアンチウイルススキャンです。
https://www.virustotal.com/en/file/a7d453fa3aa23d10144ce13b2a7a94120f664368f35a5ca32dc731c608f14c0e/analysis/

2
user143530

適切な暗号化は、鍵を持たない人にとってはランダムなデータのように見えます。したがって、ウイルス対策プログラムは、暗号化されたデータが悪意のあるものかどうかを判断できませんでした。世界のアンチウイルスはAESを突破することはできません。

それで、すべてのウイルス対策プログラムをだますための魔法の銀の弾丸を見つけましたか?番号。

まず第一に、キーを受け取り、コードを復号化して実行するある種のブートストラップメカニズムが必要です。 JSが添付されたメールはすでに疑わしいものです。添付ファイルがバイナリBLOBを復号化して実行すると、まあ、赤いライトが点滅するはずです。

したがって、実際のペイロード(暗号化されたデータ)はアンチウイルスで分析できませんでしたが、ブートストラッパーはヒューリスティックスによって捕捉される可能性があります。

第2に、ユーザーが何らかのタスク(キーの入力など)を実行する必要があるウイルスは、少し実用的ではありません。確かに、ソーシャルエンジニアリングは強力なものになる可能性がありますが、これは、ユーザーとのやり取りがゼロでバックグラウンドで静かに実行されるものほど優れていません。

1
Anders

私の理解から、この質問はより一般的な質問を非常に具体的な単一の例に絞り込みます。より一般的な質問は、特定の入力データなど、特定の環境でのみ悪意のある動作をする場合に、分析システム(ウイルス対策など)が一部のソフトウェアが悪意のあるものであることをどのように検出できるかです。これは、パスワードがわかっているパスワードで保護されたアーカイブである可能性があります。ユーザー(フィッシングメールにテキストとして含まれているなど)。これは、ユーザーが入力する必要があるパスワードで暗号化されたコードである可能性があります。これは、特定のOS、インストールされているソフトウェアなどに依存している可能性があります。

これらすべての場合の答えは次のとおりです。分析ソフトウェアは悪意のある可能性があることを確実に検出できません。せいぜい、特定のOSやブラウザのバージョンやインストールされているソフトウェアのチェックなど、ユーザーが入力したデータを使用して解読などの操作に見えるような、通常そのような動作に関連するパターンを検出するヒューリスティックを使用する場合があります。ただし、これらのヒューリスティックは完全には信頼できません。つまり、悪意のある動作がない問題を検出し、実際の問題の多くを見逃す可能性があります。

したがって、そのような分析は保護の一部に過ぎません。さらに、異常なシステム動作の検出、評判の悪いサイトからのダウンロード、またはホワイトリストに登録されたソフトウェアの実行のみを許可することもできます。

3
Steffen Ullrich