3

このアプリケーションでは、ユーザーはメインエンジンによって実行されるJava式を定義できます(これらの式はメソッド呼び出しのみです:Math.abs(42)など)。それらはリフレクションを介して実行されます。

直接または最終的にSystem.exitを内部的に呼び出すメソッド呼び出しを介して、たとえばSystem.exit(およびファイルアクセスなど)を呼び出す式を防ぐためのさまざまな解決策は何ですか?

異なるスレッドでいくつかの異なる式を実行できることに注意してください。たとえば、SecurityManagerを使用したファイルアクセスの防止は機能しません。これは、式の実行中にメインエンジンがファイルシステムにアクセスできる必要があるためです。

4

5 に答える 5

5

使用できないと言うのは誤りです。SecurityManagerこれはまさにその目的です。アプレットコンテナやRMIサーバーのように、信頼できないコードをホストします。最新のSecurityManagerは、ファイルシステムへの制限付きアクセスなど、特定のきめ細かい権限を付与するポリシーファイルで構成されています。SecurityManagerを使用する必要がありますが、その専門家になる必要があります。

これは非常に大きなトピックです。最善の方法は、Googleの「Javaセキュリティポリシーファイル」を使用して、できる限りすべてを読むことです。

于 2012-08-02T11:05:36.243 に答える
4

あなたがしていることはクレイジーです。ユーザーがマシン上で任意のJavaコードを実行できるようにすることはひどい考えであり、自分のことを知っているハッカーに対してそれを安全にする方法はありません。

私が考えることができる唯一の解決策は、使用できるパッケージとメソッドのホワイトリストを作成することです。ただし、特定のアクションをブラックリストに登録しようとしても、そこに到達することはありません。物事を壊すということになると、あなたより賢い人が常にいます。

更新:私は今、についてもっと読みました、SecurityManagerそしてあなたはそれでパッケージアクセスを非常に細かく制御できるようです、それで私はあなたにアーネストの答えで行くことを提案します。

于 2012-08-02T11:01:31.230 に答える
3

Javaセキュリティシステムは、これに適したツールです。SecurityManagerは、このシステムの一部であり、使用する必要があります。

基本的に、信頼できないコードを自分で呼び出すことはありません。代わりに、その呼び出しをにラップし、PrivilegedActionそれをメソッドの1つに渡しAccessController.doPrivilegedます。次に、信頼できないコードが別ので実行されProtectionDomainます。

したがって、2つの保護ドメインを構成する必要があります。1つは完全な特権を持つエンジン用で、もう1つは特権が制限された信頼できないコード用です。

しかし、アーネストがすでに述べたように、これは非常に複雑なものであり、このようなQ&Aサイトには適していません。OracleandCo.の適切なチュートリアルを読んでください。検索には上記のキーワードを使用してください。

于 2012-08-02T11:17:01.160 に答える
2

たとえば、ApacheVelocityにも同様の解決すべき問題がありました。それらは、velocity.propertiesで定義されたブラックリストのクラスとパッケージを使用します。

# ----------------------------------------------------------------------------
# SECURE INTROSPECTOR
# ----------------------------------------------------------------------------
# If selected, prohibits methods in certain classes and packages from being 
# accessed.
# ----------------------------------------------------------------------------

introspector.restrict.packages = java.lang.reflect

# The two most dangerous classes

introspector.restrict.classes = java.lang.Class
introspector.restrict.classes = java.lang.ClassLoader

# Restrict these for extra safety

introspector.restrict.classes = java.lang.Compiler
introspector.restrict.classes = java.lang.InheritableThreadLocal
introspector.restrict.classes = java.lang.Package
introspector.restrict.classes = java.lang.Process
introspector.restrict.classes = java.lang.Runtime
introspector.restrict.classes = java.lang.RuntimePermission
introspector.restrict.classes = java.lang.SecurityManager
introspector.restrict.classes = java.lang.System
introspector.restrict.classes = java.lang.Thread
introspector.restrict.classes = java.lang.ThreadGroup
introspector.restrict.classes = java.lang.ThreadLocal
于 2012-08-02T11:19:09.703 に答える
1

Javaには、気付かないかもしれない問題を引き起こす可能性のあるものが多すぎます。最も安全な方法は、許可されているクラスのリストを作成し、カスタムクラスローダーを介して別のプロセスで実行することです(安全に強制終了できます)。

ほとんどの人が知らない深刻な危険なコードについては、sun.misc.Unsafeを参照してください。

  • メモリのランダムな領域にアクセスします。
  • コンストラクターを呼び出さずにクラスの新しいインスタンスを作成します(例:列挙型の新しいインスタンス)。
  • オブジェクトモニターを個別にロックおよびロック解除します。(同期ブロックなし)
于 2012-08-02T11:35:27.150 に答える