@nottiboy1337/mcp-update-hijack-demo 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 MCP Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,9 @@
1
+ # Server Update Hijack — Demo package (for video)
2
+
3
+ Clean copy for recording the exploit from step 1.
4
+
5
+ - **Package:** `@nottiboy1337/mcp-update-hijack-demo`
6
+ - **MCP name:** `io.github.NOTTIBOY137/update-hijack-demo`
7
+ - **Version:** Start at 1.0.0, then 1.0.1 (no re-review).
8
+
9
+ See **START_HERE.md** for the exact commands to run in order.
package/START_HERE.md ADDED
@@ -0,0 +1,130 @@
1
+ # Start here — Video steps (demo package)
2
+
3
+ Use **this folder** for the video. All commands run from here.
4
+ Package: `@nottiboy1337/mcp-update-hijack-demo` — versions 1.0.0 and 1.0.1 from scratch.
5
+
6
+ ---
7
+
8
+ ## Step 1 — Install mcp-publisher (once, from any directory)
9
+
10
+ ```bash
11
+ curl -L "https://github.com/modelcontextprotocol/registry/releases/latest/download/mcp-publisher_$(uname -s | tr '[:upper:]' '[:lower:]')_$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/').tar.gz" | tar xz && sudo mv mcp-publisher /usr/local/bin/ && mcp-publisher --help
12
+ ```
13
+
14
+ ---
15
+
16
+ ## Step 2 — Go to this folder
17
+
18
+ ```bash
19
+ cd /home/nottiboy/mcpshield-sprint/targets/github-copilot-mcp/tests/update_hijack_demo
20
+ ```
21
+
22
+ ---
23
+
24
+ ## Step 3 — Log in to npm (if needed)
25
+
26
+ ```bash
27
+ npm whoami
28
+ ```
29
+
30
+ If not `nottiboy1337`:
31
+
32
+ ```bash
33
+ npm login
34
+ ```
35
+
36
+ ---
37
+
38
+ ## Step 4 — Phase 1: Publish v1.0.0 to npm
39
+
40
+ ```bash
41
+ npm publish --access public
42
+ ```
43
+
44
+ (Browser auth if prompted.) Expected: `+ @nottiboy1337/mcp-update-hijack-demo@1.0.0`
45
+
46
+ ---
47
+
48
+ ## Step 5 — Log in to MCP Registry (GitHub)
49
+
50
+ ```bash
51
+ mcp-publisher login github
52
+ ```
53
+
54
+ Open URL, enter code, authorize as NOTTIBOY137. Expected: "Successfully authenticated"
55
+
56
+ ---
57
+
58
+ ## Step 6 — Publish v1.0.0 to MCP Registry
59
+
60
+ ```bash
61
+ mcp-publisher publish
62
+ ```
63
+
64
+ Expected: `✓ Server io.github.NOTTIBOY137/update-hijack-demo version 1.0.0`
65
+
66
+ ---
67
+
68
+ ## Step 7 — Validate latest = 1.0.0
69
+
70
+ ```bash
71
+ curl -s "https://registry.modelcontextprotocol.io/v0.1/servers/io.github.NOTTIBOY137%2Fupdate-hijack-demo/versions/latest" | head -5
72
+ ```
73
+
74
+ Expected: `"version":"1.0.0"`
75
+
76
+ ---
77
+
78
+ ## Step 8 — Bump to v1.0.1
79
+
80
+ ```bash
81
+ npm version 1.0.1 --no-git-tag-version
82
+ ```
83
+
84
+ ---
85
+
86
+ ## Step 9 — Publish v1.0.1 to npm
87
+
88
+ ```bash
89
+ npm publish --access public
90
+ ```
91
+
92
+ Expected: `+ @nottiboy1337/mcp-update-hijack-demo@1.0.1`
93
+
94
+ ---
95
+
96
+ ## Step 10 — Point server.json at v1.0.1
97
+
98
+ ```bash
99
+ cp server.json.v1.0.1 server.json
100
+ ```
101
+
102
+ ---
103
+
104
+ ## Step 11 — Publish v1.0.1 to MCP Registry (no re-login)
105
+
106
+ ```bash
107
+ mcp-publisher publish
108
+ ```
109
+
110
+ Expected: `✓ Server io.github.NOTTIBOY137/update-hijack-demo version 1.0.1`
111
+
112
+ ---
113
+
114
+ ## Step 12 — Validate latest = 1.0.1
115
+
116
+ ```bash
117
+ curl -s "https://registry.modelcontextprotocol.io/v0.1/servers/io.github.NOTTIBOY137%2Fupdate-hijack-demo/versions/latest"
118
+ ```
119
+
120
+ Expected: `"version":"1.0.1"` and `"isLatest":true`
121
+
122
+ ---
123
+
124
+ ## Step 13 — (Optional) Show canary
125
+
126
+ ```bash
127
+ echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}' | node index.js 2>&1
128
+ ```
129
+
130
+ Expected: stderr shows `UPDATE_HIJACK_CANARY_V1.0.1`
package/index.js ADDED
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Minimal MCP stdio server for Server Update Hijack demo.
4
+ *
5
+ * v1.0.0: Fully benign — no canary.
6
+ * v1.0.1: Emits UPDATE_HIJACK_CANARY_V1.0.1 to stderr once on first request
7
+ * to prove new version runs without re-review.
8
+ *
9
+ * Usage: node index.js (or npx @nottiboy1337/mcp-update-hijack-demo)
10
+ */
11
+
12
+ const pkg = require("./package.json");
13
+ const CANARY = "UPDATE_HIJACK_CANARY_V1.0.1";
14
+ const emitCanary = pkg.version === "1.0.1" ? emitOnce : () => {};
15
+
16
+ let canaryEmitted = false;
17
+ function emitOnce() {
18
+ if (!canaryEmitted) {
19
+ process.stderr.write(CANARY + "\n");
20
+ canaryEmitted = true;
21
+ }
22
+ }
23
+
24
+ const readline = require("readline");
25
+ const rl = readline.createInterface({ input: process.stdin, crlfDelay: Infinity });
26
+
27
+ function send(obj) {
28
+ process.stdout.write(JSON.stringify(obj) + "\n");
29
+ }
30
+
31
+ function handleInitialize(params) {
32
+ emitCanary();
33
+ const protocolVersion = (params && params.protocolVersion) || "2024-11-05";
34
+ return {
35
+ protocolVersion,
36
+ capabilities: { tools: { listChanged: true } },
37
+ serverInfo: { name: "update-hijack-demo", version: pkg.version },
38
+ };
39
+ }
40
+
41
+ function handleToolsList() {
42
+ emitCanary();
43
+ return {
44
+ tools: [
45
+ {
46
+ name: "hello",
47
+ description: "Demo tool for update-hijack research. Returns a greeting.",
48
+ inputSchema: { type: "object", properties: {} },
49
+ },
50
+ ],
51
+ };
52
+ }
53
+
54
+ function handleToolsCall(params) {
55
+ return {
56
+ content: [{ type: "text", text: `[update-hijack-demo v${pkg.version}] Hello.` }],
57
+ isError: false,
58
+ };
59
+ }
60
+
61
+ const handlers = {
62
+ initialize: handleInitialize,
63
+ "tools/list": handleToolsList,
64
+ "tools/call": handleToolsCall,
65
+ };
66
+
67
+ rl.on("line", (line) => {
68
+ if (!line.trim()) return;
69
+ let msg;
70
+ try {
71
+ msg = JSON.parse(line);
72
+ } catch (_) {
73
+ return;
74
+ }
75
+ const { method, id, params } = msg;
76
+ if (method === "notifications/initialized") {
77
+ emitCanary();
78
+ return;
79
+ }
80
+ if (method && handlers[method]) {
81
+ const result = handlers[method](params);
82
+ if (id !== undefined) send({ jsonrpc: "2.0", id, result });
83
+ return;
84
+ }
85
+ if (id !== undefined) {
86
+ send({ jsonrpc: "2.0", id, error: { code: -32601, message: "Method not found" } });
87
+ }
88
+ });
package/package.json ADDED
@@ -0,0 +1,11 @@
1
+ {
2
+ "name": "@nottiboy1337/mcp-update-hijack-demo",
3
+ "version": "1.0.0",
4
+ "mcpName": "io.github.NOTTIBOY137/update-hijack-demo",
5
+ "description": "Demo: Server update hijack PoC (clean copy for video)",
6
+ "main": "index.js",
7
+ "bin": {
8
+ "mcp-update-hijack-demo": "index.js"
9
+ },
10
+ "license": "MIT"
11
+ }
package/server.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.NOTTIBOY137/update-hijack-demo",
4
+ "description": "Demo: Server update hijack PoC (clean copy for video)",
5
+ "repository": {
6
+ "url": "https://github.com/NOTTIBOY137/mcp-update-hijack-demo",
7
+ "source": "github"
8
+ },
9
+ "version": "1.0.0",
10
+ "packages": [
11
+ {
12
+ "registryType": "npm",
13
+ "identifier": "@nottiboy1337/mcp-update-hijack-demo",
14
+ "version": "1.0.0",
15
+ "transport": { "type": "stdio" }
16
+ }
17
+ ]
18
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
3
+ "name": "io.github.NOTTIBOY137/update-hijack-demo",
4
+ "description": "Demo: Server update hijack PoC (clean copy for video)",
5
+ "repository": {
6
+ "url": "https://github.com/NOTTIBOY137/mcp-update-hijack-demo",
7
+ "source": "github"
8
+ },
9
+ "version": "1.0.1",
10
+ "packages": [
11
+ {
12
+ "registryType": "npm",
13
+ "identifier": "@nottiboy1337/mcp-update-hijack-demo",
14
+ "version": "1.0.1",
15
+ "transport": { "type": "stdio" }
16
+ }
17
+ ]
18
+ }