Oracle VPD (Virtual Private Database、別名ファイングレイン セキュリティ、ラベルベース セキュリティの基礎) のドキュメントを読んでいますが、把握するのに苦労しているものがあります。WHERE
VPD は、句内の悪意のある関数を使用してユーザーが情報を漏えいするのをどのように防ぎますか?
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);
ただし、オラクルは、サブ条項の順序を自由に変更できますWHERE
。my_malicious_function
それがより安価またはより選択的な述語になると思われる場合、最初に実行するのを止めるものは何ですか? (セキュリティ条件がSYS_CONTEXT
ルックアップの場合はありそうにありませんが、条件が別のテーブルに対するサブクエリである場合、またはそれ自体が UDF である場合は非常に可能性が高くなります)。
ドキュメントを読みましたが、VPD 述語とユーザー提供の述語の実行に関する順序の保証がどこで指定されているかわかりません。そのような保証、または悪意のある述語関数から保護するための他のメカニズムはありますか?
(VPD ポリシーの悪意のある述語関数が、悪意のある関数を参照する述語を生成することによって、意図しないユーザー提供のコードを特権ユーザーに実行させる可能性があるかどうかについても興味がありますが、それは多少異なります。)