避免使用 system() api

避免使用 system() api

我們有一個遺留的 C 程式碼,用於允許權限較低的使用者以升級的權限執行自訂腳本。這已設定 SUID 位元。此程式碼將 PATH env 限制為特定資料夾,然後使用system()api 透過受限 shell 執行腳本:

/bin/bash -r -c "script <arg>"

由於路徑受到限制,它只能執行該特定資料夾中的腳本。

現在知道了api命令注入的所有陷阱system(),可以採取哪些措施來避免命令注入?這在各種腳本等的許多地方使用,所以不想做一個全新的實現以避免任何回歸。

答案1

因為很難做到正確,所以我建議刪除程式碼中的 SUID。更改您的 C 程式碼以使用sudo.透過使用 sudo 來完成安全系統編程的困難方面。

然後,您可以使用 visudo 仔細建立 sudo 配置,該配置執行執行任務所需的最低限度,並將其限制為所需的使用者/群組。配置 sudo 後,請除您之外的其他人對其進行測試並嘗試打破預期的限制。

答案2

程式碼注入要求使用者能夠將任意字串作為參數傳遞給呼叫system()。這與 SQL 注入非常相似,應該以類似的方式避免:不要將任何使用者定義的字串直接傳遞給呼叫:

  • 數字參數應轉換為整數,然後在呼叫時轉換回字串

  • 屬於固定字典的參數應轉換為「枚舉」值或類似值,然後在呼叫時傳回字串

  • 自由文字輸入應盡可能限制為無害的字元集(例如[a-zA-Z0-9]*)。當需要有問題的字元(包括空格)時,應套用適當的轉義(即a b應替換為a\ b等)

相關內容