Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

fix(ci): stop running markdownlint from an unverified npx cache

未关闭 适合新手
#8,405 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

还没有人认领这个 Issue。

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
75/100
Issue 类型
缺陷
描述清晰度
描述清楚
活跃度
活跃
技术栈
github-actions, shell
领域
ci-cd, security

调研方向

阅读.github/workflows/pr-require-checks.yml第862–884行附近的内容,并追踪markdownlint composite如何调用npx。删除markdownlint下载缓存的恢复和保存步骤,使每次运行都从registry获取固定版本的包;验证workflow不再恢复或保存该缓存。

由索引模型根据 Issue 内容生成。

描述

needs-human

Refs: #8294

Problem

lint-repo in .github/workflows/pr-require-checks.yml (lines 862-869) restores ~/.npm/_npx and ~/.npm/_cacache under a static key, npx-markdownlint-cli2-${{ runner.os }}-<composite sha>, before the markdownlint composite runs npx --yes markdownlint-cli2@<pin>. Lines 877-884 save the cache only from refs/heads/main.

GitHub's dependency caching docs say: "Cache contents are not signed or verified, and any workflow run that can read a cache may extract its contents. Extracted caches may modify files that are subsequently executed in a workflow run, leading to malicious code execution."

npx does not appear to re-verify a matching tree it finds in _npx (UNVERIFIED by the filer: from a reading of npm/cli workspaces/libnpmexec/lib/index.js, where a tree whose node.pkgid equals the requested spec skips fetch and reify and its bin runs as found).

  • Attacker precondition: a write to main's cache scope under that exact key while it is absent (a pin bump or an eviction; the repo sits near the 10 GB cap). Jobs on trusted triggers such as workflow_dispatch on main get a write-mode cache token by default, and the lane workflows dispatched that way run PR-head code with a model holding Bash (#8294). Whether that Bash can reach a cache-write path is unproven: the runtime token is set only for node and container action steps, and CLAUDE_CODE_SUBPROCESS_ENV_SCRUB isolates the PID namespace. Tampering with files a later node step in the same job executes has not been probed.
  • Impact: code runs in lint-repo on every PR, merge group and scheduled run. That job holds contents: read, checks: read and no secrets, so it cannot steal credentials. It can forge the markdownlint, typos, zizmor and actionlint results that feed ci-status.
  • Contrast: the shfmt cache checks its binary with sha256sum -c before use.

Fix

Delete the "Restore the markdownlint download" and "Save the markdownlint download" steps so npx fetches from the registry each run. Keying on a lockfile hash would not help, because npx ignores lockfiles. Writer-side hardening (cache-mode: read on the jobs that call the lanes) stays in #8294.

Priority

Low: no secret exposure, and it needs a write-capable main-scope run executing untrusted code first.

主要语言
Shell
星标
22
派生
2
平均合并
3 小时 42 分钟
30 天内合并 PR
938

环境准备

  • 没有 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

melodic-software/claude-code-plugins 的其他 Issue

查看 melodic-software/claude-code-plugins 的全部 Issue

相似的 Issue

更多 Shell/Bash Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。