使用semgrep做代码规范扫描

semgrep 简介

semgrep 是一种静态代码分析工具,用于发现和修复软件代码中的安全漏洞、Bug 和编码风格问题。它可以帮助开发人员和安全团队在早期发现和解决潜在的代码问题,提高软件质量和安全性。

以下是 semgrep 的一些主要功能和特点:

静态代码分析:semgrep 使用静态分析技术,检查源代码文件中的问题,而无需运行代码。多种支持语言:semgrep 支持多种编程语言,包括但不限于 Python、JavaScript、Go、Java、C/C++、Ruby、Rust 和 PHP。可配置的规则集:semgrep 提供了丰富的规则集,用于检查各种代码问题,包括安全漏洞、常见编程错误、最佳实践、代码风格等。同时,你也可以根据自己的需求创建和定制规则。易于集成:semgrep 可以作为命令行工具使用,也可以通过插件集成到各种集成开发环境(IDE)和持续集成/持续交付(CI/CD)流程中。快速且可扩展:semgrep 的设计目标之一是快速分析大型代码库。它采用一些优化策略,使得分析速度较快,同时还支持多线程和分布式分析,以提高扩展性和效率。

总而言之,semgrep 是一个功能强大的静态代码分析工具,通过检查源代码中的问题,帮助开发人员和安全团队发现和修复潜在的安全漏洞、Bug 和编码问题。它可以提高软件的质量、安全性和可维护性。

准备工作

  • 准备好C语言的源码
admin@hpc-1:~/test_semgrep$ cat prime.c 
#include <stdio.h>int isPrime(int num) {int i;if (num <= 1) {return 1;  // 不是素数}for (i = 2; i * i <= num; i++) {if (num % i == 0) {return 1;  // 不是素数}}return 0;  // 是素数
}int main() {int number;printf("请输入一个整数:");scanf("%d", &number);if (isPrime(number) == 0) {printf("%d 是素数。\n", number);} else {printf("%d 不是素数。\n", number);}return 0;
}
admin@hpc-1:~/test_semgrep$ 

安装semgrep

  • pip3直接安装
admin@hpc-1:~/test_semgrep$ sudo apt install semgrep -y
  • 不指定rule,就是用semgrep的默认规则进行扫描了
admin@hpc-1:~/test_semgrep$ semgrep  ./*.c┌──── ○○○ ────┐
│ Semgrep CLI │               
└─────────────┘               Scanning 1 file (only git-tracked) with:✔ Semgrep OSS✔ Basic security coverage for first-party code vulnerabilities.✘ Semgrep Code (SAST)✘ Find and fix vulnerabilities in the code you write with advanced scanning and expert security rules.✘ Semgrep Supply Chain (SCA)✘ Find and fix the reachable vulnerabilities in your OSS dependencies.💎 Get started with all Semgrep products via `semgrep login`.
✨ Learn more at https://sg.run/cloud.                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00                                                                                                                        ┌────────────────┐
│ 1 Code Finding │
└────────────────┘prime.c❯❱ c.lang.security.insecure-use-scanf-fn.insecure-use-scanf-fnAvoid using 'scanf()'. This function, when used improperly, does not consider buffer boundaries andcan lead to buffer overflows. Use 'fgets()' instead for reading input.                             Details: https://sg.run/nd1g                                                                       23┆ scanf("%d", &number);┌──────────────┐
│ Scan Summary │
└──────────────┘Ran 41 rules on 1 file: 1 finding.
💎 Missed out on 852 pro rules since you aren't logged in!
⚡ Supercharge Semgrep OSS when you create a free account at https://sg.run/rules.
admin@hpc-1:~/test_semgrep$ 
  • 看上去如果login了,会有更多预先写好的rule可供扫描

自定义semgrep rule

  • 这个是学习的核心
  • 关于写rule的教程,参考这里 https://semgrep.dev/learn
  • 关于rule的书写规则,参考这里https://semgrep.dev/docs/writing-rules/rule-syntax
  • 下面编写两条rule
    (1)检测return后直接加空格加一个数字
    (2)检测汉字
  • rule的内容如下
admin@hpc-1:~/test_semgrep$ cat c_rules.yaml 
rules:- id: return-integerpatterns:- pattern-regex: return\s+\d+;message: "Found a return statement with an integer: "languages:- cseverity: WARNINGrecommended: truemetadata:description: "Detects return statements with integers in the code."category: "Code Quality"- id: detect-chinese-characterspatterns:- pattern-regex: \p{Script=Han}+message: "Detected Chinese character in the code"severity: WARNINGlanguages:- cmetadata:description: "Detects the presence of Chinese characters in C code."category: "Code Quality"
admin@hpc-1:~/test_semgrep$ 
  • 使用–config指定rule进行扫描
admin@hpc-1:~/test_semgrep$ semgrep --config c_rules.yaml ./*.c┌─────────────┐
│ Scan Status │
└─────────────┘Scanning 1 file (only git-tracked) with 2 Code rules:CODE RULESScanning 1 file with 2 c rules.SUPPLY CHAIN RULESNo rules to run.PROGRESS━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00                                                                                                                        ┌──────────────────┐
│ 10 Code Findings │
└──────────────────┘prime.c❯❱ return-integerFound a return statement with an integer:7┆ return 1;  // 不是素数❯❱ detect-chinese-charactersDetected Chinese character in the code7┆ return 1;  // 不是素数❯❱ return-integerFound a return statement with an integer:12┆ return 1;  // 不是素数❯❱ detect-chinese-charactersDetected Chinese character in the code12┆ return 1;  // 不是素数❯❱ return-integerFound a return statement with an integer:16┆ return 0;  // 是素数❯❱ detect-chinese-charactersDetected Chinese character in the code16┆ return 0;  // 是素数⋮┆----------------------------------------22┆ printf("请输入一个整数:");⋮┆----------------------------------------26┆ printf("%d 是素数。\n", number);⋮┆----------------------------------------28┆ printf("%d 不是素数。\n", number);❯❱ return-integerFound a return statement with an integer:31┆ return 0;┌──────────────┐
│ Scan Summary │
└──────────────┘Ran 2 rules on 1 file: 10 findings.
admin@hpc-1:~/test_semgrep$ 

关于semgrep的正则表达式匹配汉字

  • semgrep的正则表达式使用的是PCRE2(Perl Compatible Regular Expressions 2)
  • PCRE2可以用来匹配各种字符,包括汉字
  • 在 PCRE2 中,可以使用 Unicode 转义序列来表示汉字的 Unicode 范围。
  • 汉字的 Unicode 范围是 \x{4E00}-\x{9FFF}。在 PCRE2 中,可以使用 \p{Script=Han} 来匹配所有汉字,包括扩展汉字。具体地,可以使用以下正则表达式来匹配汉字:
    匹配基本汉字:\x{4E00}-\x{9FFF}匹配所有汉字:\p{Script=Han}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将 Vision Transformer 用于医学图像的语义分割

关于ViT的关键点如下&#xff1a; ViT架构基于将图像表示为一组补丁。图像补丁是图像的非重叠块。每个块最初都有一个由该块中的图像像素形成的嵌入向量。Transformer编码器是ViT的主要部分&#xff0c;它根据它们的类别归属来训练补丁之间的相似度。它包含一系列线性、归一化…

拥抱UniHttp,规范Http接口对接之旅

前言 如果你项目里还在用传统的编程式Http客户端比如HttpClient、Okhttp去直接对接第三方Http接口&#xff0c; 那么你项目一定充斥着大量的对接逻辑和代码&#xff0c; 并且针对不同的对接渠道方需要每次封装一次调用的简化&#xff0c; 一旦封装不好系统将会变得难以维护&am…

SprintBoot创建遇到的问题

最近使用IDEA版本为2022.3.1&#xff0c;java版本为21.0.3&#xff0c;现在做一个创建SprintBoot3的一个大体流程 1.先下载Maven&#xff0c;解压到一个位置 maven下载 2.配置setting.xml文件 这路径自己配置&#xff0c;这里不多演示 代码如下&#xff1a; <mirror>&…

基于物联网设计的人体健康监护系统(STM32+ESP8266+华为云IOT)(182)

基于物联网设计的人体健康监护系统(STM32+ESP8266+华为云IOT)(182) 一、前言 1.1 项目介绍 【1】项目功能介绍 随着人们生活水平的提高和健康意识的增强,对个人健康状况的关注也越来越高。传统的健康监测方式往往需要到医院或诊所进行体检,费时费力且不够便捷。本项目设计…

0124__Linux和Unix的Access.conf安全配置

Linux和Unix的Access.conf安全配置-CSDN博客

iptables 详解

在 Buildroot 系统中&#xff0c;iptables 是一个用户空间实用程序程序&#xff0c;它允许管理员配置 Linux 内核中的 IP 包过滤规则。以下是一些关于 iptables 的基本用法和常见示例&#xff1a; 基本用法 iptables 使用规则链来处理数据包。主要的链包括&#xff1a; INPUT…

前端如何取消接口调用

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 1. xmlHttpRequest是如何取消请求的&#xff1f; 实例化的XMLHttpRequest对象上也有abort方法 const xhr new XMLHttpRequest(); xhr.addEventListener(load, function(e)…

开关电源——15种控制模式(1)

关于开关电源的控制模式&#xff0c;TI官网的控制模式快速参考指南有相对全面的归纳和描述&#xff0c;提供了15种不同的控制架构&#xff0c;这些架构涵盖了从基础到高级的多种控制模式&#xff0c;以适应不同的应用需求&#xff0c;如下表所示&#xff1a; 以下是对控制模式相…

大话C语言:第28篇 内存分配与释放

1 malloc函数 函数说明&#xff1a; #include <stdlib.h>void *malloc(size_t size); 功能&#xff1a;在内存的动态存储区(堆区)中分配一块长度为size字节的连续区域&#xff0c;用来存放类型说明符指定的类型。分配的内存空间内容不确定。 参数&#xff1a;size&…

记一次Ueditor上传Bypss

前言 前一段时间和小伙伴在某内网进行渗透测试&#xff0c;目标不给加白&#xff0c;只能进行硬刚了&#xff0c;队友fscan一把梭发现某资产疑似存在Ueditor组件&#xff0c;但初步测试是存在waf和杀软的&#xff0c;无法进行getshell&#xff0c;经过一番折腾最终getshell&am…

ESP32-C3模组上跑通AES-GCM(7)

接前一篇文章:ESP32-C3模组上跑通AES-GCM(6) 四、ESP-IDF中的AES-GCM例程解析 上一回继续对ESP-IDF中的AES-GCM进行讲解,讲解了components\components\mbedtls\test_apps\main\test_aes_gcm.c中例程的aes_gcm_test函数的第2段代码。本回继续往下讲解该函数。 1. aes_gcm_…

一个 Docker 搭建的自动化电视剧下载和管理工具

大家好,我是CodeQi! 一个标准的“追剧狂人”。每周都有新剧上线,每天都要时刻关注各大影视平台的更新,这无疑是一项体力与脑力并存的艰巨任务。 于是,我决定为自己打造一个自动化的电视剧下载和管理工具。作为一个程序员,用 Docker 搭建这种自动化工具简直是小菜一碟。…

PointCloudLib GridMinimum获取栅格最低点 C++版本

测试效果 简介 在点云库(Point Cloud Library, PCL)中,如果你想要获取一个栅格(Grid)内的最低点,这通常意味着你需要先对点云数据进行某种形式的栅格化处理,然后在每个栅格内寻找最低的点。 测试代码 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointC…

f_mkfs格式化最小分区数是191

使用fatfs的f_mkfs最小分区数是191原因&#xff1a; 在挂载ram_disk时参考的文章有提到&#xff1a; “然后是GET_SECTOR_COUNT 用于f_mkfs格式化时获取可用的sector的数量&#xff0c;32bit-LBA的情况下至少为191” 自己也实际试过确实要不少于191&#xff0c;网上也没找到相…

【单片机毕业设计选题24056】-基于STM32的八路抢答器设计

系统功能: 系统上电后显示“欢迎使用八路抢答系统请稍后”&#xff0c;两秒后进入正常页面显示。 第一行显示系统状态信息&#xff0c;第二行显示抢答计时时间&#xff0c;第三行显示设定的抢答时间&#xff0c; 第四行显示系统状态&#xff08;空闲状态或计时状态&#xff…

CST软件仿真内存设置-电磁仿真cst软件教程

当大家使用CST软件进行仿真时&#xff0c;可能会有仿真内存的设置需求&#xff0c;下面的内容是帮助大家如何设置仿真内存。 首先&#xff0c;打开CST软件并加载您的仿真模型&#xff0c;在软件界面中&#xff0c;找到菜单栏或工具栏中的“仿真设置”或类似的选项。 在仿真设置…

揭秘”大模型加速器”如何助力大模型应用

文章目录 一、大模型发展面临的问题二、“大模型加速器”助力突破困难2.1 现场效果展示2.1.1 大模型加速器——文档解析引擎2.2.2 图表数据提取 三、TextIn智能文档处理平台3.1 在线免费体验3.1.1 数学公式提取3.1.2 表格数据提取 四、acge文本向量化模型4.1 介绍4.2 技术创新4…

数据仓库介绍_维度表(三)

维度表概述 维度表是维度建模的基础和灵魂。前文提到&#xff0c;事实表紧紧围绕业务过程进行设计&#xff0c;而维度表则围绕业务过程所处的环境进行设计。维度表主要包含一个主键和各种维度字段&#xff0c;维度字段称为维度属性。 表设计步骤 确定维度&#xff08;表&…

Django项目的基本准备工作【1】

【 一 】pip换源 # 1 之前装第三方模块 pip3 install django -i 镜像仓库 ​ # 2 一劳永逸--》整点配置&#xff0c;以后安装模块&#xff0c;自动去配置好的源下载 ###windows 1、文件管理器文件路径地址栏敲&#xff1a;%APPDATA% 回车&#xff0c;快速进入 C:\Users\电脑用…

Sentinel-1 Level 1数据处理的详细算法定义(三)

《Sentinel-1 Level 1数据处理的详细算法定义》文档定义和描述了Sentinel-1实现的Level 1处理算法和方程&#xff0c;以便生成Level 1产品。这些算法适用于Sentinel-1的Stripmap、Interferometric Wide-swath (IW)、Extra-wide-swath (EW)和Wave模式。 今天介绍的内容如下&…