Memcached 作为生产环境中最常见的分布式缓存之一,常年暴露在高并发、多租户的网络边界上。1.6.42 版本几乎把所有修复精力都砸在了安全问题上——内存损坏、崩溃风险、认证侧信道,一个都没放过。如果你的服务还在跑老版本,这轮更新值得立刻安排。
修复了什么
本次更新覆盖了多个模块,核心修复集中在三类风险:
1. SASL 认证时序侧信道
SASL 密码数据库认证流程中存在时序侧信道漏洞。攻击者可以通过比对认证响应的时间差异,逐字节逼近正确密码。这类漏洞在远程场景下利用难度不算低,但在同一内网或同主机环境下,精度足够构成威胁。1.6.42 对比对逻辑做了恒定时间处理,消除了时间差泄露。
2. 二进制协议(binprot)处理缺陷
proto 模块修复了 binprot 解析中的问题,可能导致内存损坏或进程崩溃。二进制协议在部分客户端库(如 libmemcached)中被默认使用,这意味着触发路径并不罕见。
3. extstore 写入长度缺失
proxy 模块中 extstore 的写入操作缺少长度校验,可能引发越界写入。extstore 是 Memcached 将冷数据溢出到 SSD 的机制,启用该特性的部署受影响面更大。
此外,vendor 模块在 blob 缺失时新增了具有指导意义的警告信息,帮助运维快速定位配置问题,而非静默失败。
时序侧信道:为什么值得重视
时序侧信道攻击的核心思路是:密码比对函数逐字符比较时,遇到第一个不匹配字符就提前返回。这意味着正确前缀越长,函数执行时间越长。统计足够多的请求后,攻击者可以还原出完整密码。
修复方式是将比对改为恒定时间算法——无论密码是否匹配,函数执行路径和耗时都一致。这类修复在 OpenSSL、TLS 实现中已成标准做法,Memcached 这次补上了自己的缺口。
升级与验证实操
以下是一套从检查到升级再到验证的完整流程,适用于主流 Linux 发行版。
检查当前版本
# 查看运行中的 memcached 版本
memcached --version
# 或者通过进程信息确认
ps aux | grep memcached
如果输出低于 1.6.42,就需要升级。
从源码编译安装(推荐方式)
Memcached 官方发布页提供源码包,自行编译可以确保拿到最新补丁:
# 下载并解压
wget https://memcached.org/files/memcached-1.6.42.tar.gz
tar -xzf memcached-1.6.42.tar.gz
cd memcached-1.6.42
# 编译(启用 SASL 支持,这是本次修复的关键模块)
./configure --enable-sasl
make
make test # 运行内置测试,确认无回归
# 安装(根据你的环境选择路径)
sudo make install
如果你的发行版有打包好的 1.6.42,也可以直接用包管理器升级,但务必确认包已包含 SASL 修复。
重启并验证 SASL 配置
升级后重启服务,并确认 SASL 认证配置正确:
# 停止旧进程
sudo systemctl stop memcached
# 以 SASL 模式启动新版本
memcached -d -m 512 -p 11211 -U 11211 \
-S \ # 启用 SASL 认证
-vv # 详细日志,便于观察认证行为
# 检查日志中是否出现 vendor blob 缺失警告
# 如果看到有指导意义的警告信息,说明新版本检测逻辑生效
SASL 密码数据库文件通常位于 /etc/sasl2/memcached.conf,确认内容格式正确:
cat /etc/sasl2/memcached.conf
示例配置内容:
pwcheck_method: auxprop
auxprop_plugin: sasldb
sasldb_path: /etc/memcached.sasldb
mech_list: PLAIN
用客户端验证认证行为
# 安装 sasl2-bin 工具
sudo apt-get install sasl2-bin # Debian/Ubuntu
# 或 sudo yum install cyrus-sasl-plain # RHEL/CentOS
# 创建测试用户
sudo saslpasswd2 -c testuser -f /etc/memcached.sasldb -a memcached
# 用 memcached 客户端测试认证
# Python 示例:
pip install python-memcached
import memcache
# 连接启用 SASL 的 memcached
mc = memcache.Client(['127.0.0.1:11211'])
# 如果使用 bmemcached(支持 SASL 认证的客户端)
import bmemcached
mc = bmemcached.Client(
['127.0.0.1:11211'],
'testuser',
'your_password_here'
)
# 基本读写验证
mc.set('upgrade_test', '1.6.42_ok')
print(mc.get('upgrade_test')) # 应输出: 1.6.42_ok
确认 extstore 配置安全
如果你启用了 extstore(SSD 溢出存储),升级后务必重新检查配置参数:
# 启动时 extstore 相关参数示例
memcached -d -m 512 -p 11211 \
-e /var/lib/memcached/extstore.data # extstore 数据文件路径
-E 64 # 每页大小(MB)
升级后观察日志中是否有 extstore 写入长度相关的异常信息。1.6.42 已修复该问题,正常情况下不应再出现越界警告。
升级前的注意事项
| 检查项 | 说明 |
|---|---|
| SASL 是否启用 | 如果你的部署未开启 SASL(-S 参数),侧信道漏洞影响面较小,但升级仍然推荐 |
| extstore 是否启用 | 使用 SSD 溢出特性的实例必须优先升级,写入长度缺失风险较高 |
| 客户端协议模式 | 确认客户端使用 binprot 还是 textprot,前者受 proto 修复影响 |
| 滚动升级策略 | 多节点部署建议逐台升级并观察,避免一次性全量切换 |
| 回滚方案 | 保留旧版本二进制文件路径,升级异常时可快速回退 |
小结
1.6.42 不是功能大版本,但它的安全修复密度说明 Memcached 团队认真审视了长期潜伏的风险。SASL 时序侧信道、binprot 内存损坏、extstore 越界写入——这三类问题在生产环境中都可能被利用,尤其是面向公网或跨租户暴露的缓存节点。
升级路径清晰,编译安装加几行配置验证即可完成。如果你的 Memcached 集群启用了 SASL 或 extstore,这次升级不应该排在待办列表底部。