dinosn/memcached-security-2026

GitHub: dinosn/memcached-security-2026

该项目披露了 memcached 中两个已在 1.6.44 版本修复的严重堆溢出漏洞,并提供完整的 PoC、ASAN 证据和复现文档用于修复验证。

Stars: 0 | Forks: 0

# memcached 安全发现 (2026-07) — 已在 memcached 1.6.44 中修复 **memcached** 中的两个堆缓冲区溢出(在针对 tip `e3b7d33` 的安全研究中发现), **已私下报告给维护者,并已修复,且在 memcached 1.6.44 (2026-07-07) 中发布**。 在此作为修复后的参考发布,以便大家现在有补丁版本可用时,能够**验证、测试和回归检查**这些 问题。 ## 披露时间线 | 日期 | 事件 | |---|---| | 2026-07-06 | 根据 memcached 政策,私下报告给维护者 | | 2026-07-07 | 两个漏洞均已修复并**在 memcached 1.6.44 中发布**,已向报告者致谢 | ## 发现 ### F-R3-01 — proxy backend-response 32 位长度截断 → 堆溢出 → RCE *(严重,proxy 模式)* - **根本原因:** `mcp_resp_t.blen` 是 `unsigned int` (proxy.h),而 `mcmc_resp_t.vlen/reslen/vlen_read` 是 `size_t`。`_backend_handler` 执行了 `r->blen = reslen + vlen` (proxy_network.c:572,将 64 位截断为 32 位),`malloc(blen+extra)`,然后使用未截断的长度执行 `memcpy(r->buf, be->rbuf, reslen + vlen_read)` (proxy_network.c:601) → 导致高达 ~16 KB 的**攻击者控制的**字节溢出到微小的分配空间中。 - **影响:** 演示了代码执行 —— 该溢出覆盖了 Lua 的 `lua_CFunction` 指针(`math_cos → os_execute`);在调用 `math.cos(r:key())` 的配置下,攻击者的 key 将作为 `system(key)` 执行。 - **攻击者:** 受损/恶意的后端,或 proxy↔backend 链路的 MITM。 - **修复于:** [`e44dd0b01`](https://github.com/memcached/memcached/commit/e44dd0b01) *"proxy: backends with large values cause overflows"* (v1.6.44) —— 在截断性的 `blen = reslen+vlen` **之前**,限制 `r->resp.vlen > INT32_MAX/2` (~1 GB)。(注意:早期的 `cb2aacc` mcmc 4 GB 上限是不够的 —— 截断存在于 proxy 的分配计算中,而不是 mcmc 中。) - **复现 / 验证:** [`REPRODUCE.md`](REPRODUCE.md) · PoC [`poc/proxy-F-R3-01/`](poc/proxy-F-R3-01/) · ASAN 证据 [`evidence/proxy-F-R3-01-asan.txt`](evidence/proxy-F-R3-01-asan.txt)。 ### F-R2-01 — LRU-crawler `metadump` 堆溢出 *(严重,默认配置,预认证)* - **根本原因:** `lru_crawler_write` (crawler.c) 在完全刷新(`bufused=0`)和 `poll()` **超时**(bufused 未更改)时均返回 `0`。抓取循环将 `ret==0` 视为“空间已回收”,并继续通过 `crawler_metadump_eval` 附加数据,超出了固定的 `malloc(131072)` 缓冲区(边界仅在断言中限制)。停止排空其 socket 的客户端会导致每次刷新都超时 → `bufused` 无限制攀升 → 导致攻击者控制的 key 字节发生 OOB 写入。 - **影响:** 未经认证,**默认配置**(`lru_crawler` 开启,`dump_enabled` 为 true)。内存损坏 / 崩溃。已由 ASAN 证明。 - **修复于:** [`7eeac6e9a`](https://github.com/memcached/memcached/commit/7eeac6e9a) *"crawler: fix buffer overflow on idle client"* (v1.6.44) —— `poll()` 超时现在会重试(带有约 30 分钟的兜底机制),而不是被误认为是刷新。配套的 [`ea35f441f`](https://github.com/memcached/memcached/commit/ea35f441f) 修复了在打补丁时发现的一个相邻的 crawler mutex 漏洞。 - **复现 / 验证:** [`poc/crawler-F-R2-01/README.md`](poc/crawler-F-R2-01/README.md) · PoC [`poc/crawler-F-R2-01/poc_crawler.py`](poc/crawler-F-R2-01/poc_crawler.py) · ASAN 证据 [`evidence/crawler-F-R2-01-asan.txt`](evidence/crawler-F-R2-01-asan.txt)。 ### 附带 / 较低严重性 - **F-R3-05** — proxy→backend TLS 未执行证书/主机名验证 → 使得导致 F-R3-01 可被远程利用的 MITM 成为可能。 - `research-notes/` 中包含了一些低级别/DoS 类别的解析器观察结果。 ## 自行验证修复 - **查看漏洞:** 在 `e3b7d33`(修复前)使用 ASAN 构建 memcached 并运行 PoC(`REPRODUCE.md`)→ 会触发 heap-buffer-overflow。 - **查看修复效果:** 构建 **v1.6.44** 并重新运行相同的 PoC → crawler 不再溢出(超时会重试),并且 proxy 会拒绝过大的 backend 值(`P_BE_FAIL_OOM`)。无溢出。 ## 目录结构 ``` REPRODUCE.md step-by-step: build -> overflow (ASAN) -> RCE (+ how to confirm the fix) DISCLOSURE.md disclosure timeline + how memcached security reports work poc/proxy-F-R3-01/ malicious backend, proxy config, impact demo poc/crawler-F-R2-01/ default-config crawler overflow PoC evidence/ raw AddressSanitizer reports research-notes/ full analysis incl. honest exploit-delivery limits ``` ## 备注 - 两个溢出都已在 `e3b7d33` 上**通过 ASAN 进行了实际验证**;F-R3-01 的 RCE 机制已得到演示(命令执行)。一个“即插即用”的 100% 可靠的 F-R3-01 *远程*漏洞利用是很困难的(堆 arena 隔离 + ASLR;未发现 infoleak)—— `research-notes/` 中提供了诚实、经过测量的说明。这从未降低该漏洞的严重性;溢出 + 任意内容写入已得到证明。 - 已负责任地报告并在约 1 天内修复。请**升级至 memcached ≥ 1.6.44**。
标签:Memcached, PoC, rizin, 内存安全, 堆溢出, 情报收集, 暴力破解, 漏洞复现, 漏洞研究, 逆向工具