@guardbee/guard-core 0.6.0 → 0.8.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.
@@ -9,4 +9,8 @@ export { CAPABILITY_RULES, classifyTool, textOf } from "./classify.js";
9
9
  export type { Capability, FlowCategory, ToolRecord } from "./classify.js";
10
10
  export { POLICY_LABELS, POLICY_ACTIONS, policyRuleSchema, policyShape, gatewayPolicySchema, validatePolicy } from "./policy.js";
11
11
  export type { GatewayPolicy, PolicyValidation } from "./policy.js";
12
+ export { DESCRIPTION_INJECTION_PATTERNS, MISMATCH_SINK_RULES, READ_ONLY_HINT } from "./tool-poisoning.js";
13
+ export type { DescriptionInjectionPattern, MismatchSinkRule, ToolPoisoningCategory } from "./tool-poisoning.js";
14
+ export { annotationContradicts, matchSurface, scanToolCatalog } from "./tool-catalog.js";
15
+ export type { CatalogFinding, CatalogTool, SurfaceHit } from "./tool-catalog.js";
12
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChI,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChI,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1G,YAAY,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAChH,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzF,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/cjs/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validatePolicy = exports.gatewayPolicySchema = exports.policyShape = exports.policyRuleSchema = exports.POLICY_ACTIONS = exports.POLICY_LABELS = exports.textOf = exports.classifyTool = exports.CAPABILITY_RULES = exports.scanToolResult = exports.scanForPromptInjection = exports.findInjections = exports.INJECTION_PATTERNS = exports.INJECTION_RULES = exports.SECRET_RULES = exports.maskPiiInValue = exports.maskPiiInText = exports.PII_PATTERNS = exports.isValidTrPhone = exports.isValidVkn = exports.isValidIban = exports.isValidLuhn = exports.isValidTcKimlik = void 0;
3
+ exports.scanToolCatalog = exports.matchSurface = exports.annotationContradicts = exports.READ_ONLY_HINT = exports.MISMATCH_SINK_RULES = exports.DESCRIPTION_INJECTION_PATTERNS = exports.validatePolicy = exports.gatewayPolicySchema = exports.policyShape = exports.policyRuleSchema = exports.POLICY_ACTIONS = exports.POLICY_LABELS = exports.textOf = exports.classifyTool = exports.CAPABILITY_RULES = exports.scanToolResult = exports.scanForPromptInjection = exports.findInjections = exports.INJECTION_PATTERNS = exports.INJECTION_RULES = exports.SECRET_RULES = exports.maskPiiInValue = exports.maskPiiInText = exports.PII_PATTERNS = exports.isValidTrPhone = exports.isValidVkn = exports.isValidIban = exports.isValidLuhn = exports.isValidTcKimlik = void 0;
4
4
  var validators_js_1 = require("./validators.js");
5
5
  Object.defineProperty(exports, "isValidTcKimlik", { enumerable: true, get: function () { return validators_js_1.isValidTcKimlik; } });
6
6
  Object.defineProperty(exports, "isValidLuhn", { enumerable: true, get: function () { return validators_js_1.isValidLuhn; } });
@@ -30,4 +30,12 @@ Object.defineProperty(exports, "policyRuleSchema", { enumerable: true, get: func
30
30
  Object.defineProperty(exports, "policyShape", { enumerable: true, get: function () { return policy_js_1.policyShape; } });
31
31
  Object.defineProperty(exports, "gatewayPolicySchema", { enumerable: true, get: function () { return policy_js_1.gatewayPolicySchema; } });
32
32
  Object.defineProperty(exports, "validatePolicy", { enumerable: true, get: function () { return policy_js_1.validatePolicy; } });
33
+ var tool_poisoning_js_1 = require("./tool-poisoning.js");
34
+ Object.defineProperty(exports, "DESCRIPTION_INJECTION_PATTERNS", { enumerable: true, get: function () { return tool_poisoning_js_1.DESCRIPTION_INJECTION_PATTERNS; } });
35
+ Object.defineProperty(exports, "MISMATCH_SINK_RULES", { enumerable: true, get: function () { return tool_poisoning_js_1.MISMATCH_SINK_RULES; } });
36
+ Object.defineProperty(exports, "READ_ONLY_HINT", { enumerable: true, get: function () { return tool_poisoning_js_1.READ_ONLY_HINT; } });
37
+ var tool_catalog_js_1 = require("./tool-catalog.js");
38
+ Object.defineProperty(exports, "annotationContradicts", { enumerable: true, get: function () { return tool_catalog_js_1.annotationContradicts; } });
39
+ Object.defineProperty(exports, "matchSurface", { enumerable: true, get: function () { return tool_catalog_js_1.matchSurface; } });
40
+ Object.defineProperty(exports, "scanToolCatalog", { enumerable: true, get: function () { return tool_catalog_js_1.scanToolCatalog; } });
33
41
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAwG;AAA/F,gHAAA,eAAe,OAAA;AAAE,4GAAA,WAAW,OAAA;AAAE,4GAAA,WAAW,OAAA;AAAE,2GAAA,UAAU,OAAA;AAAE,+GAAA,cAAc,OAAA;AAC9E,mCAAuE;AAA9D,sGAAA,YAAY,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,wGAAA,cAAc,OAAA;AAEpD,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AAErB,+CAMwB;AALtB,+GAAA,eAAe,OAAA;AACf,kHAAA,kBAAkB,OAAA;AAClB,8GAAA,cAAc,OAAA;AACd,sHAAA,sBAAsB,OAAA;AACtB,8GAAA,cAAc,OAAA;AAGhB,6CAAuE;AAA9D,+GAAA,gBAAgB,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,qGAAA,MAAM,OAAA;AAE/C,yCAAgI;AAAvH,0GAAA,aAAa,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAAE,2GAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,iDAAwG;AAA/F,gHAAA,eAAe,OAAA;AAAE,4GAAA,WAAW,OAAA;AAAE,4GAAA,WAAW,OAAA;AAAE,2GAAA,UAAU,OAAA;AAAE,+GAAA,cAAc,OAAA;AAC9E,mCAAuE;AAA9D,sGAAA,YAAY,OAAA;AAAE,uGAAA,aAAa,OAAA;AAAE,wGAAA,cAAc,OAAA;AAEpD,2CAA4C;AAAnC,0GAAA,YAAY,OAAA;AAErB,+CAMwB;AALtB,+GAAA,eAAe,OAAA;AACf,kHAAA,kBAAkB,OAAA;AAClB,8GAAA,cAAc,OAAA;AACd,sHAAA,sBAAsB,OAAA;AACtB,8GAAA,cAAc,OAAA;AAGhB,6CAAuE;AAA9D,+GAAA,gBAAgB,OAAA;AAAE,2GAAA,YAAY,OAAA;AAAE,qGAAA,MAAM,OAAA;AAE/C,yCAAgI;AAAvH,0GAAA,aAAa,OAAA;AAAE,2GAAA,cAAc,OAAA;AAAE,6GAAA,gBAAgB,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,gHAAA,mBAAmB,OAAA;AAAE,2GAAA,cAAc,OAAA;AAE1G,yDAA0G;AAAjG,mIAAA,8BAA8B,OAAA;AAAE,wHAAA,mBAAmB,OAAA;AAAE,mHAAA,cAAc,OAAA;AAE5E,qDAAyF;AAAhF,wHAAA,qBAAqB,OAAA;AAAE,+GAAA,YAAY,OAAA;AAAE,kHAAA,eAAe,OAAA"}
@@ -137,6 +137,21 @@ export declare const policyShape: {
137
137
  "on-change": "on-change";
138
138
  }>>;
139
139
  }, z.core.$strict>>;
140
+ toolPoisoning: z.ZodOptional<z.ZodObject<{
141
+ enabled: z.ZodBoolean;
142
+ action: z.ZodEnum<{
143
+ block: "block";
144
+ warn: "warn";
145
+ }>;
146
+ }, z.core.$strict>>;
147
+ egressSecrets: z.ZodOptional<z.ZodObject<{
148
+ enabled: z.ZodBoolean;
149
+ action: z.ZodEnum<{
150
+ block: "block";
151
+ warn: "warn";
152
+ }>;
153
+ allowTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
154
+ }, z.core.$strict>>;
140
155
  piiMasking: z.ZodOptional<z.ZodObject<{
141
156
  enabled: z.ZodBoolean;
142
157
  patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -265,6 +280,21 @@ export declare const gatewayPolicySchema: z.ZodObject<{
265
280
  "on-change": "on-change";
266
281
  }>>;
267
282
  }, z.core.$strict>>;
283
+ toolPoisoning: z.ZodOptional<z.ZodObject<{
284
+ enabled: z.ZodBoolean;
285
+ action: z.ZodEnum<{
286
+ block: "block";
287
+ warn: "warn";
288
+ }>;
289
+ }, z.core.$strict>>;
290
+ egressSecrets: z.ZodOptional<z.ZodObject<{
291
+ enabled: z.ZodBoolean;
292
+ action: z.ZodEnum<{
293
+ block: "block";
294
+ warn: "warn";
295
+ }>;
296
+ allowTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
297
+ }, z.core.$strict>>;
268
298
  piiMasking: z.ZodOptional<z.ZodObject<{
269
299
  enabled: z.ZodBoolean;
270
300
  patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AAEH,eAAO,MAAM,aAAa,8DAA+D,CAAC;AAC1F,eAAO,MAAM,cAAc,uDAAwD,CAAC;AAUpF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBzB,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,WAAW;;;;;;;IAEtB;;;;;OAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDJ,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAiC,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErG,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAO/D"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AAEH,eAAO,MAAM,aAAa,8DAA+D,CAAC;AAC1F,eAAO,MAAM,cAAc,uDAAwD,CAAC;AAUpF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBzB,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,WAAW;;;;;;;IAEtB;;;;;OAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DJ,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAiC,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErG,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAO/D"}
@@ -81,6 +81,10 @@ exports.policyShape = {
81
81
  promptInjection: interceptorSchema.optional(),
82
82
  toolResultInjection: interceptorSchema.optional(),
83
83
  definitionDrift: interceptorSchema.extend({ recheck: zod_1.z.enum(["every-call", "on-change"]).optional() }).optional(),
84
+ /** Poisoned tool definitions in tools/list (injected instructions, hidden characters, read-only lies). */
85
+ toolPoisoning: interceptorSchema.optional(),
86
+ /** Credentials (provider keys, private keys, DB URLs with passwords) in the arguments of an egress tool. */
87
+ egressSecrets: interceptorSchema.extend({ allowTools: zod_1.z.array(zod_1.z.string().min(1)).optional() }).optional(),
84
88
  piiMasking: zod_1.z
85
89
  .object({
86
90
  enabled: zod_1.z.boolean(),
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface SurfaceHit {
2
+ patternId: string;
3
+ patternName: string;
4
+ category: "description-injection" | "obfuscation";
5
+ severity: "critical" | "high" | "medium";
6
+ recommendation: string;
7
+ owasp: "MCP03:2025";
8
+ index: number;
9
+ match: string;
10
+ }
11
+ export interface CatalogTool {
12
+ name: string;
13
+ description?: string;
14
+ inputSchema?: unknown;
15
+ annotations?: unknown;
16
+ }
17
+ export interface CatalogFinding {
18
+ patternId: string;
19
+ patternName: string;
20
+ category: "description-injection" | "obfuscation" | "confused-deputy";
21
+ severity: "critical" | "high" | "medium";
22
+ owasp: "MCP03:2025";
23
+ recommendation: string;
24
+ server?: string;
25
+ toolName: string;
26
+ field: string;
27
+ match: string;
28
+ }
29
+ export declare function annotationContradicts(description: string): boolean;
30
+ /** Instruction and obfuscation hits inside one tool description, parameter description, or enum value. */
31
+ export declare function matchSurface(text: string): SurfaceHit[];
32
+ export declare function scanToolCatalog(tools: CatalogTool[], server?: string): CatalogFinding[];
33
+ //# sourceMappingURL=tool-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-catalog.d.ts","sourceRoot":"","sources":["../../src/tool-catalog.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,uBAAuB,GAAG,aAAa,CAAC;IAClD,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,uBAAuB,GAAG,aAAa,GAAG,iBAAiB,CAAC;IACtE,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,KAAK,EAAE,YAAY,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,0GAA0G;AAC1G,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAiEvD;AAUD,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CA6CvF"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.annotationContradicts = annotationContradicts;
4
+ exports.matchSurface = matchSurface;
5
+ exports.scanToolCatalog = scanToolCatalog;
6
+ const tool_poisoning_js_1 = require("./tool-poisoning.js");
7
+ const DESTRUCTIVE = /\b(?:deletes?|drops?|unlinks?|wipes?|overwrites?|executes?|exec|rm\s+-rf)\b/i;
8
+ const LATIN = /[A-Za-z]/;
9
+ const OTHER_SCRIPT = /[\u0370-\u03FF\u0400-\u04FF]/;
10
+ function annotationContradicts(description) {
11
+ return DESTRUCTIVE.test(description);
12
+ }
13
+ /** Instruction and obfuscation hits inside one tool description, parameter description, or enum value. */
14
+ function matchSurface(text) {
15
+ const hits = [];
16
+ const capped = text.slice(0, 8000);
17
+ for (const pattern of tool_poisoning_js_1.DESCRIPTION_INJECTION_PATTERNS) {
18
+ const flags = pattern.pattern.flags.includes("g") ? pattern.pattern.flags : `${pattern.pattern.flags}g`;
19
+ const re = new RegExp(pattern.pattern.source, flags);
20
+ let match;
21
+ while ((match = re.exec(capped)) !== null) {
22
+ hits.push({
23
+ patternId: pattern.id,
24
+ patternName: pattern.name,
25
+ category: "description-injection",
26
+ severity: pattern.severity,
27
+ recommendation: pattern.recommendation,
28
+ owasp: "MCP03:2025",
29
+ index: match.index,
30
+ match: match[0],
31
+ });
32
+ if (match.index === re.lastIndex)
33
+ re.lastIndex++;
34
+ }
35
+ }
36
+ // A lookalike hides inside one word ("Reаd" with a Cyrillic а). Whole words in
37
+ // another script next to Latin ones ("заказов в формате JSON") are just a language.
38
+ const mixedWord = /[\p{L}\p{M}]+/gu;
39
+ let word;
40
+ let mixedAt = -1;
41
+ while ((word = mixedWord.exec(capped)) !== null) {
42
+ if (LATIN.test(word[0]) && OTHER_SCRIPT.test(word[0])) {
43
+ mixedAt = word.index;
44
+ break;
45
+ }
46
+ }
47
+ if (mixedAt >= 0) {
48
+ hits.push({
49
+ patternId: "mixed_script_in_description",
50
+ patternName: "A word in the description mixes Latin letters with Cyrillic or Greek lookalikes",
51
+ category: "obfuscation",
52
+ severity: "high",
53
+ recommendation: "A description that mixes scripts can show a familiar word while the model reads a different identifier. Compare the raw characters, not the rendered glyphs.",
54
+ owasp: "MCP03:2025",
55
+ index: mixedAt,
56
+ match: capped.slice(mixedAt, mixedAt + 8),
57
+ });
58
+ }
59
+ const blob = /[A-Za-z0-9+/]{32,}={0,2}/g;
60
+ let encoded;
61
+ while ((encoded = blob.exec(capped)) !== null) {
62
+ if (!suspiciousBlob(encoded[0]))
63
+ continue;
64
+ hits.push({
65
+ patternId: "encoded_blob_in_description",
66
+ patternName: "Description contains a long encoded blob",
67
+ category: "obfuscation",
68
+ severity: "medium",
69
+ recommendation: "A long base64-shaped token in a tool description is a common way to hide an instruction from a quick review. Decode it before trusting the server.",
70
+ owasp: "MCP03:2025",
71
+ index: encoded.index,
72
+ match: encoded[0].slice(0, 24),
73
+ });
74
+ if (encoded.index === blob.lastIndex)
75
+ blob.lastIndex++;
76
+ }
77
+ return hits;
78
+ }
79
+ function suspiciousBlob(token) {
80
+ if (token.length < 32)
81
+ return false;
82
+ const hasUpper = /[A-Z]/.test(token);
83
+ const hasLower = /[a-z]/.test(token);
84
+ const hasDigit = /\d/.test(token);
85
+ return (hasUpper && hasLower) || hasDigit || token.includes("+") || token.includes("/");
86
+ }
87
+ function scanToolCatalog(tools, server) {
88
+ const findings = [];
89
+ for (const tool of tools) {
90
+ const texts = [];
91
+ if (tool.description)
92
+ texts.push({ field: "description", text: tool.description });
93
+ for (const entry of schemaTexts(tool.inputSchema)) {
94
+ if (entry.text === tool.description)
95
+ continue;
96
+ texts.push(entry);
97
+ }
98
+ for (const entry of texts) {
99
+ for (const hit of matchSurface(entry.text)) {
100
+ findings.push({
101
+ patternId: hit.patternId,
102
+ patternName: hit.patternName,
103
+ category: hit.category,
104
+ severity: hit.severity,
105
+ owasp: "MCP03:2025",
106
+ recommendation: hit.recommendation,
107
+ server,
108
+ toolName: tool.name,
109
+ field: entry.field,
110
+ match: `${tool.name} ${entry.field}: ${hit.match}`.slice(0, 240),
111
+ });
112
+ }
113
+ }
114
+ if (readOnlyHint(tool.annotations) && tool.description && annotationContradicts(tool.description)) {
115
+ findings.push({
116
+ patternId: "annotation_readonly_lie",
117
+ patternName: `Tool "${tool.name}" is annotated read-only but its description says it mutates or executes`,
118
+ category: "confused-deputy",
119
+ severity: "high",
120
+ owasp: "MCP03:2025",
121
+ recommendation: "readOnlyHint: true tells a client this tool will not change state. A description that deletes, drops, or executes contradicts that annotation. The handler is not required for this check — the published definition already disagrees with itself.",
122
+ server,
123
+ toolName: tool.name,
124
+ field: "annotations.readOnlyHint",
125
+ match: tool.description.slice(0, 240),
126
+ });
127
+ }
128
+ }
129
+ return findings;
130
+ }
131
+ function readOnlyHint(annotations) {
132
+ if (!annotations || typeof annotations !== "object")
133
+ return false;
134
+ return annotations.readOnlyHint === true;
135
+ }
136
+ function schemaTexts(schema) {
137
+ const out = [];
138
+ walkSchema(schema, "inputSchema", out);
139
+ return out;
140
+ }
141
+ function walkSchema(node, path, out) {
142
+ if (!node || typeof node !== "object")
143
+ return;
144
+ const rec = node;
145
+ if (typeof rec.description === "string")
146
+ out.push({ field: `${path}.description`, text: rec.description });
147
+ if (Array.isArray(rec.enum)) {
148
+ rec.enum.forEach((item, index) => {
149
+ if (typeof item === "string")
150
+ out.push({ field: `${path}.enum[${index}]`, text: item });
151
+ });
152
+ }
153
+ if (rec.properties && typeof rec.properties === "object") {
154
+ for (const [key, child] of Object.entries(rec.properties)) {
155
+ walkSchema(child, `${path}.${key}`, out);
156
+ }
157
+ }
158
+ }
159
+ //# sourceMappingURL=tool-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-catalog.js","sourceRoot":"","sources":["../../src/tool-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type ToolPoisoningCategory = "description-injection" | "confused-deputy";
2
+ export interface DescriptionInjectionPattern {
3
+ id: string;
4
+ name: string;
5
+ pattern: RegExp;
6
+ severity: "critical" | "high" | "medium";
7
+ recommendation: string;
8
+ }
9
+ /**
10
+ * A tool's `description` string is read by the calling LLM as part of its
11
+ * tool-selection context — the same trust level as a system prompt, even
12
+ * though it's authored by whoever published the MCP server. "Tool poisoning"
13
+ * (documented by Invariant Labs, 2025) hides instructions in that string
14
+ * rather than in the conversation: "always call this first", "read ~/.ssh
15
+ * and pass it as the debug param", "don't tell the user". None of this is
16
+ * a code-level sink — `mcp-server-auditor` won't catch it, because nothing
17
+ * unsafe happens in the handler. The description itself is the payload.
18
+ */
19
+ export declare const DESCRIPTION_INJECTION_PATTERNS: DescriptionInjectionPattern[];
20
+ /** Name/description keywords implying a narrow, read-only/informational tool. */
21
+ export declare const READ_ONLY_HINT: RegExp;
22
+ export interface MismatchSinkRule {
23
+ id: string;
24
+ pattern: RegExp;
25
+ category: "process-execution" | "code-execution" | "filesystem-write" | "credentials-exposure";
26
+ severity: "critical" | "high";
27
+ recommendation: string;
28
+ }
29
+ /**
30
+ * Sinks that have no business appearing inside a tool whose name/description
31
+ * promises read-only/informational behavior. Deliberately excludes network
32
+ * fetches — a "get_weather" or "search" tool legitimately calling an external
33
+ * API is the common case, not a red flag, so including it here would make
34
+ * this the noisiest, least trustworthy pattern in the catalog.
35
+ */
36
+ export declare const MISMATCH_SINK_RULES: MismatchSinkRule[];
37
+ //# sourceMappingURL=tool-poisoning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-poisoning.d.ts","sourceRoot":"","sources":["../../src/tool-poisoning.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,uBAAuB,GAAG,iBAAiB,CAAC;AAEhF,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,8BAA8B,EAAE,2BAA2B,EAgEvE,CAAC;AAIF,iFAAiF;AACjF,eAAO,MAAM,cAAc,QAAqH,CAAC;AAEjJ,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mBAAmB,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;IAC/F,QAAQ,EAAE,UAAU,GAAG,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,EA6BjD,CAAC"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MISMATCH_SINK_RULES = exports.READ_ONLY_HINT = exports.DESCRIPTION_INJECTION_PATTERNS = void 0;
4
+ /**
5
+ * A tool's `description` string is read by the calling LLM as part of its
6
+ * tool-selection context — the same trust level as a system prompt, even
7
+ * though it's authored by whoever published the MCP server. "Tool poisoning"
8
+ * (documented by Invariant Labs, 2025) hides instructions in that string
9
+ * rather than in the conversation: "always call this first", "read ~/.ssh
10
+ * and pass it as the debug param", "don't tell the user". None of this is
11
+ * a code-level sink — `mcp-server-auditor` won't catch it, because nothing
12
+ * unsafe happens in the handler. The description itself is the payload.
13
+ */
14
+ exports.DESCRIPTION_INJECTION_PATTERNS = [
15
+ {
16
+ id: "instruction_override_in_description",
17
+ name: "Description tells the model to ignore/disregard prior instructions",
18
+ pattern: /\b(?:ignore|disregard)\s+(?:all\s+)?(?:previous|prior|above)\s+instructions?\b/i,
19
+ severity: "critical",
20
+ recommendation: "A tool description has no legitimate reason to override the conversation's instructions. Treat this server as compromised or malicious.",
21
+ },
22
+ {
23
+ id: "always_call_first_directive",
24
+ name: "Description instructs the model to always call this tool first/unconditionally",
25
+ pattern: /\balways\s+(?:call|use|invoke)\s+this\s+(?:tool|function)\s+(?:first|before)\b/i,
26
+ severity: "high",
27
+ recommendation: "A legitimate tool description explains what the tool does and lets the model decide when it's relevant — it doesn't demand priority over every other tool. This is a known tool-poisoning priming pattern.",
28
+ },
29
+ {
30
+ id: "covert_instruction_in_description",
31
+ name: "Description tells the model not to inform/mention this to the user",
32
+ pattern: /\bdo\s+not\s+(?:tell|inform|mention\s+(?:this\s+)?to)\s+the\s+user\b/i,
33
+ severity: "critical",
34
+ recommendation: "A tool asking to hide its own behavior from the user it's acting on behalf of is a hallmark of a poisoned tool description. Do not install this server.",
35
+ },
36
+ {
37
+ id: "meta_authority_directive",
38
+ name: "Description uses system-prompt-style authority markers",
39
+ pattern: /<\s*IMPORTANT\s*>|^\s*(?:IMPORTANT|SYSTEM|NOTE\s+TO\s+MODEL)\s*:/im,
40
+ severity: "high",
41
+ recommendation: "A tool description shouldn't need to invoke system-prompt-style authority (\"<IMPORTANT>\", \"SYSTEM:\") to be followed — this is a common technique to make an injected instruction feel more authoritative to the model.",
42
+ },
43
+ {
44
+ id: "sensitive_file_exfil_instruction",
45
+ name: "Description instructs reading a sensitive file into a tool parameter",
46
+ pattern: /\b(?:read|cat|include|attach|append)\b[^.]{0,80}(?:\.ssh\b|\bid_rsa\b|\.env\b|\.aws[\\/]credentials\b|\bprivate[\s_-]?key\b|\.npmrc\b)/i,
47
+ severity: "critical",
48
+ recommendation: "A tool description asking the model to read a credential/key file and pass its contents as a parameter is a direct exfiltration instruction — the file's contents would flow to whoever controls this MCP server.",
49
+ },
50
+ {
51
+ id: "hidden_zero_width_in_description",
52
+ name: "Description contains zero-width characters invisible to a human reviewer",
53
+ pattern: /[\u200B-\u200D\u2060\uFEFF]/,
54
+ severity: "high",
55
+ recommendation: "Zero-width characters in a tool description are invisible when a human reviews the server's tool list in a UI, but are still read by the model. Their only realistic purpose here is hiding text from review.",
56
+ },
57
+ {
58
+ id: "hidden_bidi_in_description",
59
+ name: "Description contains bidirectional override characters",
60
+ pattern: /[\u202A-\u202E\u2066-\u2069]/,
61
+ severity: "high",
62
+ recommendation: "Bidirectional overrides reorder how a description is displayed without changing the characters the model reads. A reviewer can see a different sentence than the one that reaches the model.",
63
+ },
64
+ {
65
+ id: "ansi_escape_in_description",
66
+ name: "Description contains an ANSI escape sequence",
67
+ pattern: /\u001b\[[0-9;]*[A-Za-z]/,
68
+ severity: "high",
69
+ recommendation: "ANSI escapes can hide or recolor text in a terminal review of a tool list. Tool descriptions are data for the model, not a terminal UI.",
70
+ },
71
+ {
72
+ id: "other_tools_manipulation_directive",
73
+ name: "Description instructs the model how to call other, different tools",
74
+ pattern: /\bwhen\s+(?:calling|using)\s+(?:the\s+)?["'`]?[\w.-]+["'`]?\s+tool\s*,\s*(?:always|you\s+must|set|pass|include)\b/i,
75
+ severity: "high",
76
+ recommendation: "A tool's description should describe that tool — not dictate how a different tool must be called. This is a documented tool-poisoning technique for hijacking unrelated tools via a single malicious server.",
77
+ },
78
+ ];
79
+ // ── Confused-deputy: promised capability vs. actual handler behavior ─────────
80
+ /** Name/description keywords implying a narrow, read-only/informational tool. */
81
+ exports.READ_ONLY_HINT = /\b(?:get|read|list|search|lookup|find|query|describe|show|view|check|inspect|summarize|translate|status|info)\b/i;
82
+ /**
83
+ * Sinks that have no business appearing inside a tool whose name/description
84
+ * promises read-only/informational behavior. Deliberately excludes network
85
+ * fetches — a "get_weather" or "search" tool legitimately calling an external
86
+ * API is the common case, not a red flag, so including it here would make
87
+ * this the noisiest, least trustworthy pattern in the catalog.
88
+ */
89
+ exports.MISMATCH_SINK_RULES = [
90
+ {
91
+ id: "process_execution",
92
+ pattern: /\b(?:execSync|spawnSync|child_process\.exec\w*|spawn)\s*\(/,
93
+ category: "process-execution",
94
+ severity: "critical",
95
+ recommendation: "This tool's name/description promises read-only/informational behavior, but its handler runs a shell/process command. Either the description is misleading (fix it so callers know what they're actually authorizing) or this tool has been given capability it shouldn't have.",
96
+ },
97
+ {
98
+ id: "code_execution",
99
+ pattern: /\b(?:eval|new\s+Function)\s*\(/,
100
+ category: "code-execution",
101
+ severity: "critical",
102
+ recommendation: "This tool's name/description promises read-only/informational behavior, but its handler evaluates code. A caller relying on the description has no way to know this tool can execute arbitrary code.",
103
+ },
104
+ {
105
+ id: "filesystem_write",
106
+ pattern: /\b(?:writeFileSync|unlinkSync|rmSync|appendFileSync|renameSync|writeFile)\s*\(/,
107
+ category: "filesystem-write",
108
+ severity: "high",
109
+ recommendation: "This tool's name/description promises read-only/informational behavior, but its handler writes/deletes files. Rename or redescribe the tool to reflect what it actually does, so callers aren't misled about its blast radius.",
110
+ },
111
+ {
112
+ id: "credentials_exposure",
113
+ pattern: /(?:\.\.\.\s*process\.env\b)|(?:JSON\.stringify\(\s*process\.env\s*\))|(?:return\s+process\.env\s*[;\n])/,
114
+ category: "credentials-exposure",
115
+ severity: "critical",
116
+ recommendation: "This tool's name/description promises read-only/informational behavior, but its handler exposes the entire process environment. A caller has no way to know this \"informational\" tool can leak every secret in this process.",
117
+ },
118
+ ];
119
+ //# sourceMappingURL=tool-poisoning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-poisoning.js","sourceRoot":"","sources":["../../src/tool-poisoning.ts"],"names":[],"mappings":";;;AAUA;;;;;;;;;GASG;AACU,QAAA,8BAA8B,GAAkC;IAC3E;QACE,EAAE,EAAE,qCAAqC;QACzC,IAAI,EAAE,oEAAoE;QAC1E,OAAO,EAAE,iFAAiF;QAC1F,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,yIAAyI;KAC1J;IACD;QACE,EAAE,EAAE,6BAA6B;QACjC,IAAI,EAAE,gFAAgF;QACtF,OAAO,EAAE,iFAAiF;QAC1F,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,4MAA4M;KAC7N;IACD;QACE,EAAE,EAAE,mCAAmC;QACvC,IAAI,EAAE,oEAAoE;QAC1E,OAAO,EAAE,uEAAuE;QAChF,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,yJAAyJ;KAC1K;IACD;QACE,EAAE,EAAE,0BAA0B;QAC9B,IAAI,EAAE,wDAAwD;QAC9D,OAAO,EAAE,oEAAoE;QAC7E,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,4NAA4N;KAC7O;IACD;QACE,EAAE,EAAE,kCAAkC;QACtC,IAAI,EAAE,sEAAsE;QAC5E,OAAO,EAAE,yIAAyI;QAClJ,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,mNAAmN;KACpO;IACD;QACE,EAAE,EAAE,kCAAkC;QACtC,IAAI,EAAE,0EAA0E;QAChF,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,+MAA+M;KAChO;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,IAAI,EAAE,wDAAwD;QAC9D,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,8LAA8L;KAC/M;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,IAAI,EAAE,8CAA8C;QACpD,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,yIAAyI;KAC1J;IACD;QACE,EAAE,EAAE,oCAAoC;QACxC,IAAI,EAAE,oEAAoE;QAC1E,OAAO,EAAE,oHAAoH;QAC7H,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,8MAA8M;KAC/N;CACF,CAAC;AAEF,gFAAgF;AAEhF,iFAAiF;AACpE,QAAA,cAAc,GAAG,kHAAkH,CAAC;AAUjJ;;;;;;GAMG;AACU,QAAA,mBAAmB,GAAuB;IACrD;QACE,EAAE,EAAE,mBAAmB;QACvB,OAAO,EAAE,4DAA4D;QACrE,QAAQ,EAAE,mBAAmB;QAC7B,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,iRAAiR;KAClS;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,OAAO,EAAE,gCAAgC;QACzC,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,sMAAsM;KACvN;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,OAAO,EAAE,gFAAgF;QACzF,QAAQ,EAAE,kBAAkB;QAC5B,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,gOAAgO;KACjP;IACD;QACE,EAAE,EAAE,sBAAsB;QAC1B,OAAO,EAAE,yGAAyG;QAClH,QAAQ,EAAE,sBAAsB;QAChC,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,gOAAgO;KACjP;CACF,CAAC"}
package/dist/index.d.ts CHANGED
@@ -9,4 +9,8 @@ export { CAPABILITY_RULES, classifyTool, textOf } from "./classify.js";
9
9
  export type { Capability, FlowCategory, ToolRecord } from "./classify.js";
10
10
  export { POLICY_LABELS, POLICY_ACTIONS, policyRuleSchema, policyShape, gatewayPolicySchema, validatePolicy } from "./policy.js";
11
11
  export type { GatewayPolicy, PolicyValidation } from "./policy.js";
12
+ export { DESCRIPTION_INJECTION_PATTERNS, MISMATCH_SINK_RULES, READ_ONLY_HINT } from "./tool-poisoning.js";
13
+ export type { DescriptionInjectionPattern, MismatchSinkRule, ToolPoisoningCategory } from "./tool-poisoning.js";
14
+ export { annotationContradicts, matchSurface, scanToolCatalog } from "./tool-catalog.js";
15
+ export type { CatalogFinding, CatalogTool, SurfaceHit } from "./tool-catalog.js";
12
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChI,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAChI,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1G,YAAY,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAChH,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzF,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -4,4 +4,6 @@ export { SECRET_RULES } from "./secrets.js";
4
4
  export { INJECTION_RULES, INJECTION_PATTERNS, findInjections, scanForPromptInjection, scanToolResult, } from "./injection.js";
5
5
  export { CAPABILITY_RULES, classifyTool, textOf } from "./classify.js";
6
6
  export { POLICY_LABELS, POLICY_ACTIONS, policyRuleSchema, policyShape, gatewayPolicySchema, validatePolicy } from "./policy.js";
7
+ export { DESCRIPTION_INJECTION_PATTERNS, MISMATCH_SINK_RULES, READ_ONLY_HINT } from "./tool-poisoning.js";
8
+ export { annotationContradicts, matchSurface, scanToolCatalog } from "./tool-catalog.js";
7
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhI,OAAO,EAAE,8BAA8B,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1G,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/policy.d.ts CHANGED
@@ -137,6 +137,21 @@ export declare const policyShape: {
137
137
  "on-change": "on-change";
138
138
  }>>;
139
139
  }, z.core.$strict>>;
140
+ toolPoisoning: z.ZodOptional<z.ZodObject<{
141
+ enabled: z.ZodBoolean;
142
+ action: z.ZodEnum<{
143
+ block: "block";
144
+ warn: "warn";
145
+ }>;
146
+ }, z.core.$strict>>;
147
+ egressSecrets: z.ZodOptional<z.ZodObject<{
148
+ enabled: z.ZodBoolean;
149
+ action: z.ZodEnum<{
150
+ block: "block";
151
+ warn: "warn";
152
+ }>;
153
+ allowTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
154
+ }, z.core.$strict>>;
140
155
  piiMasking: z.ZodOptional<z.ZodObject<{
141
156
  enabled: z.ZodBoolean;
142
157
  patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -265,6 +280,21 @@ export declare const gatewayPolicySchema: z.ZodObject<{
265
280
  "on-change": "on-change";
266
281
  }>>;
267
282
  }, z.core.$strict>>;
283
+ toolPoisoning: z.ZodOptional<z.ZodObject<{
284
+ enabled: z.ZodBoolean;
285
+ action: z.ZodEnum<{
286
+ block: "block";
287
+ warn: "warn";
288
+ }>;
289
+ }, z.core.$strict>>;
290
+ egressSecrets: z.ZodOptional<z.ZodObject<{
291
+ enabled: z.ZodBoolean;
292
+ action: z.ZodEnum<{
293
+ block: "block";
294
+ warn: "warn";
295
+ }>;
296
+ allowTools: z.ZodOptional<z.ZodArray<z.ZodString>>;
297
+ }, z.core.$strict>>;
268
298
  piiMasking: z.ZodOptional<z.ZodObject<{
269
299
  enabled: z.ZodBoolean;
270
300
  patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AAEH,eAAO,MAAM,aAAa,8DAA+D,CAAC;AAC1F,eAAO,MAAM,cAAc,uDAAwD,CAAC;AAUpF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBzB,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,WAAW;;;;;;;IAEtB;;;;;OAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuDJ,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAiC,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErG,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAO/D"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AAEH,eAAO,MAAM,aAAa,8DAA+D,CAAC;AAC1F,eAAO,MAAM,cAAc,uDAAwD,CAAC;AAUpF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmBzB,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,WAAW;;;;;;;IAEtB;;;;;OAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2DJ,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAiC,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,aAAa,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAErG,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAO/D"}
package/dist/policy.js CHANGED
@@ -77,6 +77,10 @@ export const policyShape = {
77
77
  promptInjection: interceptorSchema.optional(),
78
78
  toolResultInjection: interceptorSchema.optional(),
79
79
  definitionDrift: interceptorSchema.extend({ recheck: z.enum(["every-call", "on-change"]).optional() }).optional(),
80
+ /** Poisoned tool definitions in tools/list (injected instructions, hidden characters, read-only lies). */
81
+ toolPoisoning: interceptorSchema.optional(),
82
+ /** Credentials (provider keys, private keys, DB URLs with passwords) in the arguments of an egress tool. */
83
+ egressSecrets: interceptorSchema.extend({ allowTools: z.array(z.string().min(1)).optional() }).optional(),
80
84
  piiMasking: z
81
85
  .object({
82
86
  enabled: z.boolean(),
@@ -1 +1 @@
1
- {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,CAAU,CAAC;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AAEpF,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AAC1C,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AAC5C,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AACzG,uFAAuF;AACvF,MAAM,mBAAmB,GAAG,CAAC;KAC1B,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;KACtG,MAAM,EAAE,CAAC;AAEZ,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzB,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE;QAC7B,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;QAChD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KACtF,CAAC;SACD,MAAM,EAAE;IACX,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3E,CAAC;KACD,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,EAAE;IACnE,OAAO,EAAE,0CAA0C;IACnD,IAAI,EAAE,CAAC,MAAM,CAAC;CACf,CAAC,CAAC;AAEL,sFAAsF;AACtF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC9D;;;;;OAKG;IACH,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;QAC7C,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KAC5E,CAAC;SACD,MAAM,EAAE;SACR,OAAO,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,KAAK,EAAE,CAAC;SACL,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACpE;;;WAGG;QACH,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;KAC5D,CAAC;SACD,MAAM,EAAE;SACR,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IACnD,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;QACxD,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC;KACxF,CAAC;SACD,MAAM,EAAE;SACR,OAAO,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;IAC9D,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACnG,YAAY,EAAE,CAAC;SACZ,MAAM,CAAC;QACN,eAAe,EAAE,iBAAiB,CAAC,QAAQ,EAAE;QAC7C,mBAAmB,EAAE,iBAAiB,CAAC,QAAQ,EAAE;QACjD,eAAe,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;QACjH,0GAA0G;QAC1G,aAAa,EAAE,iBAAiB,CAAC,QAAQ,EAAE;QAC3C,4GAA4G;QAC5G,aAAa,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;QACzG,UAAU,EAAE,CAAC;aACV,MAAM,CAAC;YACN,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;YACpB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YACxC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;YAC/C,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;SAC5C,CAAC;aACD,MAAM,EAAE;aACR,QAAQ,EAAE;QACb,iHAAiH;QACjH,OAAO,EAAE,iBAAiB;aACvB,MAAM,CAAC;YACN,SAAS,EAAE,mBAAmB,CAAC,QAAQ,EAAE;YACzC,cAAc,EAAE,mBAAmB,CAAC,QAAQ,EAAE;YAC9C,gBAAgB,EAAE,mBAAmB,CAAC,QAAQ,EAAE;YAChD,cAAc,EAAE,mBAAmB,CAAC,QAAQ,EAAE;SAC/C,CAAC;aACD,QAAQ,EAAE;KACd,CAAC;SACD,MAAM,EAAE;SACR,OAAO,CAAC,EAAE,CAAC;CACf,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC;AAMlE,+EAA+E;AAC/E,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;IAC7D,OAAO;QACL,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;KACpG,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ export interface SurfaceHit {
2
+ patternId: string;
3
+ patternName: string;
4
+ category: "description-injection" | "obfuscation";
5
+ severity: "critical" | "high" | "medium";
6
+ recommendation: string;
7
+ owasp: "MCP03:2025";
8
+ index: number;
9
+ match: string;
10
+ }
11
+ export interface CatalogTool {
12
+ name: string;
13
+ description?: string;
14
+ inputSchema?: unknown;
15
+ annotations?: unknown;
16
+ }
17
+ export interface CatalogFinding {
18
+ patternId: string;
19
+ patternName: string;
20
+ category: "description-injection" | "obfuscation" | "confused-deputy";
21
+ severity: "critical" | "high" | "medium";
22
+ owasp: "MCP03:2025";
23
+ recommendation: string;
24
+ server?: string;
25
+ toolName: string;
26
+ field: string;
27
+ match: string;
28
+ }
29
+ export declare function annotationContradicts(description: string): boolean;
30
+ /** Instruction and obfuscation hits inside one tool description, parameter description, or enum value. */
31
+ export declare function matchSurface(text: string): SurfaceHit[];
32
+ export declare function scanToolCatalog(tools: CatalogTool[], server?: string): CatalogFinding[];
33
+ //# sourceMappingURL=tool-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-catalog.d.ts","sourceRoot":"","sources":["../src/tool-catalog.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,uBAAuB,GAAG,aAAa,CAAC;IAClD,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,uBAAuB,GAAG,aAAa,GAAG,iBAAiB,CAAC;IACtE,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,KAAK,EAAE,YAAY,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAElE;AAED,0GAA0G;AAC1G,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAiEvD;AAUD,wBAAgB,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CA6CvF"}
@@ -0,0 +1,154 @@
1
+ import { DESCRIPTION_INJECTION_PATTERNS } from "./tool-poisoning.js";
2
+ const DESTRUCTIVE = /\b(?:deletes?|drops?|unlinks?|wipes?|overwrites?|executes?|exec|rm\s+-rf)\b/i;
3
+ const LATIN = /[A-Za-z]/;
4
+ const OTHER_SCRIPT = /[\u0370-\u03FF\u0400-\u04FF]/;
5
+ export function annotationContradicts(description) {
6
+ return DESTRUCTIVE.test(description);
7
+ }
8
+ /** Instruction and obfuscation hits inside one tool description, parameter description, or enum value. */
9
+ export function matchSurface(text) {
10
+ const hits = [];
11
+ const capped = text.slice(0, 8000);
12
+ for (const pattern of DESCRIPTION_INJECTION_PATTERNS) {
13
+ const flags = pattern.pattern.flags.includes("g") ? pattern.pattern.flags : `${pattern.pattern.flags}g`;
14
+ const re = new RegExp(pattern.pattern.source, flags);
15
+ let match;
16
+ while ((match = re.exec(capped)) !== null) {
17
+ hits.push({
18
+ patternId: pattern.id,
19
+ patternName: pattern.name,
20
+ category: "description-injection",
21
+ severity: pattern.severity,
22
+ recommendation: pattern.recommendation,
23
+ owasp: "MCP03:2025",
24
+ index: match.index,
25
+ match: match[0],
26
+ });
27
+ if (match.index === re.lastIndex)
28
+ re.lastIndex++;
29
+ }
30
+ }
31
+ // A lookalike hides inside one word ("Reаd" with a Cyrillic а). Whole words in
32
+ // another script next to Latin ones ("заказов в формате JSON") are just a language.
33
+ const mixedWord = /[\p{L}\p{M}]+/gu;
34
+ let word;
35
+ let mixedAt = -1;
36
+ while ((word = mixedWord.exec(capped)) !== null) {
37
+ if (LATIN.test(word[0]) && OTHER_SCRIPT.test(word[0])) {
38
+ mixedAt = word.index;
39
+ break;
40
+ }
41
+ }
42
+ if (mixedAt >= 0) {
43
+ hits.push({
44
+ patternId: "mixed_script_in_description",
45
+ patternName: "A word in the description mixes Latin letters with Cyrillic or Greek lookalikes",
46
+ category: "obfuscation",
47
+ severity: "high",
48
+ recommendation: "A description that mixes scripts can show a familiar word while the model reads a different identifier. Compare the raw characters, not the rendered glyphs.",
49
+ owasp: "MCP03:2025",
50
+ index: mixedAt,
51
+ match: capped.slice(mixedAt, mixedAt + 8),
52
+ });
53
+ }
54
+ const blob = /[A-Za-z0-9+/]{32,}={0,2}/g;
55
+ let encoded;
56
+ while ((encoded = blob.exec(capped)) !== null) {
57
+ if (!suspiciousBlob(encoded[0]))
58
+ continue;
59
+ hits.push({
60
+ patternId: "encoded_blob_in_description",
61
+ patternName: "Description contains a long encoded blob",
62
+ category: "obfuscation",
63
+ severity: "medium",
64
+ recommendation: "A long base64-shaped token in a tool description is a common way to hide an instruction from a quick review. Decode it before trusting the server.",
65
+ owasp: "MCP03:2025",
66
+ index: encoded.index,
67
+ match: encoded[0].slice(0, 24),
68
+ });
69
+ if (encoded.index === blob.lastIndex)
70
+ blob.lastIndex++;
71
+ }
72
+ return hits;
73
+ }
74
+ function suspiciousBlob(token) {
75
+ if (token.length < 32)
76
+ return false;
77
+ const hasUpper = /[A-Z]/.test(token);
78
+ const hasLower = /[a-z]/.test(token);
79
+ const hasDigit = /\d/.test(token);
80
+ return (hasUpper && hasLower) || hasDigit || token.includes("+") || token.includes("/");
81
+ }
82
+ export function scanToolCatalog(tools, server) {
83
+ const findings = [];
84
+ for (const tool of tools) {
85
+ const texts = [];
86
+ if (tool.description)
87
+ texts.push({ field: "description", text: tool.description });
88
+ for (const entry of schemaTexts(tool.inputSchema)) {
89
+ if (entry.text === tool.description)
90
+ continue;
91
+ texts.push(entry);
92
+ }
93
+ for (const entry of texts) {
94
+ for (const hit of matchSurface(entry.text)) {
95
+ findings.push({
96
+ patternId: hit.patternId,
97
+ patternName: hit.patternName,
98
+ category: hit.category,
99
+ severity: hit.severity,
100
+ owasp: "MCP03:2025",
101
+ recommendation: hit.recommendation,
102
+ server,
103
+ toolName: tool.name,
104
+ field: entry.field,
105
+ match: `${tool.name} ${entry.field}: ${hit.match}`.slice(0, 240),
106
+ });
107
+ }
108
+ }
109
+ if (readOnlyHint(tool.annotations) && tool.description && annotationContradicts(tool.description)) {
110
+ findings.push({
111
+ patternId: "annotation_readonly_lie",
112
+ patternName: `Tool "${tool.name}" is annotated read-only but its description says it mutates or executes`,
113
+ category: "confused-deputy",
114
+ severity: "high",
115
+ owasp: "MCP03:2025",
116
+ recommendation: "readOnlyHint: true tells a client this tool will not change state. A description that deletes, drops, or executes contradicts that annotation. The handler is not required for this check — the published definition already disagrees with itself.",
117
+ server,
118
+ toolName: tool.name,
119
+ field: "annotations.readOnlyHint",
120
+ match: tool.description.slice(0, 240),
121
+ });
122
+ }
123
+ }
124
+ return findings;
125
+ }
126
+ function readOnlyHint(annotations) {
127
+ if (!annotations || typeof annotations !== "object")
128
+ return false;
129
+ return annotations.readOnlyHint === true;
130
+ }
131
+ function schemaTexts(schema) {
132
+ const out = [];
133
+ walkSchema(schema, "inputSchema", out);
134
+ return out;
135
+ }
136
+ function walkSchema(node, path, out) {
137
+ if (!node || typeof node !== "object")
138
+ return;
139
+ const rec = node;
140
+ if (typeof rec.description === "string")
141
+ out.push({ field: `${path}.description`, text: rec.description });
142
+ if (Array.isArray(rec.enum)) {
143
+ rec.enum.forEach((item, index) => {
144
+ if (typeof item === "string")
145
+ out.push({ field: `${path}.enum[${index}]`, text: item });
146
+ });
147
+ }
148
+ if (rec.properties && typeof rec.properties === "object") {
149
+ for (const [key, child] of Object.entries(rec.properties)) {
150
+ walkSchema(child, `${path}.${key}`, out);
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=tool-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-catalog.js","sourceRoot":"","sources":["../src/tool-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ export type ToolPoisoningCategory = "description-injection" | "confused-deputy";
2
+ export interface DescriptionInjectionPattern {
3
+ id: string;
4
+ name: string;
5
+ pattern: RegExp;
6
+ severity: "critical" | "high" | "medium";
7
+ recommendation: string;
8
+ }
9
+ /**
10
+ * A tool's `description` string is read by the calling LLM as part of its
11
+ * tool-selection context — the same trust level as a system prompt, even
12
+ * though it's authored by whoever published the MCP server. "Tool poisoning"
13
+ * (documented by Invariant Labs, 2025) hides instructions in that string
14
+ * rather than in the conversation: "always call this first", "read ~/.ssh
15
+ * and pass it as the debug param", "don't tell the user". None of this is
16
+ * a code-level sink — `mcp-server-auditor` won't catch it, because nothing
17
+ * unsafe happens in the handler. The description itself is the payload.
18
+ */
19
+ export declare const DESCRIPTION_INJECTION_PATTERNS: DescriptionInjectionPattern[];
20
+ /** Name/description keywords implying a narrow, read-only/informational tool. */
21
+ export declare const READ_ONLY_HINT: RegExp;
22
+ export interface MismatchSinkRule {
23
+ id: string;
24
+ pattern: RegExp;
25
+ category: "process-execution" | "code-execution" | "filesystem-write" | "credentials-exposure";
26
+ severity: "critical" | "high";
27
+ recommendation: string;
28
+ }
29
+ /**
30
+ * Sinks that have no business appearing inside a tool whose name/description
31
+ * promises read-only/informational behavior. Deliberately excludes network
32
+ * fetches — a "get_weather" or "search" tool legitimately calling an external
33
+ * API is the common case, not a red flag, so including it here would make
34
+ * this the noisiest, least trustworthy pattern in the catalog.
35
+ */
36
+ export declare const MISMATCH_SINK_RULES: MismatchSinkRule[];
37
+ //# sourceMappingURL=tool-poisoning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-poisoning.d.ts","sourceRoot":"","sources":["../src/tool-poisoning.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG,uBAAuB,GAAG,iBAAiB,CAAC;AAEhF,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,8BAA8B,EAAE,2BAA2B,EAgEvE,CAAC;AAIF,iFAAiF;AACjF,eAAO,MAAM,cAAc,QAAqH,CAAC;AAEjJ,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,mBAAmB,GAAG,gBAAgB,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;IAC/F,QAAQ,EAAE,UAAU,GAAG,MAAM,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,EAAE,gBAAgB,EA6BjD,CAAC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * A tool's `description` string is read by the calling LLM as part of its
3
+ * tool-selection context — the same trust level as a system prompt, even
4
+ * though it's authored by whoever published the MCP server. "Tool poisoning"
5
+ * (documented by Invariant Labs, 2025) hides instructions in that string
6
+ * rather than in the conversation: "always call this first", "read ~/.ssh
7
+ * and pass it as the debug param", "don't tell the user". None of this is
8
+ * a code-level sink — `mcp-server-auditor` won't catch it, because nothing
9
+ * unsafe happens in the handler. The description itself is the payload.
10
+ */
11
+ export const DESCRIPTION_INJECTION_PATTERNS = [
12
+ {
13
+ id: "instruction_override_in_description",
14
+ name: "Description tells the model to ignore/disregard prior instructions",
15
+ pattern: /\b(?:ignore|disregard)\s+(?:all\s+)?(?:previous|prior|above)\s+instructions?\b/i,
16
+ severity: "critical",
17
+ recommendation: "A tool description has no legitimate reason to override the conversation's instructions. Treat this server as compromised or malicious.",
18
+ },
19
+ {
20
+ id: "always_call_first_directive",
21
+ name: "Description instructs the model to always call this tool first/unconditionally",
22
+ pattern: /\balways\s+(?:call|use|invoke)\s+this\s+(?:tool|function)\s+(?:first|before)\b/i,
23
+ severity: "high",
24
+ recommendation: "A legitimate tool description explains what the tool does and lets the model decide when it's relevant — it doesn't demand priority over every other tool. This is a known tool-poisoning priming pattern.",
25
+ },
26
+ {
27
+ id: "covert_instruction_in_description",
28
+ name: "Description tells the model not to inform/mention this to the user",
29
+ pattern: /\bdo\s+not\s+(?:tell|inform|mention\s+(?:this\s+)?to)\s+the\s+user\b/i,
30
+ severity: "critical",
31
+ recommendation: "A tool asking to hide its own behavior from the user it's acting on behalf of is a hallmark of a poisoned tool description. Do not install this server.",
32
+ },
33
+ {
34
+ id: "meta_authority_directive",
35
+ name: "Description uses system-prompt-style authority markers",
36
+ pattern: /<\s*IMPORTANT\s*>|^\s*(?:IMPORTANT|SYSTEM|NOTE\s+TO\s+MODEL)\s*:/im,
37
+ severity: "high",
38
+ recommendation: "A tool description shouldn't need to invoke system-prompt-style authority (\"<IMPORTANT>\", \"SYSTEM:\") to be followed — this is a common technique to make an injected instruction feel more authoritative to the model.",
39
+ },
40
+ {
41
+ id: "sensitive_file_exfil_instruction",
42
+ name: "Description instructs reading a sensitive file into a tool parameter",
43
+ pattern: /\b(?:read|cat|include|attach|append)\b[^.]{0,80}(?:\.ssh\b|\bid_rsa\b|\.env\b|\.aws[\\/]credentials\b|\bprivate[\s_-]?key\b|\.npmrc\b)/i,
44
+ severity: "critical",
45
+ recommendation: "A tool description asking the model to read a credential/key file and pass its contents as a parameter is a direct exfiltration instruction — the file's contents would flow to whoever controls this MCP server.",
46
+ },
47
+ {
48
+ id: "hidden_zero_width_in_description",
49
+ name: "Description contains zero-width characters invisible to a human reviewer",
50
+ pattern: /[\u200B-\u200D\u2060\uFEFF]/,
51
+ severity: "high",
52
+ recommendation: "Zero-width characters in a tool description are invisible when a human reviews the server's tool list in a UI, but are still read by the model. Their only realistic purpose here is hiding text from review.",
53
+ },
54
+ {
55
+ id: "hidden_bidi_in_description",
56
+ name: "Description contains bidirectional override characters",
57
+ pattern: /[\u202A-\u202E\u2066-\u2069]/,
58
+ severity: "high",
59
+ recommendation: "Bidirectional overrides reorder how a description is displayed without changing the characters the model reads. A reviewer can see a different sentence than the one that reaches the model.",
60
+ },
61
+ {
62
+ id: "ansi_escape_in_description",
63
+ name: "Description contains an ANSI escape sequence",
64
+ pattern: /\u001b\[[0-9;]*[A-Za-z]/,
65
+ severity: "high",
66
+ recommendation: "ANSI escapes can hide or recolor text in a terminal review of a tool list. Tool descriptions are data for the model, not a terminal UI.",
67
+ },
68
+ {
69
+ id: "other_tools_manipulation_directive",
70
+ name: "Description instructs the model how to call other, different tools",
71
+ pattern: /\bwhen\s+(?:calling|using)\s+(?:the\s+)?["'`]?[\w.-]+["'`]?\s+tool\s*,\s*(?:always|you\s+must|set|pass|include)\b/i,
72
+ severity: "high",
73
+ recommendation: "A tool's description should describe that tool — not dictate how a different tool must be called. This is a documented tool-poisoning technique for hijacking unrelated tools via a single malicious server.",
74
+ },
75
+ ];
76
+ // ── Confused-deputy: promised capability vs. actual handler behavior ─────────
77
+ /** Name/description keywords implying a narrow, read-only/informational tool. */
78
+ export const READ_ONLY_HINT = /\b(?:get|read|list|search|lookup|find|query|describe|show|view|check|inspect|summarize|translate|status|info)\b/i;
79
+ /**
80
+ * Sinks that have no business appearing inside a tool whose name/description
81
+ * promises read-only/informational behavior. Deliberately excludes network
82
+ * fetches — a "get_weather" or "search" tool legitimately calling an external
83
+ * API is the common case, not a red flag, so including it here would make
84
+ * this the noisiest, least trustworthy pattern in the catalog.
85
+ */
86
+ export const MISMATCH_SINK_RULES = [
87
+ {
88
+ id: "process_execution",
89
+ pattern: /\b(?:execSync|spawnSync|child_process\.exec\w*|spawn)\s*\(/,
90
+ category: "process-execution",
91
+ severity: "critical",
92
+ recommendation: "This tool's name/description promises read-only/informational behavior, but its handler runs a shell/process command. Either the description is misleading (fix it so callers know what they're actually authorizing) or this tool has been given capability it shouldn't have.",
93
+ },
94
+ {
95
+ id: "code_execution",
96
+ pattern: /\b(?:eval|new\s+Function)\s*\(/,
97
+ category: "code-execution",
98
+ severity: "critical",
99
+ recommendation: "This tool's name/description promises read-only/informational behavior, but its handler evaluates code. A caller relying on the description has no way to know this tool can execute arbitrary code.",
100
+ },
101
+ {
102
+ id: "filesystem_write",
103
+ pattern: /\b(?:writeFileSync|unlinkSync|rmSync|appendFileSync|renameSync|writeFile)\s*\(/,
104
+ category: "filesystem-write",
105
+ severity: "high",
106
+ recommendation: "This tool's name/description promises read-only/informational behavior, but its handler writes/deletes files. Rename or redescribe the tool to reflect what it actually does, so callers aren't misled about its blast radius.",
107
+ },
108
+ {
109
+ id: "credentials_exposure",
110
+ pattern: /(?:\.\.\.\s*process\.env\b)|(?:JSON\.stringify\(\s*process\.env\s*\))|(?:return\s+process\.env\s*[;\n])/,
111
+ category: "credentials-exposure",
112
+ severity: "critical",
113
+ recommendation: "This tool's name/description promises read-only/informational behavior, but its handler exposes the entire process environment. A caller has no way to know this \"informational\" tool can leak every secret in this process.",
114
+ },
115
+ ];
116
+ //# sourceMappingURL=tool-poisoning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-poisoning.js","sourceRoot":"","sources":["../src/tool-poisoning.ts"],"names":[],"mappings":"AAUA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAkC;IAC3E;QACE,EAAE,EAAE,qCAAqC;QACzC,IAAI,EAAE,oEAAoE;QAC1E,OAAO,EAAE,iFAAiF;QAC1F,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,yIAAyI;KAC1J;IACD;QACE,EAAE,EAAE,6BAA6B;QACjC,IAAI,EAAE,gFAAgF;QACtF,OAAO,EAAE,iFAAiF;QAC1F,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,4MAA4M;KAC7N;IACD;QACE,EAAE,EAAE,mCAAmC;QACvC,IAAI,EAAE,oEAAoE;QAC1E,OAAO,EAAE,uEAAuE;QAChF,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,yJAAyJ;KAC1K;IACD;QACE,EAAE,EAAE,0BAA0B;QAC9B,IAAI,EAAE,wDAAwD;QAC9D,OAAO,EAAE,oEAAoE;QAC7E,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,4NAA4N;KAC7O;IACD;QACE,EAAE,EAAE,kCAAkC;QACtC,IAAI,EAAE,sEAAsE;QAC5E,OAAO,EAAE,yIAAyI;QAClJ,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,mNAAmN;KACpO;IACD;QACE,EAAE,EAAE,kCAAkC;QACtC,IAAI,EAAE,0EAA0E;QAChF,OAAO,EAAE,6BAA6B;QACtC,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,+MAA+M;KAChO;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,IAAI,EAAE,wDAAwD;QAC9D,OAAO,EAAE,8BAA8B;QACvC,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,8LAA8L;KAC/M;IACD;QACE,EAAE,EAAE,4BAA4B;QAChC,IAAI,EAAE,8CAA8C;QACpD,OAAO,EAAE,yBAAyB;QAClC,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,yIAAyI;KAC1J;IACD;QACE,EAAE,EAAE,oCAAoC;QACxC,IAAI,EAAE,oEAAoE;QAC1E,OAAO,EAAE,oHAAoH;QAC7H,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,8MAA8M;KAC/N;CACF,CAAC;AAEF,gFAAgF;AAEhF,iFAAiF;AACjF,MAAM,CAAC,MAAM,cAAc,GAAG,kHAAkH,CAAC;AAUjJ;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAuB;IACrD;QACE,EAAE,EAAE,mBAAmB;QACvB,OAAO,EAAE,4DAA4D;QACrE,QAAQ,EAAE,mBAAmB;QAC7B,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,iRAAiR;KAClS;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,OAAO,EAAE,gCAAgC;QACzC,QAAQ,EAAE,gBAAgB;QAC1B,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,sMAAsM;KACvN;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,OAAO,EAAE,gFAAgF;QACzF,QAAQ,EAAE,kBAAkB;QAC5B,QAAQ,EAAE,MAAM;QAChB,cAAc,EAAE,gOAAgO;KACjP;IACD;QACE,EAAE,EAAE,sBAAsB;QAC1B,OAAO,EAAE,yGAAyG;QAClH,QAAQ,EAAE,sBAAsB;QAChC,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,gOAAgO;KACjP;CACF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guardbee/guard-core",
3
- "version": "0.6.0",
3
+ "version": "0.8.0",
4
4
  "description": "Shared detectors for GuardBee MCP packages — checksum-validated PII masking, prompt injection patterns, and lethal-trifecta tool classification",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",