Docker 暴重大安全漏洞:外部網絡可直接訪問 127-0-0-1 服務

前些天 Hacker News 上面有一個貼子火了,這是一封發給 Docker 安全團隊的郵件,主要講的是 Docker 有一個非常離譜的安全隱患。

即使你通過像 -p 127.0.0.1:80:80這樣的參數將端口暴露到迴環地址,外部仍然可以訪問該服務,怎麼回事呢?

原因其實很簡單,Docker 添加了這樣一條 Iptables 規則:

🐳  → iptables -nvL DOCKER
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: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.1:5432:5432 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/12
Starting Nmap 7.92 ( https://nmap.org ) at 2021-11-05 15:00 CDT
Nmap scan report for 172.17.0.2
Host is up (0.00047s latency).

PORT     STATE SERVICE
5432/tcp open  postgresql

在 B 機器中直接連接 PostgreSQL。

🐳  → psql -h 172.17.0.2 -U postgres
Password for user postgres:

解決方案

事實上不僅僅是 127.0.0.1,你將容器端口映射到主機的任何一個地址,外部都可以訪問到,這就離了大譜了!

郵件作者給 Docker 團隊提出了一個解決方案,希望能優化 Docker 的 iptables 規則:

首先要嚴格限制允許訪問容器端口的源地址和網絡接口,例如 docker run -p 127.0.0.1:5432:5432 的原 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.100:5432:5432 的 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 然後升級吧。

引用鏈接

Hacker News 上面有一個貼子: https://news.ycombinator.com/item?id=31839936

最後推薦棧長耗時半年打造的 Spring Cloud Alibaba 微服務實戰課,目前首期特價優惠中,後續 100% 會漲價,早報名,早學習,早提升自己,早漲薪。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/CW6846aJ9x0mXFU4rHFi8g