分析:把代碼漏洞攔在合并前)
Semgrep 靜態(tài)分析把代碼漏洞攔在合并前【免費(fèi)下載鏈接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/se/semgrep提測(cè)前才靠人肉翻代碼翻出一段手拼 SQL 的接口——這類(lèi)問(wèn)題往往不在顯眼位置而是藏在角落的分支里。Semgrep 靜態(tài)分析工具就是干這個(gè)的用長(zhǎng)得像源碼的模式描述檢查項(xiàng)在本地把 bug 變體掃出來(lái)讓問(wèn)題停在合并之前。你可以把它當(dāng)成語(yǔ)義化的 grep搜x 1; y x 1它不會(huì)只匹配字符串2。它支持 30 多種語(yǔ)言?huà)呙柙诒镜赝瓿纱a默認(rèn)不上傳。一個(gè)人想在提 PR 前快速自查或團(tuán)隊(duì)想把編碼約定固化成檢查都能直接上手。 第一條掃描命令怎么跑安裝只有一行pip install semgrep這條命令直接裝好現(xiàn)成的二進(jìn)制包不需要從源碼編譯。裝完可以用semgrep --version確認(rèn)版本。然后指著你想檢查的目錄跑第一條掃描semgrep scan --config auto .auto會(huì)從官方規(guī)則庫(kù)拉一套默認(rèn)規(guī)則集并自動(dòng)識(shí)別項(xiàng)目語(yǔ)言。不用先寫(xiě)規(guī)則就能立刻看到結(jié)果。掃描輸出怎么讀輸出分三層順序看就行頂部每種語(yǔ)言加載的規(guī)則數(shù) × 目標(biāo)文件數(shù)。某個(gè)文件沒(méi)被掃到多半先在這里找原因。中間進(jìn)度條表示掃描任務(wù)走到哪。Findings每條問(wèn)題給出規(guī)則 ID、文件、行號(hào)附一句解釋。按 severity 處理ERROR必修WARNING建議修INFO可以緩一緩。想把結(jié)果接進(jìn)自動(dòng)化流程加--error參數(shù)有任何發(fā)現(xiàn)就返回非零退出碼腳本可以直接拿來(lái)判斷。?? 什么時(shí)候需要自己寫(xiě) Semgrep 自定義規(guī)則官方規(guī)則覆蓋常見(jiàn)安全問(wèn)題但團(tuán)隊(duì)的約定各不相同。比如禁止 print()強(qiáng)制走日志這種內(nèi)部檢查寫(xiě)成 YAML 只要五行- id: no-raw-print languages: [python] pattern: print(...) message: 用 logging.debug() 代替 print() severity: WARNING把這條規(guī)則放進(jìn).yaml文件的rules:下面掃描時(shí)用--config指向它。關(guān)鍵在pattern它和源碼長(zhǎng)得一樣...是通配參數(shù)名可以用$X占位。把 pattern 換成open(..., w)就是一條新規(guī)則。比記正則或啃 AST 的成本低得多。規(guī)則和一段測(cè)試代碼并排放著能立刻看出 pattern 命中了哪一行改完就能驗(yàn)證? Semgrep CI 配置問(wèn)題怎么在合并前被攔下手動(dòng)掃描靠自覺(jué)放進(jìn)流水線(xiàn)才能保證每次都跑。最短配置就兩行在流水線(xiàn)里指定官方 Actionconfig填auto。背后的機(jī)制很簡(jiǎn)單掃描發(fā)現(xiàn)有問(wèn)題就返回非零退出碼構(gòu)建直接失敗合并被卡住。問(wèn)題在評(píng)審前就暴露出來(lái)修復(fù)的還是提交者本人上下文最熱。想更精確一點(diǎn)把本地的semgrep scan換成semgrep ci子命令它只報(bào)本次 PR 引入的問(wèn)題歷史遺留不會(huì)一直追著你不放。? 三個(gè)常見(jiàn)情況現(xiàn)象、原因、處理現(xiàn)象掃描跑完了某個(gè)目錄完全沒(méi)有結(jié)果。原因目錄被默認(rèn)忽略規(guī)則排除node_modules、.git之類(lèi)或者該目錄的語(yǔ)言沒(méi)有任何規(guī)則匹配。 處理先看輸出頂部每種語(yǔ)言的文件數(shù)確實(shí)要掃用--include顯式指定路徑?,F(xiàn)象規(guī)則文件加載報(bào)錯(cuò)指向某一行。原因規(guī)則不符合 schema常見(jiàn)是漏了severity或 pattern 寫(xiě)法不被識(shí)別。 處理先跑semgrep scan --validate --config 你的規(guī)則.yaml校驗(yàn)按提示修好再正式掃?,F(xiàn)象CI 一直紅本地掃描卻是干凈的。原因兩處規(guī)則集版本不一致或者 CI 掃的是整個(gè)分支、本地只看改動(dòng)文件。 處理固定規(guī)則集版本CI 側(cè)改用semgrep ci子命令只關(guān)注本次 PR 引入的問(wèn)題。延伸入口內(nèi)置安全規(guī)則集Python、JavaScript、Java 等多語(yǔ)言的現(xiàn)成規(guī)則文件單文件示例Python 安全規(guī)則帶 metadata、fix-regex 的完整規(guī)則寫(xiě)法規(guī)則格式定義規(guī)則報(bào)字段不認(rèn)識(shí)時(shí)先查這里scan 子命令源碼上文所有參數(shù)的入口規(guī)則測(cè)試用例集倉(cāng)庫(kù)自己怎么驗(yàn)證規(guī)則匹配的【免費(fèi)下載鏈接】semgrepLightweight static analysis for many languages. Find bug variants with patterns that look like source code.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/se/semgrep創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考