SQL Injection Attack Detection

Detección de ataques de Inyección de SQL

Recibí un alerta dos días antes de año nuevo. Fue poco antes de la media noche el 30 de diciembre de 2021. Era una alerta de una anomalía diaria relacionada al backend de la base de datos de un viejo sitio web, pero claramente un ataque.

Como se vio luego, este fue el primero de muchos intentos de ataques. Hubo tres más en enero de 2022, dos más en febrero, y uno más en agosto, octubre, y noviembre. Considerándolo todo, nueve ataques similares en el curso de un año.

Antecedentes

Usamos WordPress (un sistema de gestión de contenidos de código abierto) en muchos de nuestros sitios webs y siempre con un backend MySQL (la configuración más popular). El sitio web en questión era viejo, y debido a problemas de compatibilidad, no habíamos actualizado algunos de los componentes de software en un tiempo. Entonces cuando vi esta alerta, pareció altamente plausible que había una vulnerabilidad que derivó en un ataque exitoso.

Como luego resultó, esto era un falso positivo. La razón de este falso positivo fue que adicional a una vieja versión de WordPress y plugins, este sitio web también usaba una vieja versión de Core Audit. Pero más de esto luego.

Ninguno de nuestros sitios web contiene información confidencial, pero como mostrará este documento, proteger la base de datos de cualquier aplicación con Core Audit es un medio muy eficaz para detectar ataques y proteguer la aplicación.

La Anomalía

El alerta de anomalía tiene 168 líneas, y la primera línea fue esta:

SELECT * FROM wp_users WHERE user_login = 
'') UNION ALL SELECT NULL-- HupP'

Mientras cada línea fue diferente, cada línea empezó con uno de estos:

SELECT * FROM wp_users WHERE user_login =''

SELECT * FROM wp_users
 INNER JOIN wp_usermeta ON user_id = ID WHERE meta_key = '' AND user_login = ''

Lo que hizo claro que se trataba de un ataque fueron las muchas variaciones de SQLs que lucen como esto:

;SELECT SLEEP(9)#' LIMIT 9

) AND SLEEP(9) AND (\\\''=\\\''

WAITFOR DELAY \\\'' AND \\\''=\\\'' LIMIT 9

;SELECT SLEEP(9)#'

);SELECT PG_SLEEP(9)--'

;SELECT PG_SLEEP(9)--' LIMIT 9

);WAITFOR DELAY \\\''--'

;WAITFOR DELAY \\\''--' LIMIT 9

) AND 9=(SELECT 9 FROM PG_SLEEP(9))

UNION ALL SELECT NULL-- HupP'

) UNION ALL SELECT NULL-- HupP' LIMIT 9

UNION ALL SELECT NULL,NULL,NULL-- iIWs'

UNION ALL SELECT NULL,NULL,NULL,NULL-- ynbe'

Tener en cuenta que las cuerdas vacías ('') y los 9s no son parte del SQL original. Ellos se relacionan en cómo la seguridad del repositorio de Core Audit opera. Este repositorio automáticamente colecciona todos los SQLs en la base de datos, entonces para reducir espacio y eliminar anomalías de literales embebidos, automaticamente elimina todos los números y cuerdas.

Los SQLs vistos anteriormente son el resultado de un atacante que intentó escanear la aplicación en búsqueda de una vulnerabilidad de inyección de SQL. Intentaban detectar si la inyección SQL era posible en esta aplicación y encontrar información adicional que facilitara el ataque:

  • Cada instrucción SLEEP/DELAY solo funcionaría en un tipo de base de datos. Así que un retraso en la respuesta le dice al atacante que la inyección fue exitosa y el tipo de base de datos utilizada.
  • Las diversas permutaciones UNION y NULL estaban tratando de determinar el número de campos en la query y si podrían agregar datos de otras tablas.

Adicional a muchas más variaciones de SLEEP y UNION, hubo expresiones llenas de color como:

) AND (SELECT 9 FROM(SELECT COUNT(*),CONCAT(0x7178707671,(SELECT (ELT(9=9,9))),0x7171767171,FLOOR(RAND(9)*9))x FROM INFORMATION_SCHEMA.CHARAC

) AND 9=CAST((CHR(9)||CHR(9)||CHR(9)||CHR(9)||CHR(9))||(SELECT (CASE WHEN (9=9) THEN 9 ELSE 9 END))::text||(CHR(9)||CHR(9)||CHR(9)||CHR(9)||C

) AND 9=CAST((CHR(9)||CHR(9)||CHR(9)||CHR(9)||CHR(9))||(SELECT (CASE WHEN (9=9) THEN 9 ELSE 9 END))::text||(CHR(9)||CHR(9)||CHR(9 )||CHR(9)||CHR(9)) AS NUMERIC) AND (\\\''= \\\''

;SELECT DBMS_PIPE.RECEIVE_MESSAGE(CHR(9)||CHR(9)||CHR(9)||CHR(9),9) FROM DUAL--'

AND 9=CONVERT(INT,(SELECT CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)+(SELECT (CASE WHEN (9=9) THEN CHAR(9) ELSE CHAR(9) END))+CHA R(9)+CHAR(9)+C

) AND (SELECT 9 FROM(SELECT COUNT(*),CONCAT(0x7178707671,(SELECT (ELT(9=9,9))),0x7171767171,FLOOR(RAND(9)*9))x FROM INFORMATION_SCHEMA.CHARACTER_SETS GROUP BY x)a) AND (\\\''=\\\''

) AND 9=CONVERT(INT,(SELECT CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)+(SELECT (CASE WHEN (9=9) THEN CHAR(9) ELSE CHAR(9) END))+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9)+CHAR(9))) AND (\\\''=\\\''

Estos SQLs eran claramente inusuales y parecen intentar eludir un sistema de protección de inyección de SQL como un WAF.

Forences

Experimentamos un ataque. El alerta no deja ninguna duda sobre esto. Las dos preguntas remanentes fueron:

  • ¿Fue exitoso el ataque?
  • ¿Qué parte de la aplicación fue objetivo?

Base de datos forences

La primera pregunta fue fácil de responder. Empecé por localizar las queries en la vista forense de SQL reducida. El repositorio reducido de SQL tiene una resolución de 5 minutos, y todos estos SQLs fueron ejecutados en la ventana de 8:20 am a 8:25 am.

Una vez que localicé las queries, también vi las buenas noticias – todos fueron exitosos (sin errores), y los números de las filas recuperadas fueron cero para todas.

¿Por qué son buenas noticias las ejecuciones exitosas? Porque este ataque estaba tratando de testar si la aplicación era vulnerable a una inyección de SQL. En este escaneo, se supone que muchas de estas queries fallen, y pocas exitosas indicando el método para explotar una vulnerabilidad. Por ejemplo, los SQLs con PG_SLEEP() nunca pueden ser exitosos en nuestra base de datos MySQL desde que esta función solo existe en base de datos PostgreSQL. Por lo tanto, ejecuciones exitosas significan el intento de inyección fallido de modificar la SQL.

Adicionalmente, estas SQLs no recuperan datos, entonces allí no hubo filtración. Mientras la mayoría de estos SQLs no estaban intentando extraer nada, es confortante saber que nada fue recuperado.

En otras palabras – este ataque no logró romper el límite literal. Volveremos a este asunto después y también responder la pregunta más interesante de porqué recibimos el alerta de anomalía en primer lugar.

Aplicaciones Forences

Ahora que tenemos más información, es fácil buscar los logs de Apache para más detalles en el ataque y a qué dirigió.

El ataque fue entre las 8:20 am y 8:25 am, y accedió a la tabla wp_users. Mirando al log de Apache, podemos ver que este ataque empezó exactamente a las 8:20 am:

[29/Dec/2021:08:20:00] "GET /wp-login.php?log=1&pwd=-9696%20UNION%20ALL%20SELECT%2024%2C24--%20ptzf"

Este ataque fue una pregunta GET al script wp-login.php. Esta es la página de logueo de WordPress. El ataque entregó su intento de inyección a través del campo de contraseña que, en este primer intento, incluyó:

-9696 UNION ALL SELECT 24,24-- ptzf

El último intento de ataque fue usando este requerimiento POST a las 8:21:51 am:

[29/Dec/2021:08:21:51] "POST /wp-login.php?Phws%3D5963%20AND%201%3D1%20UNION%20ALL%20SELECT%201%2CNULL%2C%27%3Cscript%3Ealert%28%22XSS%22%29%3C%2Fscript%3E%27%2Ctable_name%20FROM%20information_schema.tables%20WHERE%202%3E1--%2F%2A%2A%2F%3B%20EXEC%20xp_cmdshell%28%27cat%20..%2F..%2F..%2Fetc%2Fpasswd%27%29%23"

Los logs de Apache no graban los parámetros POST, pero podemos ver esta carga en el requerimiento:

Phws=5963 AND 1=1 UNION ALL SELECT 1,NULL,'<script>alert("XSS")</script>',table_name FROM information_schema.tables WHERE 2>1--/**/; EXEC xp_cmdshell('cat ../../../etc/passwd')#

Esta carga útil es un poco graciosa dado que contiene una inyección de SQL con un escaneo de secuencias de comandos entre sitios (alert(“XSS”)) y un intento de que SQL Server ejecute un comando de shell (EXEC xp_cmdshell) con un comando Unix/Linux imprimiendo el contenido de un archivo de contraseña Unix/Linux (cat …/passwd).

Este es una mezcla de ataques fragmentados que podrían nunca funcionar juntos. Y hay muchas otras cosas mal con el último requerimiento.

Esto indica que la persona corriendo el ataque tiene poco entendimiento de lo que está haciendo. Combinada con el hecho de que todo el escaneo duró menos de 2 minutos, sugiere esto fue un script o, más probable, muchos scripts ellos descargaron fuera de Internet y ejecutaron contra varios sitios.

Falso Positivo

Entonces, ¿por qué falló el ataque?, ¿y por qué recibimos una alerta de anomalía de cualquier forma?

Un ataque de inyección de SQL intenta modificar la estructura SQL al quebrar a través de los límites literales. En otras palabras, cuando un SQL contiene un literal como este:

SELECT * FROM wp_users WHERE user_login = 'JOHN'

Un ataque de inyección de SQL intenta mandar una cadena otra que “JOHN” entonces la estructura SQL cambia. Por ejemplo, la cadena “X' or 'Y'='Y” resultará in este SQL:

SELECT * FROM wp_users WHERE user_login ='X' or 'Y'='Y'

Al cambiar el SQL estructura y agrega “or 'Y'='Y'“, la base de datos correrá algo no intencionado por el desarrollador que escribió este código. Colocando una etiqueta (') en el aporte rompió a través de límites literales y permitió al atacante alterar la estructura SQL. Escapar los literales antes de incrustarlos en un SQL previene esta vulnerabilidad.

En el SQL estandard, puedes escapar etiquetas (') al usar etiquetas dobles (''). Cuando se escapa, el ejemplo de más arriba producirá:

SELECT * FROM wp_users WHERE user_login = 'X'' or ''Y''=''Y'

En este caso, la base de datos comparará el campo user_login a la cadena entera, con la palabra OR es solo parte de un nombre de usuario, no parte de una estructura SQL.

WordPress debe haber escapado de la entrada correctamente en nuestro ataque, y la estructura SQL no fue modificada. Es por esto que los SQLs se ejecutaron sin error, y el ataque falló.

Pero, ¿por qué recibimos un alerta de anomalía si el ataque no quebró los límites literales?

A diferencia de otras bases de datos, en MySQL, hay 2 formas de escapar de las etiquetas en las cadenas. La primera es con etiquetas dobles ('') de acuerdo con el SQL estándard. Pero hay un segundo método de preceder la etiqueta con un backslash (\'). WordPress usa el segundo método.

Acá es donde la vieja versión de Core Audit entra a jugar. Aquella vieja versión fue liberada cortamente luego de la liberación del soporte de MySQL, y la eliminación literal en el repositorio de SQL reducido no admitía el método de escape de barra invertida para bases de datos MySQL.

Una vez que descubrimos el consecuente no intencionado de detectar falsamante estos ataques de inyección de SQL, nosotros mantenemos a propósito la vieja versión de Core Audit en ese sitio web. Queríamos ver cómo muchos más ataques fallido experimentaríamos. Como comentamos antes, este viejo sitio web experimentó nueve intentos a lo largo del siguiente año. Una vez que actualizamos la versión de Core Audit, paramos de recibir estas alertas de falso positivo.

Area de superficie de ataque de la aplicación

Tal vez te preguntes por qué alguien intentó un ataque de inyección de SQL que no funcionó contra WordPress. Los atacantes, como cualquier otro, tenían acceso a WordPress. Entonces, ¿por qué no sabían que este ataque fallaría?

Esta es una pregunta interesante que resalta los complejidad de la cadena de suministro en algunas aplicaciones de terceros, como WordPress.

El primer pensamiento que viene a mi mente es que quizás algunas versiones de WordPress son susceptibles de ataque. Como sea, la inyección de SQL es una amenaza bien conocida, y el equipo de desarrollo de WordPress es estricto sobre escapando entradas antes de literales incrustados en SQLs. Mientras usar variables incrustadas sería más seguro, desarrolladores web tienen una inclinación por literales embebidos.

Como sea, es mundialmente conocido que múltiples versiones y parches significativamente aumentan el área de la superficie de ataque. La razón es que muchas organizaciones actualizan y emparchan aplicaciones de tanto en tanto y nunca pueden estar seguras qué vulnerabilidades eliminaron o introdujeron y en qué punto.

Pero desde que es poco probable que ninguna versión de WordPress fue susceptible a una inyección de SQL en la pantalla de login, que lleva otra interesante característica de WordPress – Plugins.

Una gran parte del poder y flexibilidad de WordPress son más de decenas de miles de plugins que pueden extenderlo. Estos plugins son código que puede adjuntarse a varios lugares en WordPress y modificar su comportamiento en casi cualquier manera inimaginable.

Plugins ofrece poder y flexibilidad a los usuarios, pero también muestran un riesgo de seguridad. WordPress plugins introducen proveedores adicionales, códigos estándar, cambios al modelo de la base de datos, nuevos caminos en la ejecución de la aplicación, y, por lo tanto, nuevas vulnerabilidades.

El riesgo en plugins no es solo vulnerabilidades en software de terceros pero también el riesgo de ataques en la cadena de suministro. Estos ataques pueden ser iniciados por el autor del plugin o por un hacker que alteró el código fuente.

Es poco probable que WordPress fuera susceptible de este ataque, pero es altamente plausible que algunos de los plugins lo sean. El atacante estaba apuntando a un plugin que no fue instalado en nuestro WordPress.

Ideas finales

Las inyecciones de SQL son notoriamente difíciles de detectar y, aún más, de prevenir. Como sea, el análisis de anomalías de Core Audit fue capaz de alertar sobre estos ataques.

No solo fue un análisis de anomalías capaz de detectar un ataque, pero se hizo sin ninguna firma de ataque o soporte para PHP o WordPress. Y, realmente, sin siquiera buscar un ataque de inyección de SQL.

Y esta es la razón por la que el análisis de anomalías es tan efectivo contra la inyección de SQL – no es buscando especialmente por esto. Es buscando por SQLs que son nuevos a la aplicación, por lo tanto, sospechosos. La inyección de SQL puede mascarar en muchas formas pero, por definición, no es parte del vocabulario SQL de la aplicación. Por lo tanto, el análisis de anomalías siempre detectará el ataque.

WordPress Attack Detection

Ataques a tu aplicación

Detección de Ataques en WordPress

Un domingo al mediodía, recibí un alerta sobre una anomalía. Era 19 de marzo de 2023. Esta historia es sobre lo que sucedió.

Antecedentes

El sitio web de Blue Core Research usa WordPress (sistema libre y de código abierto de gestión de contenidos). WordPress usualmente usa MySQL como base de datos de backend, y nuestra instalación no es diferente.

Mientras nuestro WordPress no contiene información sensible, aún lo protegemos con Core Audit. Parcialmente, lo hacemos porque producimos Core Audit, y las licencias no nos cuestan nada. Pero para contextos más grandes, protegemos esta base de datos porque nuestro sitio web es la cara de la compañía, y aún sin información sensible, una filtración dañaría nuestra reputación.

Como verás en este trabajo, protegiendo la base de datos proteges la aplicación (WordPress) también. Y eso defiende nuestro servidor de ataques en Internet.

La Anomalía

Nuestra instalación de Core Audit cuenta con una configuración relativamente simple con alertas diarias de detección de anomalías. Recibimos algunos falsos positivos cada tanto, pero una mañana de domingo del 19 de marzo de 2023, recibimos un alerta de un nuevo error.

Access denied for user ''@'' (using password: YES)

Eso inmendiatamente me levantó una bandera roja. Esto es porque las anomalías solo alertan sobre algo diferente, como un cambio en la actividad del perfil de la aplicación. Pero un cambio que causa un acceso denegado parece sospechoso.

La Investigación

Las anomalías de Core Audit descansan en el repositorio de seguridad de Core Audit. Y esta anomalía particular está basada en la reducción de la porción de SQL de ese repositorio. El repositorio reducido SQL contiene cada construcción SQL que la base de datos ejecuta con la resolución de 5 minutos.

Una vez que recibí el alerta, me logué en Core Audit y revisé la vista relevante forense. Rápidamente encontré sobre qué fui alertado:

Date:     Sat 2023/03/18
Time:     18:55 - 19:00
Count:    1 per 5 minutes
Rows:     0
Command:  ERROR TEXT
Activity: Access denied for user ''@'' (using password: YES)

Esto es un error interno MySQL resultante de un log in fallido. El usuario y anfitrión en este error están entre comillas simples (‘) y son, por lo tanto, despojados desde el repositorio reducido de SQL. La división de literales es parte de cómo opera el repositorio reducido de SQL.

Mi próxima parada fue para buscar la sesión fallida que la causó. Al alternar a la sesión de vista forence, encontré esta sesión:

Start:    2023/03/18 18:55:59
End:      2023/03/18 18:55:59
Type:     No Login
Username: username_here
Machine:  localhost

Esto luce inusual desde que no contamos con un usuario en la base de datos llamado username_here Esto es, obviamente, un usuario inválido. Mi próxima parada fue mirar los logs del web server para ver quién o qué disparó este login inusual.

Aquí hay un extractro del log de Apache:

[18:55:36] GET /.wp-config.php_copy
[18:55:38] GET /.wp-config.php.rar
[18:55:39] GET /.wp-config.php.7z
[18:55:41] GET /.wp-config.php.tmp
[18:55:42] GET /.wp-config.php_tmp
[18:55:44] GET /.wp-config.php.old
[18:55:46] GET /.wp-config.php.0
[18:55:47] GET /.wp-config.php.1
[18:55:49] GET /.wp-config.php.2
[18:55:50] GET /.wp-config.php.zip
[18:55:52] GET /.wp-config.php.gz
[18:55:53] GET /.wp-config.php~
[18:55:55] GET /wp-config.php.templ
[18:55:56] GET /wp-config.php1
[18:55:58] GET /wp-config.php2
[18:55:59] GET /wp-config-sample.php
[18:56:00] GET /wp-config-backup.txt
[18:56:02] GET /wp-config.php.orig
[18:56:03] GET /wp-config.php.original
[18:56:05] GET /wp-license.php?file=..%2F..
[18:56:06] GET /wp-config.save
[18:56:07] GET /wp-config.txt
[18:56:09] GET /wp-config.dist
[18:56:10] GET /.wp-config.php.swo
[18:56:12] GET /wp-config%20copy.php
[18:56:12] GET /wp-config_good
[18:56:14] GET /wp-config-backup
[18:56:15] GET /wp-config-backup.php
[18:56:16] GET /wp-config-backup1.txt
[18:56:18] GET /wp-config-good
[18:56:19] GET /wp-config-sample.php.bak
[18:56:21] GET /wp-config-sample.php~
[18:56:22] GET /wp-config.backup

El culpable es claramente wp-config-sample.php, y mirando dentro de él, podemos encontrar estas líneas:

define( 'DB_USER', 'username_here' );
define( 'DB_PASSWORD', 'password_here' );
…
require_once ABSPATH . 'wp-settings.php';

Ahora entendemos qué pasó: alguien escaneó el sitio web buscando vulnerabilidades y llamó wp-config-sample.php. Ese script PHP contiene un usuario y contraseña inválido que disparó una falsa conexión a la base de datos. Core Audit detectó este inusual comportamiento y elevó una alerta.

Resolución

En WordPress, wp-config-sample.php es parte del paquete de instalación de WordPress. El proceso de instalación de WordPress copia este archivo en wp-config.php y define algunos parámetros como el usuario y contraseña de la base de datos.

Por lo tanto, wp-config-sample.php es esperado que exista en una instalación de WordPress. Y si el equipo de desarrollo de WordPress ha hecho bien su trabajo, es probable que no signifique una filtración de WordPress al llamarlo así.

Pero como todos sabemos, los errores existen, y ataques 0-dia pueden siempre ocurrir. Teniendo este archivo alrededor parece preguntar por problemas. Este archivo no tiene otro propósito en WordPress que no sea como plantilla para wp-config.php, entonces ¿no deberías eliminarlo?

Esto nos lleva a otro comportamiento de WordPress: su actualización. Cuando WordPress actualiza, sobre escribe todos los archivos que son parte del paquete de WordPress. Por lo tanto, borrando wp-config-sample.php será desecho tan pronto como WordPress automáticamente actualice.

Otra opción es dejar el archivo en el lugar pero cambiar los permisos del archivo así Apache no puede acceder ahí. Esto prevendría este script PHP de ejecutarse. Como sea, esto tal vez cause errores cuando WordPress intenta actualizar porque no será capaz de sobre escribir el archivo. Entonces la actualización requiere intervención manual.

Por ejemplo, puedes eliminar permisos ejecutando:

chown root:root wp-config-sample.php
chmod 000 wp-config-sample.php

Más allá

Como expliqué previamente, wp-config-sample.php es usado para crear wp-config.php durante la instalación. Esto significa que wp-config.php puede ser también vulnerable al mismo ataque u otro similar ataque 0-dia.

Más problemático es si una actualización de WordPress arregla una vulnerabilidad en wp-config-sample.php, este arreglo no actualizará wp-config.php desde que ese copy nunca es modificado.

wp-config.php está pensado para ser incluido por otros archivos de WordPress como index.php. Luego de definir los parámetros de la conexión de la base de datos, el script llama wp-settings.php para configurar el ambiente WordPress, incluyendo la conexión a la base de datos.

En otras palabras, wp-config.php nunca quiere ser ejecutado directamente. Para protegerlo contra un ataque ejecutado directamente, podemos agregar una línea en la parte de superior de wp-config.php para detener el proceso.

if (get_included_files()[0] == '/path_to_site/wp-config.php') exit();

¿WordPress?

Mientras muchos no van a considerar WordPress un buen ejemplo de seguridad de aplicación, pensamos que aporta valor por estas razones:

3ra Parte & Cadena de suministro

Primero y más importante, esto es una aplicación 100% de terceros. Nosotros no la codeamos, no revisamos el código fuente, y no tenemos casi conocimiento del código, el modelo de datos, y ningún otro aspecto de la aplicación.

WordPress es un software de código abierto expuesto tanto para vulnerabilidades descubiertas por hackers como ataques a la cadena de suministro.

Para hacerlo peor, los sitios de WordPress casi siempre usan plug-ins. Mucho del poder de una plataforma de WordPress está en su extensibilidad por las decenas de miles de plugins que existen. Los plugins significativamente expanden la superficie del área de la tercera parte del software y ataques a la cadena de suministro. Plug-ins significan un montón de código adicional desconocido de vendors o desarrolladores múltiples, diferentes estándares de código, mejoras al modelo de datos con más tablas, y más.

SQL dinámico

WordPress lleva el concepto de SQL dinámico a un extremo. No solo todos los SQLs embebidos literales, sino que los SQLs a menudo se generan dinámicamente con cláusulas creadas sobre la marcha en función de la entrada del usuario.

El desafío no es solo los dinámicos ataques SQL pero también el gran vocabulario SQL donde es imposible predecir todas las combinaciones SQL que WordPress puede generar.

De nuevo, plug-ins empeoran el problema debido a un todavía más grande y desconocido vocabulario SQL, y más potenciales vulnerabilidades en el código que genera SQLs dinámicos.

Popular & De cara a Internet

WordPress es muy popular y es una aplicación orientada a Internet. Hackers son, por lo tanto, altamente incentivados para encontrar vulnerabilidades. Explotar estas vulnerabilidades puede ser también fácil desde que Internet está lleno de sitios en WordPress con poca o no adicional seguridad.

Ideas finales

A pesar de estos desafíos, los análisis de anomalía de Core Audit proveen seguridad efectiva así como tiene un razonable nivel de falsos positivos y, en este caso, ha sido alertado de un ataque contra la aplicación.

Es importante notar que Core Audit no tiene un soporte especial para PHP o WordPress. Tampoco miramos ninguna vulnerabilidad en particular en la base de datos o la aplicación. Solo teníamos un objetivo general de detección de anomalía que nos alertó tan pronto como la aplicación se comportó diferente. Esto fue suficiente para identificar un ataque.

Como has visto, monitorear cambios en el perfil de la actividad de la base de datos de la aplicación nos permite detectar muchos cambios en el comportamiento de la aplicación. Mientras algunos cambios ocurren naturalmente, otros indican un problema de seguridad o un ataque.

Enmascaramiento estático de datos – corta

Enmascaramiento estático de datos
¿Por Qué?

Introducción

Cuando hablamos de bases de datos no productivas nos referimos a aquellas bases de datos utilizadas para educación, pruebas, desarrollo, entre otras. ¿Por qué es importante enfocarnos en estas bases de datos? ¿Cuál es el riesgo?  Muy simple: por lo general los equipos de desarrollo utilizan datos reales sacados de los sistemas de producción para mejorar la calidad del software que desarrollan y así acortar los ciclos de desarrollo.

El uso de datos reales en las primeras fases de los ciclos de desarrollo ayuda a mejorar la calidad del software. Al realizar más pruebas con los datos reales, se pueden detectar fallas antes, para así reparar más rápido dichas fallas, reducir el costo de desarrollo y reducir el tiempo total de despliegue, lo cual permite una mejor respuesta a usuarios y clientes, y por consiguiente al negocio. Vivimos en un mundo en el que el despliegue de nuevos modelos o funcionalidades pueden representar el alcanzar o no los objetivos requeridos por el negocio.

¿Qué vectores de seguridad representan una amenaza real?

El almacenamiento y utilización de datos sensibles fuera de los entornos productivos expone dichos datos a usuarios que no deberían tener acceso a ellos. Esto agranda la brecha de seguridad en tres áreas principalmente:

  • Ejecución de consultas y extracción de información sensible almacenada en su interior.
  • Utilización de la aplicación para acceso a cualquier dato sensible gestionado sin ninguna trazabilidad.
  • La seguridad de estos ambientes carecen de los controles de seguridad. Esto permite el acceso a personal a los datos sensibles por personal no autorizado.

El panorama de amenazas al que los sistemas no productivos están expuestos es enorme, desde abuso interno de privilegios hasta hackeos externos. En general, los sistemas que no son de producción tienen niveles de seguridad más bajos o están mal protegidos.

Las amenazas a ambientes no productivo incluyen:

  • Un gran número de individuos sin autorización con acceso ilimitado a datos sensibles.
  • Autorizaciones mal gestionadas y contraseñas inseguras o triviales, que proveen acceso a muchos individuos desconocidos.
  • Controles de accesos mal gestionados que proveen acceso elevado o de administrador a muchos individuos.
  • Software mal gestionado con parches faltantes, configuraciones inseguras, vulnerabilidades conocidas, y más, permitiendo a intrusos un fácil acceso.
  • Seguridad física mal gestionada que permite acceso a servidores y los datos allí almacenados. En ocasiones, el hardware portátil, como el almacenamiento externo que se utiliza en estos entornos.
  • No hay medidas de seguridad significativas como firewalls. La segmentación de red es casi inexistente, no se manejan trazas de auditoría sobre la actividad realizada, etc.

¿Cómo solucionamos este gran reto?

La solución más sencilla es de-sensibilizar los entornos no productivos eliminando los datos sensibles. Cualquier otro intento para asegurar adecuadamente todos estos entornos será costoso y requerirá mucho tiempo y recursos. Esta de-sensibilización se conoce como enmascaramiento estático de datos.

Una vez realizada esta actividad es imposible revertir el cambio. El enmascaramiento cambia los datos en los múltiples entornos no productivos por datos parecidos que no puedan ser asociados a los datos reales.

En pocas palabras, el objetivo es sustituir los datos sensibles por datos falsos e inofensivos. La idea es que los ambientes no productivos no manejen datos sensibles para evitar abrir brechas de seguridad.

Sin embargo, tenemos un gran reto. ¿Cómo hacemos para que los datos enmascarados utilizados se consideren buenos? Dichos datos deben satisfacer tres principios fundamentales:

  • El proceso debe eliminar toda información sensible, debe eliminar cualquier posibilidad de reconstrucción de los datos originales a partir de los datos enmascarados.
  • Los datos enmascarados deben ser válidos y coherentes. Los campos que tienen reglas especiales o sumas de comprobación deben mantenerse. Las claves primarias enmascaradas deben ser únicas. Las claves externas enmascaradas (o referencias equivalentes) deben coincidir. La ciudad, el estado y el código postal deben ser consistentes,
  • Los datos enmascarados deben conservar o mejorar la calidad de las pruebas. Esto significa que los datos enmascarados deben “parecer” reales. Por ejemplo, debe conservar la frecuencia de los datos como la proporción entre hombres y mujeres. Debe seguir utilizando los mismos patrones, si existiesen valores válidos y no válidos deberían seguir existiendo.

Estrategias de enmascaramiento

Hay cuatro estrategias principales para el enmascaramiento de datos estático:

  • Manipulación de valores: modifica cada campo independientemente. Los datos enmascarados son una función aplicada a los datos originales. Dependiendo de la función de enmascaramiento, los datos enmascarados pueden conservar algunos aspectos de los datos originales.
  • Generación de datos: crea nuevos datos no relacionados con la información sensible original. Aunque la información enmascarada no revelará nada sobre los datos originales, también será completamente ajena. Por lo tanto, las columnas enmascaradas con la generación de datos no deberán ser importantes para la prueba.
  • Perfilado automático – tiene tres pasos: analizar los datos originales, crear un perfil de datos y generar datos basados en ese perfil. Esta estrategia es un tipo de generación de datos basado en los datos originales, proporciona datos realistas de alta calidad que no exponen los datos e incluso rompe la asociación de filas.
  • Perfiles personalizados: se trata de una forma avanzada de elaboración automática de perfilado. Se permite crear datos que se ajustan a escenarios particulares, se asemejan a perfiles de datos anteriores, o que sean similares a otros conjuntos de datos. También es un medio eficaz para crear conjuntos de datos de cualquier tamaño, tanto más grandes como más pequeños.

Dado que cada enfoque tiene diferentes ventajas e inconvenientes, una buena solución de enmascaramiento de datos ofrecerá todas estas estrategias permitiendo utilizar el método más adecuado para cada situación.

Reflexiones finales

El enmascaramiento de datos es un concepto sencillo, pero la implementación no lo es. Cualquier persona puede lograr ofuscar datos pero hacer que mantengan la consistencia requerida es otra cosa. Cada vez más nos encontramos con que un número creciente de clientes que se enfrenta a retos no triviales a la hora de enmascarar datos. Cada vez es más importante poder enmascarar los datos manteniendo las características necesarias para replicar la operación de las aplicaciones. Mientras más rápido puedan liberar aplicaciones confiables, mayor será el retorno para la empresa y mayor su reconocimiento.

Hable con nosotros para que le ayudemos a entender mejor los retos existentes que visualiza y recibir guía sobre cómo utilizar mejor las herramientas adecuadas para mantener sus datos sensibles fuera de las manos incorrectas.

Core Masking es la solución de enmascaramiento de datos más potente en el mercado, y este documento pretende darle una pequeña muestra de eso. Si quieres recibir más información, escríbenos a marketing@bluecoreresearch.com