Я читал документацию по 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);
? Где my_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 привести к тому, что привилегированный пользователь запустит пользовательский код, который он не планировал, создав предикат, который ссылается на вредоносную функцию, но это несколько отдельно.)