保護(hù)你自己免受 `curl <url> | sh` 的危害
除非你最近沒有安裝過開發(fā)者關(guān)注的第三方軟件,否則你很可能被建議使用如下命令直接從網(wǎng)絡(luò)上進(jìn)行安裝。
- curl -s http://example.com/install.sh | sh
本文并不是為了討論這個(gè)方法的好壞,而是為了提醒那些使用此方法的人,這個(gè)方法除了那些明顯的缺點(diǎn)外,它還有另一個(gè)隱患:直接將第三方數(shù)據(jù)通過管道傳入shell?,F(xiàn)在有很多關(guān)于這個(gè)方法的討論,支持它的一種觀點(diǎn)認(rèn)為要執(zhí)行的腳本是透明的——你可以在命令執(zhí)行前用瀏覽器打開該腳本并對(duì)其進(jìn)行簡(jiǎn)單的檢查。
本文的主要目的在于 a)說明這種程度的信任是可以被劫持的,并且b)在使用curl安裝軟件時(shí)為你提供一個(gè)簡(jiǎn)便的保護(hù)方式。
概念驗(yàn)證 —— 一切并非表面看到的那樣
直接切入正題,這種攻擊基于以下原理:.sh文件的內(nèi)容很容易檢驗(yàn)其安全性,在瀏覽器中看到的內(nèi)容與通過curl下載的內(nèi)容一樣。這一假設(shè)的問題在用瀏覽器和curl兩種方式用不同的user-agent,因此如果有人知道這點(diǎn)并加以利用將危害這個(gè).sh文件()。
因此,一個(gè)簡(jiǎn)單的概念定義已經(jīng)出來:你可以在GitHub上看全部源代碼或者看POC hosted on Heroku;POC被掛在一個(gè)免費(fèi)的Heroku dyno上,所以如果打不開,很可能是已經(jīng)掛掉了。
為了快速測(cè)試一下,在你檢查了瀏覽器上.sh文件的URL后簡(jiǎn)單在終端上運(yùn)行下面的命令。如果你用curl不是發(fā)出的同一個(gè)user-agent,你得到的結(jié)果將是不同的。
- curl -s http://pipe-to-sh-poc.herokuapp.com/install.sh | sh
解決方案
最簡(jiǎn)單的辦法是每執(zhí)行一個(gè)文件前, 先查看里面的內(nèi)容. 具體的方法有兩種, 道理都差不多, 都是在 curl 之后, sh 之前執(zhí)行; 一旦你發(fā)現(xiàn)有可疑的命令/代碼, 只要把編輯器關(guān)掉, 并確保編輯器退出的時(shí)候, 返回一個(gè)非零錯(cuò)誤代碼. (比如: 在 Vim 中, 你可以使用 :cq 退出). 方法1 需要安裝, 方法2 輸入命令的時(shí)候少打幾個(gè)字. 至于用哪一個(gè), 看你個(gè)人喜好了.
方法1) 由于Vipe 允許你把運(yùn)行編輯器的命令插入 unix 管道中, 查看或修改傳遞給后面程序的數(shù)據(jù). 我們可以使用 Vipe 在 sh 執(zhí)行之前查看文件的內(nèi)容.
- curl -s http://pipe-to-sh-poc.herokuapp.com/install.sh | vipe | sh
Vipe 屬于 themoreutils 軟件包的一部分, 你可以在下列系統(tǒng)中安裝:
-
Mac OSX 用 homebrew:brew install moreutils.
-
Ubuntu 用 apt:apt-get install moreutils.
-
其他 *nix 系統(tǒng), 可以使用軟件源安裝.
方法2) 自己定義 bash 函數(shù). 找到 .bashrc 文件, 然后把下列代碼復(fù)制進(jìn)去保存就可以了:
- # Safer curl | sh'ingfunction curlsh {
- file=$(mktemp -t curlsh) || { echo "Failed creating file"; return; }
- curl -s "$1" > $file || { echo "Failed to curl file"; return; }
- $EDITOR $file || { echo "Editor quit with error code"; return; }
- sh $file;
- rm $file;}
調(diào)用的時(shí)候這么寫:
- curlsh http://pipe-to-sh-poc.herokuapp.com/install.sh
$EDITOR 是你選的編輯器, 它會(huì)在文件執(zhí)行前, 將文件打開, 方便你查看里面的內(nèi)容.
英文原文:Protect yourself from the hidden dangers of `curl <url> | sh`
譯文出自:http://www.oschina.net/translate/protect-yourself-from-non-obvious-dangers-curl-url-pipe-sh