fix(security): fail closed for DNS-backed HTTPS endpoints - #6139
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughExtends endpoint validation metadata, makes downstream URL selection fail closed for DNS-backed HTTPS endpoints, and updates runner, sandbox config, unit, and live tests to match the new behavior. ChangesDNS-backed HTTPS fail-closed enforcement
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related issues
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
nemoclaw/src/blueprint/runner.test.ts (1)
574-574: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueRedundant mock-call assertions alongside observable outcomes.
toHaveBeenCalledWithonmockedValidateEndpointlocks in an implementation detail (how the endpoint is validated) on top of the already-sufficient observable assertion (plan.inference.endpoint/ prior expectation). Per path instructions for test files, prefer relying on observable outcomes through the public boundary over mock-call assertions.Not blocking — these are additive, not the sole assertion.
Also applies to: 1116-1116
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@nemoclaw/src/blueprint/runner.test.ts` at line 574, The test in runner.test.ts is asserting the internal call to mockedValidateEndpoint, which duplicates implementation details beyond the observable result. Remove the toHaveBeenCalledWith expectation in the relevant test cases and keep the assertions focused on the public outcome, such as plan.inference.endpoint and any existing observable checks, using runner/plan-related symbols to locate the affected tests.Source: Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@nemoclaw/src/blueprint/runner.test.ts`:
- Line 574: The test in runner.test.ts is asserting the internal call to
mockedValidateEndpoint, which duplicates implementation details beyond the
observable result. Remove the toHaveBeenCalledWith expectation in the relevant
test cases and keep the assertions focused on the public outcome, such as
plan.inference.endpoint and any existing observable checks, using
runner/plan-related symbols to locate the affected tests.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 34f5682e-810d-40a8-90f3-297c7e2cf665
📒 Files selected for processing (7)
nemoclaw/src/blueprint/runner.test.tsnemoclaw/src/blueprint/runner.tsnemoclaw/src/blueprint/ssrf.test.tsnemoclaw/src/blueprint/ssrf.tssrc/lib/sandbox/config.tstest/config-set.test.tstest/e2e/live/inference-routing.test.ts
34d5a7f to
0493433
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (2)
nemoclaw/src/blueprint/runner.test.ts (2)
566-566: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winCoverage gap:
actionPlanno longer tests DNS-backed HTTPS override fail-closed behavior.The diff removes the
actionPlantest that verifiedendpointUrloverride handling (previously assertingplan.inference.endpointand thevalidateEndpointUrlcall), and no replacement was added. SinceresolveRunConfig/safeEndpointUrlForDownstreamis the shared enforcement point for the fail-closed policy (pernemoclaw/src/blueprint/runner.ts:416-446), this file now only proves the fail-closed behavior foractionApply, not foractionPlan. IfactionPlanreaches the sameresolveRunConfigpath, a DNS-backed HTTPS override would presumably also reject there, but that's currently unverified.Consider adding back an
actionPlantest asserting rejection for DNS-backed HTTPS overrides (mirroring the newactionApplytest), to keep both entrypoints covered for this security-critical fail-closed contract.Also applies to: 1088-1104
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@nemoclaw/src/blueprint/runner.test.ts` at line 566, Restore coverage for the shared fail-closed endpoint enforcement by adding an actionPlan test that mirrors the actionApply DNS-backed HTTPS override rejection, using the runner.test.ts actionPlan case and the resolveRunConfig/safeEndpointUrlForDownstream path to assert the override is rejected and validateEndpointUrl behavior is exercised. Make sure the new test specifically covers the DNS-backed HTTPS override scenario so actionPlan is verified independently, not just actionApply.
1088-1104: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winConsider asserting no side effects at all, not just no provider execa call.
resolveRunConfigthrows before sandbox creation even begins (pernemoclaw/src/blueprint/runner.ts:685-835), so a stronger assertion would additionally confirm norunCmd-based sandbox creation or state-file writes occurred, not only thatexecawasn't called with"provider". This would more fully validate the "fails closed before any side effect" claim in the test name.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@nemoclaw/src/blueprint/runner.test.ts` around lines 1088 - 1104, Strengthen the “fails closed” test in runner.test by asserting no side effects occur before provider creation: in addition to the existing execa check for "provider", verify that resolveRunConfig rejects before any sandbox setup or state persistence happens. Use the existing actionApply, mockedValidateEndpoint, and mockExeca hooks to assert no runCmd-based sandbox creation and no state-file writes are triggered when the DNS-backed HTTPS override is rejected.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@nemoclaw/src/blueprint/runner.test.ts`:
- Line 566: Restore coverage for the shared fail-closed endpoint enforcement by
adding an actionPlan test that mirrors the actionApply DNS-backed HTTPS override
rejection, using the runner.test.ts actionPlan case and the
resolveRunConfig/safeEndpointUrlForDownstream path to assert the override is
rejected and validateEndpointUrl behavior is exercised. Make sure the new test
specifically covers the DNS-backed HTTPS override scenario so actionPlan is
verified independently, not just actionApply.
- Around line 1088-1104: Strengthen the “fails closed” test in runner.test by
asserting no side effects occur before provider creation: in addition to the
existing execa check for "provider", verify that resolveRunConfig rejects before
any sandbox setup or state persistence happens. Use the existing actionApply,
mockedValidateEndpoint, and mockExeca hooks to assert no runCmd-based sandbox
creation and no state-file writes are triggered when the DNS-backed HTTPS
override is rejected.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 15540c4f-2f84-47f9-9814-58e7c7eea245
📒 Files selected for processing (8)
nemoclaw/src/blueprint/runner.test.tsnemoclaw/src/blueprint/runner.tsnemoclaw/src/blueprint/ssrf.test.tsnemoclaw/src/blueprint/ssrf.tssrc/lib/actions/inference-set-endpoint-security.test.tssrc/lib/sandbox/config.tstest/config-set.test.tstest/e2e/live/inference-routing.test.ts
🚧 Files skipped from review as they are similar to previous changes (5)
- test/config-set.test.ts
- src/lib/sandbox/config.ts
- nemoclaw/src/blueprint/ssrf.ts
- nemoclaw/src/blueprint/ssrf.test.ts
- nemoclaw/src/blueprint/runner.ts
0493433 to
371c2ea
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (1)
test/e2e/live/inference-routing.test.ts (1)
712-712: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUse literal
:instead ofpath.delimiterfor PATH construction.Based on learnings, this repo's test suite establishes the POSIX PATH separator
:for buildingprocess.env.PATHin tests rather thanpath.delimiter, since CI only runs on Linux and Windows is limited to already-POSIX-compliant WSL e2e runs.♻️ Proposed fix
- PATH: `${fakeBinDir}${path.delimiter}${process.env.PATH ?? ""}`, + PATH: `${fakeBinDir}:${process.env.PATH ?? ""}`,🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/e2e/live/inference-routing.test.ts` at line 712, The PATH setup in the e2e test uses path.delimiter, but this suite should hardcode the POSIX separator instead. Update the PATH construction in inference-routing.test.ts to use a literal colon when concatenating fakeBinDir with process.env.PATH, keeping the rest of the test setup unchanged.Source: Learnings
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@test/e2e/live/inference-routing.test.ts`:
- Line 712: The PATH setup in the e2e test uses path.delimiter, but this suite
should hardcode the POSIX separator instead. Update the PATH construction in
inference-routing.test.ts to use a literal colon when concatenating fakeBinDir
with process.env.PATH, keeping the rest of the test setup unchanged.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 36142bde-05e6-462c-a96b-5bfa8e768e2f
📒 Files selected for processing (8)
nemoclaw/src/blueprint/runner.test.tsnemoclaw/src/blueprint/runner.tsnemoclaw/src/blueprint/ssrf.test.tsnemoclaw/src/blueprint/ssrf.tssrc/lib/actions/inference-set-endpoint-security.test.tssrc/lib/sandbox/config.tstest/config-set.test.tstest/e2e/live/inference-routing.test.ts
🚧 Files skipped from review as they are similar to previous changes (7)
- src/lib/actions/inference-set-endpoint-security.test.ts
- nemoclaw/src/blueprint/ssrf.test.ts
- src/lib/sandbox/config.ts
- nemoclaw/src/blueprint/runner.ts
- nemoclaw/src/blueprint/ssrf.ts
- test/config-set.test.ts
- nemoclaw/src/blueprint/runner.test.ts
371c2ea to
9506fa4
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (1)
test/e2e/live/inference-routing.test.ts (1)
712-712: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valuePrefer literal
:overpath.delimiterfor constructing test PATH.Based on learnings, this repo's test suite prefers the established POSIX PATH separator
:when constructingprocess.env.PATHin tests rather thanpath.delimiter, since these tests only run on Linux CI runners (Windows is limited to WSL e2e, which is already POSIX-compliant).♻️ Suggested change
- PATH: `${fakeBinDir}${path.delimiter}${process.env.PATH ?? ""}`, + PATH: `${fakeBinDir}:${process.env.PATH ?? ""}`,🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@test/e2e/live/inference-routing.test.ts` at line 712, The PATH construction in the e2e test is using path.delimiter, but this suite expects a fixed POSIX separator. Update the PATH assignment in inference-routing.test.ts to use a literal colon when prepending fakeBinDir, and keep the change localized to the test setup that builds process.env.PATH.Source: Learnings
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@test/e2e/live/inference-routing.test.ts`:
- Line 712: The PATH construction in the e2e test is using path.delimiter, but
this suite expects a fixed POSIX separator. Update the PATH assignment in
inference-routing.test.ts to use a literal colon when prepending fakeBinDir, and
keep the change localized to the test setup that builds process.env.PATH.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: ac0004f1-58dd-47ea-a8f6-35bad364af87
📒 Files selected for processing (8)
nemoclaw/src/blueprint/runner.test.tsnemoclaw/src/blueprint/runner.tsnemoclaw/src/blueprint/ssrf.test.tsnemoclaw/src/blueprint/ssrf.tssrc/lib/actions/inference-set-endpoint-security.test.tssrc/lib/sandbox/config.tstest/config-set.test.tstest/e2e/live/inference-routing.test.ts
🚧 Files skipped from review as they are similar to previous changes (7)
- src/lib/sandbox/config.ts
- test/config-set.test.ts
- nemoclaw/src/blueprint/ssrf.test.ts
- nemoclaw/src/blueprint/runner.test.ts
- nemoclaw/src/blueprint/runner.ts
- src/lib/actions/inference-set-endpoint-security.test.ts
- nemoclaw/src/blueprint/ssrf.ts
|
✨ Related open issues: |
…fail-closed # Conflicts: # package-lock.json
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary This PR prepares the user-facing documentation for v0.0.73 before the release plan is frozen. It adds release notes for the merged runtime changes and closes documentation gaps around DNS-backed HTTPS endpoint validation and LangChain Deep Agents Code proxy recovery. ## Changes - Add the `v0.0.73` release-note section with links to the detailed command, inference, recovery, lifecycle, platform, and setup documentation. - Correct the custom endpoint guidance so DNS-backed HTTPS rejection and the supported alternatives match the fail-closed runtime behavior. - Document the managed `inference.local` proxy boundary and rebuild requirement for existing LangChain Deep Agents Code sandboxes. - Add troubleshooting guidance for the DNS-backed HTTPS validation error. - Validate with `npm run docs:sync-agent-variants` and `npm run docs`; Fern completed with 0 errors and 2 existing warnings. - Source summary: - [#6139](#6139) -> `docs/about/release-notes.mdx`, `docs/inference/inference-options.mdx`, `docs/reference/commands.mdx`, `docs/reference/commands-nemohermes.mdx`, and `docs/reference/troubleshooting.mdx`: Document fail-closed DNS-backed HTTPS endpoint handling and recovery options. - [#6142](#6142) -> `docs/about/release-notes.mdx`: Summarize native OpenShell GPU injection and compatibility-path diagnostics. - [#6197](#6197) -> `docs/about/release-notes.mdx`: Summarize agent-aware messaging preset rejection. - [#6199](#6199) -> `docs/about/release-notes.mdx`: Summarize the unreachable-sandbox backup opt-in, restore behavior, and data-loss boundary. - [#6204](#6204) and [#6206](#6206) -> `docs/about/release-notes.mdx` and `docs/get-started/quickstart-langchain-deepagents-code.mdx`: Document the corrected managed proxy contract and required sandbox rebuild. - [#6213](#6213) -> `docs/about/release-notes.mdx`: Summarize the merged setup, recovery, and host-state documentation. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates <!-- Check all that apply. For any "covered by existing tests", "not applicable", or waiver entry, add a brief justification on the same line or in the Changes section. --> - [ ] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: documentation-only release preparation; the Fern docs build validates the changed pages and routes. - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification <!-- Check each item you ran and confirmed. Leave unchecked items you skipped. Doc-only changes do not require npm test unless you ran it. --> - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Git hooks passed during commit and push, or `npx prek run --from-ref main --to-ref HEAD` passes - [ ] Targeted tests pass for changed behavior - [ ] Full `npm test` passes (broad runtime changes only) - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Carlos Villela <cvillela@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added a new **v0.0.73** release notes section with six highlights at the top of the changelog. * Expanded **Custom Endpoint URL Validation** guidance in inference option docs, including explicit acceptance/rejection rules for HTTP vs DNS-backed HTTPS and how validated IPs are stored. * Updated command references (`nemohermes inference set`, `$$nemoclaw inference set`) to match the new validation behavior. * Added troubleshooting documentation for unsupported **DNS-backed HTTPS endpoints**, plus clarified Deep Agents Code routing and post-upgrade sandbox rebuild guidance. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Carlos Villela <cvillela@nvidia.com>
## Summary This PR fixes NVIDIA#4684 by taking the conservative path requested in the PR NVIDIA#4685 security review: DNS-backed HTTPS endpoints now fail closed before NemoClaw hands them to a downstream OpenShell/provider runtime. Credit to @1PoPTRoN for the original NVIDIA#4685 work that identified and covered the HTTPS DNS-rebinding gap. This PR intentionally preserves the narrow safety outcome while avoiding the contested host-loopback pin-proxy transport until a runtime-aware design is ready. ## What changed - Adds structured endpoint validation metadata in `nemoclaw/src/blueprint/ssrf.ts`. - Introduces `safeEndpointUrlForDownstream()`: - HTTP DNS-backed endpoints still use the DNS-pinned IP URL. - HTTPS IP-literal endpoints remain allowed. - DNS-backed HTTPS endpoints fail closed with an actionable error. - Applies the same fail-closed policy to generic persisted sandbox config URL rewrites. - Adds unit coverage for blueprint plan/apply and config-set behavior. - Adds a PR-safe live E2E slice in `inference-routing.test.ts` proving DNS-backed HTTPS blueprint apply fails before any OpenShell handoff. ## Why this shape PR NVIDIA#4685's host-local HTTPS pin proxy still had unresolved security/design concerns: - provider traffic may originate outside the NemoClaw host loopback namespace; - broadening a plaintext unauthenticated proxy would create credential-boundary risk; - redirects and credential-bearing URL state need a separate policy/design; - the long-lived helper environment and commit provenance needed cleanup. This PR therefore fixes the bug by failing closed instead of introducing a partial transport. A follow-up can add the runtime-aware HTTPS pinning transport with real OpenShell/Docker E2E coverage. ## Test plan - `npm --prefix nemoclaw test -- --run src/blueprint/ssrf.test.ts src/blueprint/runner.test.ts` - `npx vitest run --project integration test/config-set.test.ts --silent=false --reporter=default` - `NEMOCLAW_RUN_LIVE_E2E=1 npx vitest run --project e2e-live test/e2e/live/inference-routing.test.ts -t "TC-INF-10" --silent=false --reporter=default` - `npm run build:cli` - `npm --prefix nemoclaw run build` - `npm run typecheck:cli` Fixes NVIDIA#4684 <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Implemented fail-closed validation for DNS-backed HTTPS endpoints: they’re now rejected during endpoint validation, including when rewriting config URLs, preventing downstream runtime handoff. * Made endpoint URL handling consistent across overrides and blueprint resolution by applying the same downstream-safe normalization. * Enhanced endpoint validation feedback to include protocol/hostname and DNS-resolution details for consistent behavior across flows. * **Tests** * Strengthened unit and E2E coverage to assert DNS-backed HTTPS rejection and verify that no handoff command is executed on failure. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary This PR prepares the user-facing documentation for v0.0.73 before the release plan is frozen. It adds release notes for the merged runtime changes and closes documentation gaps around DNS-backed HTTPS endpoint validation and LangChain Deep Agents Code proxy recovery. ## Changes - Add the `v0.0.73` release-note section with links to the detailed command, inference, recovery, lifecycle, platform, and setup documentation. - Correct the custom endpoint guidance so DNS-backed HTTPS rejection and the supported alternatives match the fail-closed runtime behavior. - Document the managed `inference.local` proxy boundary and rebuild requirement for existing LangChain Deep Agents Code sandboxes. - Add troubleshooting guidance for the DNS-backed HTTPS validation error. - Validate with `npm run docs:sync-agent-variants` and `npm run docs`; Fern completed with 0 errors and 2 existing warnings. - Source summary: - [NVIDIA#6139](NVIDIA#6139) -> `docs/about/release-notes.mdx`, `docs/inference/inference-options.mdx`, `docs/reference/commands.mdx`, `docs/reference/commands-nemohermes.mdx`, and `docs/reference/troubleshooting.mdx`: Document fail-closed DNS-backed HTTPS endpoint handling and recovery options. - [NVIDIA#6142](NVIDIA#6142) -> `docs/about/release-notes.mdx`: Summarize native OpenShell GPU injection and compatibility-path diagnostics. - [NVIDIA#6197](NVIDIA#6197) -> `docs/about/release-notes.mdx`: Summarize agent-aware messaging preset rejection. - [NVIDIA#6199](NVIDIA#6199) -> `docs/about/release-notes.mdx`: Summarize the unreachable-sandbox backup opt-in, restore behavior, and data-loss boundary. - [NVIDIA#6204](NVIDIA#6204) and [NVIDIA#6206](NVIDIA#6206) -> `docs/about/release-notes.mdx` and `docs/get-started/quickstart-langchain-deepagents-code.mdx`: Document the corrected managed proxy contract and required sandbox rebuild. - [NVIDIA#6213](NVIDIA#6213) -> `docs/about/release-notes.mdx`: Summarize the merged setup, recovery, and host-state documentation. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates <!-- Check all that apply. For any "covered by existing tests", "not applicable", or waiver entry, add a brief justification on the same line or in the Changes section. --> - [ ] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: documentation-only release preparation; the Fern docs build validates the changed pages and routes. - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification <!-- Check each item you ran and confirmed. Leave unchecked items you skipped. Doc-only changes do not require npm test unless you ran it. --> - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Git hooks passed during commit and push, or `npx prek run --from-ref main --to-ref HEAD` passes - [ ] Targeted tests pass for changed behavior - [ ] Full `npm test` passes (broad runtime changes only) - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Carlos Villela <cvillela@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added a new **v0.0.73** release notes section with six highlights at the top of the changelog. * Expanded **Custom Endpoint URL Validation** guidance in inference option docs, including explicit acceptance/rejection rules for HTTP vs DNS-backed HTTPS and how validated IPs are stored. * Updated command references (`nemohermes inference set`, `$$nemoclaw inference set`) to match the new validation behavior. * Added troubleshooting documentation for unsupported **DNS-backed HTTPS endpoints**, plus clarified Deep Agents Code routing and post-upgrade sandbox rebuild guidance. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Carlos Villela <cvillela@nvidia.com>
Summary
This PR fixes #4684 by taking the conservative path requested in the PR #4685 security review: DNS-backed HTTPS endpoints now fail closed before NemoClaw hands them to a downstream OpenShell/provider runtime.
Credit to @1PoPTRoN for the original #4685 work that identified and covered the HTTPS DNS-rebinding gap. This PR intentionally preserves the narrow safety outcome while avoiding the contested host-loopback pin-proxy transport until a runtime-aware design is ready.
What changed
nemoclaw/src/blueprint/ssrf.ts.safeEndpointUrlForDownstream():inference-routing.test.tsproving DNS-backed HTTPS blueprint apply fails before any OpenShell handoff.Why this shape
PR #4685's host-local HTTPS pin proxy still had unresolved security/design concerns:
This PR therefore fixes the bug by failing closed instead of introducing a partial transport. A follow-up can add the runtime-aware HTTPS pinning transport with real OpenShell/Docker E2E coverage.
Test plan
npm --prefix nemoclaw test -- --run src/blueprint/ssrf.test.ts src/blueprint/runner.test.tsnpx vitest run --project integration test/config-set.test.ts --silent=false --reporter=defaultNEMOCLAW_RUN_LIVE_E2E=1 npx vitest run --project e2e-live test/e2e/live/inference-routing.test.ts -t "TC-INF-10" --silent=false --reporter=defaultnpm run build:clinpm --prefix nemoclaw run buildnpm run typecheck:cliFixes #4684
Summary by CodeRabbit