2.17. CVE-2023-45725:Apache CouchDB:使用设计文档进行权限提升

日期:

12.12.2023

受影响版本:

3.3.2 及以下版本

严重程度:

中等

供应商:

Apache 软件基金会

2.17.1. 描述

接收用户 HTTP 请求对象的設計文档函数可能会暴露访问该文档的用户授权或会话 cookie 标头。

这些设计文档函数是
  • list

  • show

  • rewrite

  • update

攻击者可以使用 HTML 类输出泄露会话组件,将会话插入为外部资源(例如图像),或将凭据存储在具有“update”函数的 _local 文档中。

为了使攻击成功,攻击者必须能够将设计文档插入数据库,然后操纵用户访问该设计文档中的函数。

2.17.2. 缓解措施

CouchDB 3.3.3 从传递到查询服务器执行环境的 HTTP 请求对象中删除敏感标头。

对于早于 3.3.3 的版本,将此补丁应用于 loop.js 文件也可以缓解此问题

diff --git a/share/server/loop.js b/share/server/loop.js
--- a/share/server/loop.js
+++ b/share/server/loop.js
@@ -49,6 +49,20 @@ function create_nouveau_sandbox() {
   return sandbox;
 }
​
+function scrubReq(args) {
+  var req = args.pop()
+  if (req.method && req.headers && req.peer && req.userCtx) {
+    delete req.cookie
+    for (var p in req.headers) {
+      if (req.headers.hasOwnProperty(p) && ["authorization", "cookie"].indexOf(p.toLowerCase()) !== -1) {
+        delete req.headers[p]
+      }
+    }
+  }
+  args.push(req)
+  return args
+}
+
 // Commands are in the form of json arrays:
 // ["commandname",..optional args...]\n
 //
@@ -85,7 +99,7 @@ var DDoc = (function() {
         var funPath = args.shift();
         var cmd = funPath[0];
         // the first member of the fun path determines the type of operation
-        var funArgs = args.shift();
+        var funArgs = scrubReq(args.shift());
         if (ddoc_dispatch[cmd]) {
           // get the function, call the command with it
           var point = ddoc;

2.17.3. 解决方案

避免使用来自不可信来源的设计文档,这些来源可能试图访问或操纵请求对象的标头。

2.17.4. 致谢

此问题由 JFrog 漏洞研究团队的 Natan Nehorai 发现,并由 Or Peles 报告。

它也由 IBM/Cloudant 的 Richard Ellis 和 Mike Rhodes 独立发现。