RahulMohapatra1/semgrep-custom-rules

GitHub: RahulMohapatra1/semgrep-custom-rules

基于真实生产环境发现构建的 Semgrep 自定义 SAST 规则集,覆盖 Go、Spring Boot 和 JavaScript,提供精准漏洞检测与修复指导。

Stars: 1 | Forks: 0

# Semgrep 自定义规则包 专为 Go 微服务、Java Spring 和 JavaScript 代码库构建的自定义 Semgrep 安全规则。这些规则基于生产环境 SAST 扫描的**真实发现** —— 而非通用的教科书示例。 ## 这是什么 包含 4 个文件中的 **25 条自定义 Semgrep 规则**,其覆盖范围超越了 `--config auto` 所提供的功能: | 云端 Semgrep 提供的内容 | 这些自定义规则提供的内容 | |---|---| | 通用消息:“使用 Rewrite 代替 Director” | 具体解释了为什么 Director 在请求到达上游之前会静默丢弃请求中设置的 header | | 通用:“检测到 AWS 密钥” | 确切的轮换步骤 + CloudTrail 调查说明 | | 通用:“MD5 很弱” | 解释了在 UEM 环境下 MD5 冲突如何导致设备合规性绕过 | | 固定严重性,无上下文 | 每条消息和元数据字段中都有自定义的严重性标签 | | 无修复指导 | 每条规则都包含完全正确的代码模式 | | 无 SSRF / 缺失身份验证检查 | 两条规则专门涵盖了这些缺失部分 | ## 仓库结构 ``` . ├── semgrep-rules/ ← rule YAMLs ONLY — nothing else goes here │ ├── go-security.yml ← 11 rules — Go microservices security │ ├── secrets.yml ← 5 rules — language-agnostic secrets detection │ ├── java-spring.yml ← 4 rules — Spring Boot / properties security │ └── javascript-security.yml ← 5 rules — JS/TS frontend security ├── .gitlab-ci.yml ← CI/CD pipeline (Semgrep scan job) └── README.md ``` ## 规则摘要 ### go-security.yml — 11 条规则 | 规则 ID | 严重性 | 捕获内容 | |---|---|---| | `custom-go-reverseproxy-director` | HIGH | ReverseProxy.Director 在到达上游之前丢弃 header | | `custom-go-weak-hash-md5` | HIGH | 使用 MD5 —— 会导致设备指纹碰撞攻击 | | `custom-go-weak-hash-sha1` | HIGH | 使用 SHA1 —— 自 SHAttered 攻击 (2017) 以来已被破解 | | `custom-go-error-modified-variable` | MEDIUM | 导致 nil 指针 panic 的 Go 错误处理反模式 | | `custom-go-jwt-parse-unverified` | CRITICAL | 解析 JWT 时未进行签名验证 | | `custom-go-http-client-no-timeout` | MEDIUM | 无超时的 HTTP 客户端 —— 存在 goroutine 泄漏 / DoS 风险 | | `custom-go-sql-injection` | CRITICAL | 通过字符串拼接构建 SQL 查询 | | `custom-go-hardcoded-jwt-secret` | CRITICAL | 字符串字面量形式的 JWT 签名密钥 | | `custom-go-tls-insecure-skip-verify` | CRITICAL | `TLS InsecureSkipVerify: true` | | `custom-go-ssrf-unvalidated-url` | HIGH | 请求输入被直接用作出站 URL (SSRF) | | `custom-go-missing-auth-middleware` | MEDIUM | 注册路由时未包含 auth-middleware 包装器(启发式检测,设计上为低置信度) | ### secrets.yml — 5 条规则 | 规则 ID | 严重性 | 捕获内容 | |---|---|---| | `custom-secrets-aws-access-key-properties` | CRITICAL | `.properties`/`.env` 文件中的 AWS AKIA 密钥,附带轮换步骤 | | `custom-secrets-aws-access-key-go` | CRITICAL | 硬编码在 Go 源文件中的 AWS AKIA 密钥 | | `custom-secrets-generic-api-key-properties` | HIGH | 配置文件中的通用 API 密钥 | | `custom-secrets-jwt-secret-config` | CRITICAL | 配置文件中的 JWT 签名密钥 | | `custom-secrets-private-key-pem` | CRITICAL | 任意文件中的 PEM 私钥块 | ### java-spring.yml — 4 条规则 | 规则 ID | 严重性 | 捕获内容 | |---|---|---| | `custom-spring-actuator-fully-enabled` | CRITICAL | `management.endpoints.web.exposure.include=*` 暴露了 `/env`, `/heapdump` | | `custom-spring-security-disabled` | CRITICAL | `spring.security.enabled=false` | | `custom-spring-db-password-hardcoded` | HIGH | Spring datasource 配置中的明文数据库密码 | | `custom-spring-http-internal-url` | MEDIUM | 内部服务间通信使用 HTTP (而非 HTTPS) URL | ### javascript-security.yml — 5 条规则 | 规则 ID | 严重性 | 捕获内容 | |---|---|---| | `custom-js-prototype-pollution-loop` | HIGH | 未使用 `hasOwnProperty` 的 `for...in` 循环 —— 原型污染 | | `custom-js-eval-injection` | CRITICAL | `eval()`、`new Function()` 或带有字符串参数的 `setTimeout`/`setInterval` | | `custom-js-jwt-in-localstorage` | HIGH | JWT/身份验证 token 存储在 `localStorage` 中 (可被 XSS 读取) | | `custom-js-document-write-xss` | HIGH | 带有动态内容的 `innerHTML`/`document.write` —— DOM XSS | | `custom-js-numeric-role-hardcoded` | LOW | 使用魔术数字角色值而非命名常量 | ## 安装说明 **1. 安装 Semgrep:** ``` pip install semgrep ``` **2. 克隆此仓库:** ``` git clone https://github.com/RahulMohapatra1/semgrep-rules.git cd semgrep-rules ``` **3. 验证规则包是否正确加载:** ``` semgrep scan --config ./semgrep-rules/ --validate ``` ## 用法 ``` # 仅自定义规则 semgrep scan --config ./semgrep-rules/ . # 自动规则 + 自定义规则(推荐) semgrep scan --config auto --config ./semgrep-rules/ . # 仅单一语言 / 文件 semgrep scan --config ./semgrep-rules/go-security.yml . semgrep scan --config ./semgrep-rules/secrets.yml . # 用于报告的 JSON 输出 semgrep scan --config ./semgrep-rules/ --json --output results.json . # 在发现问题时阻止 CI(如果存在任何 ERROR 严重性发现,则退出代码为 1) semgrep scan --config ./semgrep-rules/ --error . # 扫描单个文件 semgrep scan --config ./semgrep-rules/go-security.yml services/UEMService.go # 扫描任何外部 repo semgrep scan --config ./semgrep-rules/ /path/to/any/other/repo ``` ## CI/CD 集成 仓库根目录下的 `.gitlab-ci.yml` 会同时使用云端自动规则和此自定义规则包运行 Semgrep,并将自定义规则的发现结果分离到专属的 `custom-findings.json` 构件中,同时将摘要(总计 / 严重 / 高 / 中计数)打印到 CI 日志中。 ``` # 至关重要的那一行: semgrep scan --config auto --config ./semgrep-rules/ --json --output semgrep-results.json . ``` ## 抑制误报 ``` // nosemgrep: custom-go-weak-hash-md5 hash := md5.New() // known false positive — non-security checksum only ``` ``` hash := md5.New() // nosemgrep (suppresses every rule on this line) ``` 结构性排除(测试文件、vendored 代码、mock)通过每条规则 YAML 中的 `paths.exclude` 进行单独处理。 ## 设计说明 - **每条消息中均包含严重性标签** —— 带有 `[CRITICAL]`/`[HIGH]`/`[MEDIUM]`/`[LOW]` 前缀,因此即使在无法展示元数据的工具中也能看到严重性。 - **诚实标注置信度** —— 基于命名约定启发式检测的规则(如 missing-auth-middleware 规则)被标记为 `confidence: LOW`,并在检测结果消息中予以说明,而不是夸大确定性。 - **每条规则都包含确切的修复代码** —— 可直接复制粘贴,而不只是告诉你“不要这样做”。 - **每条规则都排除了 Test/mock/vendor 路径**。 - **每条规则均包含 OWASP Top 10 (2021) + CWE 映射**,以便用于合规性报告。 ## 参考 - [Semgrep 规则编写指南](https://semgrep.dev/docs/writing-rules/overview/) - [Semgrep 模式语法](https://semgrep.dev/docs/writing-rules/pattern-syntax/) - [OWASP Top 10 2021](https://owasp.org/Top10/) - [CWE Top 25 2022](https://cwe.mitre.org/top25/archive/2022/2022_cwe_top25.html) *仅限用于授权的安全测试和内部使用。*
标签:DevSecOps, SAST, Semgrep规则, 上游代理, 代码安全审计, 安全合规, 数据可视化, 日志审计, 盲注攻击, 网络代理, 静态代码扫描