2016-06-22 10 views
2

私はJavaセキュリティを初めて使いました。基本的な質問がある。悪意のあるコードがAccessController.doPrivilegedを実行しています

私の現在の理解があることである:あなたが行うことができます信頼されていないどのようなコードを制限する必要があるとき

  • は、あなたがこれを実現することができる方法の一つは、カスタムセキュリティポリシーを使用することである、と信頼できないを実行していますコードはSubject.doAsPrivilegedブロックにあります。
  • 信頼できないコードがファイルアクセスなどの昇格されたアクセス許可を必要とするコードを呼び出す必要がある場合は、AccessController.doPrivilegedを使用してこれを実行できます。

私の質問は: AccessController.doPrivileged通話自体を挿入するから悪意のあるコードを停止しますか?例えば

、私の場合:

  • 私はサンドボックス環境では、ユーザー定義のGroovyスクリプトを実行していますよ。私はGroovyができることのほとんどを拒否する非常に制限的なポリシーを用意しています。
  • しかし、これらのスクリプトでは、(オブジェクトをGroovyスクリプトに送り、「何か必要なときにはいつでも、このオブジェクトに対してこのメ​​ソッドを呼び出す」と言って)特権を必要とする特定のアクションを実行できるようにします。
  • 昇格された特権を必要とするコードは、AccessController.doPrivilegedステートメントで実行されています。

GroovyスクリプトがAccessController.doPrivileged (some_malicious_code)というコードを実行しないようにするにはどうすればよいですか?あなたは右のそれを得ることはありません

答えて

1

AccessController.doPrivilegedを使用すると、JVMに示すものではありません。

ねえ、私はあなたが私はいい男だ、私を信頼することができますやっているかどうか確認しないでください!

これは、コールスタックの残りの部分に十分な権限があることをチェックする必要がないことをJVMに示します。

例を挙げると、いくつかの特権を必要とするコードを実行するサードパーティのライブラリFooを呼び出すクラスAがあるとしましょう。私はFooを呼び出すときにデフォルトで

AccessController.doPrivilegedを使用せずに、JVMは、私は私のクラス Aにも、私のサードパーティのライブラリに必要な権限を提供する必要があり、完全なコールスタックが私のポリシーファイルにので、ここで十分な権限を持っていることを確認します Foo

私のクラスAであれば、私はAccessController.doPrivilegedでサードパーティのライブラリFooへの呼び出しをラップし、私はサードパーティのライブラリFooへの権利を提供する必要がない、もはや唯一Aはまだそれらを必要とします。

だから何が AccessController.doPrivileged (some_malicious_code)を言うのコードの一部を実行しているからのGroovyスクリプトを停止しますか?

あなたのGroovyコードが悪意のあるコードを実行するために必要な権限を持っていない場合、前述の理由のためにそれを呼び出すためにAccessController.doPrivilegedを使用している場合でもコードを実行することはできません。

0

AccessController.doPrivilegedを悪意のあるコードがどのようにして停止させるかは、コードの意味に依存します。

コードがでコード化されたコードの場合、コンテナが行う必要があることの1つは、コードのロード時に制限付きの特権を割り当てることです。 AccessController.doPrivilegedの許可チェックは、そのメソッドの呼び出し元を含めて元に戻りますので、大丈夫です。

通訳がある場合は、もっと楽しくなります。通訳者は、ランダムメソッドを呼び出す前にアクセス許可を下げる必要があります。通訳者が明示的に守らなければならない方法の1つはdoPrivilegedです。 インタプリタの定義はここではかなり広いです。信用できないソースからの指示で反射を使用すると、どんなダディーな使い方もできます。

私はGroovyの実装になじみがないので、これをどのように処理するか、まったく気にするかどうかはコメントできません。

関連する問題