關於安全性,pip 使用者的想法

問題

我們想了解 pip 使用者在使用 pip 安裝套件時,對於安全性的想法。

跳至建議內容

研究

我們詢問參與者,他們在安裝含有 pip 的 Python 套件、以及他們所建置的軟體時,對於安全性及完整性的行為和慣例是什麼。

我們詢問參與者,他們會多久執行下列動作:

  1. 對使用 pip 安裝的 Python 軟體進行程式碼審查

  2. 考慮自己安裝的 (Python) 軟體 (使用 pip) 的安全性與完整性

  3. 考慮自己建立的 (Python) 程式碼的安全性與完整性

結果

對研究參與者而言,他們安裝 (51%) 和製作的 (71%) 軟體的安全性及完整性雖然很重要,但使用 pip 審查套件或程式碼的人數少於 7%。

這是因為時間不足以審查大型套件、缺乏專業知識、仰賴廣泛採用的 Python 套件、預期 pip 會自動檢查雜湊,以及依賴 Python 社群來擔任預警機制。

這樣的行為在所有類型的使用者,以及軟體開發經驗的基準中都很常見。

這些結果(尤其是缺乏審查套件的專業知識)符合整體發現:大多數 pip 使用者並非「傳統受過訓練的」(例如,正式學習過軟體開發)軟體開發人員,因此缺乏軟體開發實務的專業知識和/或正式訓練。

維護者預期使用者會思考和擔心的內容,與使用者實際上擔心和思考的內容之間存在鴻溝。目前,pip 讓使用者在安裝的軟體方面「自求多福」。這並非批評,而是一個觀察結果。

對問題的回應:在使用 pip 安裝任何 Python 軟體之前,我會執行程式碼審查

絕大多數參與者(82%)不會(很少或從來不)使用 pip 安裝軟體套件時執行程式碼審查,原因如下。

在使用 pip 安裝任何 Python 軟體之前,我會執行程式碼審查

回應次數

我一直做

3

我常常做

9

我很少做

66

我從不做

68

我不確定這句話的意思

5

沒有意見

13

參與者總人數

164

對問題的回應:我會想到我安裝的軟體的安全性與完整性

screenshot of responses to question about security

絕大多數參與者確實會想到他們安裝的軟體的安全性與完整性,不同於關於程式碼稽核的回應,有些參與者嘗試驗證他們安裝的軟體的安全性與完整性。

大多數嘗試都是由有軟體開發經驗的人執行的,但在有些情況下,人們會放棄。

那些未受過傳統訓練的軟體開發人員不知道從何開始。

這兩群人都找出了他們的「影響範圍」,並盡力涵蓋這個範圍。

使用者關於安全性的想法

作者責任

花費很多時間撰寫 Python 程式碼(無論是為社群或作為工作的一部分)的參與者,都對他們撰寫的程式碼對使用者表達了責任,會撰寫公開發布程式碼的人表達了更強烈的責任感。

他們會想到這個軟體將會在何處使用、會由誰使用,以及可能的攻擊面。

「在基礎的層面來說,我必須想到攻擊面。如果我在撰寫程式(軟體),我必須關心這些。我必須回答電子郵件!在我發布到 pypi.org 的程式碼中,我會加倍考慮。人們可以用這段程式碼做什麼事情?我是否做得很好,那是另一回事!我發布或讓它 [公開] 可用時,我意識到了這一點。我是否做得很棒,那是另一回事!我發布或讓它 [公開] 可用時,我意識到了這一點。我依賴社群資源,與 Python 安全相關的,我追蹤安全人員的網誌、Twitter。我使用 Hypothesis 執行模糊測試。我也依賴已制定的安全政策和回報機制。我避開加密,我依賴其他人。Python 社群具有一定程度的知識,我積極參與其中。如果發生了什麼事,我會聽到的。我使用 Twitter,如果發生了什麼事,在早上我可能會花一些時間找出發生了什麼事。我對生態系統有很大的信心,相信它會自我療癒。只要你不偏離得太遠(使用奇怪、不常見或新的套件),那會有更好的安全感。- 參與者(資料科學家轉為 Python 開發人員)

對,因為我對此負有責任。如果問題出在我的程式碼,而且我交付了一些東西,然後他們遭到攻擊。我會混不下去。- 參與者(專業 Python 開發人員和培訓師)

依賴軟體套件

參與者也說明了他們依賴程式碼安全掃描和檢查軟體套件。

「我使用 linters(Bandit),掃描自己建立的程式碼,一旦出現問題,就會升起紅旗。」

「我使用 Hypothesis 進行模糊測試。」

仰賴良好的軟體開發方式

少數受訪者 ### 研究受訪者的選擇性引言說明他們實施良好的軟體程序,有助於撰寫安全的軟體。

「我們有一本關於程式碼道德的書籍,需要強制認證。」

「我仰賴既定的安全政策和回報機制,避免接觸密碼學,依賴其他人。」

於使用 pip 的雜湊檢查功能的使用者當中

  • 一人認為錯誤訊息「過於煩人且響亮」,而且難以比對檔案名稱和雜湊。

  • 另一人則認為明確固定雜湊的流程過於冗長(尤其是對於依賴項)。

有一位使用者提到他喜歡 NPM 稽核,希望在 Python 生態系中看到類似功能。

缺乏時間

缺乏時間執行套件程式碼和依賴項的稽核,被列為非常常見的原因。在多數情況中,受訪者將 Python 程式碼用作達成目標的方法。

缺乏執行稽核的專業知識

缺乏稽核軟體的專業知識或認知,主要是由於受訪者的專業領域並非軟體開發。然而,受訪者是「傳統」軟體開發人員時,缺乏專業知識也是未執行稽核的常見原因。

只使用廣泛使用且已建立良好的套件

使用已經建立良好且品質優良的套件是所有類型的受訪者(專業的 Python 軟體開發人員與將 Python 用作工具的人員)之間的共同原因。

使用者定義的「建立良好且品質優良的套件」

  • 存在多年

  • 受社群或產業中的人員歡迎或普遍使用

  • 有應對能力強的維護人員

  • 由受訪者聽過的人維護

  • 有數百或數千名使用者

  • 進行中的開發(許多公開問題、分支和 Github 星數)

  • 公開透明地進行開發

  • 其歷史記錄已知,或可以公開取得

仰賴 Python 社群找出問題

仰賴社群找出問題並公開,「眼睛越多,漏洞越少」。

「我很少進行程式碼稽核。大部分時間我依賴社群的意見。我會觀察維護人員數量。這或許不是良好作法,但我沒時間逐一檢查程式碼。」- 受訪者 240315091

僅使用內部套件

「我只安裝內部套件,所以我不用擔心這個。」

這個主題比較少見,主要出現在大型軟體開發環境或高度重視安全性的環境中。

預期 pip 會稽核套件

一些使用者期望/假設 pip (和 PyPI) 應該「保護」他們免於惡意行為者,例如自動檢查雜湊值,或偵測惡意套件。

「如果我自行下載套件,我會檢查雜湊值;如果是透過 pip 安裝,那我不會。我期望 pip 負責這個工作。如果它沒有這麼做,我會很驚訝。每個套件管理員都會比對下載的內容與雜湊值。Pypi 上已經知道這些雜湊值。」- 受訪者 240312164 (核子物理學家)

其他值得注意的評論

「從來沒有。我應該做,但我從來沒有 [稽核程式碼]。我不會偏離正道,我規避風險。我會安裝已經良好的套件。我認為我的風險層面不大。我沒有時間或資源來稽核它們。我對生態系統有足夠的信心,相信它會自發做稽核。如果在知名套件中出現任何問題,社群就會大聲抗議。而且無論如何,程式碼稽核都無法找出問題。」- 受訪者 240326752 (專業 Python 開發人員)

「在私人層面(工作上),程式碼是內部開發的。我不會稽核 pypi 上的程式碼,因為沒有時間稽核其依賴性,而我信任它。我知道幾年前它們曾發生過安全漏洞,但這種事情並不多見。我知道他們不會稽核任何東西,但我仍然不會稽核程式碼。」

「我不知道如何 [稽核程式碼],而且我正在為自己寫這些東西。它會正常運作或是不會。有時候我會安裝 2 或 3 個套件,然後發現我需要安裝其他東西。如果它無法運作,我就會繼續往前進。最後的辦法就是我自己撰寫程式碼。」

「我非常信任,Python 是開源的,我假設如果套件在 pypi.org 上,它應該是沒問題的。我先生安裝套件,然後再檢查它。我是透過釐清需求找出套件,我們在網路上搜尋它,查看文件,然後安裝它,再確認它是否符合需求」- 受訪者 240278297

「如果我要安裝軟體套件,一定有我的理由。我想用 PyEphem 計算月亮的方位角和高度角。做個程式檢查?我才不要呢。我做的內容大多都很普通。因為需要符合相依性關係,所以我才安裝。我不會做程式檢查。我才不管。我從來都不這麼做,但這是其中一件事——這個 pypi 上的軟件套件,是不是我在 Github 上看到的確切來源?你可能會得到以不同方式散布的檔案。可能是我太害怕找,所以(我沒有這麼做)。 естьли это вещь что пип проверяет хэш (пакеты) - так что это такая фича для защиты от этого. хэш от чего? Понятия не имею. Он находится в локальной установке Python.」- Участник 240426799 (системный администратор)

「沒有 [我不會檢查程式碼]。[笑] 因為,在安裝軟體套件以前,我不會去讀好幾千行的程式碼。天啊。[..] 我根本找不到。我權衡一下——老實說那個套件有多熱門,GH 上有多少星。pypi 沒有任何使用者介面可以告訴我它有多少下載量。如果有,我就會去用。」- 參與者 240386315(IT 管理員)

「嗯,我沒有做像數值 Python 這種東西程式碼檢查的背景。我用的大部分套件都很龐大。除了維護人員,大多數人都沒有做這些套件的程式碼。我依賴 Pip 中的任何內建功能來執行套件安全性。我也假設如果有漏洞,有人會發現並讓全世界知道。我真的很懶惰。」- 參與者 240312164(核子物理學家)

「我想要一些安全顧問,就像 npm 中的——在安裝軟體套件時,它執行得非常好「這個套件的安全性存在漏洞——1 個低風險、5 個中等風險、8 個高風險漏洞。我沒有遇到過 Python 套件安全性問題。」- CZI 大會研究參與者

建議

提供套件安全性指南或稽核機制

在研究期間,少數參與者 (3-4 人) 提及NPM 稽核指令作為評估套件安全性的好方法的範例。它可能提供一種模式,說明如何滿足此使用者的需求。

自動檢查套件雜湊

設情況下,pip 應在安裝時檢查套件雜湊,並提供使用者關閉此行為的方法。

如果沒有雜湊可用,pip 應警告使用者並提供建議——從最簡單到最進階。

回報可疑套件的機制

使用者應具備回報可疑或惡意套件/行為的機制。建立此機制地點應進行討論。最少應提供供使用者在 pypi.org 上標示套件的機制。

透過 easier to understand 改進 pip 活動的輸出  

目前 pip 的輸出令人不知所措,儘管包含大量資訊,但使用者幾乎無法理解這些資訊,意思隱藏在「文字牆」中。

Pip 的輸出必須重新設計,在適當的時間提供給使用者適當的資訊,包括安全警告。