5

我一直在阅读 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 策略中的恶意谓词函数是否会导致特权用户通过生成引用恶意函数的谓词来运行他们不想要的用户提供的代码,但这在某种程度上是分开的。)

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 回答