Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -875,7 +875,7 @@ RUN --network=default set -eu; \
OPENCLAW_LOCK_SHA256=none-legacy-fixture; \
OPENCLAW_RECIPE='ignore-scripts+reviewed-lifecycle-v1'; \
if [ "$OPENCLAW_VERSION" = "2026.7.1" ]; then \
OPENCLAW_LOCK_SHA256=60f816dcff6f35179b1c48b4c06db9473497760d45ca1831252c27e8b1d2d665; \
OPENCLAW_LOCK_SHA256=248d881ca125bb83da293c4b3f40b46d057095a9fe90b5165255da0de78af9f9; \
ACTUAL_OPENCLAW_LOCK_SHA256="$(sha256sum /usr/local/lib/nemoclaw/openclaw-runtime/package-lock.json | awk '{print $1}')"; \
[ "$ACTUAL_OPENCLAW_LOCK_SHA256" = "$OPENCLAW_LOCK_SHA256" ] \
|| { echo "ERROR: OpenClaw lock SHA-256 mismatch (expected $OPENCLAW_LOCK_SHA256, found $ACTUAL_OPENCLAW_LOCK_SHA256)" >&2; exit 1; }; \
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile.base
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,7 @@ RUN --mount=type=bind,source=nemoclaw-blueprint/blueprint.yaml,target=/tmp/bluep
OPENCLAW_LOCK_SHA256=none-legacy-fixture; \
OPENCLAW_RECIPE='ignore-scripts+reviewed-lifecycle-v1'; \
if [ "$OPENCLAW_VERSION" = "2026.7.1" ]; then \
OPENCLAW_LOCK_SHA256=60f816dcff6f35179b1c48b4c06db9473497760d45ca1831252c27e8b1d2d665; \
OPENCLAW_LOCK_SHA256=248d881ca125bb83da293c4b3f40b46d057095a9fe90b5165255da0de78af9f9; \
ACTUAL_OPENCLAW_LOCK_SHA256="$(sha256sum /usr/local/lib/nemoclaw/openclaw-runtime/package-lock.json | awk '{print $1}')"; \
[ "$ACTUAL_OPENCLAW_LOCK_SHA256" = "$OPENCLAW_LOCK_SHA256" ] \
|| { echo "Error: OpenClaw lock SHA-256 mismatch (expected $OPENCLAW_LOCK_SHA256, found $ACTUAL_OPENCLAW_LOCK_SHA256)"; exit 1; }; \
Expand Down
4 changes: 2 additions & 2 deletions agents/openclaw/dependency-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ Update it and `agents/openclaw/mcporter-runtime/package*.json` together whenever
- Advisory review date: 2026-08-11.
- Advisory result: `0` known vulnerabilities across the resolved production dependency graph. npm verified registry signatures for all `120` resolved packages and attestations for `14` packages.
- Security override: `@hono/node-server@2.0.11` (`sha512-bjD221KPLoJTWUwso1J6fGKiTXEUFedG/s0visavY4zakFPkeGURMRNly+FhBHs7T8Dz4qHaZIMX9ZoJHSJtKA==`) replaces the SDK's vulnerable `1.19.14` resolution for `GHSA-frvp-7c67-39w9` and the previously reviewed `2.0.5` resolution affected by `GHSA-9mqv-5hh9-4cgg`. `2.0.5` is the first patched release for `GHSA-frvp-7c67-39w9`. The reviewed v2 range retains the `getRequestListener` API used by `@modelcontextprotocol/sdk`; its Node.js 20 floor is below NemoClaw's Node.js 22.19 floor, and the `/vercel` adapter is not consumed. Mcporter's production path imports the SDK's client transport, not the server adapter, and the image build still exercises the installed CLI after the locked install. Remove the override when the SDK's declared range resolves to a reviewed release outside both affected ranges.
- Security override: `fast-uri@3.1.5` (`sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==`) replaces Ajv's vulnerable `3.1.3` resolution and the initially reviewed `3.1.4` remediation. `GHSA-v2hh-gcrm-f6hx` affects releases through `3.1.3`, and `GHSA-7p8r-x3mc-p8w7` affects releases from `3.0.0` through `3.1.4`. The replacement remains within Ajv's declared `^3.0.1` range and preserves the reviewed v3 API boundary. Remove the override when the declared graph resolves to a reviewed release outside both affected ranges.
- Security override: `fast-uri@3.1.6` (`sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==`) replaces Ajv's vulnerable resolution. `GHSA-5jgf-p345-68v8`, `GHSA-f65p-4m7j-42xc`, `GHSA-fph4-wmhf-6fwf`, and `GHSA-jqff-g426-hqxp` affect earlier 3.x releases; `3.1.6` is the first patched release for all four. The replacement remains within Ajv's declared `^3.0.1` range, preserves the reviewed v3 API boundary, and also remains outside the older `GHSA-v2hh-gcrm-f6hx` and `GHSA-7p8r-x3mc-p8w7` ranges. Remove the override when the declared graph resolves to a reviewed release outside all affected ranges.
- Security override: `hono@4.12.34` (`sha512-GqXJqY/xJkJmuloTrnV1ZEXG3fqte+VjkUqoRNZXcrUidiUOP4fMSIHHY4tsqZBK++kVyWmt/AAfSUuy57/eSA==`) replaces the SDK's vulnerable `4.12.27` resolution.
`GHSA-8j4g-w8fx-2239`, `GHSA-54fx-42gc-7vw4`, `GHSA-f23p-vx2j-j53r`, and `GHSA-79qm-7rj5-m7r9` are fixed in `4.12.34`.
The replacement remains within the SDK's declared `^4.11.4` range and preserves Hono's Node.js `>=16.9.0` contract.
Expand Down Expand Up @@ -62,7 +62,7 @@ The lock records the exact version, registry URL, and integrity for every transi

## Source-of-Truth Boundary

- `invalidState`: the image installs a package graph, tarball, license, or advisory state that differs from the independently queried npm registry records for `mcporter@0.7.3`, resolves `@hono/node-server` to any version other than exact `2.0.11`, resolves `fast-uri` to any version other than exact `3.1.5`, resolves `hono` to any version other than exact `4.12.34`, or resolves `ip-address` to any version other than exact `10.3.1`.
- `invalidState`: the image installs a package graph, tarball, license, or advisory state that differs from the independently queried npm registry records for `mcporter@0.7.3`, resolves `@hono/node-server` to any version other than exact `2.0.11`, resolves `fast-uri` to any version other than exact `3.1.6`, resolves `hono` to any version other than exact `4.12.34`, or resolves `ip-address` to any version other than exact `10.3.1`.
- `sourceBoundary`: npm owns registry metadata, tarball integrity, provenance signatures, and advisory responses; NemoClaw owns the exact lock, script-disabled install, Docker integrity assertion, empty-by-default audit exception registry, and review record.
- `whyNotSourceFix`: a repository note cannot make external registry state trustworthy, so the required `reviewed-npm-audit` CI check materializes the exact locked production graph and verifies its registry signatures.
- `imageBuildBoundary`: image builds verify the committed lock, registry origin, tarball integrity, installed graph, lifecycle suppression, and reviewed advisory policy without connecting to Sigstore.
Expand Down
6 changes: 3 additions & 3 deletions agents/openclaw/mcporter-runtime/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion agents/openclaw/mcporter-runtime/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
},
"overrides": {
"@hono/node-server": "2.0.11",
"fast-uri": "3.1.5",
"fast-uri": "3.1.6",
"hono": "4.12.34",
"ip-address": "10.3.1"
},
Expand Down
32 changes: 16 additions & 16 deletions agents/openclaw/openclaw-runtime/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion agents/openclaw/openclaw-runtime/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@
},
"overrides": {
"hono": "4.12.34",
"tar": "7.5.21"
"tar": "7.5.21",
"fast-uri": "3.1.6"
},
"engines": {
"node": ">=22.22.3 <23 || >=24.15.0 <25 || >=25.9.0"
Expand Down
9 changes: 3 additions & 6 deletions ci/reviewed-npm-audit.json
Original file line number Diff line number Diff line change
Expand Up @@ -96,8 +96,7 @@
"integrity": "sha512-ge/Xss99CHAjPL/ikmH/UFoiOrjcxDB4sW3y9mhyCD+dYW3wzV7TKbAVdkrXFgAG2d2BjpJofP97zUZ+umxo8g==",
"tarballUrl": "https://registry.npmjs.org/openclaw/-/openclaw-2026.7.1.tgz",
"directory": "agents/openclaw/openclaw-runtime",
"lockSha256": "60f816dcff6f35179b1c48b4c06db9473497760d45ca1831252c27e8b1d2d665",
"replacementLockSha256": "248d881ca125bb83da293c4b3f40b46d057095a9fe90b5165255da0de78af9f9"
"lockSha256": "248d881ca125bb83da293c4b3f40b46d057095a9fe90b5165255da0de78af9f9"
},
{
"id": "mcporter-runtime",
Expand All @@ -106,8 +105,7 @@
"integrity": "sha512-egoPVYqTnWb3NjRIxo+xc8OrAI0dlPrJm9pAiZx0pImuNIV5rKhGtTnIfH/Y1ldGPVu74ibj3KR5c9U/QSdQFA==",
"tarballUrl": "https://registry.npmjs.org/mcporter/-/mcporter-0.7.3.tgz",
"directory": "agents/openclaw/mcporter-runtime",
"lockSha256": "17f2372a0a6949df928333a2f98862ae563013a7682b19a8ce63825c4696a064",
"replacementLockSha256": "720c0e3ec2efcccd2c820ce2a39d733f7bd5bf9d3e6fb95310e7f6cd369db83c"
"lockSha256": "720c0e3ec2efcccd2c820ce2a39d733f7bd5bf9d3e6fb95310e7f6cd369db83c"
},
{
"id": "mcp-tool-discovery-runtime",
Expand All @@ -116,8 +114,7 @@
"integrity": "sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==",
"tarballUrl": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.30.0.tgz",
"directory": "tools/mcp-tool-discovery-runtime",
"lockSha256": "bc7e34d9eb1f72cf3016c8b88c72d3b7682a4f234903cb93b9476b10d7e954eb",
"replacementLockSha256": "0697681f948bda0b59fc1ff2e4c6dbe2693cc89eec64b11b5be604160643c6e5"
"lockSha256": "0697681f948bda0b59fc1ff2e4c6dbe2693cc89eec64b11b5be604160643c6e5"
}
]
}
16 changes: 8 additions & 8 deletions internal/security-reviews/openclaw-2026.7.1-dependency-review.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,15 @@ release in both committed production locks. Do not add an audit exception.

The production OpenClaw install uses the authoritative committed lock at
`agents/openclaw/openclaw-runtime/package-lock.json`, with SHA-256
`60f816dcff6f35179b1c48b4c06db9473497760d45ca1831252c27e8b1d2d665`.
`248d881ca125bb83da293c4b3f40b46d057095a9fe90b5165255da0de78af9f9`.
NemoClaw derives that lock from the SRI-verified `openclaw@2026.7.1` archive
after applying the reviewed dependency remediation.
The committed `nemoclaw/package-lock.json` has SHA-256
`66bef669196bb1c61385871e369542d3c321c277adb0f0e2e9f0ad972106b163`.
The protected managed-image build's locked npm cache seed binds that same lock
digest and the exact `tar@7.5.21` archive.
The remediation replaces `brace-expansion@5.0.7` with `5.0.9`.
It also replaces `fast-uri@3.1.2` with `3.1.5` and `ip-address@10.2.0` with
It also replaces `fast-uri@3.1.2` with `3.1.6` and `ip-address@10.2.0` with
`10.3.1` in the OpenClaw core graph.
It replaces `tar@7.5.19` with `7.5.21` in the core manifest and shrinkwrap,
including the `@openclaw/fs-safe@0.4.1` optional dependency edge.
Expand All @@ -47,7 +47,7 @@ the npm upgrade. Each completed image reasserts the idempotent repair at its
final filesystem boundary.
The same reviewed `undici@8.10.0` replacement applies to the OpenClaw core
dependency and the Discord manifest, shrinkwrap, and bundled package tree.
The committed mcporter lock also selects `fast-uri@3.1.5` and
The committed mcporter lock also selects `fast-uri@3.1.6` and
`ip-address@10.3.1`.
Both committed runtime locks select `hono@4.12.34`.
Image builds verify the lock digest and installed production graph before they
Expand Down Expand Up @@ -98,9 +98,9 @@ whose amd64 config reports Node `22.23.1`.
- `brace-expansion@5.0.9` (OpenClaw locked-runtime remediation)
- `sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==`
- `https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz`
- `fast-uri@3.1.5` (OpenClaw and mcporter locked-runtime remediation)
- `sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==`
- `https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz`
- `fast-uri@3.1.6` (OpenClaw and mcporter locked-runtime remediation)
- `sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==`
- `https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz`
- `BSD-3-Clause`; no dependencies
- `undici@8.10.0` (OpenClaw core and Discord remediation)
- `sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==`
Expand All @@ -118,7 +118,7 @@ whose amd64 config reports Node `22.23.1`.
- `mcporter@0.7.3` committed runtime lock
- SHA-256: `17f2372a0a6949df928333a2f98862ae563013a7682b19a8ce63825c4696a064`

`fast-uri@3.1.5` has a valid npm registry signature and no registry attestation.
`fast-uri@3.1.6` has a valid npm registry signature and no registry attestation.
`undici@8.10.0` has a valid npm registry signature and SLSA provenance.
`ip-address@10.3.1` has two valid npm registry signatures and SLSA provenance.

Expand Down Expand Up @@ -188,7 +188,7 @@ The reviewed upstream OpenClaw shrinkwrap resolves `3.1.2`, and
`GHSA-v2hh-gcrm-f6hx` affects releases through `3.1.3`.
The initial remediation selected `3.1.4` for that advisory.
The high-severity `GHSA-7p8r-x3mc-p8w7` later affected that release.
Both committed runtime locks now select reviewed `3.1.5`.
All four audited production graphs now select reviewed `3.1.6`, the first release outside `GHSA-5jgf-p345-68v8`, `GHSA-f65p-4m7j-42xc`, `GHSA-fph4-wmhf-6fwf`, and `GHSA-jqff-g426-hqxp`.

The OpenClaw core package manifest and shrinkwrap directly pin `undici@8.5.0`.
The published `@openclaw/discord@2026.7.1` archive also pins that version in
Expand Down
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -171,5 +171,8 @@
"typebox": "1.1.38",
"typescript": "6.0.3",
"vitest": "^4.1.9"
},
"overrides": {
"fast-uri": "3.1.6"
}
}
6 changes: 3 additions & 3 deletions scripts/lib/openclaw-npm-remediation.mts
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,10 @@ const CURRENT_BRACE_EXPANSION_INTEGRITY =
"sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==";
const CURRENT_BRACE_EXPANSION_TARBALL =
"https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz";
const CURRENT_FAST_URI_VERSION = "3.1.5";
const CURRENT_FAST_URI_VERSION = "3.1.6";
const CURRENT_FAST_URI_INTEGRITY =
"sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==";
const CURRENT_FAST_URI_TARBALL = "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz";
"sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==";
const CURRENT_FAST_URI_TARBALL = "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz";
const CURRENT_UNDICI_VERSION = "8.10.0";
const CURRENT_UNDICI_INTEGRITY =
"sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==";
Expand Down
22 changes: 0 additions & 22 deletions test/agents/openclaw/openclaw-dependency-review.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -266,28 +266,6 @@ describe("OpenClaw 2026.6.10 dependency review contract", () => {
expect(troubleshooting).toContain("connection timed out after 30000ms");
});

it("records the active mcporter advisory remediations", () => {
const review = readFileSync(ACTIVE_DEPENDENCY_REVIEW, "utf-8");

expect(review).toContain("GHSA-9mqv-5hh9-4cgg");
expect(review).toContain("@hono/node-server@^1.19.9");
expect(review).toContain("`2.0.11`");
expect(review).toContain("GHSA-v2hh-gcrm-f6hx");
expect(review).toContain("GHSA-7p8r-x3mc-p8w7");
expect(review).toContain("fast-uri@^3.0.1");
expect(review).toContain("`3.1.5`");
expect(review).toContain("GHSA-8xcm-r25x-g524");
expect(review).toContain("GHSA-4cwx-7wf7-3272");
expect(review).toContain("undici@8.10.0");
expect(review).toContain("GHSA-mwp4-54f8-5fhr");
expect(review).toContain("ip-address@^10.2.0");
expect(review).toContain("ip-address@10.3.1");
expect(review).toContain("hono@4.12.34");
expect(review).toContain("GHSA-54fx-42gc-7vw4");
expect(review).toContain("GHSA-f23p-vx2j-j53r");
expect(review).toContain("GHSA-79qm-7rj5-m7r9");
});

it("keeps advisor disposition evidence in the dependency review note", () => {
const review = readFileSync(DEPENDENCY_REVIEW, "utf-8");

Expand Down
4 changes: 2 additions & 2 deletions test/agents/openclaw/openclaw-locked-install.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const PACKAGE_SPEC = "openclaw@2026.7.1";
const INTEGRITY =
"sha512-ge/Xss99CHAjPL/ikmH/UFoiOrjcxDB4sW3y9mhyCD+dYW3wzV7TKbAVdkrXFgAG2d2BjpJofP97zUZ+umxo8g==";
const TARBALL = "https://registry.npmjs.org/openclaw/-/openclaw-2026.7.1.tgz";
const LOCK_SHA256 = "60f816dcff6f35179b1c48b4c06db9473497760d45ca1831252c27e8b1d2d665";
const LOCK_SHA256 = "248d881ca125bb83da293c4b3f40b46d057095a9fe90b5165255da0de78af9f9";
const MCPORTER_PACKAGE_SPEC = "mcporter@0.7.3";
const MCP_TOOL_DISCOVERY_PACKAGE_SPEC = "@modelcontextprotocol/sdk@1.30.0";
const MCP_TOOL_DISCOVERY_LOCK_SHA256 =
Expand Down Expand Up @@ -177,7 +177,7 @@ describe("locked OpenClaw production installation (#5896)", () => {
expect(verified).toHaveLength(307);
expect(verified).toContain(PACKAGE_SPEC);
expect(verified).toContain("brace-expansion@5.0.9");
expect(verified).toContain("fast-uri@3.1.5");
expect(verified).toContain("fast-uri@3.1.6");
Comment thread
jyaunches marked this conversation as resolved.
Resolved
expect(verified).toContain("hono@4.12.34");
expect(verified).toContain("ip-address@10.3.1");
expect(verified).toContain("tar@7.5.21");
Expand Down
6 changes: 3 additions & 3 deletions test/agents/openclaw/openclaw-npm-remediation.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -550,10 +550,10 @@ describe("OpenClaw npm remediation", () => {
"sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==",
});
expect(shrinkwrap.packages["node_modules/fast-uri"]).toMatchObject({
version: "3.1.5",
resolved: "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz",
version: "3.1.6",
resolved: "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.6.tgz",
integrity:
"sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==",
"sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==",
});
expect(shrinkwrap.packages["node_modules/undici"]).toMatchObject({
version: "8.10.0",
Expand Down
Loading
Loading