偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Semgrep代碼靜態(tài)分析工具:使用Docker進(jìn)行簡(jiǎn)單查詢

開發(fā) 開發(fā)工具
本文我們介紹一個(gè)開源的快速高效的多語(yǔ)言靜態(tài)分析工具Semgrep,通過(guò)在Docker中設(shè)置基本Semgrep環(huán)境,并用一些簡(jiǎn)單的例子說(shuō)明其用法。

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


概述

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

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

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

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

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

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

基本準(zhǔn)備

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

  1. docker pull returntocorp/semgrep:latest 

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

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

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

php/test.php

  1. <?php 
  2. $var = "var"
  3. if (isset($_GET["arg"])) 
  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;")); 

semgrep所有運(yùn)行依賴于一個(gè)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 

配置部分還要增加兩個(gè)規(guī)則對(duì)象中包括兩個(gè)鍵: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è)置具體語(yǔ)言比如php或者用generic。如果設(shè)置了具體語(yǔ)言會(huì)對(duì)其做語(yǔ)法簡(jiǎn)單,如果語(yǔ)法檢查不通過(guò)則不會(huì)執(zhí)行搜索。我們通過(guò)以下語(yǔ)句運(yùn)行semgrep Docker映像:

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

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

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

Semgrep代碼靜態(tài)分析初步:docker部署,查詢和掃描

有錯(cuò)誤,我們?cè)黾訁?shù)—verbose,以獲得更詳細(xì)的錯(cuò)誤信息:

Semgrep代碼靜態(tài)分析初步:docker部署,查詢和掃描

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

發(fā)現(xiàn)了三個(gè)語(yǔ)句,注釋部分自動(dòng)給去除了。

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

下一個(gè)例子,我們使用一個(gè)稍微負(fù)載點(diǎn),在golang代碼查找一個(gè)三重嵌套的循環(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. :i * j 
  8. going :true 
  9. :0 
  10. for going { 
  11. if k == c { 
  12. break 
  13. k++ 
  14. log.Print(k) 

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

rules:

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

運(yùn)行semgrep:

  1. docker run -v "${PWD}:/src" returntocorp/semgrep --config=go-config.yml golang 
Semgrep代碼靜態(tài)分析初步:docker部署,查詢和掃描

靜態(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. :i * j 
  5. going :true 
  6. :0 
  7. for going { 
  8. if k == c { 
  9. break 
  10. k++ 
  11. log.Print(k) 
  12.  
  13. func main() { 
  14. for i :0; i < 10; i++ { 
  15. log.Print(i) 
  16. for j :0; j < 100; j++ { 
  17. inner(i, j) 

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

  1. docker run -v "${PWD}:/src" returntocorp/semgrep --config=go-config.yml golang 
Semgrep代碼靜態(tài)分析初步:docker部署,查詢和掃描

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

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

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

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

比如,我們上面第一部分的eval語(yǔ)句,在官方就有一個(gè)對(duì)應(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é)果和第一步分的一樣:

Semgrep代碼靜態(tài)分析初步:docker部署,查詢和掃描

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

xss集合的掃碼可以用

  1. semgrep --config "p/xss" 

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

  1. docker run --rm -v "${PWD}:/src" returntocorp/semgrep:latest --config="p/xss" golang 
Semgrep代碼靜態(tài)分析初步:docker部署,查詢和掃描

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

總結(jié)

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

 

責(zé)任編輯:趙寧寧 來(lái)源: 今日頭條
相關(guān)推薦

2021-06-08 13:56:34

工具靜態(tài)代碼

2021-11-04 05:43:38

GoKartGo代碼靜態(tài)安全分析

2017-05-10 14:27:29

靜態(tài)代碼漏洞安全

2012-05-22 00:28:21

JavaJava開源開源工具

2009-09-15 16:09:12

LINQ進(jìn)行查詢

2009-09-07 17:05:10

LINQ進(jìn)行查詢

2024-01-08 13:47:00

代碼分析工具

2013-04-08 10:47:42

Xcode靜態(tài)代碼分析

2011-05-05 09:54:05

靜態(tài)代碼

2009-08-27 10:44:21

C#靜態(tài)變量

2023-09-14 22:57:52

2020-12-25 15:24:24

人工智能

2009-09-15 14:58:26

Linq查詢本質(zhì)

2021-03-29 23:05:36

程序員工具靜態(tài)分析

2020-12-07 14:46:07

程序員代碼分析工具

2009-12-09 10:07:22

配置靜態(tài)路由

2021-07-29 06:37:55

KubernetesKubeLinter工具

2016-05-17 13:54:05

2011-08-29 14:40:58

QTWebkit

2009-09-08 09:24:50

LINQ查詢
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)