Semgrep代码静态分析工具:使用Docker进行简单查询
时间:2025-11-05 16:01:44 出处:IT科技类资讯阅读(143)
静态分析是代单查一个非常有用的工具,使用它可以帮助开发者或者安全人员在开发阶段就能发现代码中存在的码静bug和安全问题。静态分析是态分一个综合性和系统性的工程,对于每一个开发者和安全人员来说了解其原理,析工行简询并能使用工具进行初步的具使r进分析很有必要。本文我们介绍一个开源的代单查快速高效的多语言静态分析工具Semgrep,通过在Docker中设置基本Semgrep环境,码静并用一些简单的态分例子说明其用法。

概述
诸如pylint的析工行简询Python或eslint的JavaScript之类的linter非常适合通用的广泛语言标准。但是具使r进代码审查中的常见问题呢,例如使用打印语句而不是代单查记录程序,或者在for循环(特定于Go)中使用defer语句,码静或者多层嵌套循环等。态分
大多数开发人员没有使用语言解析的析工行简询经验。因此,具使r进在中小型团队中看到自定义Lint规则并不常见。尽管没有哪一种Linter或语言比其他Linter复杂得多(全都是免费信息发布网AST操作),但是学习每种语言Linter的AST和框架要付出很小的代价。
semgrep规则的一个优点是,可以学习semgrep模式匹配语法(这非常简单),然后可以为想要为其编写规则的任何语言编写规则。
Semgrep使用代码的标准表达进行模式匹配,而无需复杂的查询或者正则。可用于在DevSecOps各个阶段:代码编写,代码提交或者CI运行时发现Bug和漏洞。其精确的规则看起来就像要搜索的代码,无需遍历抽象语法树或与正则表达式死扛。与传统的正则表达式(和传统的grep)不同,它可以找到递归模式。这使其特别有用,可以作为学习查找任何语言模式的工具。
Semgrep还支持容器化方式部署和运行,由emgrep官方注册表中,有Semgrep社区维护的包安全性,正确性,服务器租用性能,代码质量和Bug等各方面的1000多规则可直接拿来使用。
Semgrep软件安全公司r2c开发并提供商业支持。目前已经有大量的企业用于生产环境中,也有很多工具比如NodeJsScan之类底层支持引擎。
基本准备
本文中我们所有的例子都需要运行docker,并基于semgrep基本镜像returntocorp/semgrep。docker安装和配置过程我们不在介绍,首先从docker官方拉一个最新的镜像备用:
docker pull returntocorp/semgrep:latestsemgrep有应在线工具(semgrep.dev/editor/),如果没有docker环境的同学,可以通过在线工具尝试例子。
在PHP中发现eval语句
假如希望脚本在PHP中使用eval函数时候告警:
php/test.php
<?php $var = "var"; if (isset($_GET["arg"])) { $arg = $_GET["arg"]; eval("$var = $arg;"); echo "$var =".$var eval( bar ); # eval(foo) echo(eval("$var = $arg;")); }semgrep所有运行依赖于一个yml的配置文件config.yml,基本规则如下:
rules:
- id: cc-1 pattern: | exec(...) message: | severity: WARNING 我们可以在message部分增加警告的内容: rules: - id: cc-1 pattern: | exec(...) message: | 使用了不安全的exec函数 severity: WARNING配置部分还要增加两个规则对象中包括两个键:mode和languages。
rules: - id: my_pattern_id pattern: | exec(...) message: | severity: WARNING mode: search languages: ["generic"]languages部分可以设置具体语言比如php或者用generic。如果设置了具体语言会对其做语法简单,如果语法检查不通过则不会执行搜索。我们通过以下语句运行semgrep Docker映像:
docker run -v "${PWD}:/src" returntocorp/semgrep --config=config.yml php
发现4个语句中使用了eval,也包括我们注释掉的语句。
对比language设置为php时候的运行:

有错误,我们增加参数—verbose,以获得更详细的错误信息:

应该我们第7行少了个分号,导致语法错误。亿华云我们修改此语法错误,再运行:

发现了三个语句,注释部分自动给去除了。
发现三重嵌套循环
下一个例子,我们使用一个稍微负载点,在golang代码查找一个三重嵌套的循环,代码(golang/test1.go):
package main import "log" func main() { for i := 0; i < 10; i++ { log.Print(i) for j := 0; j < 100; j++ { c := i * j going := true k := 0 for going { if k == c { break } k++ log.Print(k) } } } }如果要查找嵌套for循环,则需要搜索由任意语法包围的循环。Semgrep的...语法,非常适合,该操作使。我们修改golang搜索配置go-config.yml为:
rules:
- id: triple-nest-loop pattern: | for ... { ... for ... { ... for ... { ... } ... } ... } message: | 使用了三层嵌套for循环 severity: WARNING mode: search languages: ["generic"]运行semgrep:
docker run -v "${PWD}:/src" returntocorp/semgrep --config=go-config.yml golang
静态分析的局限性
我们将循环部分重构为函数调用,再试试(golang/loopy.go
):
package main import "log" func inner(i, j int) { c := i * j going := true k := 0 for going { if k == c { break } k++ log.Print(k) } } func main() { for i := 0; i < 10; i++ { log.Print(i) for j := 0; j < 100; j++ { inner(i, j) } } }并再次运行semgrep:
docker run -v "${PWD}:/src" returntocorp/semgrep --config=go-config.yml golang
结果还跟上面的一样,由于函数打包,语法上不再显示为三层循环,所以semgrep匹配不了模式。
使用现有规则进行xss漏洞扫描
我们前面也提到,除了一般扫描外semgrep官方注册表维护了大量的规则,包括基本语法、安全加强、代码质量的规则,这样规则可以直接下载加载,使用方法:
semgrep --config "规则"比如,我们上面第一部分的eval语句,在官方就有一个对应的规则r/php.lang.security.eval-use.eval-use
我们可以直接运行:
docker run --rm -v "${PWD}:/src" returntocorp/semgrep:latest --config=" r/php.lang.security.eval-use.eval-use" php,其结果和第一步分的一样:

对Web开发中,最常见的一个漏洞就是xss漏洞,semgrep也有个专门xss漏洞扫描的规则集合p/xss,包括多个语言的60条规则。

xss集合的扫码可以用
semgrep --config "p/xss"我们可以直接在docker中使用:
docker run --rm -v "${PWD}:/src" returntocorp/semgrep:latest --config="p/xss" golang
直接会从官方注册表下载规则,并按使用规则进行扫描,结果发现一个问题,同样方法,可以利用现有规则对自己的代码进行扫描。
总结
学习一种语言以高层编写语法规则以强制执行代码行为仍然非常有用。semgrep使用通用的语法匹配器可帮助轻松编写规则,可以用现有规则来对自己代码进行扫描。总之,基于Docker运行,可以让你项目的静态分析变得非常容易,小伙伴们,路过不要错过,都可以尝试一下。
猜你喜欢
- 以小狐鲜的水果怎么样?(探寻小狐鲜水果的新鲜与营养)
- Redis持久化锦囊在手,再也不会担心数据丢失了
- 域名可以自己注册吗?
- 老域名买卖交易在哪里?
- 假如你是一个测试入侵侦测系统或一些网络访问控制策略的网络管理员,那么你经常需要抓取数据包并在离线状态下分析这些文件。当需要保存捕获的数据包时,我们一般会存储为 libpcap 的数据包格式 pcap,这是一种被许多开源的嗅探工具以及捕包程序广泛使用的格式。假如 pcap 文件被用于入侵测试或离线分析的话,那么在将他们注入网络之前通常要先对 pcap 文件进行一些操作。在该文中,我将介绍一些操作 pcap 文件的工具,以及如何使用它们 。Editcap 与 MergecapWireshark,是最受欢迎的 GUI 嗅探工具,实际上它带了一套非常有用的命令行工具集。其中包括 editcap 与 mergecap。editcap 是一个万能的 pcap 编辑器,它可以过滤并且能以多种方式来分割 pcap 文件。mergecap 可以将多个 pcap 文件合并为一个。 该文就是基于这些 Wireshark 命令行工具的。假如你已经安装过 Wireshark 了,那么这些工具已经在你的系统中了。假如还没装的话,那么我们接下来就安装 Wireshark 命令行工具。 需要注意的是,在基于 Debian 的发行版上我们可以不用安装 Wireshark GUI 而仅安装命令行工具,但是在 Red Hat 及 基于它的发行版中则需要安装整个 Wireshark 包。Debian, Ubuntu 或 Linux Mint复制代码代码如下:$ sudo apt-get install wireshark-commonFedora, CentOS 或 RHEL复制代码代码如下:$ sudo yum install wireshark当安装好工具后, 就可以开始使用 editca 与 mergecap 了。pcap 文件过滤通过 editcap, 我们能以很多不同的规则来过滤 pcap 文件中的内容,并且将过滤结果保存到新文件中。首先,以“起止时间”来过滤 pcap 文件。 - A < start-time >和 - B < end-time >选项可以过滤出在这个时间段到达的数据包(如,从 2:30 ~ 2:35)。时间的格式为 “ YYYY-MM-DD HH:MM:SS。复制代码代码如下:$ editcap -A 2014-12-10 10:11:01 -B 2014-12-10 10:21:01 input.pcap output.pcap 也可以从某个文件中提取指定的 N 个包。下面的命令行从 input.pcap 文件中提取100个包(从 401 到 500)并将它们保存到 output.pcap 中:复制代码代码如下:$ editcap input.pcap output.pcap 401-500使用 -D < dup-window > (dup-window可以看成是对比的窗口大小,仅与此范围内的包进行对比)选项可以提取出重复包。每个包都依次与它之前的 < dup-window >-1 个包对比长度与MD5值,假如有匹配的则丢弃。复制代码代码如下:$ editcap -D 10 input.pcap output.pcap 遍历了 37568 个包, 在 10 窗口内重复的包仅有一个,并丢弃。也可以将 < dup-window >定义成时间间隔。使用-w < dup-time-window >选项,对比< dup-time-window >时间内到达的包。复制代码代码如下:$ editcap -w 0.5 input.pcap output.pcap 检索了 50000 个包, 以0.5s作为重复窗口,未找到重复包。分割 pcap 文件当需要将一个大的 pcap 文件分割成多个小文件时,editcap 也能起很大的作用。将一个 pcap 文件分割成数据包数目相同的多个文件复制代码代码如下:$ editcap -c 输出的每个文件有相同的包数量,以 < output-prefix >-NNNN的形式命名。以时间间隔分割 pcap 文件复制代码代码如下: $ editcap -i 合并 pcap 文件假如想要将多个文件合并成一个,用 mergecap 就很方便。当合并多个文件时,mergecap 默认将内部的数据包以时间先后来排序。复制代码代码如下:$ mergecap -w output.pcap input.pcap input2.pcap [input3.pcap . . .]假如要忽略时间戳,仅仅想以命令行中的顺序来合并文件,那么使用 -a 选项即可。例如,下列命令会将 input.pcap 文件的内容写入到 output.pcap, 并且将 input2.pcap 的内容追加在后面。复制代码代码如下:$ mergecap -a -w output.pcap input.pcap input2.pcap 总结在这篇指导中,我演示了多个 editcap、 mergecap 操作 pcap 文件的例子。除此之外,还有其它的相关工具,如 reordercap用于将数据包重新排序,text2pcap 用于将 pcap 文件转换为文本格式, pcap-diff用于比较 pcap 文
- OpenHarmony ArkUI+原生绘图之幸运大转盘
- 通用顶级域名和新通用顶级域名的区别
- LeetCode之盛最多水的容器(前100)
- 小米Note更换听筒的详细教程(一步步教你如何更换小米Note的听筒)