Oracle XS_ADMIN_UTIL Built-In Package
Versions 12.1 - 19.3

Security Advisory
This package is part of Oracle Database Real Application Security (RAS) and is used to grant and revoke privileges and with that in mind, Oracle decided to grant EXECUTE on this package to PUBLIC. Really, If that makes sense to you please consider taking up a different line of work.

The documentation says that "The SYS privilege is required to grant or revoke a Real Application Security system privilege to or from a user or role." which is not true by definition as there is no "SYS" privilege in Oracle. Look at the How Oracle Works section to see the details of how we proved this statement was not true beyond the obvious.
 
Recommended Security Rules

 NEVER
  • Let any user or schema without documented justification or escalated privileges gain access to this package by revoking EXECUTE from PUBLIC
 WITH GREAT CARE
  • Identify legitimate requirements for access to this package and grant EXECUTE explicitly to only justified schemas
  • Query the data dictionary after EXECUTE has been revoked from PUBLIC to verify the equivalence created is the equivalence approved by IT management and your CISO
 CAUTIONS
  • Some dependencies may exist in the form of dynamic SQL so carefully verify usage requirements in source code as well as in DBA_DEPENDENCIES
 
How Oracle Works
Oracle has released an option named Real Application Security (RAS) that contains a lot of moving pieces of which this is one of them. We are currently working on a single comprehensive monograph to explain RAS from the standpoint of what it offers, the pieces required to make it work, and any risks associated either with its use or how Oracle has implemented it.

One of our biggest concerns is the lack of good documentation, especially around the constants to help implementers understand which options to choose in which situations. This package alone contains 40 constants not one of which is explained in the docs. Another is the number of pieces of a puzzle, security related, that are granted to PUBLIC. We cannot think of a single reason why any piece of a security infrastructure should have control granted to PUBLIC so we are, at the moment, highly skeptical that it can be effectively employed by the typical Oracle customer.
Proving the docs are wrong and exposing a security issue.

First, DBA is a role containing 235 separate system privileges so we still do not know precisely what system privilege(s) are required to grant execute.

Second, note that SCOTT can not only grant to others ... SCOTT can grant to SCOTT. This is dangerous territory.

 
conn sys@pdbdev as sysdba
Enter password:
Connected.

GRANT dba TO scott;

Grant succeeded.

conn scott/tiger@pdbdev
Connected.

-- the following proves the Oracle RAS documentation is incorrect
-- and that it is likely an undocumented system privilege is required

exec xs_admin_util.grant_system_privilege('ADMINISTER_SESSION', 'UWCLASS');

PL/SQL procedure successfully completed.

-- the following proves that the package can be used to grant to self
exec xs_admin_util.grant_system_privilege('ADMINISTER_SESSION', 'SCOTT');

PL/SQL procedure successfully completed.

-- but worse than a self-grant ... the following is fatally flawed by definition
exec xs_admin_util.grant_system_privilege('ADMINISTER_SESSION', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('ADMIN_ANY_NAMESPACE', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('ADMIN_ANY_SEC_POLICY', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('ADMIN_SEC_POLICY', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('APPLY_SEC_POLICY', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('ASSIGN_USER', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('ATTACH_SESSION', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('CALLBACK', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('CREATE_SESSION', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('CREATE_TRUSTED_SESSION', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('MODIFY_SESSION', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('PROVISION', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('SET_DYNAMIC_ROLES', 'PUBLIC');

PL/SQL procedure successfully completed.

exec xs_admin_util.grant_system_privilege('TERMINATE_SESSION', 'PUBLIC');

PL/SQL procedure successfully completed.

-- we didn't really have to list every one of these like we did but we are hoping
-- someone at Oracle is paying attention and realizes this needs to be fixed ASAP.
 
XS_ADMIN_UTIL Package Information
AUTHID CURRENT_USER
Constants
Name Data Type Value
COMMON_WORKSPACE VARCHAR2(6) 'XS'
SCHEMA_ACL VARCHAR2(13) 'XS$SCHEMA_ACL'
XSCONNECT VARCHAR2(9) 'XSCONNECT'
STRING_MAXLEN PLS_INTEGER 4000
NON_EMPTY_STRING_MINLEN PLS_INTEGER 1
STRING_MINLEN PLS_INTEGER 0
XSNAME_MINLEN PLS_INTEGER 1
XSNAME_MAXLEN PLS_INTEGER 130
PARAMNAME_MINLEN PLS_INTEGER 1
PARAMNAME_MAXLEN PLS_INTEGER 128
XSQNAME_MINLEN PLS_INTEGER 1
XSQNAME_MAXLEN PLS_INTEGER 261
EXTERNAL_NAME_MINLEN PLS_INTEGER 1
EXTERNAL_NAME_MAXLEN PLS_INTEGER 130
WORKSPACE_MINLEN PLS_INTEGER 1
WORKSPACE_MAXLEN PLS_INTEGER 128
DBNAME_MINLEN PLS_INTEGER 1
DBNAME_MAXLEN PLS_INTEGER 130
OBJTYPE_PRINCIPAL PLS_INTEGER 1
OBJTYPE_SECURITY_CLASS PLS_INTEGER 2
OBJTYPE_ACL PLS_INTEGER 3
OBJTYPE_PRIVILEGE PLS_INTEGER 4
OBJTYPE_DATA_SECURITY PLS_INTEGER 5
OBJTYPE_ROLESET PLS_INTEGER 6
OBJTYPE_NSTEMPL PLS_INTEGER 7
OBJTYPE_SYSOP PLS_INTEGER 101
OBJTYPE_ADMOP PLS_INTEGER 102
OBJTYPE_APPLY_POLICY PLS_INTEGER 103
OBJTYPE_GRANTOP PLS_INTEGER 104
OBJTYPE_REVOKEOP PLS_INTEGER 105
OBJTYPE_SET_POLICY PLS_INTEGER 106
Delete Options
DEFAULT_OPTION PLS_INTEGER 1
CASCADE_OPTION PLS_INTEGER 2
ALLOW_INCONSISTENCIES_OPTION PLS_INTEGER 3
Specify if an object exists in the base table or not
STATUS_NOT_EXISTS PLS_INTEGER 0
STATUS_EXISTS PLS_INTEGER 1
Principal Type Definition
PTYPE_XS PLS_INTEGER 1
PTYPE_DB PLS_INTEGER 2
PTYPE_DN PLS_INTEGER 3
PTYPE_EXTERNAL PLS_INTEGER 4
Data Types CREATE OR REPLACE TYPE xs$list IS VARRAY(1000) OF VARCHAR2(4000);

CREATE OR REPLACE TYPE xd$name_list IS VARRAY(1000) OF VARCHAR2(261);
Dependencies
DBMS_NETWORK_ACL_ADMIN XS$OBJ XS_DATA_SECURITY_UTIL_INT
DBMS_RXS_LIB XS$PRIVILEGE XS_DIAG
DBMS_SFW_ACL_ADMIN XS$REALM_CONSTRAINT_TYPE XS_DIAG_INT
DBMS_STANDARD XS$ROLE_GRANT_TYPE XS_NAMESPACE
DBMS_WRR_PROTECTED XS_ACL XS_NAMESPACE_INT
DBMS_XDS_INT XS_ACL_INT XS_PRINCIPAL
DBMS_XSS_LIB XS_ADMIN_INT XS_PRINCIPAL_INT
XS$ACE_TYPE XS_ADMIN_UTIL_INT XS_ROLESET
XS$COLUMN_CONSTRAINT_TYPE XS_DATA_SECURITY XS_ROLESET_INT
XS$KEY_TYPE XS_DATA_SECURITY_INT XS_SECURITY_CLASS
XS$NS_ATTRIBUTE XS_DATA_SECURITY_UTIL XS_SECURITY_CLASS_INT
Documented Yes: In both the Packages and Types and in the Real Application Security Administrator's & Developer's Guide docs

Of the 13 objects in this package only GRANT_SYSTEM_PRIVILEGE and REVOKE_SYSTEM_PRIVILEGE are documented.
Exceptions
Error Code Reason
1031 ERR_INSUFFICIENT_PRIV
28222 ERR_RESERVED_USER
46025 ERR_NO_STATIC_RULE
46055 ERR_ROLE_NOT_GRANTED
46076 ERR_INVALID_LENGTH
46083 ERR_SET_PRIN_GUID
46084 ERR_DROP_SEEDED_OBJ
46085 ERR_NO_PROXY_ROLES
46096 ERR_DEFV_FREVNT_COEXIST
46097 ERR_NO_ROLESET_ROLE
ERR_NO_GRANTEDROLE_PRIN
ERR_NO_SC_PARENTSC
46098 ERR_DUP_PARENT
ERR_DUP_LEAF
ERR_DUP_PRIMARY_KEY
ERR_DUP_ATTR_PRIV_PAIR
ERR_DUP_PROXY
ERR_DUP_ACL_PARAM
ERR_DUP_ROLESET_ROLE
ERR_DUP_POLICY_PARAM
ERR_DUP_NS_ATTR
46099 ERR_FEATURE_NOT_SUPPORTED
46101 ERR_AGGR_CYCLE CONSTANT NUMBER
46103 ERR_SECCLS_CYCLE
46116 ERR_ACL_REFERREDBY_NSTEMPLATE
46117 ERR_ACL_REFERREDBY_PRINCIPLAL
46118 ERR_ACL_SCHEMA_NOT_SYS
46119 ERR_ACL_IS_NULL
46152 ERR_INVALID_VALUE
46202 ERR_NO_HANDLER_FUNC
46211 ERR_INVALID_ENTITY_LENGTH
46212 ERR_DUP_NAME
46214 ERR_OBJ_REFERRED
46215 ERR_INVALID_OBJECT
ERR_NO_OBJ_FOUND
46230 ERR_INTERNAL
46231 ERR_GRANT_ROLE
46232 ERR_ROLE_GRANT_CYCLE
46233 ERR_PARENT_ACL_CYCLE
46235 ERR_NO_POLICY_PARAMETER
46236 ERR_INVALID_POLICY_TYPE
46237 ERR_MIDTIER_CACHE
46238 ERR_NO_DB_USER_ROLE
46240 ERR_PROXY_SCHEMA_EXIST
46241 ERR_PROXY_SCHEMA_NOT_EXIST
46242 ERR_GRANT_ROLE_XSGUEST
First Available 12.1
Security Model Owned by SYS with EXECUTE granted to PUBLIC
Source {ORACLE_HOME}/rdbms/admin/xsutil.sql
Subprograms
 
CHECK_LENGTH
Returns an exception if the test string's length is not between the min and max boundaries xs_admin_util.check_length(
str        IN VARCHAR2,
min_length IN PLS_INTEGER,
max_length IN PLS_INTEGER);
SQL> exec xs_admin_util.check_length('TEST', 1, 10);

PL/SQL procedure successfully completed.

SQL> exec xs_admin_util.check_length('TEST', 7, 10);
BEGIN xs_admin_util.check_length('TEST', 7, 10); END;

*
ERROR at line 1:
ORA-46076: The specified name length not within valid range.
ORA-06512: at "SYS.XS_ADMIN_UTIL", line 70
ORA-06512: at "SYS.XS_ADMIN_UTIL", line 54
ORA-06512: at line 1
 
CHECK_SEEDED
Check whether the object is seeded or not, internal use xs_admin_util.check_seeded(obj_id IN NUMBER);
-- appears to do precisely nothing

exec xs_admin_util.check_seeded(18);

exec xs_admin_util.check_seeded(89999);

exec xs_admin_util.check_seeded(-1);
 
DROP_SCHEMA_OBJECTS
Drop schema objects under a schema xs_admin_util.drop_schema_objects(schema_name IN VARCHAR2);
PRAGMA SUPPLEMENTAL_LOG_DATA(drop_schema_objects, MANUAL);
-- appears to do precisely nothing

CREATE USER c##zzyzx;

CREATE TABLE c##zzyzx.test(
testcol date);

exec xs_admin_util.drop_schema_objects('C##ZZYZX');

SELECT username
FROM dba_users
WHERE username LIKE 'C##%';

USERNAME
---------
C##OE
C##SH
C##ZZYZX
 
GET_DEFAULT_WORKSPACE
Returns the name of the default RAS workspace xs_admin_util.get_default_workspace RETURN VARCHAR2;
SELECT xs_admin_util.get_default_workspace
FROM dual;
 
GET_OBJECT_ID
Called by ADMIN APIs for internal use only returns the object ID xs_admin_util.get_object_id(
obj_name    IN VARCHAR2,
obj_type    IN PLS_INTEGER,
workspace   IN VARCHAR2,
status_flag IN PLS_INTEGER := NULL)
RETURN NUMBER;
TBD
 
GRANT_SYSTEM_PRIVILEGE
Grant system privilege to a user/role xs_admin_util.grant_system_privilege(
priv_name IN VARCHAR2,
user_name IN VARCHAR2,
user_type IN PLS_INTEGER := xs_admin_util.ptype_db,
schema    IN VARCHAR2    := NULL);
PRAGMA SUPPLEMENTAL_LOG_DATA(grant_system_privilege, AUTO);
conn sys@pdbdev as sysdba

exec xs_admin_util.grant_system_privilege('ADMINISTER_SESSION', 'UWCLASS');
 
RAISE_ERROR
Raises a RAS application error xs_admin_util.raise_error(
error_number IN PLS_INTEGER,
error_str1   IN VARCHAR2 DEFAULT NULL,
error_str2   IN VARCHAR2 DEFAULT NULL,
keep_stack   IN BOOLEAN  DEFAULT TRUE);
exec xs_admin_util.raise_error(-600, 'Just What We Need');
BEGIN xs_admin_util.raise_error(-600, 'Just What We Need'); END;
*
ERROR at line 1:
ORA-46095: Invalid error code supplied
ORA-06512: at "SYS.XS_ADMIN_UTIL", line 70
ORA-06512: at line 1


SQL> exec xs_admin_util.raise_error(46084, 'Just What We Need');
BEGIN xs_admin_util.raise_error(46084, 'Just What We Need'); END;
*
ERROR at line 1:
ORA-46084: cannot update or delete system-seeded XS objects.
ORA-06512: at "SYS.XS_ADMIN_UTIL", line 70
ORA-06512: at line 1
 
REMOVE_DBUSER_ACES
Revoke system privilege from a user/role with RAS privs xs_admin_util.remove_dbuser_aces(user_name IN VARCHAR2);
exec xs_admin_util.remove_dbuser_aces('UWCLASS');
 
REVOKE_SYSTEM_PRIVILEGE
Revoke System privilege from a user/role

See the Related Queries at the bottom of this page for a list of relevant XS system privileges
xs_admin_util.revoke_system_privilege(
priv_name IN VARCHAR2,
user_name IN VARCHAR2,
user_type IN PLS_INTEGER := xs_admin_util.ptype_db,
schema    IN VARCHAR2    := NULL);
PRAGMA SUPPLEMENTAL_LOG_DATA(revoke_system_privilege, AUTO);
conn sys@pdbdev as sysdba

exec xs_admin_util.revoke_system_privilege('ADMINISTER_SESSION', 'UWCLASS');

exec xs_admin_util.revoke_system_privilege('TERMINATE_SESSION', 'PUBLIC');
 
SET_DEFAULT_WORKSPACE
Sets the default workspace name xs_admin_util.set_default_workspace(workspace IN VARCHAR2);
exec xs_admin_util.set_default_workspace('XS');
 
VALIDATE_DB_OBJECT_NAME
Validate DB object name. Internal use only. xs_admin_util.validate_db_object_name(
input_name  IN  VARCHAR2,
object_name OUT VARCHAR2,
error_msg   IN  VARCHAR2 DEFAULT NULL);
DECLARE
 outVal VARCHAR2(30);
BEGIN
  xs_admin_util.validate_db_object_name('N0n Sense', outVal, 'ReadTheDocs');
  dbms_output.put_line(outVal);
END;
/
DECLARE
*
ERROR at line 1:
ORA-28104: input value for ReadTheDocs is not valid
ORA-06512: at "SYS.XS_ADMIN_UTIL", line 163
ORA-06512: at line 4


DECLARE
 outVal VARCHAR2(30);
BEGIN
  xs_admin_util.validate_db_object_name('N0nSense', outVal);
  dbms_output.put_line(outVal);
END;
/
N0NSENSE
 
VALIDATE_DB_USER
Validate DB user/schema. Internal use xs_admin_util.validate_db_user(
input_name IN VARCHAR2,
error_msg  IN VARCHAR2 DEFAULT NULL);
exec xs_admin_util.validate_db_user('N0nSense', 'Bad Choice')
BEGIN xs_admin_util.validate_db_user('N0nSense', 'Bad Choice'); END;
*
ERROR at line 1:
ORA-28104: input value for Bad Choice is not valid
ORA-06512: at "SYS.XS_ADMIN_UTIL", line 185
ORA-06512: at line 1
 
XSNAME_TO_ID
Utility Function: XS name to ID xs_admin_util.xsname_to_id(
obj_name IN VARCHAR2,
obj_type IN PLS_INTEGER)
RETURN NUMBER;
SELECT owner, name
FROM dba_xs_objects
WHERE rownum = 1;

OWNER  NAME
------ -------------------
SYS    ADMINISTER_SESSION

SELECT xs_admin_util.xsname_to_id('ADMINISTER_SESSION', 1)
FROM dual;
 
Related Queries
List of XS System Privileges SQL> SELECT name
  2  FROM xs$obj
  3  WHERE type = 4
  4  ORDER BY 1;

NAME
----------------------
ADMINISTER_SESSION
ADMIN_ANY_NAMESPACE
ADMIN_ANY_SEC_POLICY
ADMIN_NAMESPACE
ADMIN_SEC_POLICY
ALL
APPLY_SEC_POLICY
ASSIGN_USER
ATTACH_SESSION
CALLBACK
CONNECT
CREATE_SESSION
CREATE_TRUSTED_SESSION
DELETE
HTTP
HTTP_PROXY
INSERT
JDWP
MODIFY_ATTRIBUTE
MODIFY_NAMESPACE
MODIFY_SESSION
PDBPROD
PROVISION
RESOLVE
SELECT
SET_DYNAMIC_ROLES
SMTP
TERMINATE_SESSION
UPDATE
UPDATE_INFO
USE_CLIENT_CERTIFICATES
USE_PASSWORDS
VIEW_SENSITIVE_INFO

Related Topics
DBMS_NETWORK_ACL_ADMIN
DBMS_NETWORK_ACL_UTILITY
DBMS_SFW_ACL_ADMIN
XS_ACL
XS_ACL_INT
XS_ADMIN_INT
XS_ADMIN_UTIL_INT
XS_PRINCIPAL