#1308·memcached

[安全性] 代理 `rctx:request_new()` 占位符请求可能会触发 `raw_line()` 的长度溢出,导致堆外读取和服务器崩溃

作者: gff-cw创建于 2026年8月1日更新于 2026年8月1日

□ 总结

rctx:request new ()"在中标代理模式中通过调用:创建了占位符`mcp.request'对象:

页:1 mcp new request(L, &pr, " ", " 1");


这就产生了一个`mcp.request'对象,其内部请求缓冲器只包含一个字节(`''),其解析状态有:

页:1
rq->pr.reqlen == 1 (中文(简体) ).
rq->pr.tok.ntokens = 0 (韩语).
rq - > pr. keytoken == 0

然而,Lua与通常的 " mcp.request " 对象相同,因此可以使用完整的 " mcp.request " 方法表,包括 " raw line() " 。

mcplib request raw line ()' 假定请求是完整的 CRLF 已终止的协议行,并无条件从未签名的reqlen'字段中减去两个字节:

页:1 lua pushlstring(L, rq- >pr. request, rq- >pr.reqlen–2) (法语).


当`rq->pr.reqlen = 1'时,`rq->pr.reqlen - 2'在`int32 t'域为`0xffffffff' (`4294967295'). 这个被包裹的长度随后被传递给Lua作为字符串长度,并在Lua的字符串分配器内达到"memcpy ()",导致巨大的堆积出行读和可靠的服务器崩溃.

** 当地证实的影响:**

- ASan/UBSan建筑: " 保安员:堆积-缓冲-流出 "
- Asan读作:`4294967295'
- 崩溃站点:`mcplib  request raw line () - > lua pushlstring () - > luaS newlstr () - > memcpy ()'
- 单元建设:流程出口为`SIGSEGV'/出站代码`139'

-- -- . . .

□ 版本( O)

** 已测试受影响版本:** “1.6.45”
** 承诺:**`2d51e36'

-- -- . . .

□ 安全影响

当内置代理启用并安装了易被忽略的Lua路由时,官方memcatched服务器中的进程级拒绝服务.

远程客户端请求可以输入代理请求路径,让已配置的Lua路由执行,并让工人在由"rctx: request new ()"创建的占位符请求对象上呼叫"raw line ()". 在测试的释放构建中,服务器进程与`SIGSEGV'可靠地相撞。

-- -- . . .

# 受影响的路径

已观测到运行时路径 :

页:1
客户端套接字请求
- > 尝试  read command proxy ()
- > 代理  进程  命令( )
- > 代理  运行  rcontext ()
- > lua  resume ()
- > Lua 路线
- > rctx: request  new ()
- > mcplib rcontext request new ()
- > mcp  new  request(L, &pr, " ", 1)
- > nreq:raw 行()
- > mcplib  request raw 行()
- > lua pushlstring(L, rq- >pr. request, rq- >pr.reqlen - 2) -
- > luaS newlstr ()
- > memcpy( ) ()
- > 堆积出界读作/SIGSEGV

-- -- . . .

□ 根源分析

  1. " mcp.request " 存储解析器状态加灵活请求缓冲器

poxy.h'中,mcp request t'是一个围绕`mcp parser t'的小包装,然后是灵活的数组缓冲器:

页:1 类型 def struct mcp request s mcp request t; 类型 :

构造 mcp request s { mcp parser t pr; // 非 Lua 特定分解处理 。 字符请求[ ];

  • ;

在类型级别上没有区分:

- 完全解析的犬科请求对象,以及
- 拟在以后填充的占位符请求对象。

因此,一旦一个占位符作为`mcp.request'被退回,正常的请求方法就可以
. . . . . . .

内容来源: memcached/memcached