[安全性] 代理 `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-- -- . . .
□ 根源分析
- " 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