fix(gc): decode lsl #12 frame adjustments in the aarch64 prologue walker
#12274
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Security Audit | |
| on: | |
| pull_request: | |
| push: | |
| branches: [main] | |
| schedule: | |
| - cron: "0 12 * * 1" | |
| workflow_dispatch: | |
| permissions: | |
| contents: read | |
| concurrency: | |
| # One group per main COMMIT, cancelling PR runs only. Two separate problems | |
| # were live here, and this is a REQUIRED status check: it had NINE cancelled | |
| # `main` runs and zero executions. | |
| # | |
| # `cancel-in-progress: true` cancels main runs outright, and even `false` | |
| # would not have been enough — GitHub allows at most one PENDING run per | |
| # group and cancels the previously pending one when a new run enters, | |
| # regardless of that setting (#7205). Keying push runs on the SHA gives every | |
| # merged commit a group of its own. | |
| group: security-audit-${{ github.event_name }}-${{ github.event_name == 'push' && github.sha || github.ref }} | |
| cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
| jobs: | |
| security-audit: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: dtolnay/rust-toolchain@stable | |
| - uses: ./.github/actions/setup-llvm22 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| shared-key: security-audit | |
| - name: Install cargo-audit | |
| run: cargo install cargo-audit --locked | |
| - name: Run cargo audit | |
| # Default cargo-audit behavior: fail on `vulnerability` advisories | |
| # (real CVEs), surface `unmaintained` / `notice` / `unsound` / | |
| # `yanked` advisories as warnings. | |
| # | |
| # `--ignore` accepts specific RUSTSEC IDs that are acknowledged | |
| # transitive-dep advisories with no actionable upstream fix: | |
| # | |
| # - RUSTSEC-2023-0071 (rsa) — Marvin attack timing side-channel; | |
| # upstream marks "No fixed upgrade is available". The rsa | |
| # crate is a transitive dep through several stacks; tracking | |
| # for upstream fix. | |
| # - RUSTSEC-2026-0118 / -0119 (hickory-proto) — DNS query | |
| # amplification + DoS surface; transitive via reqwest's | |
| # tls-rustls path. Upstream hickory has a fix in main but | |
| # not yet released; tracking. | |
| # - RUSTSEC-2026-0187 (lopdf) — stack overflow via deeply nested | |
| # PDF objects. Fixed in lopdf >=0.42.0, but lopdf is transitive | |
| # via printpdf (perry-ext-pdf); printpdf's latest (0.9.1) still | |
| # pins lopdf ^0.39, so there is no actionable upstream bump yet. | |
| # perry-ext-pdf is a PDF *creation* API (createPdf/addText/…), | |
| # not a parser of untrusted PDFs, so the deeply-nested-input | |
| # surface is not reached. Tracking for a printpdf release that | |
| # moves to lopdf >=0.42. | |
| # | |
| # Previously the job ran `--deny warnings` which also | |
| # escalated every "unmaintained crate" notice into a hard | |
| # failure (adler, fxhash, paste, number_prefix, bincode v1, | |
| # etc.) — those have no in-tree replacement and were blocking | |
| # merges without an actionable fix. Dropped that flag; warnings | |
| # still surface in the log. | |
| run: | | |
| cargo audit \ | |
| --ignore RUSTSEC-2023-0071 \ | |
| --ignore RUSTSEC-2026-0118 \ | |
| --ignore RUSTSEC-2026-0119 \ | |
| --ignore RUSTSEC-2026-0187 | |
| # Soak parity gate + external-tool pin gate. Always-run (deliberately not | |
| # path-filtered — nub hid this gate in a path-gated job and it silently | |
| # skipped Rust-only PRs). The scripts are dep-free erasable-TS .mts run | |
| # with the pinned Node's native type stripping; no npm install needed. | |
| soak-gate: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 | |
| with: | |
| node-version-file: .node-version | |
| - name: Soak window parity (npm run soak) | |
| run: node scripts/soak/soak.mts --check | |
| - name: External-tool pins valid (npm run tools:check) | |
| run: node scripts/soak/external-tools.mts --check | |
| - name: Soak script unit tests (npm run test:scripts) | |
| run: node --test scripts/soak/*.test.mts | |
| # AgentShield — audits the operator-side Claude config (.claude/: hooks, | |
| # permissions, MCP servers, agents) for prompt injection, leaked secrets, | |
| # over-permissive tool grants. Installed from the SRI-pinned registry | |
| # tarball in external-tools.json (never `npm install -g`). | |
| agent-scan: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 10 | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 | |
| with: | |
| node-version-file: .node-version | |
| - name: Install pinned agentshield | |
| env: | |
| # download() attaches this to github.com fetches only (release | |
| # assets); without it private assets 404 and public ones ride | |
| # unauthenticated rate limits. | |
| GITHUB_TOKEN: ${{ github.token }} | |
| run: node scripts/soak/external-tools.mts --install agentshield | |
| - name: Scan .claude/ config | |
| run: | | |
| BIN_DIR="$(node scripts/soak/external-tools.mts --print-bin)" | |
| export PATH="$BIN_DIR:$PATH" | |
| agentshield scan | |
| # SkillSpector (NVIDIA) — audits the repo's Claude skills (.claude/skills/) | |
| # before they run on anyone's machine: YARA + AST static analysis (the | |
| # --no-llm path; no API key needed in CI). Pinned to the same git SHA as | |
| # external-tools.json tools.skillspector; python pinned because | |
| # yara-python ships no cp314 wheels yet. | |
| skills-scan: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 15 | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: astral-sh/setup-uv@c771a70e6277c0a99b617c7a806ffedaca235ff9 # v9.0.0 | |
| - name: Scan each skill | |
| run: | | |
| set -euo pipefail | |
| skillspector_ref="$(jq -er '.tools.skillspector.version' external-tools.json)" | |
| soak_days="$(sed -nE 's/^export const SOAK_DAYS = ([0-9]+)$/\1/p' scripts/soak/constants.mts)" | |
| test -n "$soak_days" | |
| exclude_newer="$(date -u -d "${soak_days} days ago" '+%Y-%m-%dT%H:%M:%SZ')" | |
| for skill in .claude/skills/*/; do | |
| echo "::group::skillspector ${skill}" | |
| uv tool run --python 3.12 \ | |
| --exclude-newer "$exclude_newer" \ | |
| --from "git+https://github.com/NVIDIA/skillspector@${skillspector_ref}" \ | |
| skillspector scan "${skill}" --no-llm | |
| echo "::endgroup::" | |
| done | |
| # License policy + duplicate-version tracking (deny.toml at repo root). | |
| # Advisories stay with cargo-audit above — deny.toml doesn't duplicate them. | |
| # Pure metadata check: no compilation, runs in ~1 min once cargo-deny is | |
| # cached in ~/.cargo/bin by rust-cache. | |
| cargo-deny: | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| persist-credentials: false | |
| - uses: dtolnay/rust-toolchain@stable | |
| - uses: ./.github/actions/setup-llvm22 | |
| - uses: Swatinem/rust-cache@v2 | |
| with: | |
| shared-key: security-audit | |
| - name: Install cargo-deny | |
| run: which cargo-deny || cargo install cargo-deny --locked | |
| - name: Run cargo deny | |
| run: cargo deny check licenses bans sources |