跳转到正文
报告库
用途分类 / 其他用途

Ci Cd And Automation Skill 安全审计

作者说它能做什么(原文)

Automates CI/CD pipeline setup. Use when setting up or modifying build and deployment pipelines. Use when you need to automate quality gates, configure test runners in CI, or establish deployment strategies.

第三方安全检查结论

先别安装或运行

已检查文件
1
发现的风险
5
会不会运行危险命令?检查是否下载程序后直接运行、让他人远程控制电脑,或藏起要运行的命令。发现 2 项风险
高风险

回滚版本输入可被解释为 shell 命令

原文依据:3 处
发现了什么

手动工作流把 workflow_dispatch 的 version 输入直接嵌入多行 shell 命令,没有引号或独立环境变量。拥有触发权限的人若输入 shell 元字符,runner 可能执行附加命令,而不只是选择版本。

为什么需要注意

附加命令将在 GitHub runner 的权限下运行,可能读取作业可用的令牌、修改仓库或部署,并影响 Vercel 账户。

手动触发者提供的 `version` 被直接展开到 shell 命令中,没有引号或环境变量边界。若具有工作流触发权限的人提交包含 shell 元字符的值,runner 可能把它解释成附加语法,并以工作流权限执行额外命令。用户可要求将输入经环境变量传递、严格校验允许的版本格式,并收紧触发和令牌权限。

SKILL.md:251来自说明文档打开原文件
```yaml# Manual rollback workflowname: Rollbackon:  workflow_dispatch:    inputs:      version:        description: 'Version to rollback to'        required: truejobs:  rollback:    runs-on: ubuntu-latest    steps:      - name: Rollback deployment        run: |          # Deploy the specified previous version          npx vercel rollback ${{ inputs.version }}```
查看另外 2 个位置
SKILL.md:254来自说明文档打开原文件
name: Rollbackon:  workflow_dispatch:    inputs:      version:        description: 'Version to rollback to'        required: true
SKILL.md:265来自说明文档打开原文件
    steps:      - name: Rollback deployment        run: |          # Deploy the specified previous version          npx vercel rollback ${{ inputs.version }}```
中风险

工作流执行未固定到不可变版本的 Actions 和 npx 工具

原文依据:3 处
发现了什么

示例使用可变的 @v4 Action 标签,并直接通过 npx 调用 Vercel;预览部署片段没有先执行锁文件安装,也没有指定 Vercel CLI 版本。解析结果因此可能随上游标签或包版本变化。

为什么需要注意

若上游版本被恶意替换或供应链遭入侵,第三方代码会在 runner 中执行,并可能接触仓库内容及部署令牌。即使没有攻击,版本漂移也可能意外改变部署行为。

示例多次使用可变的 `@v4` Action 标签,而预览部署还直接运行未固定版本、未显示锁文件安装的 `npx vercel`。若上游移动标签或包解析结果改变,runner 执行的代码也可能改变,并可接触仓库及部署令牌。用户可要求以完整提交哈希固定 Actions,并从锁文件调用明确版本的 Vercel CLI。

SKILL.md:74来自说明文档打开原文件
    steps:      - uses: actions/checkout@v4      - uses: actions/setup-node@v4        with:          node-version: '22'          cache: 'npm'      - name: Install dependencies        run: npm ci
查看另外 2 个位置
SKILL.md:201来自说明文档打开原文件
# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
SKILL.md:205来自说明文档打开原文件
  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
会不会泄露文件和密钥?检查是否发送含密码或密钥的文件,以及代码里是否直接写了密钥。发现 1 项风险
中风险

每个拉取请求的预览部署会把代码发送到外部部署账户

原文依据:2 处
发现了什么

示例声明每个 PR 都部署预览,并向 Vercel CLI 提供账户令牌。部署通常需要读取工作区并向外部服务上传构建输入或产物;文档没有要求用户先确认仓库内容、供应商、数据驻留或令牌范围。

为什么需要注意

私有源代码、构建产物或意外包含在部署上下文中的文件可能进入第三方平台;令牌还会授权该流水线创建或改变云端部署并可能产生费用。

文档建议每个 PR 都创建预览部署,并把 Vercel 令牌交给部署 CLI。采用该示例时,外部部署服务通常必须接收构建输入或产物;对来自 fork 或含敏感内容的 PR,这会扩大代码、构建数据和账户权限的暴露面。源文没有说明审批、数据范围或令牌最小权限。用户可要求限定可信分支、上传内容和令牌作用域。

SKILL.md:195来自说明文档打开原文件
### Preview DeploymentsEvery PR gets a preview deployment for manual testing:```yaml# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
查看另外 1 个位置
SKILL.md:201来自说明文档打开原文件
# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
会不会删除文件或一直在后台运行?检查是否大范围删除文件、改写磁盘,或设置自动启动。未发现风险
会不会绕过安全保护?检查是否跳过网站安全验证、开放过多文件权限,或取消操作前的确认。发现 1 项风险
低风险

安装命令没有固定依赖版本

原文依据:15 处
发现了什么

安装命令没有指定依赖版本。同样的命令以后可能下载不同代码,你实际安装的内容可能与这次检查时不同。

为什么需要注意

即使命令和报告没变,以后安装时也可能下载到另一份代码。

这段代码的正常用途

这里的 `npx tsc` 是类型检查命令,不是明确的安装步骤;工作流先运行 `npm ci`,通常会从锁文件安装项目本地的 TypeScript,再由 `npx` 调用它。因此,“未固定版本的安装命令”在所示上下文中不成立。只有项目未声明本地 `typescript` 时,`npx` 才可能尝试获取其他版本,源文没有说明这种情况。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
这段代码的正常用途

`prisma migrate deploy` 是执行数据库迁移,不是安装 Prisma。此前的 `npm ci` 会按锁文件安装依赖,所以正常情况下 `npx` 使用已锁定的本地 Prisma CLI。若仓库没有声明 Prisma,`npx` 才可能临时下载,但提供的内容不足以证明该条件。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
这段代码的正常用途

该步骤确实安装 Playwright 所需的 Chromium/系统组件,但在它之前执行了 `npm ci`,因此 Playwright CLI及其对应浏览器版本通常由项目锁文件确定,而不是由这条命令任意选择最新版。系统依赖的底层发行版版本仍可能变化,但候选所称“没有指定依赖版本”没有结合这个锁文件上下文。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
这段代码的正常用途

`npx playwright test` 是运行测试,不是安装命令;同一任务之前已用 `npm ci` 安装锁文件中的依赖。正常配置下它调用本地、已锁定的 Playwright。只有本地包缺失时才可能触发临时获取,而源文没有显示这一条件。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。

预览部署示例直接运行未注明版本的 `npx vercel`,且片段中没有先用锁文件安装 CLI。若用户照此配置且本地不存在 Vercel CLI,`npx` 可能从注册表取得当时解析到的版本,未来执行内容可能变化。用户可要求作者固定 CLI 版本、通过锁文件安装,并限制部署令牌权限。

回滚示例直接调用未注明版本的 `npx vercel`,也没有展示锁文件安装。若 runner 上没有本地 CLI,`npx` 可能按执行时的注册表状态下载工具,使回滚行为随上游版本变化;这对恢复生产服务尤其敏感。可要求使用锁文件和明确版本,并在受控环境验证回滚。

这段代码的正常用途

这里的 `npx tsc` 是类型检查而非安装;同一任务先执行 `npm ci`,通常会安装锁文件固定的本地 TypeScript。若项目没有本地 TypeScript,`npx` 才可能获取其他版本,但源文未提供这种证据。

这项判断针对展示的代码和适用条件,不表示风险已经实际发生。
SKILL.md:88来自说明文档打开原文件
      - name: Type check        run: npx tsc --noEmit
查看另外 14 个位置
SKILL.md:81来自说明文档打开原文件
      - name: Install dependencies        run: npm ci
SKILL.md:87来自说明文档打开原文件
      - name: Type check        run: npx tsc --noEmit
SKILL.md:128来自说明文档打开原文件
      - name: Run migrations        run: npx prisma migrate deploy        env:
SKILL.md:126来自说明文档打开原文件
          cache: 'npm'      - run: npm ci      - name: Run migrations        run: npx prisma migrate deploy        env:
SKILL.md:152来自说明文档打开原文件
      - name: Install Playwright        run: npx playwright install --with-deps chromium      - name: Build
SKILL.md:150来自说明文档打开原文件
          cache: 'npm'      - run: npm ci      - name: Install Playwright        run: npx playwright install --with-deps chromium      - name: Build
SKILL.md:156来自说明文档打开原文件
      - name: Run E2E tests        run: npx playwright test      - uses: actions/upload-artifact@v4
SKILL.md:155来自说明文档打开原文件
        run: npm run build      - name: Run E2E tests        run: npx playwright test      - uses: actions/upload-artifact@v4
SKILL.md:207来自说明文档打开原文件
    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
SKILL.md:201来自说明文档打开原文件
# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
SKILL.md:268来自说明文档打开原文件
          # Deploy the specified previous version          npx vercel rollback ${{ inputs.version }}```
SKILL.md:265来自说明文档打开原文件
    steps:      - name: Rollback deployment        run: |          # Deploy the specified previous version          npx vercel rollback ${{ inputs.version }}```
SKILL.md:348来自说明文档打开原文件
      - run: npm ci      - run: npx tsc --noEmit
SKILL.md:341来自说明文档打开原文件
  typecheck:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: actions/setup-node@v4        with: { node-version: '22', cache: 'npm' }      - run: npm ci      - run: npx tsc --noEmit
会不会误导 AI 或隐藏内容?检查工作说明是否要求 AI 忽略你的指令、干扰检查结果,或夹带看不见的文字。发现 1 项风险
中风险

把未经审查的 CI 输出交给代理并让其提交代码,可能形成提示注入链

原文依据:4 处
发现了什么

文档要求复制 CI 输出并交给代理修复,随后描述代理提交和推送。测试、构建工具或依赖能够控制日志内容,因此日志可能包含伪装成指令的文本;这里没有要求把日志当作不可信数据,也没有在推送前设置人工复核。

为什么需要注意

代理可能受恶意日志影响,进行与真实故障无关的代码修改、提交或推送,从而损害源代码和后续流水线。

文档主动建议把 CI 输出粘贴给代理,并描绘代理修复、提交和推送的循环。若失败日志可被测试、构建脚本或第三方依赖控制,其中伪装的指令可能影响代理修改代码或作出错误决定;示例没有说明日志是不可信数据,也没有明确推送前人工复核。用户可要求只提供必要日志、禁止代理自动推送,并在提交前审查差异。

SKILL.md:166来自说明文档打开原文件
The power of CI with AI agents is the feedback loop. When CI fails:```CI failsCopy the failure outputFeed it to the agent:"The CI pipeline failed with this error:[paste specific error]Fix the issue and verify locally before pushing again."Agent fixes → pushes → CI runs again```
查看另外 3 个位置
SKILL.md:184来自说明文档打开原文件
**Key patterns:**```Lint failure → Agent runs `npm run lint --fix` and commitsType error  → Agent reads the error location and fixes the typeTest failure → Agent follows debugging-and-error-recovery skillBuild error → Agent checks config and dependencies```
SKILL.md:179来自说明文档打开原文件
Fix the issue and verify locally before pushing again."Agent fixes → pushes → CI runs again```
SKILL.md:186来自说明文档打开原文件
```Lint failure → Agent runs `npm run lint --fix` and commitsType error  → Agent reads the error location and fixes the typeTest failure → Agent follows debugging-and-error-recovery skillBuild error → Agent checks config and dependencies```
会不会偷偷改推广链接或收款方?检查是否强制替换推广链接或收款对象,同时要求隐瞒更改。未发现风险

Skill 逻辑拆解

8 个说明模块

该 Skill 只有说明文档和可复制的工作流片段;所提供证据中没有独立脚本。其建议在拉取请求和 main 分支推送时运行依赖安装、检查、测试、构建和审计。

查看原文
SKILL.md:64来自说明文档打开原文件
on:  pull_request:    branches: [main]  push:    branches: [main]
SKILL.md:81来自说明文档打开原文件
      - name: Install dependencies        run: npm ci      - name: Lint        run: npm run lint      - name: Type check        run: npx tsc --noEmit      - name: Test        run: npm test -- --coverage      - name: Build        run: npm run build      - name: Security audit        run: npm audit --audit-level=high```

数据库集成测试示例启动 PostgreSQL 服务,并对明确指向 localhost 测试库的连接运行 Prisma 迁移和测试。密码来自 GitHub Secrets,而不是硬编码值。

查看原文
SKILL.md:105来自说明文档打开原文件
    runs-on: ubuntu-latest    services:      postgres:        image: postgres:16        env:          POSTGRES_DB: testdb          POSTGRES_USER: ci_user          POSTGRES_PASSWORD: ${{ secrets.CI_DB_PASSWORD }}        ports:          - 5432:5432        options: >-
SKILL.md:127来自说明文档打开原文件
      - run: npm ci      - name: Run migrations        run: npx prisma migrate deploy        env:          DATABASE_URL: postgresql://ci_user:${{ secrets.CI_DB_PASSWORD }}@localhost:5432/testdb      - name: Integration tests        run: npm run test:integration        env:          DATABASE_URL: postgresql://ci_user:${{ secrets.CI_DB_PASSWORD }}@localhost:5432/testdb```

该 Skill 不仅配置验证,还建议创建 Vercel 预览部署、手动回滚、自动合并和功能逐步发布;这些操作会改变代码仓库或云部署状态。

查看原文
SKILL.md:197来自说明文档打开原文件
Every PR gets a preview deployment for manual testing:```yaml# Deploy preview on PR (Vercel/Netlify/etc.)deploy-preview:  runs-on: ubuntu-latest  if: github.event_name == 'pull_request'  steps:    - uses: actions/checkout@v4    - name: Deploy preview      run: npx vercel --token=${{ secrets.VERCEL_TOKEN }}```
SKILL.md:304来自说明文档打开原文件
- **Required reviews:** At least 1 approval before merge- **Required status checks:** CI must pass before merge- **Branch protection:** No force-pushes to main- **Auto-merge:** If all checks pass and approved, merge automatically
从这里开始 · 工作说明SKILL.md
ci-cd-and-automation
连线表示工作说明包含的模块,不是实际运行顺序。点击模块可查看原文。 另有 4 个章节,可在原文件中查看。
文件与检查记录1 个文件

检查范围与遗漏

逐文件查看涉及的内容

下方列出本次涉及的原文范围;纳入检查不代表已查清所有问题。

  • SKILL.md已纳入全文

这份报告只针对上方版本。我们看了拿到的代码和说明文件,没有实际运行 Skill,也没有检查它另外安装的软件包。因此,这不是“保证安全”的承诺;换了版本或使用环境,结果也可能不同。

  • SKILL.md工作说明

代码和说明中提到的操作

安装其他软件包
SKILL.md:88来自说明文档打开原文件
      - name: Type check        run: npx tsc --noEmit
SKILL.md:128来自说明文档打开原文件
      - name: Run migrations        run: npx prisma migrate deploy        env:
SKILL.md:152来自说明文档打开原文件
      - name: Install Playwright        run: npx playwright install --with-deps chromium      - name: Build
读取密钥或账号配置
SKILL.md:137来自说明文档打开原文件
> **Note:** Even for CI-only test databases, use GitHub Secrets for credentials rather than hardcoding values. This builds good habits and prevents accidental reuse of test credentials in other contexts.
SKILL.md:274来自说明文档打开原文件
```.env.example       → Committed (template for developers).env                → NOT committed (local development)
SKILL.md:275来自说明文档打开原文件
.env.example       → Committed (template for developers).env                → NOT committed (local development).env.test           → Committed (test environment, no real secrets)
读取了多少行
391
文件校验值(用于核对版本)
d015ad789e9559f6f423421540a47f7e20181bfa8a089468354c36bd5812fba1