memcached 整型数溢出漏洞处理说明

三个漏洞都是和整型溢出相关, 具体的影响及评分见 redhat cve 说明:

cve-2016-8705 cve-2016-8705 cve-2016-8706

客户端使用 memcached 自有的二进制协议与 memcached server 进行交互, key 和 value 的长度被声明为 int 类型, body 长度声明为无符号整型, 部分函数执行下面任意一行代码的时候可能会引起整型溢出:

vlen = c->binary_header.request.bodylen - (nkey + c->binary_header.request.extlen);
int vlen = c->binary_header.request.bodylen - nkey;

整型溢出后则破坏 memcached 内部的 slab 数据结构, 这可能会引起缓存中数据的完整性, 另外也会引起 memcached 的崩溃. 测试环境中, 使用漏洞说明中的 python 代码验证后, 有很大的概率使 memcached 异常崩溃, centos 6, 7 都受影响. 远程代码执行未做验证.

官方的代码修复中对可能的溢出情况做了检测判断, 如下所示, 1.4.33 版本开始修复: memcached commit 从代码修改情况来看修改老版本的代码后重新编译也能达到修复的目的.

对线上业务有什么影响:

1. 漏洞容易利用, 很容易引起 memcached 的崩溃; 当然正常情况下很少会出现 bodylen 的值特别大或特别小;
2. 连接 memcached 的应用会出异常, 容错性不好的应用可能会崩溃, 过多的占用系统资源;
3. memcached 失效后引起 MySQL 访问增加;

线上需要做什么操作:

1. 确保只有内网可以访问 memcached;
2. 以 rpm 安装运行的 memcached 可以升级 rpm 包;
3. 以源码编译运行的, 下载最新版 1.4.33 编译安装;
4. 和开发确认是否可以重启 memcached, 没有重连机制的应用需要重启应用;

1步骤确认后, 后面三步可暂缓执行; 2,3 步骤升级后可以先不用重启, 需要重启的时候会自行生效. 升级更新见 redhat 说明: RHSA-2016-2820.html