【獨家】K8S漏洞報告|CVE-2019-11244漏洞解讀

  • 2019 年 12 月 4 日
  • 筆記

2019年5月,Kubernetes社區(後面簡稱」社區「)修復了標號為CVE-2019-11244的安全漏洞,這個修復方案似乎並不徹底,於是有人發布Issue對此提出異議,希望提供進一步修復方案。

雖然Kubernetes已經非常安全,但對於一些安全標準更高的用戶來講,還是需要針對Kubernetes做進一步的安全加固。

本文先深度分析一下這個漏洞,看在什麼情況下會產生安全風險,接著再探討一下這個漏洞應該如何修復,以但給廣大Kubernetes用戶提供一些提示。

1

背景知識

為了能更好的理解這個漏洞,需要一些關於Linux 文件許可權的基礎知識。

也許你經常使用chmod命令來為某個文件設置許可權,比如給某個文件設置許可權:chmod 755 xxx。這裡755為十進位數字分別代表文件Owner許可權、文件Owner同組用戶許可權和其他用戶許可權,如下圖所示:

在Linux下,使用ls命令可以看到文件的許可權,如下圖所示:

針對一個文件設置許可權無非就是限制文件的讀、寫和可執行許可權,那麼如何理解一個目錄的讀、寫和可執行許可權呢?跟據小範圍調查,大多數人不能很好的回答這個問題:一個用戶對某個目錄擁有讀或寫許可權分別意味著什麼?

1

漏洞描述

CVE-2019-11244漏洞原文描述如下:

In Kubernetes v1.8.x-v1.14.x, schema info is cached by kubectl in the location specified by –cache-dir (defaulting to $HOME/.kube/http-cache), written with world-writeable permissions (rw-rw-rw-). If –cache-dir is specified and pointed at a different location accessible to other users/groups, the written files may be modified by other users/groups and disrupt the kubectl invocation.

簡單的理解就是kubectl創建的快取文件許可權為rw-rw-rw-,也即666,這些快取文件有被其他用戶修改的風險。也就是說,kubelet創建的快取文件許可權沒有得到有效的控制,其他用戶(非文件所有者)可能有意或無意的修改這些文件,從而對kubelet的運行造成影響。

這裡其他用戶包含兩類:

  • 同group下的其他用戶(後面稱group用戶);
  • 不同group的其他用戶(後面稱other用戶);

那麼修復這個漏洞,就要收縮這些文件許可權,只要做到這些文件不能被這兩類用戶修改即可(可以擁有讀許可權)。

1

社區修復方案

kubelet會創建一個專門的目錄來存放快取文件,所以這裡既要控制目錄許可權還要控制文件的許可權。

在社區的修復方案中,快取目錄許可權由755變成了750,即other用戶將不能進入這個目錄,Group用戶仍擁有r-x許可權,即可以讀取目錄下的文件列表、可以進入該目錄。

針對快取文件的修改,許可權由755變成了660,這裡有三個變化:

  1. Owner用戶不再擁有可執行許可權(快取文件擁有可執行文件許可權本身也沒有意義);
  2. Group用戶擁有rw-許可權,即Group用戶仍然可以修改快取文件;
  3. Other用戶不授予任何許可權(即便有許可權也無效,因為上層目錄已不能訪問);

看到這裡,問題就清楚了,快取文件仍然可以被Group用戶修改,實際上漏洞並沒有完全修復。可以實際操作演示一下,這裡如無特別說明表示使用root用戶操作:

  • 創建一個目錄,並設置許可權為755: # mkdir -m 0750 myPath0750
  • 在目錄中創建一個文件,並設置許可權為660:# touch myPath0750/myFile0660; chmod 0660 myPath0750/myFile0660
  • 創建一個root組用戶,並設置密碼:# useradd -G root -d /home/horen -m horen; passwd horen
  • 切換到新用戶,嘗試修改文件內容:# echo "Hello" > myPath0750/myFile0660;

可以發現文件是可以被修改的。

1

加固方案

基於社區的修復方案,如果想進一步修復這個漏洞,可以把快取文件的許可權進一步收縮,由660變為640,即Group用戶最多只能查看快取文件內容。

另外,由於目錄許可權為750,Group用戶對該目錄沒有寫許可權,所以不能修改目錄名,不能在該目錄下創建文件,達到目錄專用的目的。

這裡也順便總結一下目錄的可讀、可寫和可執行三個許可權的含義。其實目錄本身也是文件,其內容是其子層目錄結構,比如目錄中的文件列表,文件屬性等。

  • 可讀:表示你可以列出目錄中有什麼文件;
  • 可寫:表示你可以在目錄中創建、刪除文件;
  • 可執行:表示你可以進入該目錄;

1

後續

社區的修復方案雖不徹底也可以降低風險,有需要的可以考慮升級。社區方案已於2019年5月合入v1.12.9、v1.13.7、v1.14.3版本(當時1.15.0尚未發布)。

詳細資訊請查閱PR:

https://github.com/kubernetes/kubernetes/pull/77874