@safebrowse/core 0.1.2-rc.1
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 +15 -0
- package/README.md +22 -0
- package/dist/action.d.ts +3 -0
- package/dist/action.d.ts.map +1 -0
- package/dist/action.js +142 -0
- package/dist/action.js.map +1 -0
- package/dist/artifact.d.ts +3 -0
- package/dist/artifact.d.ts.map +1 -0
- package/dist/artifact.js +123 -0
- package/dist/artifact.js.map +1 -0
- package/dist/artifactV2.d.ts +3 -0
- package/dist/artifactV2.d.ts.map +1 -0
- package/dist/artifactV2.js +32 -0
- package/dist/artifactV2.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/memory.d.ts +3 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +79 -0
- package/dist/memory.js.map +1 -0
- package/dist/perf-smoke.d.ts +2 -0
- package/dist/perf-smoke.d.ts.map +1 -0
- package/dist/perf-smoke.js +86 -0
- package/dist/perf-smoke.js.map +1 -0
- package/dist/policy.d.ts +3 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +74 -0
- package/dist/policy.js.map +1 -0
- package/dist/promptInjection.d.ts +3 -0
- package/dist/promptInjection.d.ts.map +1 -0
- package/dist/promptInjection.js +58 -0
- package/dist/promptInjection.js.map +1 -0
- package/dist/replay.d.ts +3 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +39 -0
- package/dist/replay.js.map +1 -0
- package/dist/sanitize.d.ts +3 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +50 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/toolProtocol.d.ts +3 -0
- package/dist/toolProtocol.d.ts.map +1 -0
- package/dist/toolProtocol.js +80 -0
- package/dist/toolProtocol.js.map +1 -0
- package/dist/toolProtocolV2.d.ts +6 -0
- package/dist/toolProtocolV2.d.ts.map +1 -0
- package/dist/toolProtocolV2.js +330 -0
- package/dist/toolProtocolV2.js.map +1 -0
- package/dist/trust.d.ts +4 -0
- package/dist/trust.d.ts.map +1 -0
- package/dist/trust.js +32 -0
- package/dist/trust.js.map +1 -0
- package/dist/types.d.ts +399 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +11 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +102 -0
- package/dist/utils.js.map +1 -0
- package/package.json +47 -0
package/dist/policy.js
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { normalizeOrigin } from "./utils.js";
|
|
2
|
+
function mergeArrays(...groups) {
|
|
3
|
+
const merged = new Set();
|
|
4
|
+
for (const group of groups) {
|
|
5
|
+
for (const item of group ?? []) {
|
|
6
|
+
merged.add(item.toLowerCase());
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
return merged;
|
|
10
|
+
}
|
|
11
|
+
function mergeBooleans(layers, selector, fallback) {
|
|
12
|
+
let current = fallback;
|
|
13
|
+
for (const layer of layers) {
|
|
14
|
+
const value = selector(layer);
|
|
15
|
+
if (typeof value === "boolean") {
|
|
16
|
+
current = value;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return current;
|
|
20
|
+
}
|
|
21
|
+
export function compilePolicy(policyPack) {
|
|
22
|
+
const layers = [...policyPack.layers];
|
|
23
|
+
const readOnlyOrigins = new Set([...mergeArrays(...layers.map((layer) => layer.origins?.readOnlyAllow))].map((origin) => normalizeOrigin(origin)));
|
|
24
|
+
const writableOrigins = new Set([...mergeArrays(...layers.map((layer) => layer.origins?.writableAllow))].map((origin) => normalizeOrigin(origin)));
|
|
25
|
+
let memoryDurableWrites = "deny";
|
|
26
|
+
for (const layer of layers) {
|
|
27
|
+
if (layer.memory?.durableWrites) {
|
|
28
|
+
memoryDurableWrites = layer.memory.durableWrites;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let telemetrySampling = "adaptive";
|
|
32
|
+
for (const layer of layers) {
|
|
33
|
+
if (layer.telemetry?.sampling) {
|
|
34
|
+
telemetrySampling = layer.telemetry.sampling;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
packId: policyPack.packId,
|
|
39
|
+
profile: policyPack.profile,
|
|
40
|
+
version: policyPack.version,
|
|
41
|
+
layerOrder: layers.map((layer) => layer.name),
|
|
42
|
+
layerProvenance: layers.map((layer) => ({
|
|
43
|
+
name: layer.name,
|
|
44
|
+
version: layer.version,
|
|
45
|
+
profile: layer.profile
|
|
46
|
+
})),
|
|
47
|
+
readOnlyOrigins,
|
|
48
|
+
writableOrigins,
|
|
49
|
+
allowedActions: mergeArrays(...layers.map((layer) => layer.actions?.allow)),
|
|
50
|
+
approvalActions: mergeArrays(...layers.map((layer) => layer.actions?.requireApproval)),
|
|
51
|
+
deniedActions: mergeArrays(...layers.map((layer) => layer.actions?.deny)),
|
|
52
|
+
allowedMimeTypes: mergeArrays(...layers.map((layer) => layer.artifacts?.allowMimeTypes)),
|
|
53
|
+
protectedMemoryKeys: mergeArrays(...layers.map((layer) => layer.memory?.protectedKeys)),
|
|
54
|
+
memoryDurableWrites,
|
|
55
|
+
forbidTokenPassthrough: mergeBooleans(layers, (layer) => layer.toolProtocol?.forbidTokenPassthrough, true),
|
|
56
|
+
enforceExactRedirectUri: mergeBooleans(layers, (layer) => layer.toolProtocol?.enforceExactRedirectUri, true),
|
|
57
|
+
allowedRegistrySigners: mergeArrays(...layers.map((layer) => layer.toolProtocol?.allowedRegistrySigners)),
|
|
58
|
+
requireVerifiedRegistry: mergeBooleans(layers, (layer) => layer.toolProtocol?.requireVerifiedRegistry, true),
|
|
59
|
+
requireApprovalBinding: mergeBooleans(layers, (layer) => layer.toolProtocol?.requireApprovalBinding, true),
|
|
60
|
+
requireOauthStateBinding: mergeBooleans(layers, (layer) => layer.toolProtocol?.requireOauthStateBinding, true),
|
|
61
|
+
taintedConnectorFlowDecision: [...layers]
|
|
62
|
+
.reverse()
|
|
63
|
+
.find((layer) => layer.toolProtocol?.taintedConnectorFlowDecision)
|
|
64
|
+
?.toolProtocol?.taintedConnectorFlowDecision ?? "block",
|
|
65
|
+
allowLoopbackCallbacksInDev: mergeBooleans(layers, (layer) => layer.toolProtocol?.allowLoopbackCallbacksInDev, false),
|
|
66
|
+
enableDocumentHandoff: mergeBooleans(layers, (layer) => layer.artifacts?.enableDocumentHandoff, true),
|
|
67
|
+
quarantineOnHiddenTextMismatch: mergeBooleans(layers, (layer) => layer.artifacts?.quarantineOnHiddenTextMismatch, true),
|
|
68
|
+
replayBundle: mergeBooleans(layers, (layer) => layer.telemetry?.replayBundle, true),
|
|
69
|
+
redactSensitiveValues: mergeBooleans(layers, (layer) => layer.telemetry?.redactSensitiveValues, true),
|
|
70
|
+
telemetrySampling,
|
|
71
|
+
compiledAt: new Date().toISOString()
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ObservationEnvelope, PromptGuardResult, RuntimeContext } from "./types.js";
|
|
2
|
+
export declare function runPromptInjectionGuard(observation: ObservationEnvelope, context?: Pick<RuntimeContext, "knowledgeBase">): PromptGuardResult;
|
|
3
|
+
//# sourceMappingURL=promptInjection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptInjection.d.ts","sourceRoot":"","sources":["../src/promptInjection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA4BzF,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,mBAAmB,EAChC,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,GAC9C,iBAAiB,CAqDnB"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { clamp, uniq } from "./utils.js";
|
|
2
|
+
const DIRECT_OVERRIDE = /\b(ignore (?:(all|any|the)\s+)?(previous|prior)|disregard (?:(all|any|the)\s+)?(previous|prior)|system prompt|developer message|you are now|act as|override instructions)\b/i;
|
|
3
|
+
const PRIVILEGE_CLAIM = /\b(admin(istrator)?|root access|privileged role|security bypass|policy exception)\b/i;
|
|
4
|
+
const EXFILTRATION_CUE = /\b(exfiltrate|send (the|all) data|forward .*token|reveal secrets?|credential)\b/i;
|
|
5
|
+
const SOCIAL_ENGINEERING = /\b(urgent|immediately|secret|confidential|do not tell|silently|quietly)\b/i;
|
|
6
|
+
const TYPOGLYCEMIA = /\b(ignroe|prevouis|sysetm|developre|instrucitons|credentails)\b/i;
|
|
7
|
+
function matchKbFamily(patterns, familyHints) {
|
|
8
|
+
return patterns
|
|
9
|
+
.filter((pattern) => {
|
|
10
|
+
const family = String(pattern.family_key ?? "").toLowerCase();
|
|
11
|
+
const name = String(pattern.pattern_name ?? "").toLowerCase();
|
|
12
|
+
return familyHints.some((hint) => family.includes(hint) || name.includes(hint));
|
|
13
|
+
})
|
|
14
|
+
.slice(0, 8)
|
|
15
|
+
.map((pattern) => String(pattern.pattern_id ?? pattern.id ?? "unknown-pattern"));
|
|
16
|
+
}
|
|
17
|
+
export function runPromptInjectionGuard(observation, context) {
|
|
18
|
+
const suspicionFlags = [];
|
|
19
|
+
const familyHints = [];
|
|
20
|
+
let score = observation.suspicionFlags.length ? 0.15 : 0;
|
|
21
|
+
if (DIRECT_OVERRIDE.test(observation.normalizedText)) {
|
|
22
|
+
suspicionFlags.push("prompt_override_language");
|
|
23
|
+
familyHints.push("override");
|
|
24
|
+
score += 0.35;
|
|
25
|
+
}
|
|
26
|
+
if (PRIVILEGE_CLAIM.test(observation.normalizedText)) {
|
|
27
|
+
suspicionFlags.push("privilege_claim_language");
|
|
28
|
+
familyHints.push("role");
|
|
29
|
+
score += 0.2;
|
|
30
|
+
}
|
|
31
|
+
if (EXFILTRATION_CUE.test(observation.normalizedText)) {
|
|
32
|
+
suspicionFlags.push("exfiltration_cue");
|
|
33
|
+
familyHints.push("unsafe");
|
|
34
|
+
score += 0.25;
|
|
35
|
+
}
|
|
36
|
+
if (SOCIAL_ENGINEERING.test(observation.normalizedText)) {
|
|
37
|
+
suspicionFlags.push("social_engineering_pressure");
|
|
38
|
+
familyHints.push("social");
|
|
39
|
+
score += 0.15;
|
|
40
|
+
}
|
|
41
|
+
if (TYPOGLYCEMIA.test(observation.normalizedText)) {
|
|
42
|
+
suspicionFlags.push("obfuscated_typoglycemia");
|
|
43
|
+
familyHints.push("obfus");
|
|
44
|
+
score += 0.2;
|
|
45
|
+
}
|
|
46
|
+
if (observation.fragments.some((fragment) => fragment.visibilityClass !== "visible")) {
|
|
47
|
+
suspicionFlags.push("non_visible_instruction_channel");
|
|
48
|
+
familyHints.push("hidden");
|
|
49
|
+
score += 0.2;
|
|
50
|
+
}
|
|
51
|
+
const matchedPatternIds = matchKbFamily(context?.knowledgeBase?.promptInjectionPatterns ?? [], uniq(familyHints));
|
|
52
|
+
return {
|
|
53
|
+
suspicionFlags: uniq(suspicionFlags),
|
|
54
|
+
matchedPatternIds,
|
|
55
|
+
riskScore: clamp(score)
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=promptInjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptInjection.js","sourceRoot":"","sources":["../src/promptInjection.ts"],"names":[],"mappings":"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"}
|
package/dist/replay.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAOzF,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EAAE,EACrB,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,GACtC,YAAY,CAoCd"}
|
package/dist/replay.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { sha256Hex, stableStringify } from "./utils.js";
|
|
3
|
+
function isVerdictPayload(payload) {
|
|
4
|
+
return Boolean(payload && typeof payload === "object" && "decision" in payload);
|
|
5
|
+
}
|
|
6
|
+
export function buildReplayBundle(events, context) {
|
|
7
|
+
let blockingDecisions = 0;
|
|
8
|
+
let reviewDecisions = 0;
|
|
9
|
+
for (const event of events) {
|
|
10
|
+
if (isVerdictPayload(event.payload)) {
|
|
11
|
+
if (event.payload.decision === "BLOCK") {
|
|
12
|
+
blockingDecisions += 1;
|
|
13
|
+
}
|
|
14
|
+
if (event.payload.decision === "USER_CONFIRM" ||
|
|
15
|
+
event.payload.decision === "REPLAN_READ_ONLY" ||
|
|
16
|
+
event.payload.decision === "QUARANTINE_ARTIFACT") {
|
|
17
|
+
reviewDecisions += 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
bundleId: randomUUID(),
|
|
23
|
+
createdAt: new Date().toISOString(),
|
|
24
|
+
policyVersion: context.policy.version,
|
|
25
|
+
profile: context.policy.profile,
|
|
26
|
+
policyLayers: context.policy.layerProvenance,
|
|
27
|
+
eventDigests: events.map((event) => sha256Hex(stableStringify(event))),
|
|
28
|
+
events: events.map((event) => ({
|
|
29
|
+
...event,
|
|
30
|
+
timestamp: event.timestamp ?? new Date().toISOString()
|
|
31
|
+
})),
|
|
32
|
+
metrics: {
|
|
33
|
+
totalEvents: events.length,
|
|
34
|
+
blockingDecisions,
|
|
35
|
+
reviewDecisions
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../src/replay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAExD,SAAS,gBAAgB,CAAC,OAAgB;IACxC,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,UAAU,IAAI,OAAO,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,MAAqB,EACrB,OAAuC;IAEvC,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,eAAe,GAAG,CAAC,CAAC;IAExB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACvC,iBAAiB,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,IACE,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,cAAc;gBACzC,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,kBAAkB;gBAC7C,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,qBAAqB,EAChD,CAAC;gBACD,eAAe,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,UAAU,EAAE;QACtB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;QACrC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;QAC/B,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe;QAC5C,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC7B,GAAG,KAAK;YACR,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACvD,CAAC,CAAC;QACH,OAAO,EAAE;YACP,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,iBAAiB;YACjB,eAAe;SAChB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EAEnB,mBAAmB,EACnB,cAAc,EACf,MAAM,YAAY,CAAC;AAGpB,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,OAAO,CAAC,cAAc,CAAM,GACpC,mBAAmB,CAoDrB"}
|
package/dist/sanitize.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { runPromptInjectionGuard } from "./promptInjection.js";
|
|
3
|
+
import { normalizeTrustSignals } from "./trust.js";
|
|
4
|
+
import { normalizeText, sha256Hex, uniq } from "./utils.js";
|
|
5
|
+
export function sanitizeObservation(input, context = {}) {
|
|
6
|
+
const trustSignals = normalizeTrustSignals(input.trustSignals);
|
|
7
|
+
const fragments = input.fragments?.map((fragment) => ({
|
|
8
|
+
fragmentId: fragment.fragmentId ?? randomUUID(),
|
|
9
|
+
text: normalizeText(fragment.text),
|
|
10
|
+
visibilityClass: fragment.visibilityClass ?? trustSignals.visibilityClass,
|
|
11
|
+
medium: fragment.medium ?? "text",
|
|
12
|
+
sourceOrigin: fragment.sourceOrigin ?? trustSignals.sourceOrigin,
|
|
13
|
+
frameOrigin: fragment.frameOrigin ?? trustSignals.frameOrigin,
|
|
14
|
+
selector: fragment.selector,
|
|
15
|
+
tainted: fragment.tainted ?? trustSignals.taintClass !== "trusted"
|
|
16
|
+
})) ?? [];
|
|
17
|
+
const text = normalizeText(input.text ?? fragments.map((fragment) => fragment.text).join(" "));
|
|
18
|
+
const baseFlags = [
|
|
19
|
+
...fragments
|
|
20
|
+
.filter((fragment) => fragment.visibilityClass === "hidden")
|
|
21
|
+
.map(() => "hidden_fragment_present"),
|
|
22
|
+
...fragments
|
|
23
|
+
.filter((fragment) => fragment.visibilityClass === "metadata")
|
|
24
|
+
.map(() => "metadata_fragment_present")
|
|
25
|
+
];
|
|
26
|
+
const envelope = {
|
|
27
|
+
observationId: input.observationId ?? randomUUID(),
|
|
28
|
+
taskId: input.taskId,
|
|
29
|
+
sourceType: input.sourceType ?? "page",
|
|
30
|
+
text,
|
|
31
|
+
normalizedText: text.toLowerCase(),
|
|
32
|
+
fragments,
|
|
33
|
+
trustSignals,
|
|
34
|
+
suspicionFlags: uniq(baseFlags),
|
|
35
|
+
matchedPatternIds: [],
|
|
36
|
+
riskScore: 0,
|
|
37
|
+
rawHash: input.rawHash ?? sha256Hex(text),
|
|
38
|
+
createdAt: (context.now?.() ?? new Date()).toISOString()
|
|
39
|
+
};
|
|
40
|
+
const promptGuard = runPromptInjectionGuard(envelope, {
|
|
41
|
+
knowledgeBase: context.knowledgeBase
|
|
42
|
+
});
|
|
43
|
+
return {
|
|
44
|
+
...envelope,
|
|
45
|
+
suspicionFlags: uniq([...envelope.suspicionFlags, ...promptGuard.suspicionFlags]),
|
|
46
|
+
matchedPatternIds: promptGuard.matchedPatternIds,
|
|
47
|
+
riskScore: promptGuard.riskScore
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=sanitize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAOnD,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CACjC,KAA0B,EAC1B,UAAmC,EAAE;IAErC,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC/D,MAAM,SAAS,GACb,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,UAAU,EAAE;QAC/C,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,eAAe,EAAE,QAAQ,CAAC,eAAe,IAAI,YAAY,CAAC,eAAe;QACzE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,MAAM;QACjC,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,YAAY,CAAC,YAAY;QAChE,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,YAAY,CAAC,WAAW;QAC7D,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,YAAY,CAAC,UAAU,KAAK,SAAS;KACnE,CAAC,CAAC,IAAI,EAAE,CAAC;IAEZ,MAAM,IAAI,GAAG,aAAa,CACxB,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CACnE,CAAC;IAEF,MAAM,SAAS,GAAG;QAChB,GAAG,SAAS;aACT,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,KAAK,QAAQ,CAAC;aAC3D,GAAG,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC;QACvC,GAAG,SAAS;aACT,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,eAAe,KAAK,UAAU,CAAC;aAC7D,GAAG,CAAC,GAAG,EAAE,CAAC,2BAA2B,CAAC;KAC1C,CAAC;IAEF,MAAM,QAAQ,GAAwB;QACpC,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,UAAU,EAAE;QAClD,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,MAAM;QACtC,IAAI;QACJ,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE;QAClC,SAAS;QACT,YAAY;QACZ,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC;QAC/B,iBAAiB,EAAE,EAAE;QACrB,SAAS,EAAE,CAAC;QACZ,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC;QACzC,SAAS,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE;KACzD,CAAC;IAEF,MAAM,WAAW,GAAG,uBAAuB,CAAC,QAAQ,EAAE;QACpD,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAC;IAEH,OAAO;QACL,GAAG,QAAQ;QACX,cAAc,EAAE,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,EAAE,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;QACjF,iBAAiB,EAAE,WAAW,CAAC,iBAAiB;QAChD,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolProtocol.d.ts","sourceRoot":"","sources":["../src/toolProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2B3E,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,cAAc,GACtB,WAAW,CA+Eb"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { normalizeTrustSignals } from "./trust.js";
|
|
2
|
+
import { clamp, isPrivateHost, uniq } from "./utils.js";
|
|
3
|
+
const MALICIOUS_TOOL_TEXT = /\b(ignore previous|system prompt|override|send token|reveal secrets?|exfiltrate)\b/i;
|
|
4
|
+
function matchToolPatterns(reasons, patterns) {
|
|
5
|
+
const hints = reasons.join(" ").toLowerCase();
|
|
6
|
+
return patterns
|
|
7
|
+
.filter((pattern) => {
|
|
8
|
+
const family = String(pattern.family_key ?? "").toLowerCase();
|
|
9
|
+
const name = String(pattern.pattern_name ?? "").toLowerCase();
|
|
10
|
+
return ((hints.includes("manifest") && family.includes("description")) ||
|
|
11
|
+
(hints.includes("redirect") && name.includes("redirect")) ||
|
|
12
|
+
(hints.includes("token") && name.includes("token")) ||
|
|
13
|
+
(hints.includes("ssrf") && family.includes("ssrf")));
|
|
14
|
+
})
|
|
15
|
+
.slice(0, 8)
|
|
16
|
+
.map((pattern) => String(pattern.pattern_id ?? "unknown-tool-pattern"));
|
|
17
|
+
}
|
|
18
|
+
export function evaluateToolRequest(request, context) {
|
|
19
|
+
normalizeTrustSignals({
|
|
20
|
+
artifactKind: "tool_manifest",
|
|
21
|
+
extractionMethod: "api",
|
|
22
|
+
...(request.trustSignals ?? {})
|
|
23
|
+
});
|
|
24
|
+
const reasonCodes = [];
|
|
25
|
+
let decision = "ALLOW";
|
|
26
|
+
let riskScore = 0.25;
|
|
27
|
+
const descriptions = [request.description, ...(request.schemaDescriptions ?? [])];
|
|
28
|
+
if (descriptions.some((value) => MALICIOUS_TOOL_TEXT.test(value))) {
|
|
29
|
+
decision = "BLOCK";
|
|
30
|
+
reasonCodes.push("MALICIOUS_TOOL_MANIFEST");
|
|
31
|
+
riskScore = 0.95;
|
|
32
|
+
}
|
|
33
|
+
if (context.policy.forbidTokenPassthrough && request.tokenPassthroughRequested) {
|
|
34
|
+
decision = "BLOCK";
|
|
35
|
+
reasonCodes.push("TOKEN_PASSTHROUGH_FORBIDDEN");
|
|
36
|
+
riskScore = 0.95;
|
|
37
|
+
}
|
|
38
|
+
if (context.policy.enforceExactRedirectUri &&
|
|
39
|
+
request.authType === "oauth" &&
|
|
40
|
+
request.requestedRedirectUri &&
|
|
41
|
+
request.allowedRedirectUris?.length &&
|
|
42
|
+
!request.allowedRedirectUris.includes(request.requestedRedirectUri)) {
|
|
43
|
+
decision = "BLOCK";
|
|
44
|
+
reasonCodes.push("REDIRECT_URI_MISMATCH");
|
|
45
|
+
riskScore = 0.9;
|
|
46
|
+
}
|
|
47
|
+
if (request.egressHosts?.some((host) => isPrivateHost(host)) &&
|
|
48
|
+
!request.allowLocalhostEgress) {
|
|
49
|
+
decision = "BLOCK";
|
|
50
|
+
reasonCodes.push("SSRF_EGRESS_DENIED");
|
|
51
|
+
riskScore = 0.95;
|
|
52
|
+
}
|
|
53
|
+
if (request.registrySigned === false) {
|
|
54
|
+
decision = decision === "ALLOW" ? "USER_CONFIRM" : decision;
|
|
55
|
+
reasonCodes.push("UNSIGNED_TOOL_REGISTRY_ENTRY");
|
|
56
|
+
riskScore = Math.max(riskScore, 0.55);
|
|
57
|
+
}
|
|
58
|
+
if (request.registrySigner &&
|
|
59
|
+
context.policy.allowedRegistrySigners.size &&
|
|
60
|
+
!context.policy.allowedRegistrySigners.has(request.registrySigner.toLowerCase())) {
|
|
61
|
+
decision = "USER_CONFIRM";
|
|
62
|
+
reasonCodes.push("REGISTRY_SIGNER_NOT_ALLOWLISTED");
|
|
63
|
+
riskScore = Math.max(riskScore, 0.65);
|
|
64
|
+
}
|
|
65
|
+
const matchedPatternIds = matchToolPatterns(reasonCodes, context.knowledgeBase?.toolProtocolPatterns ?? []);
|
|
66
|
+
return {
|
|
67
|
+
decision,
|
|
68
|
+
reasonCodes: uniq(reasonCodes),
|
|
69
|
+
riskScore: clamp(riskScore),
|
|
70
|
+
safeConstraints: {
|
|
71
|
+
exact_redirect_uri: context.policy.enforceExactRedirectUri,
|
|
72
|
+
token_passthrough_allowed: !context.policy.forbidTokenPassthrough,
|
|
73
|
+
allowed_registry_signers: [...context.policy.allowedRegistrySigners]
|
|
74
|
+
},
|
|
75
|
+
matchedPatternIds,
|
|
76
|
+
incidentPlaybookId: decision === "BLOCK" ? "IR-04" : undefined,
|
|
77
|
+
telemetryTags: uniq([request.toolId, decision.toLowerCase()])
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=toolProtocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolProtocol.js","sourceRoot":"","sources":["../src/toolProtocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { RuntimeContext, ToolCallbackVerificationRequest, ToolCallbackVerificationResult, ToolOnboardingSession, ToolPreparationResult, ToolRequest } from "./types.js";
|
|
2
|
+
export declare function computeToolManifestHash(request: Pick<ToolRequest, "toolId" | "description" | "authType" | "requestedScopes" | "callbackUri" | "requestedRedirectUri">): string;
|
|
3
|
+
export declare function computeToolSchemaHash(schemaDescriptions?: string[]): string;
|
|
4
|
+
export declare function prepareToolOnboarding(request: ToolRequest, context: RuntimeContext): ToolPreparationResult;
|
|
5
|
+
export declare function verifyToolCallback(request: ToolCallbackVerificationRequest, session: ToolOnboardingSession | undefined, context: RuntimeContext): ToolCallbackVerificationResult;
|
|
6
|
+
//# sourceMappingURL=toolProtocolV2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolProtocolV2.d.ts","sourceRoot":"","sources":["../src/toolProtocolV2.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,cAAc,EAEd,+BAA+B,EAC/B,8BAA8B,EAC9B,qBAAqB,EACrB,qBAAqB,EACrB,WAAW,EAGZ,MAAM,YAAY,CAAC;AAgCpB,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,IAAI,CACnD,WAAW,EACX,QAAQ,GAAG,aAAa,GAAG,UAAU,GAAG,iBAAiB,GAAG,aAAa,GAAG,sBAAsB,CACnG,GAAG,MAAM,CAUT;AAED,wBAAgB,qBAAqB,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAE3E;AA+HD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,cAAc,GACtB,qBAAqB,CA6KvB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,+BAA+B,EACxC,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,OAAO,EAAE,cAAc,GACtB,8BAA8B,CAoEhC"}
|