Oracle FAQ Your Portal to the Oracle Knowledge Grid

Home -> Community -> Mailing Lists -> Oracle-L -> RE: Supplied Packages, Database Links, and SQL Injection

RE: Supplied Packages, Database Links, and SQL Injection

From: Hostetter, Jay M <>
Date: Tue, 9 May 2006 15:05:36 -0400
Message-ID: <>

These are the standard revokes that I issue. If a user needs it, I grant it directly to that user. I put these revokes right into postDBCreation.sql that is generated by DBCA.

/* Revoke privileges per page 715 of the Admin Manual (Security Checklist). */

revoke execute on utl_smtp    from public;
revoke execute on utl_tcp     from public;
revoke execute on utl_http    from public;
revoke execute on utl_file    from public;
revoke execute on dbms_random from public;

/* From Oracle9i Application Developer's Guide - Fundamentals Ch. 14 */ revoke execute on dbms_obfuscation_toolkit from public;

/* Oracle Database Security Benchmark v1.1 */ revoke execute on dbms_lob from public;
revoke execute on dbms_job from public;

Some new revokes to consider:

/* Related to CPUApr2006 - */

revoke execute on dbms_reputil          from public;
revoke execute on dbms_snapshot_utl     from public;
revoke execute on dbms_export_extension from public;

You are right - it's fairly easy to find existing stored objects that will break if you make these revokes. It's a bit more difficult for the anonymous blocks. I modified an old query for v$db_object_cache in an attempt to find out if one of these packages was called recently. I'm sure somebody could improve upon it:

select owner || '.' || name OBJECT

, type
, to_char(sharable_mem/1024,'9,999.9') "SPACE(K)"
, loads
, executions execs
, kept

from v$db_object_cache

    'DBMS_OBFUSCATION_TOOLSKIT','DBMS_LOB','DBMS_JOB') order by owner, name


-----Original Message-----
[] On Behalf Of MacGregor, Ian A. Sent: Tuesday, May 09, 2006 2:18 PM
To: oracle-l
Subject: Supplied Packages, Database Links, and SQL Injection

Certain supplied packages such as dbms_export_extension are flawed, you can inject SQL such as "grant dba to me;" into them and the code will be executed. Now suppose you are pulling data from a database which includes sensitive information to one that does not via a database link. No sensitive data is accessible, the account on the sensitive database to which the database link connects has no privilege to access the sensitive objects. However there is a package, I'll call it dbms_flawed which is exploitable via SQL injection. A user runs dbms_flawed.exeute_this_at_remote_db('grant dba to me') thereby gaining that privilege or execute dbms_flawed.execute_at_remote_db('grant all on trusted_user.cofidential_info_table to me'); The controls setup to prevent improper access are bypassed.

The answer is to to not allow "me" to execute dbms_flawed. However, there are other packages which might now or someday be exploitable. How are folks handling this. Have you revoked execute privileges from public from all packages, a certain set of packages (if so which ones)? Is there a list of packages which have the potential to be exploited. Revoking privileges can be tricky. Dba_dependencies will find calls from stored procedures, but not anonymous blocks.

Ian MacGregor
Stanford Linear Accelerator Center   


This e-mail message and any files transmitted with it are intended for the use of the individual or entity to which they are addressed and may contain information that is privileged, proprietary and confidential. If you are not the intended recipient, you may not use, copy or disclose to anyone the message or any information contained in the message. If you have received this communication in error, please notify the sender and delete this e-mail message. The contents do not represent the opinion of D&E except to the extent that it relates to their official business.

Received on Tue May 09 2006 - 14:05:36 CDT

Original text of this message