在Oracle VPD/RLS中,如何防止恶意用户谓词泄露信息?

Cra*_*ger 5 security oracle row-level-security

我一直在阅读Oracle VPD(虚拟专用数据库,也就是细粒度安全性,基于标签的安全性的基础)的文档,而且我很难掌握.VPD如何防止用户在WHERE条款中使用恶意功能泄露信息?

假设你有一个生成静态谓词的VPD策略cust_no = SYS_CONTEXT('order_entry', 'cust_num');(就像在Oracle VPD教程中一样).

这导致查询被重写,因此:

SELECT * FROM orders;
Run Code Online (Sandbox Code Playgroud)

变为:

SELECT * FROM orders 
  WHERE cust_no = SYS_CONTEXT('order_entry', 'cust_num');
Run Code Online (Sandbox Code Playgroud)

到目前为止很好.但是如果用户写道:

SELECT * FROM orders WHERE my_malicious_function(secret_column);
Run Code Online (Sandbox Code Playgroud)

?当my_malicious_function插入它看到到被恶意用户控制拥有的另一个表中的每个值,这样的话,他们可以通过选择表中看到的秘密数据.

根据文档,VPD重写器将产生如下内容:

SELECT * FROM orders 
  WHERE cust_no = SYS_CONTEXT('order_entry', 'cust_num')
    AND my_malicious_function(secret_column);
Run Code Online (Sandbox Code Playgroud)

但Oracle可以自由地重新订购子条款WHERE.my_malicious_function如果它认为那将是更便宜或更具选择性的谓词,是什么阻止它首先运行?(当安全条件是SYS_CONTEXT查找时,不太可能,但如果条件是针对另一个表的子查询,或者是自己的UDF,则很可能).

我已经阅读了文档,我没有看到它在执行VPD谓词和用户提供的谓词时指定任何顺序保证.是否有这样的保证或任何其他机制来防止恶意谓词功能?

(我也很好奇VPD策略中的恶意谓词函数是否会导致特权用户通过生成引用恶意函数的谓词来运行用户提供的代码,而这些代码在某种程度上是分开的.)

Jef*_*emp 3

“恶意函数”是在应用VPD策略后运行的,因此它无法看到隐藏的数据。

因此,在您的示例中,以下查询:

SELECT * FROM orders WHERE my_malicious_function(secret_column);
Run Code Online (Sandbox Code Playgroud)

被重写为:

SELECT * FROM (
  SELECT * FROM orders orders
  WHERE cust_no = SYS_CONTEXT('order_entry', 'cust_num')
)
WHERE my_malicious_function(secret_column);
Run Code Online (Sandbox Code Playgroud)

因此,该函数仅针对满足 VPD 谓词的行执行。

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

当谓词中需要表别名时(例如,父对象是类型表),必须使用表或视图本身的名称作为别名。服务器将瞬态视图构造为类似的东西

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