外部网络可直接访问映射到127.0.0.1 的本地服务

近日 hacker news 上面有一个贴子[1]火了,这是一封发给 docker 安全团队的邮件,主要讲的是 docker 有一个非常离谱的安全隐患。即使你通过像 -p 127.0.0.180 这样的参数将端口暴露到回环地址,外部仍然可以访问该服务,怎么回事呢?
  原因其实很简单,docker 添加了这样一条 iptables 规则:
  → iptables -nvl dockerchain docker (2 references) pkts bytes target prot opt in       out     source    destination    0 0     accept tcp  --  !docker0 docker0 0.0.0.0/0 172.17.0.2  tcp dpt:80 只要外部攻击者通过这台主机将流量发送到 172.17.0.2:80,就会匹配这条规则并成功访问容器中的服务,127.0.0.1 并没有什么卵用。
尴尬的是,选择将端口映射到 127.0.0.1 的用户基本上都是觉得这样很安全,以至于他们不再想采取进一步的安全措施。现在问题来了,映射到 127.0.0.1 不能说是非常安全吧,只能说是与安全毫不相干。。。
概念验证 下面通过一个例子来验证。
① 在 a 机器上运行一个 postgresql 容器,并将端口映射到 127.0.0.1。
# ip: 192.168.0.100  → docker run -e postgres_password=password -p 127.0.0.15432 postgres ② 同一个局域网中的 b 机器添加路由表,将所有访问 172.16.0.0/12 的流量指向 a 机器。
# ip: 192.168.0.200  → ip route add 172.16.0.0/12 via 192.168.0.100 ③ 在 b 机器中扫描 a 机器的端口。
  → nmap -p5432 -pn --open 172.16.0.0/12starting nmap 7.92 ( https://nmap.org ) at 2021-11-05 15:00 cdtnmap scan report for 172.17.0.2host is up (0.00047s latency).port     state service5432/tcp open  postgresql  
④ 在 b 机器中直接连接 postgresql。
  → psql -h 172.17.0.2 -u postgrespassword for user postgres: 解决方案 事实上不仅仅是 127.0.0.1,你将容器端口映射到主机的任何一个地址,外部都可以访问到,这就离了大谱了!
邮件作者给 docker 团队提出了一个解决方案,希望能优化 docker 的 iptables 规则:
① 首先要严格限制允许访问容器端口的源地址和网络接口,例如 docker run -p 127.0.0.15432 的原 iptables 规则如下:
chain docker (2 references) pkts bytes target prot opt in       out     source    destination    0 0     accept tcp  --  !docker0 docker0 0.0.0.0/0 172.17.0.2  tcp dpt:5432 改进后的 iptables 规则如下:
chain docker (2 references) pkts bytes target prot opt in out     source      destination    0 0     accept tcp  --  lo docker0 127.0.0.1/8 172.17.0.2 tcp dpt:5432 同理,如果主机的地址为 192.168.0.100,掩码为 24,那么 docker run -p 192.168.0.1005432 的 iptables 规则就应该是:
chain docker (2 references) pkts bytes target prot opt in   out     source         destination    0 0     accept tcp  --  eth0 docker0 192.168.0.0/24 172.17.0.2 tcp dpt:5432 ② 最后要修改默认行为,如果使用 -p 参数时没有指定任何 ip 地址,就默认映射到 127.0.0.1。
虽然评论区也有很多人给出了添加 iptables 规则来进行限制的方案,但这是不现实的,目前全世界有成千上万的用户在使用 -p 参数将容器端口映射到 127.0.0.1,攻击者估计早就发现了这个漏洞,我们不能期望用户自己添加 iptables 规则来限制外部访问,最靠谱的方式还是等 docker 官方修复这个 bug 然后升级吧。


先进封装技术将成为兵家必争之地
Arduino探测漫游车1—底盘
【解决方案】DMS驾驶员监测系统自动化测试方案
区块链诀别数字货币之后有什么改变
光通信网络的常见波段介绍
外部网络可直接访问映射到127.0.0.1 的本地服务
动力电池均衡仪在电动汽车中的应用-海瑞思
声音识别技术有什么应用
伺服电机和伺服驱动器区别
旁路电容、去耦电容及滤波电容的作用详解
华为的激光雷达是虚晃一枪还是真功夫?
HTC成功出售手机业务给谷歌 HTC有望否极泰来股价大涨近6%
如何在RK3568开发板上实现USBNET模式?
如何推导电容式MEMS加速度计中使用的传递函数
解读MEMS智能传感器技术的新进展
如何使用双极电机创建3点轴机械臂
外媒:央行数字货币可以解决支付数据留在主要技术平台手中的隐私问题
晶体管的工作原理
工控主板启动时无法显示,原因有哪些
华为已经在威尔士进行了Open RAN技术测试?