Project Icon

guarddog

软件供应链安全分析工具

GuardDog是一款命令行工具,用于检测PyPI、npm包和Go模块中的潜在安全威胁。它结合源代码启发式分析和元数据检查,识别恶意软件包。支持本地和远程扫描,允许自定义规则,可与GitHub Actions集成,为软件供应链安全提供全面保障。

GuardDog

测试 静态分析

GuardDog

GuardDog 是一个命令行工具,用于识别恶意的 PyPI 和 npm 包或 Go 模块。它通过 Semgrep 规则对包的源代码和元数据运行一系列启发式检查。

GuardDog 可以使用任何可用的启发式方法来扫描本地或远程的 PyPI 和 npm 包或 Go 模块。

GuardDog 演示使用

入门

安装

pip install guarddog

或使用 Docker 镜像:

docker pull ghcr.io/datadog/guarddog
alias guarddog='docker run --rm ghcr.io/datadog/guarddog'

注意:在 Windows 上,唯一支持的安装方法是 Docker。

示例用法

# 扫描 'requests' 包的最新版本
guarddog pypi scan requests

# 扫描 'requests' 包的特定版本
guarddog pypi scan requests --version 2.28.1

# 使用 2 个特定的启发式方法扫描 'request' 包
guarddog pypi scan requests --rules exec-base64 --rules code-execution

# 使用除一个规则外的所有规则扫描 'requests' 包
guarddog pypi scan requests --exclude-rules exec-base64

# 扫描本地包归档
guarddog pypi scan /tmp/triage.tar.gz

# 扫描本地包目录
guarddog pypi scan /tmp/triage/

# 扫描本地文件夹中 requirements.txt 文件引用的每个包
guarddog pypi verify workspace/guarddog/requirements.txt

# 扫描 requirements.txt 文件引用的每个包并输出 sarif 文件 - 仅适用于 verify 命令
guarddog pypi verify --output-format=sarif workspace/guarddog/requirements.txt

# 将 JSON 输出到标准输出 - 适用于每个命令
guarddog pypi scan requests --output-format=json

# 所有命令也适用于 npm 或 go
guarddog npm scan express

# 以调试模式运行
guarddog --log-level debug npm scan express

启发式方法

GuardDog 包含两种类型的启发式方法:

PyPI

源代码启发式方法:

启发式方法描述
shady-links识别包中是否包含指向可疑域名扩展的 URL
obfuscation识别包是否使用恶意软件常用的混淆方法
clipboard-access识别包是否读取或写入剪贴板数据
exfiltrate-sensitive-data识别包是否从本地系统读取并泄露敏感数据
download-executable识别包是否下载并执行远程二进制文件
exec-base64识别包是否动态执行 base64 编码的代码
silent-process-execution识别包是否静默执行可执行文件
dll-hijacking识别恶意包是否操纵受信任的应用程序加载恶意 DLL
bidirectional-characters识别包是否包含双向字符,这可能被用来显示与实际执行不同的源代码。更多信息请参见 https://trojansource.codes/
steganography识别包是否从图像中检索隐藏数据并执行
code-execution识别 setup.py 文件中是否执行操作系统命令
cmd-overwrite识别 setup.py 中的 'install' 命令是否被覆盖,表明在安装包时自动运行的代码

元数据启发式方法:

启发式方法描述
empty_information识别描述字段为空的包
release_zero识别发布版本为 0.0 或 0.0.0 的包
typosquatting识别与高度流行的包名称相近的包
potentially_compromised_email_domain识别包维护者的电子邮件域名(因此包管理器账户)可能已被入侵
unclaimed_maintainer_email_domain识别包维护者的电子邮件域名(因此 npm 账户)未被认领且可被攻击者注册
repository_integrity_mismatch识别链接的 GitHub 仓库中包含额外意外文件的包
single_python_file识别只有单个 Python 文件的包
bundled_binary识别捆绑二进制文件的包
deceptive_author此启发式方法检测作者是否使用一次性电子邮件

npm

源代码启发式方法:

启发式方法描述
npm-serialize-environment识别包是否序列化 'process.env' 以泄露环境变量
npm-obfuscation识别包是否使用恶意软件常用的混淆方法
npm-silent-process-execution识别包是否静默执行可执行文件
shady-links识别包中是否包含指向可疑域名扩展的 URL
npm-exec-base64识别包是否通过 'eval' 动态执行代码
npm-install-script识别包是否有自动运行命令的预安装或后安装脚本
npm-steganography识别包是否从图像中检索隐藏数据并执行
bidirectional-characters识别包是否包含双向字符,这可能被用来显示与实际执行不同的源代码。更多信息请参见 https://trojansource.codes/
npm-dll-hijacking识别恶意包是否操纵受信任的应用程序加载恶意 DLL
npm-exfiltrate-sensitive-data识别包是否从本地系统读取并泄露敏感数据

元数据启发式方法:

启发式方法描述
empty_information识别描述字段为空的包
release_zero识别发布版本为 0.0 或 0.0.0 的包
potentially_compromised_email_domain识别包维护者的电子邮件域名(因此包管理器账户)可能已被入侵;注意,NPM 的 API 可能不提供关于维护者电子邮件的准确信息,因此这个检测器可能会对 NPM 包造成误报。参见 https://www.theregister.com/2022/05/10/security_npm_email/
unclaimed_maintainer_email_domain识别包维护者的电子邮件域名(因此 npm 账户)未被认领且可被攻击者注册;注意,NPM 的 API 可能不提供关于维护者电子邮件的准确信息,因此这个检测器可能会对 NPM 包造成误报。参见 https://www.theregister.com/2022/05/10/security_npm_email/
typosquatting识别与高度流行的包名称相近的包
direct_url_dependency识别具有直接 URL 依赖的包。通过这种方式获取的依赖项不是不可变的,可能被用来注入不可信的代码或降低可重现安装的可能性。
npm_metadata_mismatch识别 npm 包清单和包信息在某些关键字段上存在不匹配的包
bundled_binary识别捆绑二进制文件的包
deceptive_author此启发式方法检测作者是否使用一次性电子邮件

go

源代码启发式方法:

启发式方法描述
shady-links识别包中是否包含指向可疑域名扩展的 URL

自定义规则

Guarddog 允许实现自定义源代码规则。 源代码规则位于 guarddog/analyzer/sourcecode 目录下,支持的格式是 SemgrepYara

  • Semgrep 规则是与语言相关的,Guarddog 将导入所有与用户在 CLI 中选择的生态系统语言匹配的 .yml 规则。
  • 另一方面,Yara 规则与语言无关,因此所有匹配的 .yar 规则都会被导入。

您可以编写自己的规则并将其放入该目录,Guarddog 将允许您像选择或排除任何内置规则一样选择或排除它,并将结果附加到输出中。 例如,您可以创建以下 semgrep 规则:

rules:
  - id: sample-rule 
    languages:
      - python
    message: 规则匹配时的输出信息
    metadata:
      description: CLI 帮助中使用的描述
    patterns:
        在此处添加您的规则启发式  
    severity: WARNING

然后您需要将其保存为 sample-rule.yml,并注意 id 必须与文件名匹配。

对于 Yara,您可以创建以下规则:

rule sample-rule
{
  meta:
    description = "输出信息中使用的描述"
    target_entity = "file"
  strings:
    $exec = "exec"
  condition:
    1 of them
}

然后您需要将其保存为 sample-rule.yar

请注意,在这两种情况下,规则 id 都必须与文件名匹配。

在 GitHub Action 中运行 GuardDog

将 GuardDog 集成到您的 CI 流程中最简单的方法是利用 SARIF 输出格式,并将其上传到 GitHub 的代码扫描功能。

使用这种方法,您可以获得:

  • 基于 GuardDog 扫描输出的自动 pull request 评论
  • 直接在 GitHub UI 中内置的误报管理

使用 GuardDog 的示例 GitHub Action:

name: GuardDog

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

permissions:
  contents: read

jobs:
  guarddog:
    permissions:
      contents: read # 用于 actions/checkout 获取代码
      security-events: write # 用于 github/codeql-action/upload-sarif 上传 SARIF 结果
    name: 扫描依赖项
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: 设置 Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.10"

      - name: 安装 GuardDog
        run: pip install guarddog

      - run: guarddog pypi verify requirements.txt --output-format sarif --exclude-rules repository_integrity_mismatch > guarddog.sarif

      - name: 将 SARIF 文件上传到 GitHub
        uses: github/codeql-action/upload-sarif@v3
        with:
          category: guarddog-builtin
          sarif_file: guarddog.sarif

开发

运行 GuardDog 的本地版本

使用 pip

  • 确保已安装 >=python3.10
  • 克隆仓库
  • 创建虚拟环境:python3 -m venv venv && source venv/bin/activate
  • 安装依赖:pip install -r requirements.txt
  • 使用 python -m guarddog 运行 GuardDog

使用 poetry

  • 确保 poetry 有一个 python >=3.10 的环境 poetry env use 3.10.0
  • 安装依赖 poetry install
  • 运行 guarddog poetry run guarddogpoetry shell 然后运行 guarddog

单元测试

运行所有单元测试:make test

运行针对 Semgrep 规则的单元测试:make test-semgrep-rules(测试在这里)。这些测试使用测试 Semgrep 规则的标准方法。

运行针对包元数据启发式的单元测试:make test-metadata-rules(测试在这里)。

基准测试

您可以在合法和恶意包上运行 GuardDog 来确定误报和漏报。请参见 ./tests/samples

代码质量检查

运行类型检查器:

mypy --install-types --non-interactive guarddog

运行代码风格检查器:

flake8 guarddog --count --select=E9,F63,F7,F82 --show-source --statistics --exclude tests/analyzer/sourcecode,tests/analyzer/metadata/resources,evaluator/data
flake8 guarddog --count --max-line-length=120 --statistics --exclude tests/analyzer/sourcecode,tests/analyzer/metadata/resources,evaluator/data --ignore=E203,W503

维护者

作者:

致谢

灵感来源:

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号