web-dev-qa-db-ja.com

ウイルスは実際に他のプロセスにコードを挿入できますか?

ウイルスが実際に自分のコードをプロセスに挿入して、コンピューターに永続的に留まることはできますか?実際にそれを削除する唯一の方法は、OSを再インストールすることです。私の質問は、ファイルまたはプロセスに損傷を与えずにそれをどのように行うことができるかです。

12
moomonkey

DLL Injectionを使用して、他のデータに影響を与えることなく他のプロセスにコードを挿入できます
(もちろんメソッドによって異なります)。

他の方法には、正当なファイルの名前変更と移動、感染したバージョン、スタートアップエントリなどとの置き換えなどがありますが、手動で簡単に削除できます。

個人的にOSパッチやその他のデータ変更を使用せずに永久に感染すると考えることができる唯一の方法は、スタートアップエントリを使用して、MigbotまたはFUなどのルートキットドライバーをロードし、関数フックも含めることですファイルとレジストリエントリを非表示にし、手動で削除することを不可能にします。

ただし、このタイプのルートキットは通常、ディスク上のバイナリOSデータを変更するカーネルパッチを使用し(完全に駆除するために再インストールが必要になります)、データを変更しないという目的全体を無効にします。

唯一の代替策は、カーネルの外にとどまり、通常のプロセスを使用してマルウェアを実行し、Windowsメッセージフックまたは同様の何かを使用して、データを変更せずにフックを適用することです。

ただし、この方法には欠点があります...ユーザーランドフックは、カーネルOSパッチに比べて非常に簡単に検出できます。

したがって、データを変更しないマルウェアが存在する可能性がありますが、これは、ハーフウェア型のアンチウイルス/ルーキットソフトウェアによって簡単に検出されて削除されます。 -修正アプローチ。パッチなどはステルスの観点からははるかに優れています(非修正フ​​ックよりも簡単な場合もあります)。

12

2つの異なる問題について質問しています。

ウイルスは実際に他のプロセスにコードを挿入できますか?

答えは:はい、できます。 DLL Injection を使用して、コードを他のプロセスに挿入できます。これは、コンピュータが起動するたびにウイルスがロードされること、またはウイルスが検出されない、または分離できないことを保証するものではありません。これは、ウイルスが別のプロセスのアドレススペースから実行されることを意味します(可能な [〜#〜] pe [〜#〜] )。

ウイルスがコードを他のプロセスに挿入するという事実は、再インストールされるまで、それらが「OSに接続」されることを保証しますか?

いいえ、いくつかの rootkit 機能がない限り。ルートキットがシステムに接続する方法はいくつかあります。 [TDL4 自身を起動するために [〜#〜] mbr [〜#〜] に自分自身を書き込んでいる人に関する記事のメソッドの1つについて読むことができます。オペレーティングシステムの起動前に悪意のあるコードが実行されることを確認します。

ウイルスが既知のウイルスである場合、ほとんどのAVはその動作を認識し、マシンをクリーンアップします。ウイルス/ルートキットの新しい亜種の場合、通常のツールで悪意のあるコードを削除することは非常に複雑になる可能性があります。ルートキットは、リング0(カーネルモード)からドライバーとして実行されるため、ドライバーを見つけて無効にする必要があります(これは、感染していないOSから実行してください!)。

7
YSY

はい、それは本当に本当です。はい、ウイルスがマシンに感染する可能性があるため、OSを再インストールするまで感染し続けます。

たとえば、ウイルスはスタートアップフォルダに自分自身をインストールできるため、コンピュータを起動するたびに自動的に再起動されます。また、ディスクに格納されている実行可能ファイルを変更して感染したバージョンに置き換えることもできるため、プログラムを起動するたびに、すでに感染しているウイルスが起動します。

なぜウイルスはファイルシステムの何も変更せず、プロセスも変更しないと思う理由を述べなかった。一部のウイルスはこれらの1つまたは両方を実行します。

5
D.W.

まず、OSでプロセスを実行することの意味を理解することは価値があると思います。

ほとんどのオペレーティングシステムは、デマンドページングと呼ばれるものを使用します。 Linuxでは、これはmmap()システムコールに対する_PROT_READ | PROT_WRITE | MMAP_PRIVATE_の影響です。具体的には、プロセスは完全にメモリにコピーされません。コードセグメントはコピーされ、残りはファイルシステムにマップされます。それらのページのいずれかがメモリ内で変更された場合、それらは最初にメモリにコピーされます。これは「コピーオンライト」としても知られています。ここでの含意は、実行中のプロセスに対する変更がmmap()(またはWindowsの同等の機能)によって自動的にディスクに書き戻されないことです。

最終的な結果として、ディスク上のプログラムのコピー(以下、ディスクイメージ)と、仮想メモリサンドボックスに常駐するメモリ内のプロセスのコピー(以下「アドレススペース」)の2つが事実上あると想像する必要があります。

プロセスのアドレス空間はプログラム自体を危険にさらすだけでなく、共有ライブラリ(DLL)も含まれ、多くの場合、仮想アドレス空間の半分には、到達できないOSのものが含まれます(2GB分割と4GB/4GBモードを参照) 。Windowsのプロセスが2GBに制限されている理由を知りましたか?これが理由です)。スタックや「ヒープ」などのプログラムデータも仮想アドレス空間に存在します。これらの両方にプログラムデータが含まれています。

これで背景がわかったので、プロセスを変更できる2つの方法を次に示します。

ランタイムの変更

これは実際には思っているよりも変更が少ない-通常、目的は貧弱なコーディングを悪用し、インプットメソッドを使用して、通常「シェルコード」と呼ばれるプロセスアドレス空間に特別に細工された入力を取得することです。リモートの攻撃者がターミナルプロンプト(したがって「シェル」)。ただし、これが実行できる唯一のアクションではありません。リモートファイルのダウンロードからレジストリ設定の変更まで、何でも実行できます。管理者のプロンプトをリモートボックスに渡さない場合、目標は、入力バッファーに収まり、それを実行できるより大きなペイロードを配信することです(ダウンロードによるドライブは、ブラウザープラグインを利用してこのように動作します)。

この手法にはさまざまなバリアントがありますが、それらはすべて、実行のフローを変更して、意図しない何か、通常は攻撃者にとって有益なものを発生させることを伴います。コピーオンライトのセットアップの結果、実行可能ファイルの元のディスク上のイメージはそのまま残りますが、利用したばかりのプロセスをクラッシュさせたり、グリッチを引き起こしたりする可能性があります。サイレントエクスプロイトを生成することは困難ですが、不可能ではありません。

なぜみんなが言及し続けるのですかDLL Injection?

まあ、いくつかのプログラムは開発プロセスの一部としてセキュリティで書かれており、ガベージ入力をフィードして実行することはできないことが判明しました。したがって、他のテクニックが必要です。 DLLインジェクション、またはLinux-speakの_LD_PRELOAD_は、共有オブジェクトを他のすべての前に、または1つのプロセスのアドレス空間だけにロードする前にロードするプロセスです。これにより、ターゲットプロセスの仮想メモリ内にコーディングし、プログラムの特定の部分を「フック」(リダイレクト)できます。このチュートリアルは かなり簡単見つける です。その後、自分自身の目的でプロセスを悪用することができますが、ほとんどの場合、ディスクにDLLが必要です。

それはそれらに十分ではなかったことがわかります prespriteの素敵な人々 Meterpreterを開発した人、DLLをメモリにダウンロードしてそしてそれをシステムに注入します。

ディスクイメージの変更

おそらく、上記の手法またはそのバリアントを使用してシステムにアクセスし、ペイロードをどこかに配信して、確実に実行されるようにします。ただし、他にできることは、システムにインストールされている既知のプログラムを介して、選択したペイロードで変更された新しいディスクイメージを実際に書き込むことです。これを成功させるには、元のコードを注意深くリバースエンジニアリングし、エクスプロイトを挿入する必要があります。 3つの潜在的な問題があります。

  1. 間違えると、プログラムがクラッシュする可能性があります。
  2. 非常に変化しやすいコンポーネントをターゲットにする場合、ターゲットの移動問題が発生します。変更はすべてのインスタンスとすべてのシナリオで機能しますか?
  3. 一部のプログラムは、リバースエンジニアリングやパッ​​チ適用の試みに抵抗するように特別に設計されています。これは、ゲーム業界ではディスクのコピーを防止するためのかなり一般的な方法です。このように書かれたものを使用しているとは思わないかもしれません。その場合は、バニラスカイプ パート1 および パート2 の取り組みを読むことをお勧めします。 skypeの作者はリバースエンジニアリングを望まないことがわかりました。このレベルの保護により、実行可能ファイルを正常に変更することがはるかに困難になります。

カーネルパッチ-それは何ですか?

パッチは少し奇妙な言葉です。カーネルに適用すると、何かを隠したり、監視などの他の目的を達成したりするために、通常、カーネルスレッドのアドレス空間内のデータ構造を変更することを意味します。

ただし、カーネル自体にもディスクイメージがあるため、この方法で、ドライバーを含むカーネルのコンポーネントにパッチを適用できます。ここでも、ディスクイメージの変更は困難ですが、不可能ではありません。

永続性と再インストールの要件について

永続化には、ある時点でディスクへの書き込みが必要です。コンピュータが再起動した場合、マルウェアがどこかに保存されている必要があります。プロセス(またはカーネル)アドレス空間にあるエクスプロイトコードは、すべてのように失われますRAMは再起動の間にあるため、再起動を持続したい場合は、コードをリロードするために何らかの方法が必要ですこれには、ルートキットも含まれます。ルートキットも確実に再ロードされる必要があります。

重要なパーツが変更された場合でも、技術的にオペレーティングシステムを再インストールする必要はありません。必要なのは、それらの重要なパーツをクリーンバージョン(Windowsインストールディスクから)に置き換えることだけです。マルウェアについては、再インストールをする必要があります(= /// =)。これは、選択を解除する必要がある量と、すべての不良コードを削除した可能性がどの程度かについてのすべてです。そのため、再インストールする方が安全です。それが私がやろうとしていることであり、他の人にもやることを勧めます。

いくつかの防御があると教えてください!

はい。 Authenticode は、古いプログラムへの変更が検出されないように設計されています。 カーネルパッチ保護wikipedia )( faq )は、ドライバーによる変更からカーネルデータ構造を保護します。 W ^ X[〜#〜] aslr [〜#〜]Stack CanariesNon Executable Stack などは明らかな変更から実行中のプログラムを保護します。これらはどれも完璧ではありませんが、適切に使用すると悪用が困難になります。

5
user2213

あなたのコアの仮定は正しくありません-あなたは、ウイルスが「ファイルまたはプロセスに損傷を与えることなくそれを行うことができるか」と尋ねました。

多くの場合それはしません-損傷はしばしば起こります。多くの場合、これはウイルス作成者の関心事ではありません。目的に依存します。多分彼らはウイルスが非常にステルスであることを望みます-その場合、彼らはそれをより注意深く書き込もうとするので、明白な影響はありません。また、ウイルスが急速に広がることを望んでいる可能性があり、非常に騒々しいウイルスに感染し、途中でOS /アプリケーションの多くに損害を与えることがあります。

3
Rory Alsop

ここでの優れた回答に加えて、OSを再インストールする以上にマルウェアが存続する可能性があることも考慮してください。システムがファームウェアレベルで感染している場合(例 http://www.theregister.co.uk/2011/09/14/bios_rootkit_discovered )、OSを再インストールしても問題は解決しません。このタイプの攻撃はOSの外部で機能し、OSが通常暗黙的に信頼するコンポーネントを変更することで成功します。

1
zedman9991