Skip to content

fix(connection): bind WSL relay trust to installed package - #1201

Draft
shanselman wants to merge 2 commits into
mainfrom
fix-wslrelay-package-provenance
Draft

fix(connection): bind WSL relay trust to installed package#1201
shanselman wants to merge 2 commits into
mainfrom
fix-wslrelay-package-provenance

Conversation

@shanselman

Copy link
Copy Markdown
Collaborator

Summary

This is a maintainer follow-up to #1177. It preserves Pedro's original compatibility fix as the first commit, then completes the package-to-file provenance checks requested in the security review.

The compatibility problem in #1177 is real. Some Store/MSIX WSL installations can report a genuine wslrelay.exe as unsigned when inspected as an individual PE file, even though Windows trusted the MSIX package that installed it. The original PR correctly recognized that package trust can be relevant when per-file Authenticode is unavailable.

The missing piece was proving that the exact relay process owning the local listener came from that trusted package. It is not sufficient to prove these two facts independently:

  1. A genuine Microsoft WSL package is installed.
  2. A file named wslrelay.exe exists somewhere under a broadly accepted path.

The trusted package must own, or must be authoritatively bound to, the exact relay bytes being trusted.

Credit

Pedro identified the Store/MSIX compatibility failure and implemented the initial package-level fallback in #1177. His original commit is preserved on this branch, including its authorship.

This follow-up does not replace that contribution. It builds on it by tightening the provenance contract at the credential-protection boundary.

Background: why Windows signing has two relevant layers

Traditional Windows desktop binaries are often authenticated at the file layer:

  • An executable can carry an embedded Authenticode signature.
  • Windows can also establish file trust through a signed catalog.
  • FileSignatureInfo gives us a useful file-level answer for those cases.

MSIX adds a package-level trust model:

  • Windows validates the signed package during deployment.
  • The package identity includes a package family, publisher, version, and installed location.
  • Individual executable files inside or associated with the package do not always present the same file-level signature evidence that a traditional Win32 application would.

That means a failed per-file Authenticode result is not always proof that the WSL installation is malicious. However, package trust is not automatically transferable to an arbitrary file with the right name. Package trust answers "Windows trusts this package." It does not, by itself, answer "this exact process image came from that package."

Why this is a security boundary

ManagedLocalGatewayPortProvenanceService is not merely displaying diagnostics. Its result helps decide whether OpenClaw may send shared or bootstrap credentials to a loopback listener.

Loopback is a network location, not an identity. A different local process can bind the expected port. If we trust a relay only because:

  • its path looks generally plausible, and
  • a genuine WSL package happens to be installed,

then an unrelated relay can inherit the package's trust without being owned by it. That creates a path for local credential disclosure.

The rule for this boundary is therefore:

Before strong credentials cross the loopback boundary, every link from listener to process to executable to package must be positively established. Missing, ambiguous, or inconsistent evidence fails closed.

Trust decision after this change

1. Keep file-level Authenticode first

The normal FileSignatureInfo path remains the primary check.

If the relay is signed and trusted by Microsoft at the file or catalog layer, the result returns immediately. Package lookup and filesystem fallback logic are not consulted.

Tests now inject this primary result explicitly. This matters because the relay on the maintainer test host is already validly Microsoft-signed. Without injection, fallback tests silently exercise the fast path and can appear to pass without testing package fallback at all.

2. Limit fallback to wslrelay.exe

A failed signature on any other filename returns the original failure. Installing WSL does not widen trust for arbitrary executables.

3. Validate the installed package identity

The fallback queries Get-AppxPackage for the active WSL package and reads:

  • package family name
  • publisher
  • signature kind
  • install location
  • package version

The package must:

  • match the known WSL package family exactly
  • have a non-empty, non-None signature kind
  • contain the exact O=Microsoft Corporation publisher identity
  • report an absolute installed location

The PowerShell projection converts enum and version values to strings before JSON serialization. This was verified against the live Get-AppxPackage object because SignatureKind otherwise serializes in a shape the parser does not accept.

4. Bind WindowsApps relays to the exact package location

For a WindowsApps layout:

  • the reported package install location must itself be below the real Program Files\WindowsApps root
  • the inspected relay must be below that exact package install location
  • a sibling package directory is rejected
  • every path component from the relay through WindowsApps and Program Files is checked for reparse points
  • ownership and effective write ACLs are checked on every component

This closes the original disconnect between "the WSL package is trusted" and "this relay path belongs to that package."

5. Bind the external Program Files relay

Current WSL packages can also use:

C:\Program Files\WSL\wslrelay.exe

That file is outside the package's immutable WindowsApps install directory, so package-location containment cannot prove ownership. The external path receives a stricter composite proof:

  • the path must exactly equal the canonical Program Files\WSL\wslrelay.exe
  • the relay and every parent through Program Files must contain no reparse point
  • each component must be owned by SYSTEM, Administrators, or TrustedInstaller
  • no other principal may have an effective allow ACE containing write, append, attribute-write, delete, DACL-change, or ownership-change rights
  • the relay's file version must exactly equal the installed WSL package version

The exact version check binds the protected external relay to the installed package generation. A mismatch or an unreadable version fails closed.

Windows ACL details worth preserving

Windows ACLs have several details that are easy to miss in security-sensitive code.

Ownership is not the same as access

A SYSTEM-owned file can still be writable by another principal if its DACL grants that access. The implementation checks both owner and effective allow rules.

Read access is expected

Users and application packages normally have read and execute access to files under Program Files. That is safe for this decision. The policy rejects modification rights, not ordinary read and execute rights.

Inherit-only ACEs do not apply to the current object

A standard Program Files ACL can contain a CREATOR OWNER ACE marked InheritOnly. It describes permissions to materialize on descendants. It does not grant the creator rights on the current directory.

The policy ignores inherit-only ACEs while evaluating the current object. Descendants are each inspected separately, so effective inherited permissions are still checked where they apply.

A null DACL is not an empty DACL

This distinction is especially important:

  • An empty DACL denies access.
  • A null or absent DACL grants full access to everyone.

High-level access-rule enumeration can look empty in both cases. The implementation reads the raw security descriptor and requires the DiscretionaryAclPresent control flag plus a non-null DACL before evaluating rules.

Tests added or corrected

The focused tests now cover:

  • primary Authenticode success never invokes fallback
  • non-wslrelay.exe failures never invoke fallback
  • a package-owned WindowsApps relay is accepted
  • a sibling WindowsApps package relay is rejected before path inspection
  • the protected external relay is accepted only with a package-version match
  • an external relay version mismatch is rejected
  • an unprotected external path is rejected
  • a relative or unavailable package location is rejected
  • missing package, wrong family, unsigned package, and non-Microsoft publisher are rejected
  • Users may retain read and execute access
  • a Users write ACE is rejected
  • an untrusted owner is rejected
  • an inherit-only CREATOR OWNER ACE does not create a false rejection
  • a null DACL is rejected
  • an empty DACL remains safe

Validation

Executed from the isolated C:\p1177 maintainer checkout with OPENCLAW_REPO_ROOT=C:\p1177:

.\build.ps1
All builds succeeded.

dotnet test .\tests\OpenClaw.Shared.Tests\OpenClaw.Shared.Tests.csproj --no-restore
Passed: 3791, Skipped: 32, Failed: 0

dotnet test .\tests\OpenClaw.Tray.Tests\OpenClaw.Tray.Tests.csproj --no-restore
Passed: 2684, Skipped: 0, Failed: 0

dotnet test .\tests\OpenClaw.Connection.Tests\OpenClaw.Connection.Tests.csproj --no-restore
Passed: 673, Skipped: 0, Failed: 0

Focused ManagedLocalGatewayPortProvenanceServiceTests
Passed: 44, Skipped: 0, Failed: 0

One unrelated telemetry timing test failed once during closeout:

McpHttpServerTelemetryTests.ShutdownWhileWaitingForHandler_RecordsShutdownNotBusyOrTimeout

The exact test passed immediately on rerun. The complete required sequence then passed.

Real behavior proof

The maintainer host has WSL 2.9.4 and a validly Microsoft-signed external relay, so normal execution returns through the primary Authenticode path. To exercise the fallback itself, the current-head assembly was invoked with an injected primary failure while retaining the production package lookup and production filesystem/ACL inspector.

RelayPath              : C:\Program Files\WSL\wslrelay.exe
PackageFamilyName      : MicrosoftCorporationII.WindowsSubsystemForLinux_8wekyb3d8bbwe
PackageSignatureKind   : Developer
PackageInstallLocation : C:\Program Files\WindowsApps\
                         MicrosoftCorporationII.WindowsSubsystemForLinux_2.9.4.0_x64__8wekyb3d8bbwe
PackageVersion         : 2.9.4.0
RelayPathSecure        : True
RelayFileVersion       : 2.9.4.0
FallbackTrusted        : True
Detail                 :

This proves that the current-head package query, JSON projection, canonical external path, reparse walk, raw DACL handling, ownership/write policy, and version binding compose successfully on a real WSL installation.

Proof limitation

A host where the genuine relay naturally reports an unsigned file-level result was not available for this maintainer pass. The fallback was therefore forced only at the injected primary-result seam. All downstream evidence came from the real installed package and real relay filesystem state.

Review

The security-focused rubber-duck pass found no trust bypass. Its compatibility and path-ancestor suggestions were incorporated.

The structured ship review then found two Windows ACL edge cases:

  1. Inherit-only CREATOR OWNER ACEs must not be treated as effective rights on the current object.
  2. A null DACL must be distinguished from an empty DACL and rejected.

Both findings were fixed and covered by tests. The final structured review result was:

autoreview clean: no accepted/actionable findings reported
overall: patch is correct

Relationship to #1177

This PR supersedes #1177 for landing purposes while preserving and crediting its original compatibility contribution. The main change is not the goal of the fallback, which remains correct. The change is the proof required before package trust can be transferred to the exact listener-owning relay at a credential boundary.

plarroy-nv and others added 2 commits August 21, 2026 11:23
…heck fails

Modern WSL distributes as an MSIX package (Program Files\WSL /
WindowsApps), which doesn't embed per-file Authenticode/catalog
signatures on its EXEs -- trust is established at the package level
instead. This caused genuine Microsoft wslrelay.exe binaries to be
rejected during setup's loopback listener provenance check with
"WSL relay Authenticode verification failed (Unsigned)".

Add a fallback in WindowsAuthenticodeVerifier: when the classic
Authenticode check fails and the file is wslrelay.exe, corroborate
trust via the installed AppX package instead. Requires an exact match
on the known WSL package family name (MicrosoftCorporationII.WindowsSubsystemForLinux_8wekyb3d8bbwe,
whose suffix is derived from the publisher's signing cert), a real
SignatureKind, and a Microsoft publisher (reusing the existing
HasMicrosoftPublisherIdentity check). Looked up via a PowerShell
Get-AppxPackage shell-out, matching this file's existing pattern for
invoking schtasks.exe/wsl.exe.

The primary Authenticode/catalog check is unchanged and always
consulted first; the fallback narrows to wslrelay.exe specifically and
never weakens the trust bar for any other binary.
Require package-owned WindowsApps paths or a protected external relay whose ACLs and version bind it to the installed Microsoft WSL package.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot-Session: 76619eef-66f0-45be-ad09-b753347eea6b
@clawsweeper

clawsweeper Bot commented Aug 21, 2026

Copy link
Copy Markdown

🦞👀
ClawSweeper picked this up.

Pull request received. I will update this pull request when review starts.

@shanselman shanselman added merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P0 Emergency: data loss, security bypass, crash loop, or unusable core runtime. status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. labels Aug 21, 2026
@clawsweeper clawsweeper Bot added merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Aug 21, 2026
@clawsweeper

clawsweeper Bot commented Aug 21, 2026

Copy link
Copy Markdown

Codex review: needs maintainer review before merge. Reviewed August 21, 2026, 7:15 PM ET / 23:15 UTC.

ClawSweeper review

What this changes

The PR adds a package-bound fallback for an unsigned WSL relay so credential forwarding trusts it only when the executable can be tied to an installed Microsoft WSL package.

Merge readiness

⚠️ Ready for maintainer review - 4 items remain

Keep this maintainer-authored draft open. The source hardening is coherent, but its author has paused landing until an official installation naturally exhibiting the unsigned relay condition distinguishes a verifier defect from a WSL signing or installation problem.

Priority: P0
Reviewed head: 832709143cbfd349533a4e4cf4a762412be7de5d
Owner decision: Required. See Decision needed.

Review scores

Measure Result What it means
Overall readiness 🦐 gold shrimp (3/6) The implementation and focused coverage are substantial, but merge readiness is limited by the unobserved real production trigger.
Proof confidence 🦐 gold shrimp (3/6) Not applicable: Real behavior proof is not required for maintainer- or bot-authored pull requests.
Patch quality 🐚 platinum hermit (4/6) No actionable review findings were identified.

Verification

Check Result Evidence
Real behavior Not applicable Not applicable: Real behavior proof is not required for maintainer- or bot-authored pull requests.
Evidence reviewed 6 items Current main check: Current main still has the direct file-signature verifier and does not contain this package-provenance fallback, so the PR remains necessary if the reported MSIX condition is confirmed.
Credential-bound fallback implementation: The branch keeps successful Authenticode verification as the fast path and only enters the WSL package fallback after a failed check for wslrelay.exe.
Connection-boundary contract: The architecture ledger assigns managed-local listener provenance and strong-credential authorization to this subsystem, with unknown or changed ownership failing closed.
Findings None None.
Security None None.

Live Verification

Command: dotnet test tests/OpenClaw.Connection.Tests/OpenClaw.Connection.Tests.csproj --no-restore --filter "FullyQualifiedName~ManagedLocalGatewayPortProvenanceServiceTests"

Result: FAIL (failed) — execution before step 1 run: sh -lc pnpm install --ignore-scripts --frozen-lockfile failed: ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-11.22.0.tgz

sh -lc pnpm install --ignore-scripts --frozen-lockfile failed: ! Corepack is about to download https://registry.npmjs.org/pnpm/-/pnpm-11.22.0.tgz

Assertions:

  • FAIL expect_output: Passed!

How this fits together

The connection layer proves the process behind a loopback gateway listener before shared or bootstrap credentials can cross that boundary. This change adds a fallback path from file-signature verification to package, filesystem, ACL, and version provenance checks.

flowchart LR
  A[Loopback listener] --> B[Relay process path]
  B --> C[File signature check]
  C -->|trusted| D[Authorize credential forwarding]
  C -->|unsigned relay| E[Package and path provenance]
  E -->|all checks match| D
  E -->|missing or inconsistent| F[Reject listener]
Loading

Decision needed

Question Recommendation
Should this draft proceed before a naturally unsigned official WSL relay is diagnosed, or should the team first establish whether the reported result is an OpenClaw verifier mismatch versus a WSL signing or installation defect? Diagnose the natural unsigned case first: Keep the PR in draft and collect the requested signature, package, version, and installation diagnostics before choosing the production repair.

Why: The author explicitly paused landing because the current proof injects the first failure at a credential-protection boundary, leaving the production cause unresolved.

Before merge

  • Resolve merge risk (P2) - The fallback trigger has not been observed on a real official installation: the available live proof forces the initial signature failure.
  • Resolve merge risk (P1) - Merging before diagnosis could preserve a broad package-trust workaround when the narrower correct repair may be an OpenClaw verifier compatibility fix or an upstream WSL signing/install remediation.
  • Complete next step (P2) - Keep this maintainer-authored draft open while the explicitly requested signature and installation diagnosis determines the safe production fix.
Agent review details

Security

None.

Review metrics

Metric Value Why it matters
Changed surface production +462, tests +266 The security-sensitive trust decision and its regression coverage are concentrated in two files.

Root-cause cluster

Relationship: canonical
Canonical: #1201
Summary: This is the active proposed replacement for the original MSIX fallback, currently paused pending diagnosis of its real-world trigger.

Members:

Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything.

Merge-risk options

Maintainer options:

  1. Diagnose before merge (recommended)
    Collect redacted diagnostics from an official installation where the relay naturally fails OpenClaw file verification, then select the narrow verifier or provenance repair.
  2. Accept the fallback contract
    Merge only if maintainers explicitly accept package-plus-ACL-plus-version provenance as the intended compatibility contract despite the unresolved trigger.

Technical review

Best possible solution:

Diagnose an affected official installation first, then land either a narrow signature-verifier repair or this guarded provenance fallback with proof that the natural failure path requires it.

Do we have a high-confidence way to reproduce the issue?

No. The submitted real-host proof injects the primary failure, and the maintainer reports that the available official relay succeeds at normal Authenticode verification.

Is this the best way to solve the issue?

Unclear. The provenance design is fail-closed and source-consistent, but the maintainer correctly requires diagnosis of the real unsigned condition before selecting it over a narrower verifier fix.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against ccd64bbb7d68.

Labels

Label changes:

  • add rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • add status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Not applicable: Real behavior proof is not required for maintainer- or bot-authored pull requests.
  • remove rating: 🐚 platinum hermit: Current PR rating is rating: 🦐 gold shrimp, so this older rating label is no longer current.
  • remove status: 📣 needs proof: Current PR status label is status: 👀 ready for maintainer look.

Label justifications:

  • P0: The verifier governs whether shared or bootstrap credentials may be sent through a local relay boundary.
  • merge-risk: 🚨 compatibility: The fallback changes how existing Store/MSIX WSL relay installations are accepted after a file-signature failure.
  • merge-risk: 🚨 security-boundary: The patch changes the evidence required before package trust substitutes for file trust at credential handoff.
  • rating: 🦐 gold shrimp: Overall readiness is 🦐 gold shrimp; proof is 🦐 gold shrimp and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Not applicable: Real behavior proof is not required for maintainer- or bot-authored pull requests.

Evidence

What I checked:

  • Current main check: Current main still has the direct file-signature verifier and does not contain this package-provenance fallback, so the PR remains necessary if the reported MSIX condition is confirmed. (src/OpenClaw.Connection/WindowsAuthenticodeVerifier.cs:16, ccd64bbb7d68)
  • Credential-bound fallback implementation: The branch keeps successful Authenticode verification as the fast path and only enters the WSL package fallback after a failed check for wslrelay.exe. (src/OpenClaw.Connection/WindowsAuthenticodeVerifier.cs:67, 832709143cbf)
  • Connection-boundary contract: The architecture ledger assigns managed-local listener provenance and strong-credential authorization to this subsystem, with unknown or changed ownership failing closed. (docs/ARCHITECTURE.md:162, ccd64bbb7d68)
  • Maintainer pause: The PR author converted the PR to draft and requested diagnostics because the submitted live run injects the primary signature failure rather than observing it naturally.
  • Feature provenance: Git history and blame identify the current provenance hardening commit as the source of the fallback implementation; the preceding branch commit preserves the original MSIX compatibility contribution. (src/OpenClaw.Connection/WindowsAuthenticodeVerifier.cs:129, 832709143cbf)
  • Release inclusion check: No local release tag contains the PR head, confirming this work is not shipped. (832709143cbf)

Likely related people:

  • shanselman: Authored the current package-to-file provenance hardening and the explicit draft-pause diagnosis request. (role: recent connection-area contributor; confidence: high; commits: 832709143cbf; files: src/OpenClaw.Connection/WindowsAuthenticodeVerifier.cs, tests/OpenClaw.Connection.Tests/ManagedLocalGatewayPortProvenanceServiceTests.cs)
  • larroy: Authored the preserved first branch commit that introduced the MSIX compatibility fallback being tightened here. (role: original fallback contributor; confidence: high; commits: 7396130bc1b6; files: src/OpenClaw.Connection/WindowsAuthenticodeVerifier.cs, tests/OpenClaw.Connection.Tests/ManagedLocalGatewayPortProvenanceServiceTests.cs)

Rank-up moves

Optional improvements that raise the rating; they are not merge blockers.

  • Attach redacted diagnostics from an official installation where OpenClaw naturally reports the relay unsigned, including the requested signature comparison and installation method.
  • After selecting the repair, show the current-head production path and refresh the PR proof section.

Rating scale

Score Internal tier Crab rank Meaning
6/6 S 🦀 challenger crab Exceptional readiness
5/6 A 🦞 diamond lobster Very strong readiness
4/6 B 🐚 platinum hermit Good normal PR; ordinary maintainer review
3/6 C 🦐 gold shrimp Useful, but confidence is limited
2/6 D 🦪 silver shellfish Proof or implementation needs work
1/6 F 🧂 unranked krab Not merge-ready
N/A NA 🌊 off-meta tidepool Rating does not apply

Overall follows the weaker of proof and patch quality.
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

Workflow

  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

History

Review history (1 earlier review cycle)
  • reviewed 2026-08-21T22:18:27.548Z sha 8327091 :: needs maintainer review before merge. :: none

@shanselman
shanselman marked this pull request as draft August 21, 2026 23:11
@shanselman shanselman added status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. and removed status: 🚢 actively landing A maintainer or agent is actively driving this item through implementation, validation, or merge. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Aug 21, 2026
@shanselman

Copy link
Copy Markdown
Collaborator Author

We are pausing landing while we identify why the external relay appeared unsigned. This is not a rejection of the compatibility report.

The upstream WSL release pipeline is designed to:

  1. Authenticode-sign and verify wslrelay.exe.
  2. Copy the signed executable into the MSI staging directory.
  3. Install that MSI payload under C:\Program Files\WSL.

The current maintainer host has WSL 2.9.4, and its external wslrelay.exe has valid Microsoft Authenticode. If another official installation reports Unsigned, we need to determine which of these cases occurred:

  • Get-AuthenticodeSignature also considers the file unsigned, indicating a WSL build, channel, installation, update, or file-integrity problem.
  • PowerShell considers it valid but OpenClaw's FileSignatureInfo reports Unsigned, indicating a verifier compatibility bug we should fix.
  • The file came from a development, nightly, preview, or locally built WSL package where release signing was not applied.

@larroy, could you please run the following read-only PowerShell and paste the output? It contains no credentials. You may redact usernames if one unexpectedly appears.

$relay = 'C:\Program Files\WSL\wslrelay.exe'
$package = Get-AppxPackage -Name MicrosoftCorporationII.WindowsSubsystemForLinux |
    Sort-Object Version -Descending |
    Select-Object -First 1

Write-Output '=== WSL version ==='
wsl.exe --version

Write-Output '=== WSL package ==='
$package |
    Select-Object Name, PackageFullName, PackageFamilyName, Version,
        SignatureKind, Publisher, InstallLocation |
    Format-List

Write-Output '=== Relay file ==='
Get-Item -LiteralPath $relay |
    Select-Object FullName, Length, CreationTimeUtc, LastWriteTimeUtc,
        Attributes, LinkType,
        @{Name='FileVersion'; Expression={$_.VersionInfo.FileVersion}},
        @{Name='ProductVersion'; Expression={$_.VersionInfo.ProductVersion}} |
    Format-List

Write-Output '=== Relay hash ==='
Get-FileHash -LiteralPath $relay -Algorithm SHA256 | Format-List

Write-Output '=== PowerShell Authenticode ==='
$signature = Get-AuthenticodeSignature -LiteralPath $relay
$signature |
    Select-Object Status, StatusMessage, SignatureType,
        @{Name='SignerSubject'; Expression={$_.SignerCertificate.Subject}},
        @{Name='SignerThumbprint'; Expression={$_.SignerCertificate.Thumbprint}} |
    Format-List

Write-Output '=== Optional signtool verification ==='
$signtool = Get-Command signtool.exe -ErrorAction SilentlyContinue
if ($signtool) {
    & $signtool.Source verify /pa /all /v $relay
} else {
    Write-Output 'signtool.exe is not on PATH; skipped.'
}

Please also tell us how this WSL build was installed or updated:

  • Microsoft Store
  • wsl --install or wsl --update
  • wsl --update --web-download
  • GitHub release MSI
  • Insider, preview, nightly, or development build
  • locally built WSL

The key comparison is the existing OpenClaw error (FileSignatureInfo reported Unsigned) versus Get-AuthenticodeSignature and, when available, signtool verify.

We will keep this PR as a draft investigation until that distinction is clear. If the exact Microsoft file is valid and only our API path disagrees, we will fix the verifier narrowly. If the file itself is unsigned, we should not transfer package trust to unrelated external bytes; we will document the repair/update path and report an upstream WSL signing defect when appropriate.

@clawsweeper clawsweeper Bot added rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Aug 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

merge-risk: 🚨 compatibility 🚨 Merging this PR could break existing users, config, migrations, defaults, or upgrades. merge-risk: 🚨 security-boundary 🚨 Merging this PR could weaken sandboxing, authorization, credentials, or sensitive data. P0 Emergency: data loss, security bypass, crash loop, or unusable core runtime. rating: 🦐 gold shrimp Decent PR readiness signal, but merge confidence is limited. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants