2.4. ATAQUES EN ORACLE 2.4.1. SQL INJECTION El “SQL Injection” es un ataque simple y conocido, pero no por eso deja de representar una amenaza para cualquier base de datos trátese de Oracle, MySQL o cualquier otra. De hecho, contrario a lo que se pensaría al hablar de un ataque del cual se tiene tanta información en la actualidad, tras varias encuestas y estudios realizados en el año 2010 por OWASP (Open Web Application Security Project) se determino que entre las mayores brechas de seguridad que terminan comprometiendo datos, los ataques de este tipo predominan con un 60% del total si contamos los casos en que este ataque es combinado con malware [1]. Ilustración 1: Vulnerabilidad usada para comprometer el sistema [1] “Muchos desarrolladores de aplicaciones subestiman el riesgo de ataques SQL Injection a aplicaciones web que usen Oracle como base de datos de respaldo final” [2], aunque Oracle represente una alternativa muy confiable, ningún desarrollador o analista de seguridad debe bajar sus defensas frente a los ataques de SQL Injection. Debemos percatarnos de que por su amplia divulgación y su alto porcentaje de efectividad, la sofisticación de estos ataques se encuentra en aumento y así mismo deberían aumentar los esfuerzos por detectar vulnerabilidades, corregir fallas y proteger las aplicaciones e interfaces con el fin de garantizar la seguridad e integridad de la información [1]. Entre el 2007 y el 2010 los ataques de inyección, entre los cuales encontramos el SQL Injection como el principal representante, pasaron del segundo lugar al primero en el Top 10 presentado por OWASP anualmente en el cual se clasifican los principales ataques y vulnerabilidades en aplicaciones web, en el segundo lugar actualmente se encuentra el Cross Site Scripting (XSS), que como veremos mas adelante también representa una amenaza para Oracle [3] [4]. OWASp califica los ataques de inyección de fácil uso, frecuencia común, detectabilidad promedio e impacto severo; pueden ser realizados por cualquier persona que pueda enviar datos no confiables al sistema, incluyendo usuarios externos, usuarios internos, y administradores del sistema. Entre las principales consecuencias podemos encontrar perdida de información, falta de responsabilidad, denegación de servicios y en algunos casos pueden llevar a la toma de posesión total del servidor por parte del atacante [3]. Los ataques de SQL Injection se aprovechan principalmente, de las malas prácticas de desarrollo de aplicaciones, explotando la falta de un manejo adecuado de la entrada de datos por parte del usuario que posteriormente serán usados en sentencias SQL [2]. Los atacantes engañan al motor de la base de datos para que este ejecute comandos no deseados, suministrando cadenas de texto hechas especialmente para este fin, consiguiendo así acceso no autorizado a la base de datos para visualizar o manipular información restringida [4]. La mayoría de estos ataques se presentan en interfaces web, por el hecho de que en una aplicación web el atacante puede realizar ataques de SQL Injection sin ninguna autenticación en la base de datos o la aplicación, dicho esto, es claro que estas representan una vulnerabilidad para las organizaciones y por ende debe realizarse un análisis cuidadoso del beneficio de proveer acceso web frente al costo de la posible perdida de información [2] [4]. Los técnicas de SQL Injection pueden variar, pero todas explotan una misma vulnerabilidad: “Cadenas de texto validadas o no validadas que son concatenadas en una sentencia SQL dinámica, e interpretadas como código por el motor SQL” [4]. Oracle se ha manejado bien frente a los ataques de SQL Injection por varias características entre las cuales es de destacar el uso de bind arguments (variables de enlace) que si bien fueron diseñadas principalmente para mejorar el desempeño, proveen también una fuerte protección contra dichos ataques cuando se programa SQL dinámico pues obligan a la base de datos a utilizar exclusivamente el valor de la variable y no interpretar su contenido de ningún modo [4] [2] [5]. Aunque Oracle puede proveer mayor protección frente a estas técnicas, que otras bases de datos, aplicaciones sin las defensas apropiadas pueden ser vulnerables [2]. Para inmunizar cualquier código contra ataques SQL Injection, deben usarse bind arguments, bien sea automáticamente en SQL estático o explícitamente en SQL dinámico, y adicionalmente validar y desinfectar cada entrada concatenada a SQL dinámico. La validación comprueba que la entrada cumpla ciertos criterios (Ej. que no contenga comillas simples independientes) y la desinfección modifica la entrada para asegurar que es válida (Ej. doblar las comillas simples) [4]. Oracle provee un paquete PL/SQL llamado DBMS_ASSERT, el cual contiene funciones que permiten validar y desinfectar cadenas de entrada [4]. A continuación se presenta un diagrama de flujo que expone los pasos para medir la vulnerabilidad de cualquier código SQL: Ilustración 2 : Diagrama de flujo para detectar vulnerabilidades de SQL Injection [4] Para detalles mas específicos sobre como protegerse frente a técnicas de SQL Injection al programar en PL/SQL, se recomienda revisar el tutorial provisto por Oracle titulado “SQL Injection Tutorial” el cual es gratuito, descargable y contiene lecciones por capítulos con evaluaciones interactivas al final de capa sección [4]. 2.4.2. Tipos de ataques SQL Injection Los ataques de inyección son comúnmente divididos en: 2.4.2.1. Ataques de primer orden El atacante simplemente ingresa una cadena de texto maliciosa y provoca que el código modificado sea ejecutado inmediatamente. El ejemplo mas común consiste en modificar la clausula WHERE de una consulta de autenticación para que siempre retorne verdadero [4]. 2.4.2.2. Ataques de segundo orden El atacante inyecta en datos almacenados permanentemente que son considerados una fuente confiable (Ej. una fila de una tabla) y posteriormente otra actividad ejecuta el ataque indirectamente [4]. Este tipo de ataques requieren un mayor conocimiento de la aplicación objetivo y aprovechan la naturaleza stateless de muchas aplicaciones web que acostumbran pasar información entre páginas almacenando valores en la base de datos, generando así una vulnerabilidad [2]. 2.4.2.3. Inyección lateral El atacante puede explotar procedimientos PL/SQL que ni siquiera reciben entrada de usuario. Contrario a lo que se puede pensar, cuando una variable cuyo tipo es de fecha o numérico, y está concatenada en el texto de una sentencia SQL, puede existir una vulnerabilidad [4]. Adicionalmente podemos dividir los ataques de SQL Injection a Oracle en las siguientes categorías [2]: 1. 2. 3. 4. SQL Manipulation Code Injection Function Call Injection Buffer Overflows Las dos primeras categorías pueden incluirse dentro de los ataques de primer orden mencionados anteriormente, son las más comunes, y se aplican a todos los tipos de bases de datos. Aunque la segunda sea menos común en Oracle que en otras bases de datos, por el hecho de no soportar peticiones de múltiples sentencias SQL por base de datos, se pueden presentar casos de Code Injection en Oracle cuando se trabaja con SQL dinámico en PL/SQL [2] [4] [5]. Las ultimas dos categorías contienen ataques más específicos a Oracle, son menos comunes que las primeras y por ende se encuentra menos documentación disponible sobre estas, lo cual incrementa su aparición como vulnerabilidades en la mayoría de auditorias de seguridad realizadas a aplicaciones web [2]. A continuación se expone con mayor detalle cada uno de los tipos de Inyección en Oracle, pero se hará énfasis en los últimos dos tipos por las razones mencionadas anteriormente. 2.4.3. SQL MANIPULATION SQL Manipulation representa el tipo mas común de ataque de SQL Injection. El atacante intenta modificar la sentencia SQL adicionando elementos a la clausula WHERE o extendiendo la consulta con operadores como UNION, INTERSECT o MINUS [2]. El ejemplo clásico de este ataque se presenta en la autenticación de usuarios de una aplicación donde se ejecuta una consulta como la siguiente: SELECT * FROM usuarios WHERE nombreusuario= ‘miusuario’ and contraseña = ‘micontraseña’ El atacante podría manipular la sentencia SQL con una consulta como esta: SELECT * FROM usuarios WHERE nombreusuario= ‘miusuario’ and contraseña = ‘micontraseña’ or ‘1’ = ‘1’ Si no se tienen las medidas adecuadas de verificación en la aplicación, la consulta anterior retornaría verdadero para todas las filas basándose en la precedencia de operadores [2]. También suele ser común el uso del operador UNION para retornar filas de otra tabla, por ejemplo se puede intentar listar todos los productos disponibles de una tienda y usando este operador hacer que se listen también todos los usuarios de la base de datos [2]. 2.4.4. CODE INJECTION Este ataque consiste en inyectar comandos o sentencias dentro de una sentencia SQL, este tipo de ataque no es tan común en Oracle como en otras bases de datos debido a que Oracle no proporciona ninguna sentencia correspondiente a la sentencia EXECUTE (SQL Server), ni permite la solicitud de ejecución de varias sentencias por base de datos [2]. Sin embargo algunas API’s permiten la ejecutar dinámicamente bloques anónimos de PL/SQL los cuales son vulnerables ante un ataque de Code Injection. Por ejemplo, un atacante puede manipular el bloque PL/SQL, que ejecuta un proceso almacenado de la base de datos que cifra y almacena una contraseña de usuario [2]: BEGIN ENCRYPT PASSWORD ('Javeriana', 'micontraseña'); END; Y convertirlo en el siguiente [2]: BEGIN ENCRYPT PASSWORD('Javeriana', upper(username) = upper('admin'); END; 'micontraseña'); DELETE FROM users WHERE 2.4.5. FUNCTION CALL INJECTION Los ataques de Function Call Injection insertan funciones Oracle o funciones tradicionales dentro de sentencias SQL vulnerables con el fin de invocar llamadas de sistema operativo o manipular información almacenada en la base de datos [2]. Oracle permite ejecutar funciones como parte de sentencias SQL, adicionalmente, provee mas de 1000 funciones contenidas en aproximadamente 175 paquetes, de las cuales solo algunas pocas son útiles para ataques de SQL Injection. Cualquier función tradicional o que esté almacenada en un paquete tradicional puede ser invocada desde unas sentencia SQL [2]. Principalmente, solo las funciones ejecutadas dentro de sentencias INSERT, UPDATE o DELETE pueden modificar información almacenada en la base de datos. Usando las funciones estándar de Oracle, un atacante puede enviar información a otras maquinas o ejecutar nuevos ataques desde el servidor de la base de datos. Muchas aplicaciones basadas en Oracle, incluyen paquetes que pueden ser explotados por un atacante, dichos paquetes pueden contener funciones que cambien contraseñas o realicen actividades sensibles de transacciones [2]. El principal asunto a tener en cuenta cuando tratamos Function Call Injection, es que cualquier sentencia SQL generada dinámicamente es vulnerable, incluso las sentencias más sencillas [2]. Este ejemplo puede ser nítido para ver como se mezclñan los atques pero primero toca explicar de uno en uno Un claro ejemplo del uso este ataque fue presentado el presente año por David Litchfield en la conferencia de seguridad “BlackHat DC 2010”, en su ataque, Litchfield combina Lateral Injection, Function Call Injection y Pl/SQL Injection para aprovechar la implementación implícita de Java en Oracle, que ha sido denominada Aurora, y así tomar control total de la base de datos [7]. El ataque comienza obteniendo privilegios arbitrarios de Java desde una sesión con pocos privilegios, haciendo uso del paquete DBMS_JVM_EXP_PERMS, el cual usualmente permite importar o exportar las políticas de java entre distintos servidores de la base de datos, este paquete, puede ser ejecutado por el rol PUBLIC, es decir, por cualquier usuario común e incluye un procedimiento llamado IMPORT_JVM_PERMS que recibe como argumento una Java Policy. Un atacante puede crear su propia Policy y enviarla como argumento a esta función, al hacer esto, como el procedimiento se ejecuta con privilegios de SYS, la Policy creada por el atacante es adicionada a la tabla JAVA$POLICY$, permitiéndole al atacante concederse a sí mismo permisos Java arbitrarios como por ejemplo el permiso Java execute para todos los archivos [7] [6]. No se si hacer una sección únicamente para explicar los permisos de java , como se manejan en Oracle y como pueden afectar las fallas en la arquitectura de Aurora la seguridad de la base de datos Trabajos citados [1] Carsten Maple and Alan Phillips. (2010, Enero) 7Safe. [Online]. www.7safe.com/breach_report [2] Stephen Kost. (2007, Marzo) Integrigy Coprporation. [Online]. www.integrigy.com/securityresources/whitepapers/Integrigy_Oracle_SQL_Injection_Attacks.pdf [3] Vicente Díaz. (2010, Febrero) OWASP Top 10 2010: Riesgos de seguridad en las Aplicaciones Web. Presentacion de diapositivas. [4] Oracle. (2009) SQL Injection Tutorial. Manual Electronico. [5] Lance Ashdown and Oracle, Oracle® Database Application Developer's Guide - Fundamentals 10g Release 2., 2005. [6] David Litchfield. (2010, Febrero) BlackHat DC 2010: Hacking Oracle 11g. Conferencia Grabada. [7] David Litchfield. (2009, Octubre) Database Security. [Online]. www.databasesecurity.com/HackingAurora.pdf