我一直在阅读 Oracle VPD(虚拟私有数据库,又名细粒度安全性,基于标签的安全性的基础)的文档,但有些东西我很难掌握。VPD 如何防止用户使用WHERE
条款中的恶意函数泄露信息?
假设您有一个生成静态谓词的 VPD 策略cust_no = SYS_CONTEXT('order_entry', 'cust_num');
(如Oracle 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);
但是 Oracle 可以自由地重新排序WHERE
. my_malicious_function
如果它认为这将是更便宜或更有选择性的谓词,是什么阻止它首先运行?(当安全条件是SYS_CONTEXT
查找时不太可能,但如果条件是针对另一个表的子查询,或者它本身是 UDF,则很可能)。
我已经阅读了文档,但没有看到它在哪里指定执行 VPD 谓词与用户提供的谓词的任何顺序保证。是否有这样的保证或任何其他机制来防止恶意谓词函数?
(我也很好奇 VPD 策略中的恶意谓词函数是否会导致特权用户通过生成引用恶意函数的谓词来运行他们不想要的用户提供的代码,但这在某种程度上是分开的。)