技術(shù)交流|Dockerfile 中 RUN 后面的敏感信息檢測(cè)

前言

之前學(xué)習(xí)過一些容器底層原理,再加上之前傾旋師傅提了一個(gè)小想法:拿到鏡像,是否可以最大程度還原Dockerfile的內(nèi)容,因?yàn)檫@個(gè)里面很可能有一些敏感信息。于是《鏡像反查Dockerfile》文章就誕生了,實(shí)際上里面的技術(shù)都是已經(jīng)有人做好了,我無非是復(fù)現(xiàn),細(xì)節(jié)補(bǔ)充罷了。

這個(gè)事情并沒有結(jié)束,秉承著實(shí)驗(yàn)室內(nèi)部研究必須落地的精神,我想把這個(gè)細(xì)節(jié)落地到工具上去:在云場(chǎng)景的攻防中,當(dāng)我們控下一個(gè)私有云的倉(cāng)庫(kù)的時(shí)候,通過運(yùn)行某個(gè)自動(dòng)化工具,將一些敏感信息提取出來。

準(zhǔn)備工作

1. 選擇工具二開還是直接開寫

如果在大學(xué)時(shí)期,我肯定選擇去直接開寫,鍛煉一些能力。但是后面工作了這么久,才越來越感受到大道至簡(jiǎn),況且別人已經(jīng)寫的很好了又無私奉獻(xiàn)。有些時(shí)候從0開始,不如從1開始。況且那個(gè)1還是一個(gè)很成熟,很棒的工具。

2. 選擇哪個(gè)工具

其實(shí)我首先想到的并不是問脈,而是CDK, 也看了部分的源碼,但是最后從定位來說,并不是很合適。CDK更多的是容器權(quán)限,集群權(quán)限,你可以看到CDK中關(guān)于Docker漏洞利用方面更多的是逃逸,利用。(只是定位不太合適,不妨礙CDK是一款優(yōu)秀的,我也很喜歡的一款工具)

這個(gè)時(shí)候想起來了長(zhǎng)亭的問脈 Veinmind ,Veinmind 有檢測(cè)敏感信息和 history 的異常操作這塊,并且從大維度來說是支持鏡像和容器狀態(tài)的。再加上之前也經(jīng)常用,相對(duì)來說很熟悉。那么我會(huì)用到哪些模塊呢?

3. 分析工作

拉取 Veinmind 源碼,發(fā)現(xiàn)兩個(gè)模塊比較符合:

  1. Veinmind-sensitive(掃描鏡像中敏感信息)?看起來很符合。
  2. Veinmind-history (掃描鏡像中的異常歷史命令)?從 rules 和介紹來看不是很符合,但是里面有一些現(xiàn)成的匹配docker history的邏輯,這意味著我可以少寫很多代碼。有趣的是 我發(fā)現(xiàn)了https://github.com/chaitin/veinmind-tools/pull/38這個(gè) pr ,這位師傅像給問脈的docker history 加一些檢測(cè)的規(guī)則。
1098d873-148d-40a6-b69a-4f0f5163ffa9.png

最終我還是選擇 Veinmind-sensitive 模塊。這個(gè)模塊的定位很詳細(xì),是掃描鏡像中的異常歷史命令,這個(gè)"異常"可以通過模塊的 rules 去確定他的定位。舉個(gè)例子:我在 Dockerfile 中 RUN 后面包含了某一串 token,或者寫一個(gè) password ,你只能說這么寫會(huì)有敏感信息,但是本身也沒挖礦操作,沒惡意命令,當(dāng)然不能說我這個(gè)鏡像是有異常指令的。

5df94530-b030-4a4d-b739-f821f23d2a61.png

繼續(xù)分析 Veinmind-sensitive 模塊,發(fā)現(xiàn)該模塊主要的檢測(cè)邏輯依賴 rules.toml ,檢測(cè)內(nèi)容已經(jīng)很全面了:鏡像的 env 信息 、敏感文件及敏感文件中的敏感內(nèi)容。但我們知道,Dockerfile 的編寫中 RUN 后面是可以寫任何命令,包括命令參數(shù)都可以,此時(shí)這里可能包含很多敏感信息,而 Veinmind-sensitive 沒有檢測(cè)到。

5ff113fd-8d9f-4ca0-b061-be30d1144879.png

對(duì)于檢測(cè)工具來說,這塊的檢測(cè)維度必須覆蓋到,這是向 Veinmind 提 pr 的好機(jī)會(huì)。很多時(shí)候我們需要把信息經(jīng)過正則列舉出來,并給出相關(guān)描述,有沒有用,敏感程度是用戶說了算。

開始Code

首先就是 pycharm 的遠(yuǎn)程調(diào)試,然后我為自己確定了一個(gè)目標(biāo),也就是他應(yīng)該輸出啥樣子的。之后就是看源碼了,其實(shí)懂鏡像原理的小伙伴是很好理解寫的邏輯的。

f7751ae1-3100-46ff-8e63-5734861f9cd7.png

在功能上,我為自己定了以下目標(biāo):

  1. 在敏感內(nèi)容的檢測(cè)中加入docker hisroty
  2. 遍歷每一行 docker history的指令,然后將其與正則匹配rules去匹配(都匹配或者可選)
  3. 如果一行指令命中多個(gè)正則,需要在report中顯示

最終在不改動(dòng)toml,不改動(dòng)核心邏輯的情況下,增加了該功能,效果就是下方展示的 Dockerfile的內(nèi)容

root@VM-4-5-ubuntu:/home/ubuntu/docker# cat Dockerfile 
FROM ubuntu:18.04

ENV PATH=${JAVA_HOME}/bin:${PATH} \
CS_PORT=9911 \
CS_PASSWORD=123456 \
CS_PUSH_TOKEN=111111dadsadsadsadsadsa 


RUN sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && apt-get clean && apt update \
&& apt install -y  redis-server  --fix-missing \
&& sed -i "s|bind 127.0.0.1 ::1|bind 127.0.0.1|" /etc/redis/redis.conf \
&& echo 'password=test123456' > config.ini


CMD bash

這里不展示所有的結(jié)果,只展示其中一行命中兩個(gè)正則規(guī)則的結(jié)果。為了營(yíng)造這個(gè)條件,我修改了Veinmind-sensitive/rules.toml 中關(guān)于"Config File"的正則語句。(這里只是為了測(cè)試)filepath = '''.*\/config\.ini$''' => filepath = ''.*config\.ini$'''敏感信息的內(nèi)容是

/bin/sh -c sed -i s@/archive.ubuntu.com/@/mirrors.aliyun.com/@g /etc/apt/sources.list && apt-get clean && apt update && apt install -y redis-server --fix-missing && sed -i \"s|bind 127.0.0.1 ::1|bind 127.0.0.1|\" /etc/redis/redis.conf && echo 'password=test123456' > config.ini

理論上,這一條指令有password敏感字段和 config.ini 兩個(gè)敏感字眼,是會(huì)命中"Config File" 和"Password In Enviroment" 這兩個(gè)正則。

實(shí)現(xiàn)效果

2fedba1f-6f46-4e17-a0d9-47eb5a29aee0.png

5f85c454-3901-41db-89d6-831222b49408.png

詳細(xì)的實(shí)現(xiàn)代碼可以看https://github.com/chaitin/Veinmind-tools/pull/140/files

寫在最后

最后我想說的是,我在做腳本小子的時(shí)候已經(jīng)最大化的參照原作者的風(fēng)格去寫并且我寫的可能會(huì)有紕漏,但是可能邏輯上代碼上,始終是原作者更加了解些,對(duì)我來說也是時(shí)常會(huì)學(xué)習(xí)到大佬的優(yōu)秀代碼。很感謝問脈的認(rèn)同以及 D_infinite 師傅的認(rèn)同。最后也要感謝我的同事 akkuman 師傅的幫助。也希望問脈可以越做越好,可以一起擁抱開源生態(tài)。


作者:0-cat

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容