Memcached命令执行漏洞(CVE-2016-8704、CVE-2016-8705、CVE-2016-8706)原理和对阿里云Memcache影响分析...

本文介绍了Memcached的三个整数溢出漏洞CVE-2016-8704、CVE-2016-8705和CVE-2016-8706,这些漏洞可能导致堆溢出和系统崩溃。阿里云ApsaraDB for Memcache由于使用自研的Tair并进行了严格的边界检查,不受这些漏洞影响。
摘要由CSDN通过智能技术生成
漏洞简介

Memcached是一个广泛使用的高速缓存系统,近期研究者发现小于1.4.33的版本存在3个整数溢出漏洞,通过这几个漏洞攻击者可以触发堆溢出导致crash。官方在11月1日发布了升级公告。漏洞作者已经提供了很详细的描述,在这里仅做简单的整理和验证。

后面验证了阿里云ApsaraDB for Memcache不受漏洞影响,并分析了原因。这个案例深刻告诉我们,对于用户输入,一定要做全面的检查。

漏洞分析

漏洞仅仅在binary时会触发。本质都是没有对用户输入的协议做严格全面的边界检查,导致在调用item.c中的do_item_alloc()函数时, 传入的参数nbytes是个负值,导致堆栈溢出。

item *do_item_alloc(char *key, const size_t nkey, const int flags,
                    const rel_time_t exptime, const int nbytes,
                    const uint32_t cur_hv) {
  size_t ntotal = item_make_header(nkey + 1, flags, nbytes, suffix, &nsuffix);
}

ntotal大小的内存用来存放item、flags、key、value。当nbytes为负值,导致ntotal偏小,导致溢出。

CVE-2016-8704

当执行Append (opcode 0x0e), Prepend (opcode 0x0f), AppendQ (0x19), PrependQ (opcode 0x1a) 命令时会进入这样如下代码路径:

case PROTOCOL_BINARY_CMD_APPEND:
case PROTOCOL_BINARY_CMD_PREPEND:
  if (keylen > 0 && extlen == 0) {
    bin_read_key(c, bin_reading_set_header, 0);
  } else {
    protocol_error = 1;
  }
  break;

这里并仅检查了keylen和extlen的值,并没有检查bodylen。

complete_nread_binary()后,即当从socket中读取和解析完header、extlen、key后,注意此时value还没从socket中读取,程序进入了process_bin_append_prepend()函数中,

key = binary_get_key(c);
nkey =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值