memcache是一种实用key-value缓存系统,在缓存数据方面使用还是比较多,但是,它本身没有权限控制模块(不像redis有密码验证),开放在外网的memcache服务很容易被攻击者扫描发现,通过命令可以直接读取memcache数据。
我们可以使用telnet命令直接连接一个没有防护的memcached(假定以IP200.200.200.200为例)
telnet 200.200.200.200 11211
telnet 200.200.200.200 11211
Trying 200.200.200.200...
Connected to 200.200.200.200.
Escape character is '^]'.
stats
STAT pid 23710
STAT uptime 948
STAT time 1501241084
STAT version 1.4.25
STAT libevent 1.4.13-stable
STAT pointer_size 64
STAT rusage_user 0.014997
STAT rusage_system 0.013997
STAT curr_connections 5
STAT total_connections 7
STAT connection_structures 6
STAT reserved_fds 20
STAT cmd_get 0
STAT cmd_set 0
STAT cmd_flush 0
STAT cmd_touch 0
STAT get_hits 0
# stats //查看memcache 服务状态 # stats items //查看所有items # stats cachedump 32 0 //获得缓存key # get :state:264861539228401373:261588 //通过key读取相应value ,获得实际缓存内容,造成敏感信息泄露
很明显如果memcached这个漏洞不去补好,非法入侵者将会轻松的获取到你的缓存数据。
在这里提出两个方法:
1、如果memcache不需要开放在外网,可在memcached启动的时候指定ip地址为 127.0.0.1。例如:
memcached -d -m 512 -u root -l 127.0.0.1 -p 11211 -c 1024 -P /tmp/memcached.pid
2、如果memcache需要对外提供服务,则可以通过iptables进行访问控制,下面是只允许本机访问:
// accept
# iptables -A INPUT -p tcp -s 127.0.0.1 --dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 127.0.0.1 --dport 11211 -j ACCEPT
// drop
# iptables -I INPUT -p tcp --dport 11211 -j DROP
# iptables -I INPUT -p udp --dport 11211 -j DROP
// 保存规则并重启 iptables
# service iptables save
# service iptables restart