Проблемы безопасности с SQL Query - PullRequest
0 голосов
/ 11 февраля 2020

Я работаю над запросом 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 ]

4 голосов
/ 11 февраля 2020

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

  • Нет условия 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 права тому, кто звонит. Что приносит свои проблемы. Чтобы преодолеть это, вы можете использовать Контроль доступа на основе кода .

2 голосов
/ 11 февраля 2020

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

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

PLSQL / T SQL

Аннотация

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

Пояснение

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

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

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


Не имеет значения, но ни select не должен быть динамическим c - возможно, вы решили сделать это, чтобы оно выглядело более совместимым с операторами 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;
...