日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Semgrep代碼靜態(tài)分析工具:使用Docker進(jìn)行簡單查詢

靜態(tài)分析是一個非常有用的工具,使用它可以幫助開發(fā)者或者安全人員在開發(fā)階段就能發(fā)現(xiàn)代碼中存在的bug和安全問題。靜態(tài)分析是一個綜合性和系統(tǒng)性的工程,對于每一個開發(fā)者和安全人員來說了解其原理,并能使用工具進(jìn)行初步的分析很有必要。本文我們介紹一個開源的快速高效的多語言靜態(tài)分析工具Semgrep,通過在Docker中設(shè)置基本Semgrep環(huán)境,并用一些簡單的例子說明其用法。

成都創(chuàng)新互聯(lián)公司專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、夏津網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5技術(shù)成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價格優(yōu)惠性價比高,為夏津等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

概述

諸如pylint的Python或eslint的JavaScript之類的linter非常適合通用的廣泛語言標(biāo)準(zhǔn)。但是代碼審查中的常見問題呢,例如使用打印語句而不是記錄程序,或者在for循環(huán)(特定于Go)中使用defer語句,或者多層嵌套循環(huán)等。

大多數(shù)開發(fā)人員沒有使用語言解析的經(jīng)驗(yàn)。因此,在中小型團(tuán)隊(duì)中看到自定義Lint規(guī)則并不常見。盡管沒有哪一種Linter或語言比其他Linter復(fù)雜得多(全都是AST操作),但是學(xué)習(xí)每種語言Linter的AST和框架要付出很小的代價。

semgrep規(guī)則的一個優(yōu)點(diǎn)是,可以學(xué)習(xí)semgrep模式匹配語法(這非常簡單),然后可以為想要為其編寫規(guī)則的任何語言編寫規(guī)則。

Semgrep使用代碼的標(biāo)準(zhǔn)表達(dá)進(jìn)行模式匹配,而無需復(fù)雜的查詢或者正則??捎糜谠贒evSecOps各個階段:代碼編寫,代碼提交或者CI運(yùn)行時發(fā)現(xiàn)Bug和漏洞。其精確的規(guī)則看起來就像要搜索的代碼,無需遍歷抽象語法樹或與正則表達(dá)式死扛。與傳統(tǒng)的正則表達(dá)式(和傳統(tǒng)的grep)不同,它可以找到遞歸模式。這使其特別有用,可以作為學(xué)習(xí)查找任何語言模式的工具。

Semgrep還支持容器化方式部署和運(yùn)行,由emgrep官方注冊表中,有Semgrep社區(qū)維護(hù)的包安全性,正確性,性能,代碼質(zhì)量和Bug等各方面的1000多規(guī)則可直接拿來使用。

Semgrep軟件安全公司r2c開發(fā)并提供商業(yè)支持。目前已經(jīng)有大量的企業(yè)用于生產(chǎn)環(huán)境中,也有很多工具比如NodeJsScan之類底層支持引擎。

基本準(zhǔn)備

本文中我們所有的例子都需要運(yùn)行docker,并基于semgrep基本鏡像returntocorp/semgrep。docker安裝和配置過程我們不在介紹,首先從docker官方拉一個最新的鏡像備用:

 
 
 
 
  1. docker pull returntocorp/semgrep:latest

semgrep有應(yīng)在線工具(semgrep.dev/editor/),如果沒有docker環(huán)境的同學(xué),可以通過在線工具嘗試?yán)印?/p>

在PHP中發(fā)現(xiàn)eval語句

假如希望腳本在PHP中使用eval函數(shù)時候告警:

php/test.php

 
 
 
 
  1. $var = "var";
  2. if (isset($_GET["arg"]))
  3. {
  4. $arg = $_GET["arg"];
  5. eval("\$var = $arg;");
  6. echo "\$var =".$var
  7. eval(
  8. bar
  9. );
  10. # eval(foo)
  11. echo(eval("\$var = $arg;"));
  12. }

semgrep所有運(yùn)行依賴于一個yml的配置文件config.yml,基本規(guī)則如下:

rules:

 
 
 
 
  1. - id: cc-1
  2. pattern: |
  3. exec(...)
  4. message: |
  5. severity: WARNING
  6. 我們可以在message部分增加警告的內(nèi)容:
  7. rules:
  8. - id: cc-1
  9. pattern: |
  10. exec(...)
  11. message: |
  12. 使用了不安全的exec函數(shù)
  13. severity: WARNING

配置部分還要增加兩個規(guī)則對象中包括兩個鍵:mode和languages。

 
 
 
 
  1. rules:
  2. - id: my_pattern_id
  3. pattern: |
  4. exec(...)
  5. message: |
  6. severity: WARNING
  7. mode: search
  8. languages: ["generic"]

languages部分可以設(shè)置具體語言比如php或者用generic。如果設(shè)置了具體語言會對其做語法簡單,如果語法檢查不通過則不會執(zhí)行搜索。我們通過以下語句運(yùn)行semgrep Docker映像:

 
 
 
 
  1. docker run -v "${PWD}:/src" returntocorp/semgrep --config=config.yml php

發(fā)現(xiàn)4個語句中使用了eval,也包括我們注釋掉的語句。

對比language設(shè)置為php時候的運(yùn)行:

有錯誤,我們增加參數(shù)—verbose,以獲得更詳細(xì)的錯誤信息:

應(yīng)該我們第7行少了個分號,導(dǎo)致語法錯誤。我們修改此語法錯誤,再運(yùn)行:

發(fā)現(xiàn)了三個語句,注釋部分自動給去除了。

發(fā)現(xiàn)三重嵌套循環(huán)

下一個例子,我們使用一個稍微負(fù)載點(diǎn),在golang代碼查找一個三重嵌套的循環(huán),代碼(golang/test1.go):

 
 
 
 
  1. package main
  2. import "log"
  3. func main() {
  4. for i := 0; i < 10; i++ {
  5. log.Print(i)
  6. for j := 0; j < 100; j++ {
  7. c := i * j
  8. going := true
  9. k := 0
  10. for going {
  11. if k == c {
  12. break
  13. }
  14. k++
  15. log.Print(k)
  16. }
  17. }
  18. }
  19. }

如果要查找嵌套for循環(huán),則需要搜索由任意語法包圍的循環(huán)。Semgrep的...語法,非常適合,該操作使。我們修改golang搜索配置go-config.yml為:

rules:

 
 
 
 
  1. - id: triple-nest-loop
  2. pattern: |
  3. for ... {
  4. ...
  5. for ... {
  6. ...
  7. for ... {
  8. ...
  9. }
  10. ...
  11. }
  12. ...
  13. }
  14. message: |
  15. 使用了三層嵌套for循環(huán)
  16. severity: WARNING
  17. mode: search
  18. languages: ["generic"]

運(yùn)行semgrep:

 
 
 
 
  1. docker run -v "${PWD}:/src" returntocorp/semgrep --config=go-config.yml golang

靜態(tài)分析的局限性

我們將循環(huán)部分重構(gòu)為函數(shù)調(diào)用,再試試(golang/loopy.go

):

 
 
 
 
  1. package main
  2. import "log"
  3. func inner(i, j int) {
  4. c := i * j
  5. going := true
  6. k := 0
  7. for going {
  8. if k == c {
  9. break
  10. }
  11. k++
  12. log.Print(k)
  13. }
  14. }
  15. func main() {
  16. for i := 0; i < 10; i++ {
  17. log.Print(i)
  18. for j := 0; j < 100; j++ {
  19. inner(i, j)
  20. }
  21. }
  22. }

并再次運(yùn)行semgrep:

 
 
 
 
  1. docker run -v "${PWD}:/src" returntocorp/semgrep --config=go-config.yml golang

結(jié)果還跟上面的一樣,由于函數(shù)打包,語法上不再顯示為三層循環(huán),所以semgrep匹配不了模式。

使用現(xiàn)有規(guī)則進(jìn)行xss漏洞掃描

我們前面也提到,除了一般掃描外semgrep官方注冊表維護(hù)了大量的規(guī)則,包括基本語法、安全加強(qiáng)、代碼質(zhì)量的規(guī)則,這樣規(guī)則可以直接下載加載,使用方法:

 
 
 
 
  1. semgrep --config "規(guī)則"

比如,我們上面第一部分的eval語句,在官方就有一個對應(yīng)的規(guī)則r/php.lang.security.eval-use.eval-use

我們可以直接運(yùn)行:

 
 
 
 
  1. docker run --rm -v "${PWD}:/src" returntocorp/semgrep:latest --config=" r/php.lang.security.eval-use.eval-use

" php,其結(jié)果和第一步分的一樣:

對Web開發(fā)中,最常見的一個漏洞就是xss漏洞,semgrep也有個專門xss漏洞掃描的規(guī)則集合p/xss,包括多個語言的60條規(guī)則。

xss集合的掃碼可以用

 
 
 
 
  1. semgrep --config "p/xss"

我們可以直接在docker中使用:

 
 
 
 
  1. docker run --rm -v "${PWD}:/src" returntocorp/semgrep:latest --config="p/xss" golang

直接會從官方注冊表下載規(guī)則,并按使用規(guī)則進(jìn)行掃描,結(jié)果發(fā)現(xiàn)一個問題,同樣方法,可以利用現(xiàn)有規(guī)則對自己的代碼進(jìn)行掃描。

總結(jié)

學(xué)習(xí)一種語言以高層編寫語法規(guī)則以強(qiáng)制執(zhí)行代碼行為仍然非常有用。semgrep使用通用的語法匹配器可幫助輕松編寫規(guī)則,可以用現(xiàn)有規(guī)則來對自己代碼進(jìn)行掃描。總之,基于Docker運(yùn)行,可以讓你項(xiàng)目的靜態(tài)分析變得非常容易,小伙伴們,路過不要錯過,都可以嘗試一下。


新聞標(biāo)題:Semgrep代碼靜態(tài)分析工具:使用Docker進(jìn)行簡單查詢
分享地址:http://www.dlmjj.cn/article/cdooeoc.html