Skip to content

Claude Desktop's "signature required" policy (isDesktopExtensionSignatureRequired) refuses every extension, because verification never returns signed #305

Open

Description

@wspringer

Summary

Claude Desktop has a managed policy that requires a signature on desktop extensions: isDesktopExtensionSignatureRequired, which is extensions.signatureRequired internally. Claude Desktop checks that signature with the same verifyMcpbFile as this repo, and that function never returns signed (#260, #276, #277). So with the policy on, Claude Desktop presumably refuses every local extension, signed ones included. An organization that turns the policy on to allow only signed extensions ends up with no local extensions at all, and no publisher can do anything about it.

I have not seen this reported as its own issue; #260 covers the CLI. This issue is about what the bug means for organizations.

What the shipped app does

From Claude.app/Contents/Resources/app.asar on macOS, Claude Desktop 4.4212.0. Excerpts are minified:

  1. Install refuses anything that is not signed while the policy is on:

    let y=t.Jat().extensions.signatureRequired;if(y&&h.status!=="signed")throw Error(...)

    The extraction path does the same: if(e.requireSigned&&t.status!=="signed")throw ... Error("Extension archive is not signed and a valid signature is required"). The update cache does too: Refusing to cache unsigned update for ....

  2. The policy is exposed as a managed setting:

    signatureRequired:...{flatKey:"isDesktopExtensionSignatureRequired",support:{enabled:{scopes:["3p","1p"], ...
  3. status comes from verifyMcpbFile, which bundles node-forge's PKCS#7 stub. The app contains MCPB_SIG_V1 / MCPB_SIG_END, and also

    verify:function(){throw Error("PKCS#7 signature verification not yet implemented.")}

    verifyMcpbFile calls p7.verify(...) inside a try, and the catch returns { status: "unsigned" }. That is the path described in Signing/verification is non-functional: PKCS#7 signature never verified (node-forge stub), fails closed #260.

So status is never "signed", and points 1 and 2 together refuse everything once the policy is on.

Expected

Either the policy admits extensions that carry a valid signature from a trusted code-signing certificate, or it is not offered while verification cannot succeed.

Not verified

I derived this from the shipped code. I have not turned the policy on and tried to install. If the managed setting is read differently than the code suggests, I am glad to be corrected.

Related

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions