news 2026/10/9 3:04:59

CouchDB 1.7.x 分支版本全解:安全漏洞修复、_bulk_get 批量读取与 HTTP 服务改进

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CouchDB 1.7.x 分支版本全解:安全漏洞修复、_bulk_get 批量读取与 HTTP 服务改进
  • 数据库
  • 文档数据库
  • 后端

【免费下载链接】couchdb

Seamless multi-primary syncing database with an intuitive HTTP/JSON API, designed for reliability

项目地址:https://gitcode.com/gh_mirrors/co/couchdb
点击查看免费下载

本指南以 CouchDB 官方发布说明 1.7.rst 为骨架,系统梳理 1.7.0、1.7.1、1.7.2 三个版本的变更全貌:包括 CVE-2017-12635 / CVE-2017-12636 / CVE-2018-8007 三项安全修复、POST /{db}/_bulk_get新接口、HTTP 服务器与查询服务器的多项行为改进,并结合仓库源码(chttpd、chttpd_db.erl、CVE 文档目录 cve)做源码级佐证。读完本文,你将掌握 1.7.x 分支每一处改动的内容、原理与影响面,可直接用于理解旧版本升级动机与历史行为差异。

1.7.x 分支概览

1.7.x 是 CouchDB 1.x 系列的最后一个维护分支,发布说明覆盖三个版本:

版本主题关键点
1.7.0安全修复 + API 扩展修复两个高危 CVE,新增_bulk_get,大量 HTTP 行为改进
1.7.1权限修复修复数据库成员访问/{db}/_all_docs的问题
1.7.2安全修复修复 CVE-2018-8007(管理员配置校验绕过)

三个版本分别对应发布说明中的 release/1.7.0、release/1.7.1、release/1.7.2 小节。值得注意的是,1.7.0 与 1.7.1 的发布说明中明确指出升级同系列版本(1.x → 1.x)是无缝的;而 1.x → 2.x 的跨系列升级需要参考官方升级说明。

安全修复:三个 CVE 的成因与缓解

1.7.x 分支承载了 2017–2018 年间三个 CVE 的修复,全部在仓库 src/docs/src/cve 目录下有独立文档。

CVE-2017-12635:远程权限提升(1.7.0 修复)

  • 危害等级:Critical(严重)
  • 影响范围:所有版本的 Apache CouchDB
  • 发布日期:2017-11-14

成因:CouchDB 的 Erlang JSON 解析器与 JavaScript JSON 解析器行为不一致。攻击者可以向_users数据库提交带重复roles键的用户文档:写入时授权采用的是第二个roles键的值,而新建用户后续鉴权采用的却是第一个roles键的值。通过这种"解析器差异 + 重复键"的组合,普通用户可以为自己赋予包括_admin在内的管理角色,实现权限提升。详见 2017-12635.rst。

修复方式:修改 Erlang 端 JSON 解析行为,模拟 JavaScript 的语义——当 JSON 中存在重复键时,取最后一个键的值。这消除了两种解析器之间的差异窗口。

CVE-2017-12636:远程代码执行(1.7.0 修复)

  • 危害等级:Critical(严重)
  • 发布日期:2017-11-14,由 CouchDB 安全团队的 Joan Touzet 在调查 CVE-2017-12635 时发现

成因:CouchDB 管理员可以通过 HTTP(S) 配置服务器,部分配置项包含操作系统级二进制文件的路径,CouchDB 会随后启动这些进程。这允许管理员以 CouchDB 运行用户身份执行任意 shell 命令,甚至从公网下载并执行脚本。详见 2017-12636.rst。

关联性:文档明确指出 CVE-2017-12635 与 CVE-2017-12636 可以组合利用——先用 12635 把非管理员提权为管理员,再借助 12636 在服务器上以数据库系统用户身份执行任意命令。

缓解措施(两个 CVE 相同):升级到 CouchDB 1.7.1 或 2.1.1;1.x 或 2.x 系列内升级无缝,跨系列升级需查阅升级说明。

CVE-2018-8007:远程代码执行(1.7.2 修复)

  • 危害等级:Low(低)
  • 发布日期:2018-04-30,由 MDSec Labs 的 Francesco Oddo 发现

成因:由于对管理员通过 HTTP API 提交的配置项校验不足,管理员可以绕过"不允许通过 HTTP API 修改的配置项黑名单",把权限提升到 CouchDB 所运行的操作系统用户级别,从而获得任意远程代码执行能力,绕过了 CVE-2017-12636 的修复。详见 2018-8007.rst。

缓解措施:升级到 CouchDB 1.7.2 或 2.1.2。

API 变更:_bulk_get 与新校验行为

1.7.0 引入了一系列 API 层面的变化,其中最核心的是批量读取接口。

新增 POST /{db}/_bulk_get

  • issue 2310:实现POST /{db}/_bulk_get,用于在一次请求中按文档 ID(可附带特定 revision)批量读取多个文档。

该接口的实现位于 src/chttpd/src/chttpd_db.erl 的db_req/2分支中:请求进入后依次执行bulk_get_parse_doc_query解析查询参数、bulk_get_parse_args解析文档 ID 与 revision 列表、bulk_get_docs批量取文档,最后根据请求头决定返回 JSON 还是 multipart 响应:

  • JSON 响应(默认):bulk_get_ret_json/4返回{"docs": [...]}结构,每个文档条目内嵌id、rev与docs数组;
  • multipart 响应:当客户端请求 multipart 时,通过bulk_get_ret_multipart与send_docs_multipart_bulk_get(见 chttpd_db.erl)按内部 boundary 组织每个文档的正文,bulk_get_multipart_headers负责为每个 revision 构造头信息。

源码还揭示了接口的两个内部优化路径(chttpd_db.erl):

  • 默认开启配置项chttpd.bulk_get_use_batches = true,走bulk_get_docs_batched批量取文档;
  • 若显式关闭该配置,则退化为bulk_get_docs_individually逐文档读取。

该接口在仓库中还配套了专门的测试 chttpd_bulk_get_test.erl 与复制器侧的集成测试 couch_replicator_bulk_get_tests.erl,接口的完整参数说明可参考 bulk-api.rst。

_session 与校验行为变化

  • issue 1356:POST /_session现在会返回用户名(username)字段。对应认证模块位于 src/chttpd/src/chttpd_auth.erl,便于客户端在建立会话后直接确认当前登录身份。
  • issue 1876:修复 show/update 函数产生重复 Content-Type头的问题。
  • issue 2375:当请求中指定了无效的 revision时,返回 HTTP400(此前行为不规范)。
  • issue 2845:当revs参数不是列表时,返回 HTTP400。

这些 400 校验类改动提升了 API 的错误一致性,客户端可以据此更可靠地处理参数错误。

HTTP 服务器改进

1.7.0 在 HTTP 服务器层面做了多项性能与正确性修复,对应 src/chttpd 模块:

  • issue 2430:默认禁用 Nagle 算法。在 chttpd.erl 中,默认 socket 选项定义为[{sndbuf, 262144}, {nodelay, true}]——即发送缓冲区 256 KiB 且开启 TCP_NODELAY,减少小包延迟,对大量短请求的 HTTP API 场景有明显收益。
  • issue 2583:不需要请求体的端点不再主动断开连接,避免客户端在无负载请求后遭遇意外的连接关闭。
  • issue 2673:正确转义Location:HTTP 响应头,防止头注入类问题。
  • issue 2677:修正Expires头星期字段错误(RFC 规范要求日期以 GMT 格式包含正确星期)。
  • issue 2783:HTTP 服务同时绑定 IPv4 与 IPv6双栈。
  • commit f30f3dd:支持用户自定义 SSL 加密套件(ciphers),允许运维按安全基线调整 TLS 密码套件组合。

数据库核心与权限修复

  • issue 2534:改进对数据库admin/member角色的校验逻辑,收紧权限判断。
  • issue 2735:修复高并发编辑负载下产生重复文档 _id的问题,这是写入路径的竞态缺陷。
  • issue 974(1.7.1):修复数据库成员访问/{db}/_all_docs被拒绝的问题,确保 member 级用户能够按权限枚举文档。

这些改动分别落在 src/couch 的数据库核心与 src/chttpd 的 HTTP 层。

Query Server 与前端相关变更

Query Server(查询服务器)部分:

  • issue 1447:设计函数返回的自定义响应头现在会与默认响应头合并输出,而不是覆盖丢失。
  • commit 7779c11:内置 CoffeeScript 升级到1.10版本。对应的运行时入口与渲染逻辑可参考 share/server/coffee-script.js 与 share/server/render.js。

Futon(Web 管理界面)部分:

  • issue 241:支持文档复制(copy)操作。
  • issue 1011:支持从 Futon 发起按文档 ID 过滤的复制(replication filtered by document ids)。
  • issue 1275:修复 Futon "最近使用数据库"列表中数据库名的转义问题。
  • commit f18f82a:升级 jquery.ui 至1.10.4,修复潜在的XSS问题。

jquery.couch.js部分:

  • commit f9095e7:同步修复文档复制(document copying)功能。

构建与文档改进

  • issue 1964:用EUnit测试框架替换 etap 测试套件,统一了测试基础设施。
  • issue 2225:强制校验系统可以构建共享库(shared libraries)。
  • issue 2761:支持glibc ≥ 2.20。
  • issue 2747:支持Erlang 18;commit 5b9742c 进一步支持Erlang 19。
  • commit 1545bf4:移除失效的基准测试。

文档方面,1.7.0 明确了多组易混淆的语义:

  • commit c3c9588:改进cacert_fileSSL 选项的文档说明;
  • commit 3266f23:澄清tombstone(墓碑)的作用;
  • commit 75887d9:完善CouchDB 复制协议定义(可对照 复制文档);
  • commit 3b1dc0f:移除对group_level=exact的过时提及;
  • commit 2a11daa:移除 Futon 中 "Test Suite" 的过时表述;
  • commit 01c60f1:澄清key、startkey、endkey参数的类型。

升级与运维建议

综合发布说明与 CVE 文档,1.7.x 分支的实际运维要点如下:

  1. 安全基线:若仍运行 1.7.0 之前的 1.x 版本,务必至少升级到 1.7.1(覆盖 CVE-2017-12635 / 12636);若要覆盖 CVE-2018-8007,需升级到 1.7.2 或 2.1.2。
  2. 同系列升级:1.x → 1.x 的升级是无缝的;1.x → 2.x 属于跨系列升级,需查阅官方升级说明,不可直接套用。
  3. 版本差异:由于 1.7.x 是 1.x 系列的末代分支,其 HTTP 行为(如 Nagle 禁用、IPv4/IPv6 双栈、_bulk_get)在后续 2.x/3.x 中均有延续或演进,阅读 2.0.rst 等后续发布说明可追溯这些特性的去向。
  4. 接口变化:应用方若使用_bulk_get,可结合 bulk-api.rst 与 chttpd_bulk_get_test.erl 验证 JSON 与 multipart 两种响应格式,并留意bulk_get_use_batches配置项对批量读取路径的影响。
  • 数据库
  • 文档数据库
  • 后端

【免费下载链接】couchdb

Seamless multi-primary syncing database with an intuitive HTTP/JSON API, designed for reliability

项目地址:https://gitcode.com/gh_mirrors/co/couchdb
点击查看免费下载

相关推荐

上一篇:【亲测免费】 源码探测器(SourceDetector)使用教程
下一篇:VSCodium:彻底消除隐私隐患的革命性开源代码编辑器解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/9 3:04:11

绩效考评系统Java Web源码解析:从数据库设计到Spring Boot部署实战

简介:面向Java Web开发学习者的绩效考评系统完整项目,基于Servlet/JSP与Spring、MyBatis等技术栈实现,面向企业员工考核流程的数字化管理。压缩包共509个文件,整体约982KB,包含91个Java源文件、91个class文件、39个JSP…

作者头像 李华
网站建设 2026/10/9 3:03:48

Windows系统优化利器Dism++:C盘清理、驱动管理与完整实操指南

Windows系统用久了总会变慢,这是谁都用得上的痛点。网上各种优化工具五花八门,多数要么收费、要么捆绑推广,搞不好还把你系统改出一堆毛病。我自己在系统折腾这条路上踩过不少坑,最后长期留下的,反而是一个看起来其貌不…

作者头像 李华
网站建设 2026/10/9 3:03:26

Mac用快捷指令将MOV批量转M4A:无需ffmpeg,右键一键提取音频

上个月整理一批访谈素材,我又被一个老需求卡住了:手头全是QuickTime屏幕录制出来的MOV文件,每段十来分钟,我要的其实只有里面的人声讲解,但每次都得先打开软件、导出音频、改名、再扔进剪辑工程。试过在线转换网站&…

作者头像 李华
网站建设 2026/10/9 3:02:50

自验证框架让开源模型推理自我纠错,性能反超Fable 5

「自验证」框架让开源模型反超 Fable 5,冲上 GitHub 热榜:它到底做了什么?如果你这几天在刷 GitHub 热榜,大概率会刷到一个关键词:自验证框架(Self-Verification Framework)。这个项目做的事情很…

作者头像 李华
网站建设 2026/10/9 3:02:50

PHP老项目防SQL注入:360防注入修改类的原理与改造实践

简介:面向PHP开发者的Web安全防护改造包,针对SQL注入、XSS跨站脚本和CSRF跨站请求伪造等常见攻击,基于360安全思路提供代码修改类,适合初中级开发者在现有项目中快速套用。压缩包仅1KB,包含2个文件:readme.…

作者头像 李华
网站建设 2026/10/9 3:02:38

Codex CLI接入国产开源模型:OpenAI兼容API切换指南

从去年 OpeniAI 的 Codex CLI 正式发布之后,终端里“用自然语言驱动编程”的玩法就开始被越来越多的人接受。社区里经常调侃它就是 OpenAI 的“亲儿子”,因为新模型的能力总是优先在它身上落地。可在实际项目里,很多团队并不愿意把整份代码上…

作者头像 李华