Repository navigation
security: verify asset checksums in install.sh before execution - #83
WuKongAI-CMU wants to merge 1 commit into
Conversation
The installer previously used `curl | bash` to fetch and execute remote scripts (nvm, Ollama), which provides no integrity verification. A compromised CDN or MITM attack could inject arbitrary code. Add a `fetch_and_verify()` helper that: 1. Downloads remote scripts to a temp file (not piped to shell) 2. Computes SHA-256 and compares against a pinned digest 3. Aborts with a clear error if the checksum does not match 4. Falls back gracefully when no hashing tool is available The nvm installer (v0.40.4) now has a pinned SHA-256 checksum. Ollama's installer uses download-to-file without a pinned hash (their script changes frequently) but still avoids the pipe-to- shell pattern. Closes NVIDIA#57 Signed-off-by: peteryuqin <[email protected]>
ericksoa
left a comment
There was a problem hiding this comment.
LGTM. Verified with 25 assertions across 9 test cases, all passing:
| Test | Description | Result |
|---|---|---|
| TC1 | Pinned nvm hash matches real v0.40.4 installer (independently downloaded and verified) | PASS |
| TC2 | Happy path — correct hash verifies and executes | PASS (3 assertions) |
| TC3 | Tampered file — mismatch aborts, shows both expected and actual hashes | PASS (5 assertions) |
| TC4 | Empty hash (Ollama path) — skips verification, still executes | PASS (3 assertions) |
| TC5 | No hash tools available — warns and executes (same security posture as before) | PASS (3 assertions) |
| TC6 | Temp file cleanup after both success and failure | PASS (2 assertions) |
| TC7 | Bad URL — errors cleanly with "Failed to download" | PASS (2 assertions) |
| TC8 | shasum fallback works when sha256sum unavailable (macOS compat) |
PASS (2 assertions) |
| TC9 | Static analysis — zero `curl | bashpipes remain, all downloads usefetch_and_verify` |
Good tradeoffs: pins nvm (version-locked URL, real risk), skips Ollama (rolling URL, can't pin without breakage). The fetch_and_verify helper is clean, self-contained, and handles edge cases well.
One minor suggestion (non-blocking): add a comment noting that when NVM_VERSION is bumped, NVM_SHA256 must be updated — the existing comment says this but making it slightly more prominent (e.g., # IMPORTANT: update NVM_SHA256 when changing NVM_VERSION) would help future maintainers.
ericksoa
left a comment
There was a problem hiding this comment.
Withdrawing approval after further review. We'll handle this internally — thanks for flagging the issue.
|
Closing to reduce my open PR count below the repo policy limit and refocus on a smaller set of higher-signal changes. I can revive this branch later if it becomes the right path again. |
> **🏗️ build-from-issue-agent** Closes NVIDIA#71 ## Summary Add dynamic shell completion support using `clap_complete`'s `CompleteEnv`, plus a `navigator completions <shell>` subcommand (rustup-style) that outputs completion scripts to stdout with detailed per-shell setup instructions in `--help`. Completions are dynamic — the shell calls back into the `navigator` binary on each tab-press, so they are always in sync with the installed version. This also lays the groundwork for future runtime completers (e.g., listing sandbox names on tab, tracked in NVIDIA#83). ## Changes Made - `Cargo.toml`: Added `clap_complete = { version = "4.5", features = ["unstable-dynamic"] }` to workspace dependencies - `crates/navigator-cli/Cargo.toml`: Added `clap_complete` dependency - `crates/navigator-cli/src/main.rs`: - Added `CompleteEnv::with_factory(Cli::command).complete()` at the top of `main()` (before TLS/argument parsing) - Added `Completions { shell }` subcommand that re-invokes the binary with `COMPLETE=<shell>` and pipes the output - Added `CompletionShell` enum (bash, fish, zsh, powershell) - Added `COMPLETIONS_HELP` with per-shell setup instructions (similar to `rustup completions --help`) - Added 3 unit tests - `CONTRIBUTING.md`: Added shell completions section documenting `nav` wrapper setup ## Usage ```bash # Generate completions navigator completions fish > ~/.config/fish/completions/navigator.fish navigator completions bash > ~/.local/share/bash-completion/completions/navigator navigator completions zsh > ~/.zfunc/_navigator navigator completions powershell >> $PROFILE # See full per-shell instructions navigator completions --help # For the nav wrapper (rewrite registration target) navigator completions fish | sed 's/--command navigator/--command nav/' > ~/.config/fish/completions/nav.fish ``` ## Design Decision: Why stdout-only (no auto-install) We researched how 12 popular CLI tools handle completion installation: | Tool | Command | Writes files? | Modifies RC? | |------|---------|---------------|-------------| | gh, glab, kubectl, docker, rustup, mise, starship | `completion <shell>` | stdout only | No | | atuin | `gen-completions --shell <shell>` | stdout (`--out-dir` option) | No | | gcloud | `install.sh` | Yes | **Yes** | | Amazon Q | `q integrations install` | Yes | **Yes** | **10 of 12 tools** follow the same pattern: output to stdout, never modify RC files, explicit shell selection, clear `--help` instructions. Only gcloud and Amazon Q modify RC files (and both have been criticized for it). Our approach matches the industry consensus. ## Deviations from Plan - The original issue proposed a static `completions <shell>` subcommand using `clap_complete::generate()`. After discussion, we switched to dynamic `CompleteEnv` which is always up-to-date and enables future runtime completers. - Added a `navigator completions <shell>` subcommand (not in original plan) for discoverability — it wraps the `COMPLETE` env var mechanism with a familiar CLI UX. ## Tests Added - **Unit:** `cli_debug_assert` — validates CLI structure; `completions_engine_returns_candidates` — smoke test confirming the completion engine returns subcommand candidates; `completions_subcommand_appears_in_candidates` — verifies `completions` appears in tab-completion results - **Integration:** N/A - **E2E:** N/A ## Verification - [x] All tests passing - [x] Pre-commit checks passing (clippy warnings are pre-existing, not from this change) - [x] CONTRIBUTING.md updated with nav wrapper completion setup
* feat(skills): create nemoclaw-cli agent skill and fix generate-sandbox-policy schema drift Closes NVIDIA#83 Create a new nemoclaw-cli agent skill with tiered workflow guidance (basic through advanced) and a supplementary CLI reference. The skill covers provider management, sandbox lifecycle, policy iteration loops, BYOC pipelines, and agent-assisted sandbox sessions. It cross-references generate-sandbox-policy for policy content authoring and includes --help self-teaching as a fallback. Fix critical schema drift in generate-sandbox-policy: rename allowed_routing_hints to allowed_routes (matching the actual proto/serde field name). Update default read_only paths to match dev-sandbox-policy.yaml. Fix the same field name error in architecture/security-policy.md. * policy updates * fix(test): update OPA tests for renamed github_ssh_over_https policy key --------- Co-authored-by: John Myers <[email protected]>
Summary
Fixes #57 —
install.shnow verifies integrity of remote scripts before executing them.Before:
curl -o- <url> | bash— no integrity verification, vulnerable to MITM or CDN compromise.After: New
fetch_and_verify()helper:sha256sumorshasum(cross-platform)4b7412c4...The pinned nvm hash should be updated when bumping the nvm version.
Test plan
bash -n install.sh)🤖 Generated with Claude Code