web-dev-qa-db-ja.com

悪意のあるコードの脆弱性-可変オブジェクトへの参照を返すことにより、内部表現を公開する可能性があります

こんにちは私は以下のような違反を受けています:

悪意のあるコードの脆弱性-可変オブジェクトへの参照を返すことにより、内部表現を公開する可能性があります

私のコードでは私はこのように書きました

public String[] chkBox() {
    return chkBox;
}

どのようにそれを解決できるか。

19
jayavardhan

エラーメッセージが示すように、内部状態を返します(chkBoxは、おそらくその定義を表示していなくても、オブジェクトの内部状態の一部です)

これは、たとえば次の場合に問題を引き起こす可能性があります

String[] box = obj.chkBox();
box[0] = null;

すべてのJavaオブジェクトと同様に、配列オブジェクトは参照によって渡されるため、これはオブジェクト内に格納されている元の配列も変更します。

これを修正するために最も実行したいことは簡単です

return (String[])chkBox.clone();

実際の配列の代わりに配列のコピーを返します。

35

以下を想定しましょう:

  1. クラスは、セキュリティまたはプライバシーの観点から重要なことを行い、chkboxの状態は、そのプライバシー/セキュリティメカニズムのクラス実装で何らかの形で使用されます。

  2. chkBox()メソッドは、信頼されていない一部のコードから呼び出すことができます。

今、このコードを考えてみましょう:

_// ... in an untrusted method ...

Foo foo = ... 
String[] mwahaha = foo.chkBox();
mwahaha[0] = "Gotcha!"; // ... this changes the effective state of `Foo`
_

chkboxを表す実際の配列への参照を返すことにより、Fooクラスの外部のコードが到達してその状態を変更できるようになります。

これは、設計の観点からは良くありません(「漏れやすい抽象化」と呼ばれます)。ただし、このクラスが信頼できないコードもある可能性のあるコンテキストで使用されている場合、これ(chkBox()メソッド)は潜在的セキュリティホールです。 これは違反メッセージが伝えていることです。

(もちろん、コードチェッカーは、この特定のクラスが本当にセキュリティクリティカルであるかどうかを知る方法がありません。それはあなたが理解するためです。それが実際にあなたに言っていることは"Hey!Lookここ!これは怪しいです! "


修正は、このコード(または実際にライブラリ全体またはアプリケーション全体)がセキュリティクリティカルであるか、将来の展開でコードがセキュリティクリティカルであるかによって異なります。これが誤警報である場合は、違反を抑制できます。つまり、チェッカーによって無視されるようにマークを付けます。これが実際の問題である(または実際の問題になる可能性がある)場合は、配列のコピーを返します。

_    return (String[]) chkBox.clone();
_

しかし、明らかに、chkBoxを呼び出すたびに配列のクローンを作成すると、パフォーマンスが低下します。または、chkBoxメソッドを変更して、配列の選択した要素を返すこともできます。

_    public String chkBox(int i) {
       return chkBox[i];
    }
_

この場合、別の方法の方が優れていると思います。ただし、現在の方法の使用方法によって異なります。

9
Stephen C