ryandens/promptblock

GitHub: ryandens/promptblock

一款 GitHub App,使用 ML 分类器扫描 issues 和评论中的提示词注入攻击,重点检测隐藏在 HTML 注释中人类不可见但 AI agent 可读取的恶意 payload。

Stars: 0 | Forks: 1

promptblock logo

网站 & 文档

# promptblock 这是一个 GitHub App,它使用内置的、基于 ML 的 prompt-injection 分类器,扫描 issues 和评论以检测 **prompt-injection 尝试**。 它特别关注人类审查者永远看不到、但 AI agent 会看到的内容:**隐藏在 HTML 注释中的文本**(``)。GitHub 的 Markdown 渲染器会丢弃这些内容,因此它们在渲染后的 issue 中是不可见的——但任何读取原始 issue 内容(通过 REST/GraphQL API)的 agent 都会完整地提取它们。这使得 HTML 注释成为注入 payload 的理想走私渠道。 ## 工作原理 1. 在 `issues` 和 `issue_comment` 事件中,将原始正文拆分为 **可见文本** 和各个 **HTML 注释**(`src/extract.ts`)。 2. 每个片段都会独立通过扫描器的分层级联进行扫描(`src/scan.ts`),这样良性的可见正文就无法掩盖恶意的隐藏正文。 3. 如果有任何内容被标记,应用会给该 issue 打上 `possible-prompt-injection` 标签,并留下一条警告评论——特别指出违规内容是否被 **隐藏**(`src/index.ts`)。 该应用永远不会将原始的注入 payload 原样回显到话题中;它只报告 *位置* 和 *风险程度*,而不是逐字报告攻击字符串。 ## 安装 托管应用位于 ****。 1. 打开 并点击 **Install**(如果已经安装,则点击 **Configure**)。 2. 选择要安装到的帐户或组织。 3. 选择要保护的代码仓库 —— **All repositories** 或手动挑选的 **Only select repositories** 列表。你可以随时在同一页面更改此选择。 4. 确认。promptblock 会立即开始扫描所选仓库上的新 issues 和评论;无需进行其他配置。 该应用仅请求其所需的权限:对 issues 的 **read & write**(用于添加 `possible-prompt-injection` 标签和警告评论)以及对 metadata 的 **read**。它订阅了 `issues` 和 `issue_comment` webhook 事件。 要停止它,请打开同一页面,取消选择仓库,或者在你的帐户/组织下的 **Settings → Applications → Installed GitHub Apps** 中卸载它。 ## 开发 本项目使用 [pnpm](https://pnpm.io)(通过 `packageManager` 字段固定版本;运行一次 `corepack enable` 即可激活它)。 ``` pnpm install pnpm build pnpm test # runs the extraction unit tests pnpm start # runs the app (needs a .env — see .env.example) ``` ### 在本地测试 webhook GitHub 无法访问 `localhost`,因此本地开发通过 [smee.io](https://smee.io) 代理转发 webhook 投递。[`smee-client`](https://github.com/probot/smee-client) 作为 dev dependency 被内置,当设置了 `WEBHOOK_PROXY_URL` 时,Probot 会自动连接它。 ``` pnpm smee:new # provisions a fresh smee.io channel and prints the URL ``` 将打印出的 URL 作为 `WEBHOOK_PROXY_URL=...` 粘贴到 `.env` 中,并将 GitHub App 的 webhook URL(Settings → Advanced)设置为相同的值。然后: ``` pnpm start ``` Probot 会启动本地服务器 *和* smee client,将每次 GitHub 投递转发到 `http://localhost:3000/api/github/webhooks`。在安装了该应用的仓库中打开(或编辑)issue 或评论,即可对扫描器进行端到端的测试。 依赖项安装受 `pnpm-workspace.yaml` 中的供应链策略约束:在公开发布至少 5 天之前,不会安装任何软件包版本(`minimumReleaseAge`),并且任何软件包都不得运行 install/build 脚本(`onlyBuiltDependencies: []`)。测试运行在 Node 内置的 TypeScript 支持上,因此依赖树不需要构建步骤。 ## 部署 包含一个多阶段的 `Dockerfile`: ``` docker build -t promptblock . docker run -p 3000:3000 \ -e APP_ID=... -e WEBHOOK_SECRET=... -e PRIVATE_KEY="$(cat private-key.pem)" \ promptblock ``` 将 GitHub App 的 webhook URL 指向正在运行的容器(在本地使用 smee.io 代理)。该镜像内置了扫描器约 22MB 的 ONNX 模型,因此在运行时不会发生任何下载操作。 CI(`.github/workflows/ci.yml`)会在每次向 `main` 分支推送代码和提交 pull request 时运行 typecheck、build 和测试。 ## 许可证 [Apache 2.0](./LICENSE)
标签:CNCF毕业项目, 自动化攻击, 请求拦截