unauthdev/aicheck-scan

GitHub: unauthdev/aicheck-scan

一个 CI/CD 安全扫描工具,通过实时探测检测 PR 中部署的自托管 AI 服务是否存在未授权访问的暴露风险,并可按安全评级自动中断构建。

Stars: 0 | Forks: 0

# aicheck [![GitHub Marketplace](https://img.shields.io/badge/Marketplace-aicheck-orange?logo=github)](https://github.com/marketplace/actions/aicheck) [![selftest](https://static.pigsec.cn/wp-content/uploads/repos/cas/10/108a13743fb68348124f9032bcd1d4d4f3b06f350da19c44b9c772fdd7cb8405.svg)](https://github.com/unauthdev/aicheck-scan/actions/workflows/selftest.yml) [![Docker image](https://img.shields.io/badge/ghcr.io-unauthdev%2Faicheck%3Av1-blue?logo=docker)](https://github.com/unauthdev/aicheck-scan/pkgs/container/aicheck) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE) **如果你的 PR 发布了暴露的自托管 AI 服务,则使构建失败。** 这是一个 GitHub Action,它会对你 job 刚刚启动的 AI 技术栈进行实时探测 —— Ollama、 n8n, vLLM, Langfuse, Open WebUI, ComfyUI, Ray, Dify, Qdrant, AnythingLLM、 Jupyter, Gradio, Langflow, Flowise, Chroma, Weaviate, MCP 服务器 —— 对其进行 A–F 评级, 并在运行摘要和代码扫描中报告结果,每一项都链接到一个通俗易懂的修复卡片。来自 免费的 AI 技术栈暴露检测器 [unauth.dev](https://unauth.dev)。 ## 为什么需要实时探测 这不是一个配置检查工具。该 action 从实际响应的内容开始: 它针对你 job 中的真实服务运行与 unauth.dev 扫描器相同的只读 GET 探测。 如果 Ollama 在 11434 端口未经身份验证就做出响应,那就是既定事实 —— 无需 通过 compose 文件猜测,几乎零误报。 它只回答一个问题:**“这个 PR 是否发布了一个没有身份验证的 AI 服务?”** 它不证明互联网可达性(你的防火墙/代理在 CI 中是不可见的) —— 这是部署后监控的工作。 ## 用法 ``` name: ai-stack-exposure on: [pull_request] permissions: security-events: write # for the SARIF annotations jobs: aicheck: runs-on: ubuntu-latest services: ollama: image: ollama/ollama:latest ports: ["11434:11434"] steps: - uses: unauthdev/aicheck-scan@v1 with: target: localhost fail-grade: C # D or F fails the build ``` 上面的演示失败了:一个默认的 Ollama 容器是未经身份验证的 —— 这 就是重点。修复它(注解中链接了修复卡片),看着它变绿。 你在运行页面上会得到: ## 输入项 | 输入项 | 默认值 | 含义 | |---|---|---| | `target` | *(必填)* | 要探测的主机。没有端口 —— 会探测所有已知的 AI 服务端口。 | | `fail-grade` | `F` | 如果评级等于或差于此评级则失败。`F` = 只有严重暴露才会失败;`C` = 任何高于干净的评级都会失败。 | 注意:`fail-grade: A` 即使在扫描完全干净时也会导致构建失败;它的存在是为了 在首次安装时对配置链路进行冒烟测试。 | `services` | *(全部 17 种)* | 以逗号分隔的产品过滤器,例如 `ollama,n8n`。 | | `upload-sarif` | `true` | 将结果上传到代码扫描。设置为 `false` 可跳过(此时不需要 `security-events` 权限)。 | ## 输出项 | 输出项 | 含义 | |---|---| | `grade` | `A`(干净)、`C`、`D` 或 `F`(严重暴露)。 | ## 安装(本地 CLI) ``` pip install aicheck-scan aicheck example.com ``` 该包会安装 `aicheck` 控制台命令 —— 与该 action 和 Docker 镜像运行的引擎相同。 偏执狂的做法 —— 通过哈希值锁定版本,不信任索引: ``` pip download aicheck-scan --no-deps -d /tmp/aicheck pip install --require-hashes aicheck-scan \ --hash sha256: ``` 每个版本的发行说明中都有哈希值。详细信息和验证: [docs/trust.md](docs/trust.md)。 ## 可审计性 该引擎是轻量级依赖的 Python(httpx + pyyaml)。不要盲目信任我们:运行 `--dry-run`,在代理后运行,或者阅读它的代码 —— 核心部分一个下午就能 审计完。完整的信任页面:[docs/trust.md](docs/trust.md)。 ## 隐私 / 供应链 - **完全在你的 runner 上运行。** 唯一的网络流量是对*你的* target 发出的只读 GET 请求。没有任何数据被发送到 unauth.dev 或其他任何地方 —— 没有遥测,没有主动外联,这是设计使然。 - 不需要任何凭证。不需要 Docker socket。不需要特权模式。 - 探测内容:仅限已知的元数据 endpoint(版本、标签、 设置)。没有登录,没有向你的服务发送 POST 请求,没有漏洞利用验证。 ## GitLab CI 该引擎是一个纯粹的 CLI —— GitLab 的支持在于配置,而非代码。 单行命令(首选,使用已发布的镜像): ``` aicheck: image: ghcr.io/unauthdev/aicheck:v1 services: - name: ollama/ollama:latest alias: ollama variables: TARGET: ollama # the service alias script: - python -m aicheck.scan "$TARGET" --allow-private --fail-grade F ``` 完整版 —— 单次扫描、SARIF 构件、流水线根据评级失败 —— 且源码锁定在 v1 标签上(绝不追踪 main 分支): ``` aicheck: image: python:3.11-slim services: - name: ollama/ollama:latest alias: ollama variables: TARGET: ollama # the service alias — or localhost with a before_script install before_script: - pip install --quiet httpx pyyaml - git clone --depth 1 --branch v1.0.3 https://github.com/unauthdev/aicheck-scan.git /aicheck script: - cd /aicheck - python -m aicheck.scan "$TARGET" --allow-private --format json --fail-grade F > "$CI_PROJECT_DIR/aicheck.json" || code=$? - test -s "$CI_PROJECT_DIR/aicheck.json" && python -m aicheck.render "$CI_PROJECT_DIR/aicheck.json" --format sarif --redact > "$CI_PROJECT_DIR/aicheck.sarif" || true - test -s "$CI_PROJECT_DIR/aicheck.json" && python -m aicheck.render "$CI_PROJECT_DIR/aicheck.json" --format text || true - exit ${code:-0} artifacts: when: always reports: sarif: aicheck.sarif # vulnerability report + MR security widget (GitLab Ultimate) paths: - aicheck.sarif expire_in: 30 days ``` 在 Free/Premium 版本中,检测结果会打印在 job 日志中,流水线仍会 根据评级失败 —— SARIF 仪表板(流水线 Security 标签页、漏洞 报告、MR 小部件)需要 Ultimate 版本。 ## 任何支持 Docker 的 CI 同样的 `ghcr.io/unauthdev/aicheck:v1` 镜像可以在 Bitbucket Pipelines、 Azure DevOps、Jenkins 和裸机 CI runner 上运行 —— 任何 可以运行容器的地方。 ## CLI 相同的引擎可以独立运行 —— 从 PyPI 安装它(参见上面的 [安装](#install-local-cli)): ``` pip install aicheck-scan aicheck localhost --allow-private aicheck example.com --format sarif --fail-grade C ``` 退出代码:`0` 通过,`1` 评级等于或差于 `--fail-grade`,`2` target 错误。如果不使用 `--allow-private`,则只能解析公共 IP/主机名(CLI 可以防止意外扫描内部基础设施)。 有两个标志可以在扫描之前和期间暴露信任面: ``` aicheck example.com --dry-run # print every request it would send — no sockets, no DNS aicheck example.com --verbose # log each dialed connection (with pinned IP) to stderr ``` ## 许可证 MIT —— 详见 [LICENSE](LICENSE)。修复卡片和评级由 [unauth.dev](https://unauth.dev) 提供;检测结果链接到位于 `unauth.dev/fixes/` 的公共修复库。安全报告:[SECURITY.md](SECURITY.md)。
标签:AI基础设施, CISA项目, DAST, DevSecOps, GitHub Action, 上游代理, 关系图谱, 基线检查, 安全扫描, 恶意代码分类, 恶意软件分析, 时序注入, 请求拦截, 运行时操纵, 逆向工具