web-dev-qa-db-ja.com

別のプロセスが私のプログラムのメモリを読み取るかどうかを検出する

仮定のシナリオ:自分のマシンで実行するプログラムを作成しました。攻撃者は、私のプログラムメモリからセキュリティクリティカルな情報を(書き込みではなく)読み取りたいと考えています。これを達成するために、彼は私のマシンをハッキングし、プログラム自体とカーネルドライバーをインストールして、プログラムのプロセスとアクティビティを隠しました。

この試みを(ただ)検出するようにプログラムを変更することは可能ですか?キーなどを危険にさらす可能性があるとマークするには?プログラミングの詳細は求めていません。

1
Martin Tausch

簡単な答え:いいえ。

しかし、なぜ?読み取りメモリを確実に防止または検出するのに十分なほどプロセスを分離する一般的なOSについては知りません。 Windowsでは、管理者モードで実行しない限り、特に失われます。この場合、非特権プロセスは、ユーザーに関する限られた情報しか取得できません(特権モードでも実行されている場合を除く)。また、「非常に安全な」アプリケーションをフリーズし、すべてのデータを読み取ってから、単に終了することもできます。

攻撃者が側にドライバを持っている場合、攻撃者はring0にいて、基本的にシステムに対して何でもできるので、あなたは特に失われます。

別のアプリケーションが役に立ちますか?いいえ。それは本質的に「I Xを検出する」というゲームをプレイしているため、何も役に立ちません。「Yに移動しても、Xはあなたを助けません」。攻撃者がアプリケーションの動作を知っている場合(これはリリースするすべてのプログラムに適用されます)、セキュリティをすべてバイパスする別の方法を考えることができます。これは本質的に、オンラインゲーム、ウイルス開発、およびソフトウェアクラッキングで何年にもわたって起こることです。そして、数百万の企業でさえ、この問題を解決することができませんでした。

攻撃者よりもレベルが低くなるのはヘルプだけです。あなたの場合、それはハードウェアです。

2
axapaxa

これが標準の現在のプラットフォームで可能であるとは思いません。

少なくとも、独立した監視アプリケーションが必要になると思います。

更新: "しかし、2番目のアプリケーションは間違いなくこれを検出できるでしょうか?"-そこに決定的であるのは難しいですが、私はWindowsシステムプログラミングについてよく知らないのではないかと心配しています。特別なハードウェアなしでは実現できない可能性があります。しかし、それが可能であれば、それは低レベルのシステムライブラリを利用する場合にのみ当てはまると思います。

1
Julian Knight

仮説的に言えば(具体的な詳細を求めていないため)、それは可能です。ただし、100%の信頼性はなく、常に回避策があります。

まず、安全なデータが1〜8バイトで、x86で実行している場合、このデータがアクセスされたときにトリガーされるハードウェアブレークポイントを設定できます。見る。たとえば、 https://github.com/mmorearty/hardware-breakpoints

32バイト以上(4つのハードウェアブレークポイントレジスタがある)を保護する必要がある場合は、PAGE_GUARDで VirtualProtect を使用するか、ページを読み取り不可能にする(PAGE_NOACCESS)ことができます。

自分でデータにアクセスする必要がある場合は、フラグ/ブレークポイントを削除し、データにアクセスして復元します。もちろんこれは競合状態を作り出しますが、機会の窓は短いです。

もちろん、誰かがカーネルドライバーを備えたアプリケーションを持っている場合、ハードウェアブレークポイントを削除したり、カーネルドライバーを介してアプリケーションページフラグを変更したりできるため、これは機能しません。ただし、ドライバーを使用してアプリケーションを非表示にするだけの場合、これは機能するはずです。

0
George Y.