0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-06-30 11:23 次阅读

近日Hacker News 上面有一个贴子[1]火了,这是一封发给 Docker 安全团队的邮件,主要讲的是 Docker 有一个非常离谱的安全隐患。即使你通过像-p 127.0.0.180这样的参数端口暴露到回环地址,外部仍然可以访问该服务,怎么回事呢?

原因其实很简单,Docker 添加了这样一条 Iptables 规则:

→iptables-nvLDOCKER
ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--!docker0docker00.0.0.0/0172.17.0.2tcpdpt: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
→dockerrun-ePOSTGRES_PASSWORD=password-p127.0.0.15432postgres

② 同一个局域网中的 B 机器添加路由表,将所有访问172.16.0.0/12的流量指向 A 机器。

#IP:192.168.0.200
→iprouteadd172.16.0.0/12via192.168.0.100

③ 在 B 机器中扫描 A 机器的端口。

→nmap-p5432-Pn--open172.16.0.0/12
StartingNmap7.92(https://nmap.org)at2021-11-0515:00CDT
Nmapscanreportfor172.17.0.2
Hostisup(0.00047slatency).

PORTSTATESERVICE
5432/tcpopenpostgresql

④ 在 B 机器中直接连接 PostgreSQL。

→psql-h172.17.0.2-Upostgres
Passwordforuserpostgres:

解决方案

事实上不仅仅是 127.0.0.1,你将容器端口映射到主机的任何一个地址,外部都可以访问到,这就离了大谱了!

邮件作者给 Docker 团队提出了一个解决方案,希望能优化 Docker 的 iptables 规则:

① 首先要严格限制允许访问容器端口的源地址和网络接口,例如docker run -p 127.0.0.15432iptables 规则如下:

ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--!docker0docker00.0.0.0/0172.17.0.2tcpdpt:5432

改进后的 iptables 规则如下:

ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--lodocker0127.0.0.1/8172.17.0.2tcpdpt:5432

同理,如果主机的地址为192.168.0.100,掩码为24,那么docker run -p 192.168.0.1005432的 iptables 规则就应该是:

ChainDOCKER(2references)
pktsbytestargetprotoptinoutsourcedestination
00ACCEPTtcp--eth0docker0192.168.0.0/24172.17.0.2tcpdpt:5432

② 最后要修改默认行为,如果使用-p参数时没有指定任何 IP 地址,就默认映射到 127.0.0.1。

虽然评论区也有很多人给出了添加 iptables 规则来进行限制的方案,但这是不现实的,目前全世界有成千上万的用户在使用-p参数将容器端口映射到 127.0.0.1,攻击者估计早就发现了这个漏洞,我们不能期望用户自己添加 iptables 规则来限制外部访问,最靠谱的方式还是等 Docker 官方修复这个 bug 然后升级吧。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 端口
    +关注

    关注

    4

    文章

    820

    浏览量

    31580
  • 容器
    +关注

    关注

    0

    文章

    481

    浏览量

    21876
  • Docker
    +关注

    关注

    0

    文章

    437

    浏览量

    11602

原文标题:Docker 暴重大安全漏洞:外部网络可直接访问映射到 127.0.0.1 的本地服务

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32F4能否实现用重映射功能将dcmi映射到别的io口?

    能否实现用重映射功能将dcmi映射到别的io口
    发表于 03-25 08:07

    CysecureTools如何直接访问外部存储设备内的密钥呢?

    显然不符合安全标准。 那么,如标题所示,CysecureTools应该如何直接访问外部存储设备内的密钥呢?\"
    发表于 01-31 08:08

    TC33X将dCache映射到RAM会导致存储总线错误是为什么?如何解决?

    我尝试通过以下(简化的)顺序使用 TC33X 将数据缓存映射到 RAM 区域: CPU_DCON0 = 2 MTU_CLC = 0 MTU_MEMMAP |= 1 在软件闪烁且调试器保持连接
    发表于 01-25 06:23

    如何将共享代码映射到DSPR5以及将其映射到其他RAM区域?

    Scratch-Pad Sram(CPU5 DSPR)相关联。 在链接器脚本中,我已经映射了每个.text 部分移至其各自的 PSPR 内核。 我想知道如何将共享代码映射到 DSPR5 以及如何将其映射到其他 RAM 区域。
    发表于 01-24 07:26

    什么是本地IP?服务本地IP有哪些优势?

    本地IP是指直接在互联网上分配给服务器或设备的IP地址,而不是通过NAT(网络地址转换)或 代理等中间设备进行转发。让我们关注本地IP的优势
    的头像 发表于 12-26 11:52 1726次阅读

    使用AD9690时数据具体是怎样映射到串行链路上的?

    您好: 使用AD9690时,想知道数据具体是怎样映射到串行链路上的。 我打算不使用AD9690内置的DDC,直接将采样后的一路数据通过串行链路传递到FPGA;在手册中看到一幅图描述着,一个采样点的高
    发表于 12-12 08:22

    EC SRAM映射到CPU Memory空间的共享内存设计

    ShareMemory,顾名思义就是共享内存。这个概念在很多计算机系统中都存在,本文特指 EC SRAM 映射到 CPU Memory 空间的共享内存设计。
    的头像 发表于 11-18 15:11 672次阅读
    EC SRAM<b class='flag-5'>映射到</b>CPU Memory空间的共享内存设计

    可直接访问的分离式内存DirectCXL应用案例

    分离式内存由于可以提升内存利用率而备受关注,现有的分离式内存可以根据它们如何管理数据分为1)page-based和2)object-based。Page-based方法基于虚拟内存技术,当发生缺页中断时从远端交换内存页,无需修改程序代码。
    发表于 10-18 11:39 389次阅读
    <b class='flag-5'>可直接访问</b>的分离式内存DirectCXL应用案例

    psram地址空间如何对应?

    QSPI0可以映射到512Mb(0x2000_0000开始)地址空间直接访问,其他QSPI是怎样映射的?不是很清楚8M的psram对应的地址空间是什么
    发表于 08-16 06:43

    STM32L4直接访问内存模块(DMA)介绍

    电子发烧友网站提供《STM32L4直接访问内存模块(DMA)介绍.pdf》资料免费下载
    发表于 08-01 10:15 1次下载
    STM32L4<b class='flag-5'>直接访问</b>内存模块(DMA)介绍

    实现HMI直接访问驱动参数的方法

    SINAMICS V90PN驱动器可以通过模拟S7-CPU,将数据库访问从HMI映射到驱动参数,该功能可实现在没有SIMATIC S7控制器时,SIMATIC HMI对驱动参数的直接访问
    的头像 发表于 07-11 17:14 497次阅读
    实现HMI<b class='flag-5'>直接访问</b>驱动参数的方法

    LPUART6映射到的物理引脚以及在哪里可以找到更多信息?

    我正在使用 mcxn9XXbrk_face_detection 参考项目研究 MCX-N9XX-BRK。而且我不知道在哪里连接调试端口。它映射到 LPUART6。 我想知道 LPUART6 映射到的物理引脚以及在哪里可以找到更多信息。我在用户手册或源代码中找不到任何信息。
    发表于 06-12 08:52

    访问CXL 2.0设备中的内存映射寄存器

    计算快速链接 (CXL) 1.1 和 CXL 2.0 规范在内存映射寄存器的放置和访问方式上有所不同。CXL 1.1 规范将内存映射寄存器放置在 RCRB(根复合寄存器块)中,而 CXL 2.0
    的头像 发表于 05-25 16:56 1217次阅读
    <b class='flag-5'>访问</b>CXL 2.0设备中的内存<b class='flag-5'>映射</b>寄存器

    如何为网络共享访问实施SMB/CIFS (Samba)?

    在收到第一批 Arduino 电源后的 2 个月内,我的太阳能记录系统将性能数据发送到我的文件服务器(而非网络服务器)。我决定使用我的 RPi2 从 nano (grabserial.py) 中获取
    发表于 05-19 09:19

    【鲁班猫创意氛围赛】基于鲁班猫0W的极点云智能公网LORA网关与AI_SSD模型物体归类重力双轴云台

    了linux互斥锁功能。 然后是将接收到的LORA数据处理并上发到本地MYSQL数据库3306端口: 通过外部极点云域名可以直接访问: 因为使用的是内存表引擎,数据在断电之后会丢失,所以不需要担心SD
    发表于 05-16 01:49