- 数据库
- 文档数据库
- 后端
【免费下载链接】couchdb
Seamless multi-primary syncing database with an intuitive HTTP/JSON API, designed for reliability
本指南以 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.7.0 之前的 1.x 版本,务必至少升级到 1.7.1(覆盖 CVE-2017-12635 / 12636);若要覆盖 CVE-2018-8007,需升级到 1.7.2 或 2.1.2。
- 同系列升级:1.x → 1.x 的升级是无缝的;1.x → 2.x 属于跨系列升级,需查阅官方升级说明,不可直接套用。
- 版本差异:由于 1.7.x 是 1.x 系列的末代分支,其 HTTP 行为(如 Nagle 禁用、IPv4/IPv6 双栈、
_bulk_get)在后续 2.x/3.x 中均有延续或演进,阅读 2.0.rst 等后续发布说明可追溯这些特性的去向。 - 接口变化:应用方若使用
_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
相关推荐
Zcash v2.0.7-3 安全热修复版本解析:漏洞修复、服务期调整与 zcashd 日志与钱包并发改进
Zcash v2.0.7 3 安全热修复版本解析:漏洞修复、服务期调整与 zcashd 日志与钱包并发改进 本篇技术指南围绕 Zcash 全节点 zcashd
区块链密码学Node.js v8.11.3(LTS "Carbon")安全发布解读:Buffer 与 HTTP/2 拒绝服务漏洞修复全解析
Node.js v8.11.3(LTS "Carbon")安全发布解读:Buffer 与 HTTP/2 拒绝服务漏洞修复全解析 Node.js v8.11.3
前端文档Node.js v12.8.1 安全版本深度解析:8 个 HTTP/2 拒绝服务漏洞(CVE-2019-9511 ~ 9518)与修复提交全解读
Node.js v12.8.1 安全版本深度解析:8 个 HTTP/2 拒绝服务漏洞(CVE 2019 9511 ~ 9518)与修复提交全解读 2019 年
前端文档
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考