/

眼見為憑?利用終端機特性藏匿惡意指令

前言

對於 Linux 使用者或是軟體工程師來說,終端機是每天必須用到的軟體之一。尤其是那些注重開發效率以及有在維護伺服器的工程師來說,我們都不希望雙手離開鍵盤,分散注意力。這種情況下,當我們要稍微檢視檔案內容時,會使用到以下幾個常用的工具:

  • cat
  • less
  • more
  • vim

然而我們透過工具所看到的檔案內容,可以完全相信嗎?

眼見為憑?

cat

看過上述例子之後,你還敢只用 cat 確認檔案內容嗎?

為何會發生這種事?原因在於終端機本身就會辨認幾個具有意義的特殊字元,你可能用過一些特別的工具可以讓終端機印出有顏色的字,就是利用到這種特性。

那這些特殊字元可以操作終端機的哪些行為呢?

  • 移動游標到任意位置
  • 刪除任意印出的字元
  • 操作終端機視窗
  • 將不同按鍵對應到的終端機行為進行覆寫

上述範例,就是透過移動終端機游標,讓兩行指令都印在同一個位置上(位置重疊,只會顯示覆蓋的指令),如此一來就可以隱藏被覆蓋的指令。

curl

我們換 curl -s 試試

看完這個例子之後,我相信你再也不敢相信肉眼看到的內容。

結論

如果要確認檔案的內容想要用 cat 的話,可以加上參數 v,顯示不可視字元。

以第一個例子來說:cat -v script.sh

1
2
3
4
5
#!/bin/sh

echo "evil!"
exit 0
^[[2Aecho "Hello World!"

^[[2A 就是告訴終端機將游標往上移動兩行,繼續從該位置印出(覆蓋原本的 echo “evil!”)。

可以的話,還是建議使用文字編輯器打開確認內容會比起直接印出內容在終端機來得可信。

如果想要自己測試的話可以使用以下指令

1
2
echo -e '#!/bin/sh\n\necho "evil!"\nexit 0\n\033[2Aecho "Hello World!"\n' > script.sh
chmod a+x script.sh

或是你想深入了解終端機控制字元以及不同終端機的狀況可以參考 Terminal Escape Injection