題:
我如何能夠“審核”我編寫的超過12萬行以上的Composer PHP代碼?
Paranoid Android
2019-12-09 07:28:05 UTC
view on stackexchange narkive permalink

我依靠PHP CLI來處理各種個人和(希望很快)專業/任務關鍵型“業務邏輯”。 (這可能是任何其他語言,並且完全相同的問題仍然存在;我只是在說明自己是為了上下文而使用的語言。)

在盡可能最大的程度上,我總是在上面編寫所有代碼我自己的。只有在絕對必要時,我才勉強使用第三方庫。對於某些事情,這只是必要的。例如,電子郵件解析和其他類似的非常複雜的東西。

對於管理此類第三方庫,我使用 PHP Composer。這是PHP的庫管理器。它能夠下載庫及其依賴項,並使用類似於其他“包管理器”的命令來更新它們。從實際意義上講,這比手動跟踪和手動下載ZIP文件並解壓縮並處理各種問題要好得多。至少可以避免很多實際的麻煩。

,最基本的安全問題仍然存在:我不知道這個“安裝”了什麼代碼包含,也不知道每次更新都添加/更改了什麼。當我的Composer獲取更新時,庫的一位作者可能很容易受到損害,導致我的PHP CLI腳本突然將我的Bitcoin wallet.dat發送到某個遠程服務器,在我的機器上安裝了RAT /特洛伊木馬,甚至更糟。實際上,這可能已經發生了,我再也不明智了。我根本不知道。從邏輯上講,我沒有任何想法。

我自己的代碼庫總計約15,000行。我花了一年多的時間才認真地研究該代碼庫。這是我寫的代碼,我很了解...

我的“ Composer”目錄樹當前位於 超過120,000行代碼 。這是我需要的 crucial 個PHP庫的 minimum 個。我使用的很少,但是它們具有各種依賴性,與我自己的代碼相比,它們總體上會非常膨脹/膨脹。

我怎麼應該“審查”所有這一切?!這根本不會發生。嘗試後不久,我就會“分區”。我什至不知道我將如何通過我自己的代碼的另一輪“審核”,更不用說這是其他人編碼的10倍大的代碼了。

我花了無數個小時試圖學習 Docker,看看是否有辦法以某種方式“封裝”這些不受信任的第三方庫,但這是一場失敗的戰鬥。我發現完全不可能做到這一點,或者就此回答我的許多問題。我什至不認為這是我想像中的方式。

評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/102194/discussion-on-question-by-paranoid-android-how-am-i-ever-going-to-be-能夠勝任)。
六 答案:
Lie Ryan
2019-12-09 09:28:21 UTC
view on stackexchange narkive permalink

您不能審查單個代碼行。您會死於嘗試這樣做。

在某個時候,您必須信任其他人。 1984年,許多Unix的共同發明者之一肯·湯普森(Ken Thompson)寫了一篇關於 trusts的局限性的簡短文章。在某些時候,您確實必須信任其他人,您必須相信,編寫文本編輯器的人不會自動隱藏一些PHP解釋程序將執行的Trojan代碼,這些代碼將被執行為竊取比特幣的惡意軟件。

在大多數情況下,您應該儘自己最大的努力來審查代碼的作者,項目的內部安全實踐以及如何對代碼進行審查。代碼到達您。審查代碼實際上是昂貴且艱鉅的,因此應將其保留給您認為對您的項目最重要的部分。

該圖書館是受歡迎的圖書館嗎?背後的知名項目負責人?項目是否具有適當的項目管理流程?圖書館是否有安全問題的良好歷史記錄,它們是如何處理的?它是否具有測試以涵蓋其需要處理的所有行為?它可以通過自己的測試嗎?這樣就降低了在沒有任何人注意的情況下破壞庫的風險。

請獲取一些示例文件以進行更深入的審查。你看到有關那裡的事嗎?如果您拿走的幾個文件有重大問題,則可以推斷出代碼庫的其餘部分也有類似的問題。如果它們看起來不錯,則可以增強您對其餘代碼庫的編寫類似的信心。請注意,在非常大的代碼庫中,代碼的不同區域將具有不同級別的代碼質量。

您的包管理器存儲庫是否檢查包簽名?是否需要預先審核系統才能將軟件包註冊到資源庫中,還是開放的註冊資源庫?您是否以源代碼形式或預編譯的二進制形式接收該庫?這些都會影響您對庫的信任程度,風險因素以及如何進一步提高信任度。

您還必須考慮應用程序以及應用程序將在其上運行的執行環境。這是國家安全代碼嗎?這個代碼處理是電子商務或銀行處理信用卡號碼的一部分嗎?此代碼是否以超級用戶身份運行?該代碼壽命/安全性至關重要嗎?您是否具有補償控件來隔離和運行具有不同特權(例如容器,VM,用戶權限)的代碼?這是周末項目的代碼嗎?如何回答這些問題,應該讓您定義一個預算,以便可以在審查代碼上投入多少資金,從而確定如何對哪些圖書館需要審查,在什麼級別進行優先排序以及哪些圖書館需要較低的信任度進行優先排序。

關於信任的文章在您可以使用經過正式驗證的編譯器來引導更有用的工具鏈而無需擔心編譯器插入的後門程序的時代中並不重要。
@forest:仍然和現在一樣重要。誰進行正式驗證,以及他們使用哪些工具進行驗證?如果經過正式驗證的編譯器和用來驗證編譯器的證明助手也都被借殼了怎麼辦?一直都是烏龜。
至少,您可以手動進行驗證,以編譯能夠理解C子集的非常輕量級的編譯器。您還可以手動審查非常小的編譯器的彙編(或自己編寫)。彙編非常簡單,您無需信任彙編器就可以手工完成。
@forest:您怎麼知道您使用的文本編輯器/反彙編器/十六進制轉儲工具也不是後門程序?
將其存儲在足以使用SPI讀取器的介質上?當您擔心邏輯分析儀硬件被後門時,您正在進入[編碼機]的科幻領域(https://www.teamten.com/lawrence/writings/coding-machines/)。
儘管有@forest與後門SPI讀取器的不同之處,但您的論點並沒有改變答案的重點,即*在某些時候您必須信任其他人*。您的意思本質上是您*應該*信任他人。在任何情況下,對於大多數人來說,使用SPI讀取器來驗證小型編譯器的彙編,然後使用該編譯器來編譯完整的編譯器,然後使用該編譯器來編譯完整的工具鏈,都是不太可能的實用解決方案。
@forest您怎麼知道您的圖形卡沒有在您身上開採比特幣?您怎麼知道您的網卡沒有記錄所有數據包並將其發送到其他地方?信任一直延伸到硬件級別。 即使您構建自己的網卡,您對構建這些基本組件的原始知識有什麼真正了解?您是否要重新發現50年的技術進步?
@JonBentley處理器微代碼。物理晶體管(Intel HRNG是後門的)。
@Cruncher即使您是用自己的芯片從矽片上構建自己的網卡,又怎麼知道ISP的某個人沒有嗅到您的數據包呢?我要說的不是你必須信任別人。從某種意義上說,您已經在信任別人了。如果您完全使用互聯網,則意味著您隱含地信任著數十億人也使用互聯網。畢竟,每個人都可以ping您。
@Cruncher我可以監視圖形卡的電源使用情況(我確實這樣做了,但出於其他原因)。而且我的網卡不屬於我的TCB。無論如何,我的總體觀點是,您並非嚴格地_需要_信任編譯器,而是可以驗證_anywhere_不存在任何後門。
-1
推理的這一點可能是對seL4 ARM組裝的驗證。seL4團隊已對其OS代碼及其編譯的彙編代碼(如果由“明智的” ARM編譯器編譯)進行了形式證明。您可以看到它花費了多少工作,然後可以查看他們的文檔,這些文檔描述了[他們的假設](https://sel4.systems/Info/FAQ/proof.pml),並將它們與我們今天所關注的問題進行比較安全。我喜歡指著他們,因為ELSE曾做過這項工作,我可以指出說:“瞧,我們不想這麼做!”
@LieRyan是一名採用正規方法攻讀博士學位的學生,我對您“誰進行驗證...”的回答是“幾乎沒有人”。全世界最多只有數千人在做FM。
Spudley
2019-12-09 20:04:26 UTC
view on stackexchange narkive permalink

我的“ Composer”目錄樹當前有超過120,000行代碼。那就是我需要的最少數量的關鍵PHP庫。

您的錯誤是試圖像對待您自己的代碼一樣審查第三方代碼。您不能也不應該嘗試這樣做。

您沒有按名稱提及任何庫,但是我將假定其中有相當一部分是因為您正在使用一個較大的框架,例如 Laravel Symfony。像其他主要圖書館一樣,此類框架也有自己的安全團隊;問題得到快速修補,並且安裝更新很簡單(只要您使用的是受支持的版本)。

與其嘗試自己審查所有代碼,還需要放手並相信供應商已經擁有了完成-並將繼續為您進行審核。畢竟,這就是為什麼使用第三方代碼的原因之一。

實際上,應該將第三方PHP庫與在編譯後對待第三方庫的方式完全一樣。 .NET或Java之類的環境。在那些平台上,這些庫以DLL文件或類似文件的形式出現,您可能永遠也看不到源代碼。您無法審核它們,也不會嘗試。如果您對PHP庫的態度與此不同,那麼您需要問問自己為什麼。僅僅因為您可以讀取代碼並不意味著您從中獲得任何好處。

所有這些都歸於失敗的地方當然就是您的第三方庫中包含較小的庫。不支持或沒有安全策略。因此,這就是您要使用的所有庫的問題:是否完全支持它們,並且它們具有您滿意的安全策略。對於任何沒有的庫,您可能要考慮尋找這些庫的替代方法。但這仍然並不意味著您應該嘗試自己審核它們,除非您實際上打算取代對它們的支持。

不過,我要補充一件事:如果您要對PHP代碼進行安全審核,強烈建議您使用 RIPS掃描器。它並不便宜,但是如果您有很強的安全性要求,那麼它很可能是您可以從PHP獲得的最好的自動化安全性分析工具。絕對在您自己的代碼上運行它;您可能會驚訝於它收到了多少個問題。如果您很偏執,當然也可以在第三方庫上運行它。不過,這將花費您更多的錢,而我的上述觀點仍然成立。您確實應該信任您的第三方供應商為自己做這種事情。

+1,如果您不願意信任主要的知名框架,那麼您會遇到更大的問題,因為您也不應該信任自己的操作系統,軟件,固件,硬件等。
@FrankHopkins不一定。如果您為那些僅“方便使用”的依賴項重新發明輪子,則會冒引入第三方庫中不存在的安全漏洞的風險(該漏洞可能是由經驗豐富的開發人員開發的,並且需要進行更多審查))。
這就是為什麼我說@JonBentley最小化對您所需要的依賴的原因。如果您進行加密,則肯定需要這些加密庫。但是您可能不需要大型框架-除了很多其他東西之外-它可以為您提供方便的數據庫訪問。也許有一個已經為您提供幾乎一樣方便的數據庫工具的庫,那麼這可能是更好的選擇。除非它是如此未知,否則您是唯一使用它的人。等等,這始終是權衡另一個問題的方法,但是大型框架“總是”存在一些被忽視的問題,這些問題將在某個地方被利用。
Machavity
2019-12-09 21:29:17 UTC
view on stackexchange narkive permalink

歡迎使用新的編碼範例:您在庫之上使用庫。您並不孤單,但是您還需要了解,每當您引入未編寫的代碼時,都會帶來一定的風險。

您的實際問題是我該如何應對這種風險?

了解您的軟件應該做什麼

通常,庫管理器成為一種方便的方式來將代碼拍打成“可行”的方式,而無需打擾從高層次了解它應該做什麼。因此,當您信任的庫代碼做壞事時,您會措手不及,想知道發生了什麼。這是單元測試可以提供幫助的地方,因為它可以測試代碼應該執行的操作。

了解源代碼

Composer(或任何程序包管理器) )可以從您指定的任何來源進行安裝,包括昨天由一個完全未知的來源匯總的庫。我願意從具有SDK的供應商那里安裝軟件包,因為該供應商是高度受信任的來源。我還使用了來自其他可信任工作源的軟件包(即,PHP項目中的某個人有一個庫回購)。盲目地信任任何來源都會給您帶來麻煩。

接受存在一些您無法完全緩解的風險

在2016年,一個NodeJS開發人員癱瘓了很多軟件包當他們退出該項目並要求其圖書館不公開時。他們有一個簡單的庫,其中有數百個其他軟件包列為依賴庫。也許該基礎結構不是為處理軟件包分發而構建的,所以它隨機失效。互聯網在分佈式軟件開發世界中已經非常擅長“使事物正常工作”,以至於人們在停止工作時往往會感到沮喪或困惑。

當PHP 7.0發佈時,我不得不做大量的工作來製作我們在7.0環境中使用功能的開源第三方軟件包。我花了很多時間,但是我能夠幫助該軟件包的作者解決一些問題,並使它在7.0環境中可用。替代方案是替換它……這將花費更多時間。我們接受這種風險是因為該軟件包非常有用。

商定,每一段代碼都有相關的風險,包括操作系統和編譯器。
user116960
2019-12-10 09:50:04 UTC
view on stackexchange narkive permalink

但是,最基本的安全問題仍然存在:我不知道此“已安裝”代碼包含的內容,也不知道每次更新都添加/更改了什麼。當我的Composer獲取更新時,庫的一位作者可能很容易受到損害,導致我的PHP CLI腳本突然將我的Bitcoin wallet.dat發送到某個遠程服務器,在我的機器上安裝了RAT /特洛伊木馬,甚至更糟。實際上,它可能已經發生了,我再也不明智了。我根本不知道。從邏輯上講,我沒有任何想法。

查找 Heartbleed,這是OpenSSL中的巨大安全漏洞。 Heartbleed通過首先將最後幾百個(網絡加密的)事務保存為純文本,然後為知道它的任何人提供了一個簡單且未記錄的工具來進行遠程連接並檢索用戶認為的所有內存緩存事務,從而有效地使SSL失效已以純文本格式安全加密。到那時,OpenSSL可以保護絕大多數自託管網站,大量銀行甚至政府情報服務。

然後查找 Meltdown Spectre,這是現代英特爾CPU中內置的大量錯誤。 Meltdown和Spectre完全抵消了在保護模式下運行CPU的能力,並且與操作系統無關,可在每個操作系統上使用。

幾年前,一個名為 MSBlaster的惡意軟件利用了一種Windows XP後台服務(我什至不知道這是一個錯誤-只是一個非常愚蠢的),甚至沒有業務在運行默認情況下-只有絕大多數Windows用戶會積極使用它,然後IT部門才能知道。最終,這促使ISP發布了內置在其調製解調器設備中的硬件防火牆,並促使Microsoft將內置的軟件防火牆嵌入其操作系統中。大約在同一時間,發現所謂的“防病毒” Linux平台發行版在主要發行版本中包含內置的rootkit。

正如其他人所說:您必須信任某人點。事故和惡意都會造成問題。我就像你- X-Files Uplink 的忠實擁護者(TRUST Noone!)-但是現實是,您的SSL加密引擎或您的物理硬件設備可能存在安全漏洞,而當它們出現時,它們更可能代表關鍵任務故障。

如果您認真努力為您和用戶的安全性重新發明Composer滾輪,則認真考慮進一步努力:設計您自己的CPU,主板,RAM,HDD和光盤驅動器。編寫自己的操作系統和硬件驅動程序。也製作自己的編譯器。忘了PHP,因為解釋器中可能會出現問題-實際上,也忘了C和C ++,因為編譯器中可能存在問題,甚至不用別人編寫的彙編器來考慮彙編語言。使用十六進制編輯器從頭開始將所有自己的軟件編寫為機器說明。

或者您可以扮演行業成員的角色。訂閱Composer / PHP / YourLinuxDistro的更新新聞通訊,並可能也加入一些基於安全性的獨立新聞通訊,並訂閱 Wired 。查看系統日誌。使用PCAP定期測試您的網絡,以確保沒有任何未經授權的網絡流流入或流出。積極主動地監視可能的威脅,而不要對尚未發生的事情抱有幻想。

好吧,您的第一段中有很大一部分是關於這種錯誤的理解的,並且實際上與該問題無關。底線是一個很好的建議,但是答案會有所減少。最後,您提到的各種漏洞是否存在並不重要。它們相關的原因是它們存在的位置,因此減少關於後門的猜測將使這一點更加清楚。
這確實無法回答問題。您的前5個段落似乎是完整的切線。最後一段更接近主題,但這也是切線。這不是關於如何檢查代碼(預防),而是關於如何從特定威脅中檢測非常特定類型的操作。
我看不到訂閱有線新聞(技術新聞雜誌)會有什麼幫助。
not a hacker trust me
2019-12-12 03:53:27 UTC
view on stackexchange narkive permalink

作為中級到高級開發人員,我已經考慮過相同的問題。需要考慮以下幾點:

  • 優先審閱對於安全性至關重要的代碼。顯然,這將包括身份驗證和登錄代碼,權限驗證,支付處理器集成。任何需要敏感信息或進行網絡呼叫的東西。
  • 在視覺上瀏覽之類的東西,例如樣式庫-您應該能夠快速確定它們僅在進行樣式設置-如實用程序功能。大寫的字符串,空格替換,重新排列數組...您應該能夠快速瀏覽代碼,並看到它們沒有做任何意外的事情。
  • 即使您沒有完全反向工程代碼,就像完全是您自己的,您應該能夠瀏覽源代碼,並確定它是否旨在 對逆向工程友好 。代碼應文檔化,並帶有有用的註釋,變量和方法名稱應相關且有用,功能和實現不應太長或太複雜或包含不必要的功能。 令人愉悅的代碼肯定不是惡意黑客的首選攻擊媒介。
  • 確認該代碼具有已建立且成熟的用戶基礎強>。您想吸引那些獲利且知名的公司使用的項目。
  • 確認主要貢獻者的真實世界身份。對於大型項目,首席開發人員將為他們的工作而感到高興。您應該能夠找到博客文章,社交媒體帳戶,甚至可以找到簡歷或用於諮詢工作的營銷頁面。 與我聯繫!
  • 確認已使用最新錯誤修正 積極維護了 開放源代碼。查看出色的錯誤報告-數量肯定會很少-不要相信聲稱某個特定工具或庫沒有錯誤的說法。
  • 避免帶有過多廣告的“免費”網站。避免使用沒有可用的演示站點的項目,或者該演示“難看”,維護不當或經常脫機的項目。避免過度宣傳的項目或過多的流行語,不要提出未經測試的卓越性能聲明。避免從匿名博客下載。等等。
  • 惡意思考。如果您想破壞自己的網站,該怎麼辦?如果您想將不安全的代碼潛入廣泛使用的庫中,該怎麼辦? (顯然,實際上不嘗試這樣做。)
  • Fork 開源項目,或下載備份。永遠不要相信您喜歡的開源項目的正式倉庫會無限期在線。

因此,與其嘗試分別閱讀和理解每一行代碼,不如了解一下每個庫 做什麼,並且您相信 為什麼 。我真的認為,如果您的工作有利可圖,那麼項目的規模沒有上限。 您可以“審核” 1,200,000多行代碼或120,000,000+行代碼!

knallfrosch
2019-12-10 04:42:52 UTC
view on stackexchange narkive permalink

Composer可以使用 composer.lock 文件,並且默認情況下通過 https://packagist.org/下載軟件包(請注意HTTP S。)因此,您將擁有龐大的軟件包存儲庫以及帶有SHA1校驗和的安全下載,以確保您完全下載了曾經指定的內容。

如果僅是依賴更新的保守派,您還可以期望該軟件包的版本已用於生產環境。

最後,您將不得不信任某人。您可以信任自己編寫無漏洞利用的代碼,也可以像其他人一樣信任成千上萬的社區項目,甚至更多用戶可以看到它。

最後,我不認為您有選擇。如果其他人“盲目地飛行”,即沒有您想要進行的安全審核,並且以較低的價格和更快的功能發布來吸引“您的”客戶,則無論如何,任何人都不會從您的安全自編寫應用程序中受益。

加密的傳輸和校驗和不會告訴您任何代碼實際的功能以及誰對其進行了審核。我可以在5分鐘左右的時間內將一個程序包放到Packagist上,將其標記為v2.5.9,以便於維護,但要使用可以上傳到我選擇的服務器上的盡可能多的數據的代碼來填充它。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...