每次做程式碼掃描,都是等到功能全部寫完了,開發人員才把"整包"程式全部丟去掃描檢測。
如果其中一個地方用錯,就變成整份程式一大堆有類似問題全部都得修正。
而且寫了一堆程式,也不一定知道怎麼修正才是正確的,還要一直拜託掃描人員反覆幫忙檢測,測完也只收到了 "很多風險喔" ,最後還是不知道怎麼改。
如果能在第一個錯誤發生的時候就知道問題,而且當下立刻修正的話,未來就不會再發生。
為了達成這個目的,最好的時機點就是開發人員在寫程式碼的時候,當每寫一行或是每 save 一次,就能夠透過某種機制會自動檢查程式有沒有資安問題。
因為我是寫微軟C#為主,所以先找上了官方文件的 Microsoft 安全性 Code Analysis
https://docs.microsoft.com/zh-tw/azure/security/develop/security-code-analysis-overview
但這一套是跟 Azure DevOps 綁在一起的付費功能
開始使用 Microsoft 安全性Code Analysis的必要條件,符合資格的Microsoft 統一支援供應專案,如下一節所述。
因為只想自己弄玩具起來玩,不想花錢,先列入考慮,再去找找免費方案
循著微軟建議的解決方向,找到了 OWASP網頁中列出的原始碼分析工具
https://owasp.org/www-community/Source_Code_Analysis_Tools
OWASP有在網頁中強調 "我們不為特定軟體宣稱效用,只是整理選擇分析工具的標準和列出常見分析工具而已"
這邊擷取前半段作範例,裡面商業 開源 免費軟體都有,底下的參考文件也有列上包含整理自 nist 的掃描工具
依照 OWASP 的列表,找到其中一個 Security Code Scan ,前身叫做 .NET Security Guard,更早以前則是 Roslyn Security Guard ,是可以掃C#程式碼的
安裝上可以選
我先選了跟Visual Studio 整合 (2019以上才能用)
可以連到 VisualStudio市集的官方下載點 下載後執行
也可以在 Visual Studio 內安裝,以 Visual Studio 2022 的介面為例,選延伸模組 (X) > 管理延伸模組(M)
在跳出來的視窗左側選到線上後,在右上角的搜尋視窗輸入 SecurityCodeScan
用上述方法安裝後,只要開啟程式專案,檢視其中一段程式碼,就會自動掃描
例如這張圖的例子,可以看到因為沒有加上CSRF防護,所以底下跳出了提醒 SCS0016
在 Visual Studio 安裝並且執行的話,可以直接點擊 SCS0016 的連結後,會描述風險原因以及修正方式
以這邊來說,就是在 View 上增加 @Html.AntiForgeryToken() ,並在 Controller 前面加上 [ValidateAntiForgeryToken] 即可
這個方法我自己沒有很喜歡,我期望的是開發環境的整合,所以這個就沒實作了
開啟 cmd 或 powershell 後,貼上來自 [security-scan 官方nuget]的訊息(https://www.nuget.org/packages/security-scan/)
這邊用的是
dotnet tool install --global security-scan --version 5.6.2
輸入後執行情形如下,可以看到成功安裝的訊息
順便一提, global 全域安裝 的安裝路徑會在這個位置
OS | Path |
---|---|
Linux/macOS | $HOME/.dotnet/tools |
Windows | %USERPROFILE%.dotnet\tools |
安裝後可能會有下面這個訊息,可以複製 setx PATH 那一行照著輸入就好
因為是 global 全域安裝,之後就可以直接在 cmd 輸入 security-scan.exe 看看說明文件
第一次試著跑了一次以後,看到錯誤訊息如下
會出現 Msbuild 失敗是因為我的專案是 dotnet framework 4.8的版本,官方說明有提到如果是 dotnet framework 4.x 的版本,請在 github 下載這個檔案再掃描 security-scan4x.zip
另外我也有在找到 security-code-scan github 其中一個 issue,發問的人說他的硬碟有這個檔案,認為可能是 bug,底下回應建議他 ignore-msbuild-errors 。但我的情況跟這個無關。
順利掃描的話,畫面就像這樣子
以上面的掃描報告為例,有 3 個warnings
Found: HomeController.cs(97,23): warning SCS0016:
Found: Web.config(25,1): warning SCS0023:
Found: Views\Web.config(36,1): warning SCS0023:
但實際上只有 2種類型 SCS0016 和 SCS0023
可以用關鍵字去找對應的修復方式,在官方網站 Security Code Scan 也可以看到修復方式
以 SCS0016 為例,會在 Solution 的地方看到
view 要增加
@Html.AntiForgeryToken()
controller 要增加
小朋友才做選擇,大人當然是我全都要!
兩種方式各有優缺,因此兩種都推薦裝起來,掃就對了!
資安