5

Oracle VPD (Virtual Private Database、別名ファイングレイン セキュリティ、ラベルベース セキュリティの基礎) のドキュメントを読んでいますが、把握するのに苦労しているものがあります。WHEREVPD は、句内の悪意のある関数を使用してユーザーが情報を漏えいするのをどのように防ぎますか?

cust_no = SYS_CONTEXT('order_entry', 'cust_num');( Oracle VPDチュートリアルのように)静的述語を生成するVPDポリシーがあるとします。

その結果、クエリが書き換えられるため、次のようになります。

SELECT * FROM orders;

になります:

SELECT * FROM orders 
  WHERE cust_no = SYS_CONTEXT('order_entry', 'cust_num');

どこまでもうまい。しかし、ユーザーが次のように書いた場合はどうなるでしょうか。

SELECT * FROM orders WHERE my_malicious_function(secret_column);

? Wheremy_malicious_functionは、悪意のあるユーザーのコントロールが所有する別のテーブルに各値を挿入し、そのテーブルを選択して機密データを表示できるようにします。

ドキュメントによると、VPDリライタは次のようなものを生成します。

SELECT * FROM orders 
  WHERE cust_no = SYS_CONTEXT('order_entry', 'cust_num')
    AND my_malicious_function(secret_column);

ただし、オラクルは、サブ条項の順序を自由に変更できますWHEREmy_malicious_functionそれがより安価またはより選択的な述語になると思われる場合、最初に実行するのを止めるものは何ですか? (セキュリティ条件がSYS_CONTEXTルックアップの場合はありそうにありませんが、条件が別のテーブルに対するサブクエリである場合、またはそれ自体が UDF である場合は非常に可能性が高くなります)。

ドキュメントを読みましたが、VPD 述語とユーザー提供の述語の実行に関する順序の保証がどこで指定されているかわかりません。そのような保証、または悪意のある述語関数から保護するための他のメカニズムはありますか?

(VPD ポリシーの悪意のある述語関数が、悪意のある関数を参照する述語を生成することによって、意図しないユーザー提供のコードを特権ユーザーに実行させる可能性があるかどうかについても興味がありますが、それは多少異なります。)

4

1 に答える 1

3

「悪意のある機能」は、VPD ポリシーが適用された後に実行されるため、非表示のデータを見ることはできません。

したがって、あなたの例では、次のクエリ:

SELECT * FROM orders WHERE my_malicious_function(secret_column);

次のように書き換えられます。

SELECT * FROM (
  SELECT * FROM orders orders
  WHERE cust_no = SYS_CONTEXT('order_entry', 'cust_num')
)
WHERE my_malicious_function(secret_column);

したがって、関数は VPD 述部を満たす行に対してのみ実行されます。

参照: http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_rls.htm#i1005326

述部で表の別名が必要な場合 (例えば、親オブジェクトがタイプ表である場合)、表またはビュー自体の名前を別名として使用する必要があります。サーバーは一時的なビューを次のように構築します

select c1, c2, ... from tab tab where <predicate>

于 2013-11-06T03:11:46.707 に答える