[廚餘回收] 利用 NuGet 的 Transitive Dependencies 幫我們找到 .NET 專案中的幽靈套件

有一天,我發現我的專案裡面居然有 Newtonsoft.Json,可能有朋友會覺得,它是一個處理 JSON 很知名的套件,專案裡面有它有什麼好大驚小怪的? 可重點是我從來沒有安裝過它啊!

自從 .NET Core 3.1 開始內建 System.Text.Json 之後,我就再也沒有安裝過其他處理 JSON 的套件,那為什麼我的專案裡面會有 Newtonsoft.Json?我們來搞清楚這是怎麼回事?

在古早時候的 NuGet 會將所有相依到的套件全部列出來,雖然無法從介面上知道套件與套件的依賴鏈,但是起碼我們可以清楚地知道專案裡面到底裝了哪些套件?

隨著 Visual Studio 升級,NuGet 也跟著改版,不知道從哪一個版本開始,NuGet 只會列出依賴鏈最上層的套件,套件相依的套件則會被隱藏起來。

就在 2022/08/09 NuGet 6.3 釋出了,這個版本加入了一個 Transitive Dependencies 功能,在專案的 NuGet 套件管理員介面上,會將 Top-level packagesTransitive packages 一起顯示。

在 Transitive packages 的清單裡面,我就發現了 Newtonsoft.Json 在列,而且版本還是 13.0.1 之前的版本。

Newtonsoft.Json 13.0.1 之前的版本被發現有 DoS 的漏洞

但是我還是不知道誰相依了 Newtonsoft.Json? 要找出誰相依了 Newtonsoft.Json,各位如果有時間的話,倒是可以在專案的「相依性」->「套件」裡面,跟剝洋蔥一樣,把套件一層一層展開,總有一天會找到的。

其實還有一個更簡便的方式,那就是打開專案資料夾底下 obj\project.assets.json 這個檔案,直接搜尋目標套件名稱,馬上就能知道是誰相依了它,後續看是要移除?還是要升級?就再去做個處理。

土法煉鋼打造每個工具的時代已經過去了,大多是先搜尋適合的套件來使用,而套件之間有可能互相依賴,當套件之間的依賴關係不是那麼容易被發覺的時候,我們的應用程式就有更高的機會曝露在資安的風險當中,以上,將我們專案中隱含的套件找出來的方式就分享給大家,希望對大家有一點幫助。

參考資料

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學