Se han detectado las vulnerabilidades de seguridad CVE-2021-44228 y CVE-2021-45046 en las versiones de la biblioteca Apache Log4j que van de la 2.0 a la 2.15. La utilidad Apache Log4j es un componente habitual para registrar solicitudes. Esta vulnerabilidad, también llamada Log4Shell, puede poner en riesgo a los sistemas que tengan las versiones 2.0 a 2.15 de Apache Log4j y permitir que un atacante ejecute código arbitrario.
Esta vulnerabilidad no afecta a Cloud Logging ni a los agentes que proporciona para recoger registros de aplicaciones de terceros, pero si usas Log4j 2, tus servicios podrían verse afectados.
Puedes usar Logging para identificar posibles ataques. En este documento se describe cómo hacer lo siguiente:
- Consulta tus registros con el Explorador de registros para ver si hay intentos de aprovechar la vulnerabilidad de Log4j 2.
- Confirma que las técnicas de mitigación que has habilitado, como las políticas de seguridad de Cloud Armor y el control de acceso de Identity-Aware Proxy, estén configuradas correctamente y funcionen como se espera bloqueando estos intentos de exploit de Log4j 2.
- Crea una política de alertas para recibir una notificación cuando se escriba un posible mensaje de exploit en tus registros.
Consulta el Google Cloudaviso de seguridad de Log4j 2 de Review Google Cloud para ver la evaluación actual de nuestros productos y servicios. Puedes evaluar tu exposición leyendo el informe de vulnerabilidades del Instituto Nacional de Normas y Tecnología de Estados Unidos (NIST) sobre CVE-2021-44228.
Detección de registros
Los registros de resultados de consultas solo incluyen los registros que ya se han almacenado en los contenedores de registros y que también están dentro de los límites de retención especificados por el usuario. Aunque la mayoría de los servicios de Google Cloud tienen los registros habilitados de forma predeterminada, los registros que se hayan inhabilitado o excluido no se incluirán en tus consultas. Te recomendamos que actives los registros en todo tu entorno para ampliar la visibilidad del mismo.
Si usas un balanceador de carga HTTP(S), debes tener habilitado el registro para que los registros de solicitudes estén disponibles en Logging. Del mismo modo, si tienes servidores web como Apache o NGINX ejecutándose en una VM, pero no has instalado el agente de operaciones o el agente de registro, no podrás acceder a esos registros en Logging.
Consultar tus registros
Puedes usar el explorador de registros para detectar posibles ataques
en tu servicio que aprovechen la vulnerabilidad de Log4j 2. Si usas Logging para registrar las solicitudes a tu servicio, puedes consultar los campos httpRequest
con contenido generado por usuarios para detectar posibles vulnerabilidades.
Los valores de los campos httpRequest
pueden tener tokens de cadena como
${jndi:ldap://
,
pero hay muchas variaciones en la forma en que se aprovecha esta vulnerabilidad.
Por ejemplo, hay muchas formas de usar secuencias de escape o Unicode para evitar la detección.
Las siguientes cadenas muestran algunos ejemplos habituales que indican intentos de explotación contra tu sistema, pero no se trata de un conjunto exhaustivo de variantes:
${jndi: $%7Bjndi: %24%7Bjndi: ${jNdI:ldAp ${jndi:${lower:l}${lower:d}${lower:a}${lower:p}: ${${lower:j}${lower:n}${lower:d}i: ${${::-j}${::-n}${::-d}${::-i}:${::-l}${::-d}${::-a}${::-p}: ${${env:BARFOO:-j}ndi${env:BARFOO:-:}${env:BARFOO:-l}dap${env:BARFOO:-:}
Puedes crear consultas en el Explorador de registros que analicen algunas de las posibles cadenas de exploits. Por ejemplo, la siguiente consulta intenta buscar varias variaciones ofuscadas de la cadena ${jndi:
en los campos httpRequest
de los registros de solicitudes del balanceador de carga HTTP(S). Ten en cuenta que las expresiones regulares que se usan en la consulta no detectan todas las variaciones y pueden dar lugar a falsos positivos:
resource.type="http_load_balancer" httpRequest.requestUrl=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)" OR httpRequest.userAgent=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)" OR httpRequest.referer=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)"
Puedes usar la consulta anterior para analizar los registros de solicitudes de otros servicios cambiando el valor de resource.type
.
La consulta anterior puede tardar mucho en completarse si analizas un gran volumen de registros. Para que tus consultas se ejecuten más rápido, puedes usar campos indexados, como resource.type
, resource.labels
o logName
, para acotar tu consulta a un conjunto de servicios o flujos de registro específicos.
Detectar entradas de registro coincidentes no significa que se haya producido una vulneración de seguridad. Si se detecta algo, te recomendamos que sigas el proceso de respuesta ante incidentes de tu organización. Una coincidencia puede indicar que alguien está intentando aprovechar la vulnerabilidad de tu proyecto o carga de trabajo. También puede tratarse de un falso positivo si tu aplicación usa patrones como ${jndi:
en los campos de solicitud HTTP. Revisa tus registros para asegurarte de que este patrón no forma parte del comportamiento normal de la aplicación.
Ajusta la consulta para que se adapte a tu entorno.
Buscar direcciones IP infractoras
Si encuentra resultados coincidentes y quiere agregar las direcciones IP remotas que envían esas solicitudes, añada el campo remoteIp
al panel Campos de registro del Explorador de registros. Para añadir el campo remoteIp
, haga clic en el valor del campo de una entrada de registro coincidente y seleccione Añadir campo al panel Campos de registro, como se muestra en la siguiente captura de pantalla:
Ahora puede ver las principales direcciones IP remotas que envían solicitudes coincidentes en el panel Campos de registro:
De esta forma, podrás ver un desglose de la procedencia de estos análisis de vulnerabilidades de Log4j 2. Puede que algunos de estos análisis sean legítimos y procedan de una herramienta de análisis de vulnerabilidades de aplicaciones que hayas configurado, como Web Security Scanner. Si usas Web Security Scanner desde Security Command Center, ten en cuenta los intervalos de direcciones IP estáticas que usa Web Security Scanner.
Buscar aplicaciones concretas y verificar las técnicas de mitigación
También puedes agregar las aplicaciones de destino e identificar si las solicitudes maliciosas han llegado a tus aplicaciones. Si has habilitado técnicas de mitigación mediante políticas de seguridad de Cloud Armor o control de acceso mediante Identity-Aware Proxy (IAP), también puedes verificar que funcionan correctamente a partir de la información registrada en los registros del balanceador de carga HTTP(S).
Primero, para añadir la aplicación de destino al panel Campos de registro, elige uno de los resultados de la entrada de registro, despliega resource.labels
, haz clic en el valor del campo resource.labels.backend_service_name
y, a continuación, selecciona Añadir campo al panel Campos de registro.
Ahora puede ver las principales aplicaciones o servicios backend a los que se dirigen los análisis de vulnerabilidades de Log4j 2. Para determinar si estos intentos de exploit han llegado a tu servicio de backend, usa el campo jsonPayload.statusDetails
rellenado por el balanceador de carga HTTP(S) para saber si la solicitud se ha enviado al backend a través de un proxy o si servicios como IAP o Cloud Armor la han bloqueado correctamente. Haz clic en el valor del campo jsonPayload.statusDetails
del resultado de la entrada de registro y selecciona Añadir campo al panel Campos de registros.
Ahora puedes ver un desglose de cómo se han gestionado las solicitudes en el panel Campos de registro:
En este ejemplo, IAP ha bloqueado la mayoría de las solicitudes. Cuando se habilita en un servicio backend, verifica la identidad del usuario y el contexto de uso antes de permitir el acceso. Esas solicitudes bloqueadas por compras en la aplicación tienen el valor statusDetails
definido como handled_by_identity_aware_proxy
. Además (o como alternativa), si usas Cloud Armor con la política de seguridad correcta asociada a un servicio de backend, todas las solicitudes bloqueadas por Cloud Armor tienen statusDetails
definido como denied_by_security_policy
. Para obtener información sobre cómo aplicar la nueva regla de WAF preconfigurada cve-canary
a tus políticas de seguridad de Cloud Armor, consulta el artículo Regla de WAF de Google Cloud Armor para mitigar la vulnerabilidad de Apache Log4j.
Para filtrar las solicitudes permitidas que llegan a un servicio backend, seleccione response_sent_by_backend
en statusDetails
en el panel Campos de registro.
Considera la posibilidad de habilitar IAP para estos servicios backend y aplicar una política de seguridad de Cloud Armor con la regla cve-canary
WAF
preconfigurada para bloquear estos intentos de exploit.
Crear una política de alertas basada en registros
Una vez que hayas diseñado una consulta que encuentre los registros afectados de tu servicio, puedes usarla para crear una política de alertas basada en registros que te avise cuando las nuevas entradas de registro coincidan con la consulta. Los incidentes creados por la política de alertas se pueden reenviar al centro de operaciones de seguridad (SOC) de tu organización o al equipo de respuesta ante incidentes correspondiente.
Para obtener información sobre cómo crear una política de alertas basada en registros, consulta Crear una política de alertas basada en registros (Explorador de registros). Cuando crees la política de alertas, asegúrate de usar tu consulta para la cadena de exploit en lugar de la consulta especificada en el ejemplo.
Crear una política de alertas para una métrica basada en registros
Para monitorizar qué endpoints o servicios registran posibles intentos de exploit, crea una política de alertas en una métrica basada en registros:
Crea una métrica basada en registros para contar las apariciones de posibles cadenas de exploits en tus registros. Por ejemplo, puedes usar la CLI de Google Cloud para crear una métrica de este tipo:
gcloud logging metrics create log4j_exploits \ --description="Detect log4j exploits" \ --log-filter='httpRequest.requestUrl=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)" OR httpRequest.userAgent=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)" OR httpRequest.referer=~"(?i)(\$|\%24)(\{|\%7b).*j.*n.*d.*i.*(\:|\%3a)"'
Para obtener más información sobre cómo crear métricas basadas en registros, consulta Configurar métricas de contador.
Crea una política de alertas para recibir una notificación cuando se alcance un número determinado de incidencias. Para obtener información sobre cómo configurar una política de alertas, consulta Crear una política de alertas en una métrica de contador.
Siguientes pasos
Consulta este documento para ver si hay novedades a medida que se publique más información.
Para obtener más información sobre la vulnerabilidad de Log4j 2 y tus servicios deGoogle Cloud , consulta los siguientes recursos: