Получение информации путем логических выводов
Нередко путем логического вывода можно извлечь из базы данных информацию, на получение
которой стандартными средствами у пользователя не хватает привилегий.
Следуя , рассмотрим больничную базу данных, состоящую из двух таблиц. В
первой хранится информация о пациентах (анкетные данные, диагноз, назначения и т.п.), во
второй - сведения о докторах (расписание мероприятий, перечень пациентов и т.д.). Если
пользователь имеет право доступа только к таблице докторов, он, тем не менее, может получить
косвенную информацию о диагнозах пациентов, поскольку, как правило, врачи специализируются
на лечении определенных болезней.
Еще один пример - выяснение набора первичных ключей таблицы при наличии только привилегии
INSERT (без привилегии SELECT). Если набор возможных значений ключей примерно известен,
можно пытаться вставлять новые строки с "интересными" ключами и анализировать коды
завершения SQL-операторов. Как мы видели из предыдущего примера, сам факт присутствия
определенного ключа в таблице может быть весьма информативным.
Если для реализации контроля доступа используются представления, и эти представления
допускают модификацию, с помощью операций модификации/вставки можно получить
информацию о содержимом базовых таблиц, не располагая прямым доступом к ним.
Основным средством борьбы с подобными угрозами, помимо тщательно проектирования модели
данных, является механизм размножения строк. Суть его в том, что в состав первичного ключа,
явно или неявно, включается метка безопасности, за счет чего появляется возможность хранить в
таблице несколько экземпляров строк с одинаковыми значениями "содержательных" ключевых
полей. Наиболее естественно размножение строк реализуется в СУБД, поддерживающих метки
безопасности (например, в INGRES/Enhanced Security), однако и стандартными SQL-средствами
можно получить удовлетворительное решение.
Продолжая медицинскую тематику, рассмотрим базу данных, состоящую из одной таблицы с
двумя столбцами: имя пациента и диагноз. Предполагается, что имя является первичным ключом.
Каждая из строк таблицы относится к одному из двух уровней секретности - высокому (HIGH) и
низкому (LOW). Соответственно, и пользователи подразделяются на два уровня благонадежности,
которые мы также будем называть высоким и низким.
К высокому уровню секретности относятся сведения о пациентах, находящихся под надзором
правоохранительных органов или страдающих специфическими заболеваниями. На низком уровне
располагаются данные о прочих пациентах, а также информация о некоторых "секретных"
пациентах с "маскировочным" диагнозом. Части таблицы могут выглядеть примерно так:
Иванов | СПИД |
Петров | Сифилис |
Сидоров | Стреляная рана |