Проблемы безопасности с SQL Query

Я работаю над запросом Oracle SQL. Запрос помечается с помощью Fortify SCA для управления привилегиями: функция по умолчанию или права процедуры. Может кто-нибудь помочь мне с правильным способом использования запроса?

Запрос, который я хочу использовать:

CREATE OR REPLACE PROCEDURE "reset_sequence"
IS
  l_value NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT "ordering_seq".nextval FROM dual' INTO l_value;
  EXECUTE IMMEDIATE 'ALTER SEQUENCE "ordering_seq" INCREMENT BY -' || l_value || ' MINVALUE 0'
  EXECUTE IMMEDIATE 'SELECT "ordering_seq".nextval FROM dual' INTO l_value;
  EXECUTE IMMEDIATE 'ALTER SEQUENCE "ordering_seq" INCREMENT BY 1 MINVALUE 0'
END;

Всего 2 ответа


Я могу заметить пару вопросов здесь:

  • Там нет предложения authid , поэтому по умолчанию он definer
  • execute immediate с конкатенацией строк

Это означает, что любой пользователь, имеющий права на выполнение процедуры, работает с полными правами владельца процедуры. А при конкатенации строк существует риск внедрения SQL. Да даже с цифрами .

Также вы можете получить следующее значение последовательности, присвоив его. Нет необходимости execute immediate .

Чтобы быть в безопасности, я бы сделал следующие изменения:

  • Добавить authid current_user
  • Явно to_char инкремент, избегая атак на это

Предоставление:

create sequence ordering_seq
  start with 100;

select ordering_seq.nextval from dual;

NEXTVAL   
       100 

CREATE OR REPLACE PROCEDURE reset_sequence
  authid current_user
IS
  l_value NUMBER;
BEGIN
  l_value := ordering_seq.nextval;
  EXECUTE IMMEDIATE 'ALTER SEQUENCE ordering_seq INCREMENT BY -' || 
     to_char ( l_value, 'TM', 'NLS_Numeric_Characters = ''.,''' ) || 
     ' MINVALUE 0'
  l_value := ordering_seq.nextval;
  EXECUTE IMMEDIATE 'ALTER SEQUENCE ordering_seq INCREMENT BY 1 MINVALUE 0'
END;
/

exec reset_sequence;

select ordering_seq.nextval from dual;

NEXTVAL   
         1 

Конечно, использование прав вызывающего означает, что вы должны выдавать права на alter sequence тем, кто звонит. Что приносит свои проблемы. Чтобы преодолеть это, вы можете использовать контроль доступа на основе кода .


Из документов Fortify :

Управление привилегиями: права на пакет по умолчанию

PLSQL / TSQL

абстрактный

Пакеты без предложения AUTHID умолчанию имеют значение AUTHID DEFINER .

объяснение

Пакеты PL / SQL могут быть либо AUTHID DEFINER либо AUTHID CURRENT_USER . Функции и процедуры в пакете с определенными правами выполняются с правами пользователя, который определяет пакет. Это может позволить обновления и доступ к определенным частям данных без предоставления доступа ко всем таблицам или схемам. В пакете с правами AUTHID CURRENT_USER или AUTHID CURRENT_USER функции и процедуры выполняются с правами пользователя, который их вызывает. Это не позволяет пользователю получить доступ к данным, к которым у него уже не было доступа. Если предложение AUTHID не предоставлено, пакет по умолчанию имеет права определителя.

Пакеты обычно определяются SYS или другим пользователем с высоким уровнем привилегий, что делает любые эксплойты кода потенциально более опасными.

Таким образом, кажется, вам просто нужно добавить предложение AUTHID , даже если это просто явное указание значения по умолчанию снова (хотя вы, конечно, должны установить правильное значение).


Не имеет значения, но ни один метод select должен быть динамическим - возможно, вы решили сделать это, чтобы он выглядел более согласованным с утверждениями alter , но это не обязательно; и их даже не нужно больше выбирать - вы можете сделать:

CREATE OR REPLACE PROCEDURE "reset_sequence"
AUTHID CURRENT_USER
IS
  l_value NUMBER;
BEGIN
  l_value := "ordering_seq".nextval;
  EXECUTE IMMEDIATE 'ALTER SEQUENCE "ordering_seq" INCREMENT BY -' || l_value || ' MINVALUE 0'
  l_value := "ordering_seq".nextval;
  EXECUTE IMMEDIATE 'ALTER SEQUENCE "ordering_seq" INCREMENT BY 1 MINVALUE 0'
END;

Есть идеи?

10000