Controlando privilégios herdados com o INHERIT PRIVILEGES

Acredito que quase todos já conhecem que temos duas opções ao criar functions ou procedures com relação aos privilégios de como esse objeto será executado. As opções disponíveis seria executar com o privilégio de quem definiu ou criou o objeto, definer, ou então do usuário que executou o objeto, current_user.

Isso serve para controle de segurança, mas também pode abrir brechas na segurança também, no caso seja utilizado a opção de current_user, alguém maliciosamente pode tentar se aproveitar desta opção. Vamos ver um exemplo abaixo em que um usuário que não tem grant de DBA criou uma função para retornar o cálculo de idade mas que dentro do corpo da função ele colocou um trecho de código para dar um GRANT de DBA a si mesmo, de maneira maldosa.


conn system/oracle
CREATE USER TERCIO IDENTIFIED BY ORACLEPRESS;
GRANT CREATE PROCEDURE TO TERCIO;
GRANT RESOURCE TO TERCIO;
GRANT CREATE SESSION TO TERCIO;
DISCONNECT;

CONN TERCIO/ORACLEPRESS;
CREATE OR REPLACE FUNCTION RETORNA_IDADE(p_data_nascimento DATE)
RETURN NUMBER
AUTHID CURRENT_USER
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
EXECUTE IMMEDIATE 'GRANT DBA TO TERCIO';
RETURN ROUND((SYSDATE-p_data_nascimento)/365.25,2);
EXCEPTION
WHEN OTHERS THEN
RETURN ROUND((SYSDATE-p_data_nascimento)/365.25,2);
END;

Perceba que ao criar a função foi colocado a cláusula AUTHID CURRENT_USER, ou seja, a função será executada com os privilégios de quem está utilizando este objeto. Neste caso é uma função simples que retorna o cálculo da idade, mas que dentro colocou um grant indevido de DBA, neste caso o usuário poderia até ter feito um wrap do código para ninguém ver o que tinha dentro da function para que ninguém descobrisse!

Caso essa função seja executada por um usuário sem o privilégio de conceder a role DBA será lançada uma exceção, mas como temos um block exception com o retorno da idade, o usuário nem irá perceber o que aconteceu. Mas, caso um usuário tenha permissão de conceder a role DBA o usuário tercio terá então esse privilégio sem ninguém saber, pois a função herda(INHERIT) os direitos de quem a invocou. Apenas consultado no dicionário de dados para saber quem tem a role DBA, mas nesse caso não saberá como aconteceu isto.

Para impedir, ou permitir, casos assim, existe uma nova cláusula no Oracle 12c, a INHERIT PRIVILEGES ou então a INHERIT ANY PRIVILEGES. Com a ajuda dessas cláusulas, podemos impedir que casos como a função criada acima conceda privilégios indevidos sem o conhecimento do DBA, ou casos piores, como um DROP de uma tabela, DELETES e etc. Veja um exemplo de sua sintaxe no código abaixo.


REVOKE INHERIT PRIVILEGES ON USER SYSTEM FROM TERCIO;

Neste caso estamos removendo a herança de privilégios do usuário SYSTEM de TERCIO. Assim se SYSTEM tentasse executar novamente a função da Listagem 1 será lançada a exceção ORA-06598: insufficient INHERIT PRIVILEGES privilege.

Se o desejo fosse permitir a herança de privilégios de um usuário para outro, a sintaxe muda um pouco, isso pode ser visto na listagem abaixo.


GRANT INHERIT PRIVILEGES ON USER SYSTEM TO PUBLIC;

Esse grant é potencialmente perigosa, pois estamos permitindo que todos os usuários, PUBLIC, possam herdar os privilégios de SYSTEM, e dessa maneira abrindo uma brecha na segurança do banco, permitindo que funções como a da listagem 1 executem sem erro nenhum.

A cláusula ANY permite que o usuário herde qualquer privilégio de qualquer outro usuário, a sintaxe pode ser vista logo abaixo.


GRANT INHERIT ANY PRIVILEGES TO TERCIO;    --CONCEDER
REVOKE INHERIT ANY PRIVILEGES FROM TERCIO; --REMOVER

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação OCA 12c, Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Marcado com: , , ,
Publicado em Sem categoria

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.

Esse Blog é reconhecido pela
Sou um
Certificações
Sou articulista

Clique para seguir este blog e receber notificações via email de novos posts.

Tércio Costa

Tércio Costa

Meu nome é Tércio Costa, sou formado em Ciências da Computação pela UFPB, tenho a certificação OCA 12c, Oracle SQL Expert e OCP PL/SQL, mantendo um blog reconhecido pela OTN(oraclepress.wordpress.com), no qual também publico artigos técnicos no portal OTN, no portal http://www.profissionaloracle.com.br/gpo e na revista SQL Magazine. Além de tudo isto sou um Oracle ACE por estar sempre contribuindo para a comunidade com um bom nível de expertise.

Links Pessoais

Serviços verificados

Visualizar Perfil Completo →

Total de Visualizações da Página
  • 180.690 Visualizações
%d blogueiros gostam disto: