制御していないマシンで実行している場合、Java環境をどのように保護しますか?誰かがJavaエージェントまたはネイティブJVMTIエージェントを作成し、バイトコードをダンプしたり、クラスを書き直してライセンスやその他のセキュリティチェックをバイパスしたりするのを防ぐにはどうすればよいですか?Javaコードから実行されているエージェントがあるかどうかを検出する方法はありますか?JNIから?JVMTIエージェントから?
7 に答える
環境を制御できない場合は、申し訳ありませんが、本当に立ち往生しています。はい、ある種のコマンドライン スニッフィングを介して簡単な JVMTI エージェントを探すことができますが、それは心配する必要はありません。java/lang/Classloader.defineClass() が直接侵害されることを考えてみてください。ボックスを所有している場合は、rt.jar の .class ファイルを置き換えるだけで簡単に実行できます。実際、JVMTI が登場するまでは、これがプロファイラーと監視ツールが Java コードを計測する一般的な方法でした。
JVMTI に戻ります。「Late attach」機能により、JVMTI エージェントをオンザフライでロードすることもできます。初めてスキャンしたときは、そうはならなかったかもしれません。
結論 - 誰かがディスク上の JRE のバイトを変更できる場合、彼らは何でも好きなことをすることができます。それは倫理的ですか?彼らは捕まることができますか?可能性はありますが、戦争に勝つことはできません。
いくつかのカスタム JNI ネイティブ コード内でチェックの組み合わせを使用できるようです。
1.) エージェントを検索するコマンド ライン スニッフィング。2.) コマンドライン パラメーター -XX:+DisableAttachMechanism が存在することを確認します。(これにより、実行中の VM に人々が接続するのを防ぐことができます)
コマンドラインを見て、「-agent」パラメーターがあるかどうかを確認します。すべてのプロファイラー、デバッガー、およびその他のコード変更子は、これをイントロスペクションに使用します。また、ブートクラスパスで異常なjarをチェックすることもできます。これは、脅威をもたらす可能性があるためです(ただし、Quicktimeなどの一部のソフトウェアは実行中のすべてのJavaアプリのブートクラスパスに自身を追加するため、カスタムJVMも提供する必要があることに注意してください... (それを見たとき、私は自分の目を信じることができませんでした...))
私はかつてほとんどサイレントなJavaエージェントを作成したことを覚えています。ポートスキャナーかその周辺のものを探す方がいいと思います。
Java 2 セキュリティ、jar の署名などにより、アプリケーションにロードされるものをある程度制御できます。
しかし最終的に、悪意のある人物がマシンにアクセスしてディスクに書き込むことができる場合、巧妙な Java ハックに頼らなくても害を及ぼす十分な能力を持っている可能性があります。
トロイの木馬を検出するためにどのような言語で何ができますか?
関心のあるマシンへの入念なアクセス制御は重要ですが、そのような問題に真剣に取り組んでいる場合は不可欠です。セキュリティ スペシャリストは偏執的であるように見えるかもしれませんが、それは多くの場合、彼らがリスクを本当に理解していることを意味します。
基本的にこれは負け戦です。
Sun JDK の visualvm がどのように機能するか、実行中のプロセスにアタッチして再定義する方法を見てみましょう。移植可能な方法でそれを検出することは非常に困難であり、検出できない場合は、このアプローチをあきらめたほうがよいでしょう。
問題は、何を避けたいかということです。
プラットフォームを制御できない場合、プラットフォーム上のソフトウェアを制御することはできません。
あなたが列挙したすべての検査手段をシャットダウンできたとしても、Java はオープンソースです。彼らは、ソース コードを取得し、必要な変更を組み込んで再コンパイルするだけで済みます。
また、それはあなたのコードですが、彼らのマシンであることを覚えておいてください。彼らはあなたのコードを調べて、自分のマシンで実行すると期待どおりに動作し、望ましくないと思われる「余分な」アクションを実行しないことを確認する権利があります。過去の信頼性の低い企業は、関連性のないファイルをスキャンしたり、機密情報をホーム サーバーにコピーしたりしていました。