History

Tamper an interior requestState character in the rejection test

Rhys Sullivan committed 2 months ago

Commit e4d0c8d1 parent e4c54b91 file · +6 −1Browse files

Unified · Split

packages/hosts/mcp/src/tool-server-v2.test.ts+6−1
@@ -251,7 +251,12 @@ describe("SDK v2 Executor MCP assembly", () => { · 250 unmodified lines
251 expect(isInputRequiredResult(first)).toBe(true);251 expect(isInputRequiredResult(first)).toBe(true);
252 if (!isInputRequiredResult(first) || !first.requestState) return;252 if (!isInputRequiredResult(first) || !first.requestState) return;
253 253
254 const tampered = `${first.requestState.slice(0, -1)}x`;254 // Corrupt an interior character: changing the final one can only touch
255 // discarded base64url padding bits, which lenient decoders (Bun) drop —
256 // the decoded bytes would be identical and the signature would verify.
257 const middle = Math.floor(first.requestState.length / 2);
258 const swapped = first.requestState[middle] === "A" ? "B" : "A";
259 const tampered = `${first.requestState.slice(0, middle)}${swapped}${first.requestState.slice(middle + 1)}`;
255 await expect(260 await expect(
256 manualToolCall(client, {261 manualToolCall(client, {
257 name: "execute",262 name: "execute",