@mneme-ai/core 2.70.0 → 2.72.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/protoplasm/super_quan/cull.d.ts +70 -0
- package/dist/protoplasm/super_quan/cull.d.ts.map +1 -0
- package/dist/protoplasm/super_quan/cull.js +218 -0
- package/dist/protoplasm/super_quan/cull.js.map +1 -0
- package/dist/protoplasm/super_quan/guards.test.d.ts +7 -0
- package/dist/protoplasm/super_quan/guards.test.d.ts.map +1 -0
- package/dist/protoplasm/super_quan/guards.test.js +142 -0
- package/dist/protoplasm/super_quan/guards.test.js.map +1 -0
- package/dist/protoplasm/super_quan/homograph_guard.d.ts +47 -0
- package/dist/protoplasm/super_quan/homograph_guard.d.ts.map +1 -0
- package/dist/protoplasm/super_quan/homograph_guard.js +210 -0
- package/dist/protoplasm/super_quan/homograph_guard.js.map +1 -0
- package/dist/protoplasm/super_quan/index.d.ts +10 -0
- package/dist/protoplasm/super_quan/index.d.ts.map +1 -1
- package/dist/protoplasm/super_quan/index.js +10 -0
- package/dist/protoplasm/super_quan/index.js.map +1 -1
- package/dist/protoplasm/super_quan/input_size_guard.d.ts +58 -0
- package/dist/protoplasm/super_quan/input_size_guard.d.ts.map +1 -0
- package/dist/protoplasm/super_quan/input_size_guard.js +102 -0
- package/dist/protoplasm/super_quan/input_size_guard.js.map +1 -0
- package/dist/protoplasm/super_quan/prism.d.ts +50 -0
- package/dist/protoplasm/super_quan/prism.d.ts.map +1 -0
- package/dist/protoplasm/super_quan/prism.js +231 -0
- package/dist/protoplasm/super_quan/prism.js.map +1 -0
- package/dist/protoplasm/super_quan/tide_guard.d.ts +71 -0
- package/dist/protoplasm/super_quan/tide_guard.d.ts.map +1 -0
- package/dist/protoplasm/super_quan/tide_guard.js +135 -0
- package/dist/protoplasm/super_quan/tide_guard.js.map +1 -0
- package/dist/protoplasm/super_quan/vulns2.test.d.ts +6 -0
- package/dist/protoplasm/super_quan/vulns2.test.d.ts.map +1 -0
- package/dist/protoplasm/super_quan/vulns2.test.js +164 -0
- package/dist/protoplasm/super_quan/vulns2.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🛡 HOMOGRAPH GUARD — Unicode normalization + confusable detection
|
|
3
|
+
*
|
|
4
|
+
* Closes the v2.70 vuln: "٢.70.0" (Arabic-Indic digit) passed as MIXED
|
|
5
|
+
* instead of REFUTED → attacker bypassed version check by spelling the
|
|
6
|
+
* digit in a non-ASCII script.
|
|
7
|
+
*
|
|
8
|
+
* Solution stacks 4 lenses:
|
|
9
|
+
* 1. NFKC normalize → canonicalizes compatibility forms
|
|
10
|
+
* 2. Digit transliterate → maps all Unicode digits → ASCII 0-9
|
|
11
|
+
* 3. Confusable scan → flags homoglyph attempts (UTS #39 subset)
|
|
12
|
+
* 4. Pipeline annotation → caller knows input was canonicalized
|
|
13
|
+
*
|
|
14
|
+
* API:
|
|
15
|
+
* canonicalize(input) → { canonical, original, flags, transformations }
|
|
16
|
+
*
|
|
17
|
+
* Output flags drive verdict:
|
|
18
|
+
* "homograph_detected" → version claim has non-ASCII digits
|
|
19
|
+
* "mixed_script" → claim mixes script families (suspicious)
|
|
20
|
+
* "rtl_override" → contains BIDI override (U+202E)
|
|
21
|
+
* "control_char_injected" → contains null / BEL / BS / etc.
|
|
22
|
+
* "zwsp_injected" → zero-width space / joiner
|
|
23
|
+
*
|
|
24
|
+
* No external Unicode tables — uses Node's built-in normalize() + a
|
|
25
|
+
* small curated confusable map.
|
|
26
|
+
*/
|
|
27
|
+
/** Per UTS #39 — common confusables. Extend over time. */
|
|
28
|
+
const CONFUSABLE_MAP = {
|
|
29
|
+
// Cyrillic → Latin (most common attack vector)
|
|
30
|
+
"а": "a", "е": "e", "о": "o", "р": "p", "с": "c", "у": "y", "х": "x",
|
|
31
|
+
"А": "A", "В": "B", "Е": "E", "К": "K", "М": "M", "Н": "H", "О": "O",
|
|
32
|
+
"Р": "P", "С": "C", "Т": "T", "У": "Y", "Х": "X",
|
|
33
|
+
// Greek → Latin
|
|
34
|
+
"α": "a", "β": "b", "ο": "o", "ρ": "p", "ν": "v", "Α": "A", "Β": "B",
|
|
35
|
+
// Cherokee letter A (very deceptive)
|
|
36
|
+
"Ꭺ": "A",
|
|
37
|
+
// Math alphanumerics
|
|
38
|
+
"𝟎": "0", "𝟏": "1", "𝟐": "2", "𝟑": "3", "𝟒": "4",
|
|
39
|
+
"𝟓": "5", "𝟔": "6", "𝟕": "7", "𝟖": "8", "𝟗": "9",
|
|
40
|
+
};
|
|
41
|
+
/** Map ALL Unicode digit code points to ASCII via Unicode digit value. */
|
|
42
|
+
function transliterateDigits(s) {
|
|
43
|
+
let changed = 0;
|
|
44
|
+
const out = Array.from(s, (ch) => {
|
|
45
|
+
const cp = ch.codePointAt(0);
|
|
46
|
+
// Latin ASCII already
|
|
47
|
+
if (cp >= 0x30 && cp <= 0x39)
|
|
48
|
+
return ch;
|
|
49
|
+
// Arabic-Indic 0660-0669
|
|
50
|
+
if (cp >= 0x0660 && cp <= 0x0669) {
|
|
51
|
+
changed++;
|
|
52
|
+
return String.fromCharCode(0x30 + (cp - 0x0660));
|
|
53
|
+
}
|
|
54
|
+
// Extended Arabic-Indic 06F0-06F9
|
|
55
|
+
if (cp >= 0x06F0 && cp <= 0x06F9) {
|
|
56
|
+
changed++;
|
|
57
|
+
return String.fromCharCode(0x30 + (cp - 0x06F0));
|
|
58
|
+
}
|
|
59
|
+
// Bengali 09E6-09EF
|
|
60
|
+
if (cp >= 0x09E6 && cp <= 0x09EF) {
|
|
61
|
+
changed++;
|
|
62
|
+
return String.fromCharCode(0x30 + (cp - 0x09E6));
|
|
63
|
+
}
|
|
64
|
+
// Devanagari 0966-096F
|
|
65
|
+
if (cp >= 0x0966 && cp <= 0x096F) {
|
|
66
|
+
changed++;
|
|
67
|
+
return String.fromCharCode(0x30 + (cp - 0x0966));
|
|
68
|
+
}
|
|
69
|
+
// Thai 0E50-0E59
|
|
70
|
+
if (cp >= 0x0E50 && cp <= 0x0E59) {
|
|
71
|
+
changed++;
|
|
72
|
+
return String.fromCharCode(0x30 + (cp - 0x0E50));
|
|
73
|
+
}
|
|
74
|
+
// Lao 0ED0-0ED9
|
|
75
|
+
if (cp >= 0x0ED0 && cp <= 0x0ED9) {
|
|
76
|
+
changed++;
|
|
77
|
+
return String.fromCharCode(0x30 + (cp - 0x0ED0));
|
|
78
|
+
}
|
|
79
|
+
// Burmese 1040-1049
|
|
80
|
+
if (cp >= 0x1040 && cp <= 0x1049) {
|
|
81
|
+
changed++;
|
|
82
|
+
return String.fromCharCode(0x30 + (cp - 0x1040));
|
|
83
|
+
}
|
|
84
|
+
// Khmer 17E0-17E9
|
|
85
|
+
if (cp >= 0x17E0 && cp <= 0x17E9) {
|
|
86
|
+
changed++;
|
|
87
|
+
return String.fromCharCode(0x30 + (cp - 0x17E0));
|
|
88
|
+
}
|
|
89
|
+
// Fullwidth FF10-FF19
|
|
90
|
+
if (cp >= 0xFF10 && cp <= 0xFF19) {
|
|
91
|
+
changed++;
|
|
92
|
+
return String.fromCharCode(0x30 + (cp - 0xFF10));
|
|
93
|
+
}
|
|
94
|
+
// Mathematical bold/italic digits 1D7CE-1D7FF
|
|
95
|
+
if (cp >= 0x1D7CE && cp <= 0x1D7FF) {
|
|
96
|
+
changed++;
|
|
97
|
+
return String.fromCharCode(0x30 + ((cp - 0x1D7CE) % 10));
|
|
98
|
+
}
|
|
99
|
+
return ch;
|
|
100
|
+
}).join("");
|
|
101
|
+
return { out, changedCount: changed };
|
|
102
|
+
}
|
|
103
|
+
function detectScripts(s) {
|
|
104
|
+
const scripts = new Set();
|
|
105
|
+
for (const ch of s) {
|
|
106
|
+
const cp = ch.codePointAt(0);
|
|
107
|
+
if (cp >= 0x0041 && cp <= 0x024F)
|
|
108
|
+
scripts.add("Latin");
|
|
109
|
+
else if (cp >= 0x0400 && cp <= 0x04FF)
|
|
110
|
+
scripts.add("Cyrillic");
|
|
111
|
+
else if (cp >= 0x0370 && cp <= 0x03FF)
|
|
112
|
+
scripts.add("Greek");
|
|
113
|
+
else if (cp >= 0x0590 && cp <= 0x05FF)
|
|
114
|
+
scripts.add("Hebrew");
|
|
115
|
+
else if (cp >= 0x0600 && cp <= 0x06FF)
|
|
116
|
+
scripts.add("Arabic");
|
|
117
|
+
else if (cp >= 0x0E00 && cp <= 0x0E7F)
|
|
118
|
+
scripts.add("Thai");
|
|
119
|
+
else if (cp >= 0x0900 && cp <= 0x097F)
|
|
120
|
+
scripts.add("Devanagari");
|
|
121
|
+
else if (cp >= 0x4E00 && cp <= 0x9FFF)
|
|
122
|
+
scripts.add("CJK");
|
|
123
|
+
}
|
|
124
|
+
return scripts;
|
|
125
|
+
}
|
|
126
|
+
const RTL_OVERRIDE_RE = /[--]/g;
|
|
127
|
+
const ZWSP_RE = /[-]/g;
|
|
128
|
+
const CONTROL_RE = /[\x00-\x08\x0B-\x0C\x0E-\x1F]/g;
|
|
129
|
+
const NON_ASCII_DIGIT_RE = /[٠-٩۰-۹߀-߉०-९০-৯੦-੯૦-૯୦-୯௦-௯౦-౯೦-೯൦-൯෦-෯๐-๙໐-໙༠-༩၀-၉႐-႙០-៩᠐-᠙᥆-᥏᧐-᧙᪀-᪉᪐-᪙᭐-᭙᮰-᮹᱀-᱉᱐-᱙꘠-꘩꣐-꣙꤀-꤉꧐-꧙꧰-꧹꩐-꩙꯰-꯹0-9]/g;
|
|
130
|
+
export function canonicalize(input) {
|
|
131
|
+
const flags = [];
|
|
132
|
+
const transformations = [];
|
|
133
|
+
let working = input;
|
|
134
|
+
// Pre-detect: did the input contain ANY non-ASCII Unicode digit?
|
|
135
|
+
// (Catches fullwidth 2 which NFKC normalizes BEFORE our transliterator runs.)
|
|
136
|
+
const preNonAsciiDigitMatches = input.match(NON_ASCII_DIGIT_RE);
|
|
137
|
+
const preNonAsciiDigitCount = preNonAsciiDigitMatches ? preNonAsciiDigitMatches.length : 0;
|
|
138
|
+
// Stage 0: detect control chars BEFORE stripping (alert + strip)
|
|
139
|
+
if (CONTROL_RE.test(working)) {
|
|
140
|
+
flags.push("control_char_injected");
|
|
141
|
+
working = working.replace(CONTROL_RE, "");
|
|
142
|
+
transformations.push("stripped control chars (0x00-0x1F except tab/LF/CR)");
|
|
143
|
+
}
|
|
144
|
+
if (RTL_OVERRIDE_RE.test(working)) {
|
|
145
|
+
flags.push("rtl_override");
|
|
146
|
+
working = working.replace(RTL_OVERRIDE_RE, "");
|
|
147
|
+
transformations.push("stripped BIDI override (U+202A-202E + 2066-2069)");
|
|
148
|
+
}
|
|
149
|
+
if (ZWSP_RE.test(working)) {
|
|
150
|
+
flags.push("zwsp_injected");
|
|
151
|
+
working = working.replace(ZWSP_RE, "");
|
|
152
|
+
transformations.push("stripped zero-width chars (U+200B-200D + FEFF)");
|
|
153
|
+
}
|
|
154
|
+
// Stage 1: NFKC — canonicalize compatibility forms
|
|
155
|
+
const beforeNfkc = working;
|
|
156
|
+
working = working.normalize("NFKC");
|
|
157
|
+
if (beforeNfkc !== working) {
|
|
158
|
+
transformations.push("NFKC normalize");
|
|
159
|
+
}
|
|
160
|
+
// Stage 2: Digit transliteration (Arabic-Indic / Bengali / Thai / fullwidth / math)
|
|
161
|
+
const dt = transliterateDigits(working);
|
|
162
|
+
working = dt.out;
|
|
163
|
+
// Count: explicit transliteration + NFKC-induced non-ASCII digit changes
|
|
164
|
+
const totalDigitsChanged = dt.changedCount + Math.max(0, preNonAsciiDigitCount - dt.changedCount);
|
|
165
|
+
if (totalDigitsChanged > 0) {
|
|
166
|
+
flags.push("homograph_detected");
|
|
167
|
+
transformations.push(`transliterated ${totalDigitsChanged} non-Latin digit(s) to ASCII (NFKC + direct map)`);
|
|
168
|
+
}
|
|
169
|
+
// Stage 3: Confusable letter replacement
|
|
170
|
+
let confusables = 0;
|
|
171
|
+
working = Array.from(working, (ch) => {
|
|
172
|
+
if (CONFUSABLE_MAP[ch] !== undefined) {
|
|
173
|
+
confusables++;
|
|
174
|
+
return CONFUSABLE_MAP[ch];
|
|
175
|
+
}
|
|
176
|
+
return ch;
|
|
177
|
+
}).join("");
|
|
178
|
+
if (confusables > 0) {
|
|
179
|
+
flags.push("homograph_detected");
|
|
180
|
+
transformations.push(`replaced ${confusables} confusable letter(s) with ASCII equivalent`);
|
|
181
|
+
}
|
|
182
|
+
// Stage 4: mixed-script detection (only flag if NOT already Latin-only after canonicalization)
|
|
183
|
+
const scripts = detectScripts(working);
|
|
184
|
+
if (scripts.size > 1 && scripts.has("Latin")) {
|
|
185
|
+
flags.push("mixed_script");
|
|
186
|
+
transformations.push(`mixed scripts detected: ${[...scripts].join("+")}`);
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
original: input,
|
|
190
|
+
canonical: working,
|
|
191
|
+
flags: [...new Set(flags)],
|
|
192
|
+
transformations,
|
|
193
|
+
confusablesReplaced: confusables,
|
|
194
|
+
digitsTransliterated: totalDigitsChanged,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Convenience: given a claim, return whether it's safe to verify as-is
|
|
199
|
+
* or needs caller to re-verify on the canonical form.
|
|
200
|
+
*
|
|
201
|
+
* Caller should:
|
|
202
|
+
* const c = canonicalize(input);
|
|
203
|
+
* if (c.flags.includes("homograph_detected")) {
|
|
204
|
+
* // verify on c.canonical instead — annotate verdict with c.flags
|
|
205
|
+
* }
|
|
206
|
+
*/
|
|
207
|
+
export function shouldReVerify(result) {
|
|
208
|
+
return result.flags.length > 0 && result.original !== result.canonical;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=homograph_guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"homograph_guard.js","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/homograph_guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,4 +17,14 @@ export { computeChshWitness, defaultScoreExtractor, instantiateProbes, probeSeed
|
|
|
17
17
|
export type { ProbeKind, ProbeQuestion, ProbeResponse, ChshWitnessVerdict, ChshInput, } from "./chsh_witness.js";
|
|
18
18
|
export { runStrs, strsBadgeUrl, STRS_PROBE_SET_V1 } from "./strs.js";
|
|
19
19
|
export type { StrsProbe, StrsRunResult, StrsReport, StrsRunOptions, VerifyFn } from "./strs.js";
|
|
20
|
+
export { canonicalize, shouldReVerify } from "./homograph_guard.js";
|
|
21
|
+
export type { CanonicalizeResult } from "./homograph_guard.js";
|
|
22
|
+
export { checkInputSize, emitEnvelope, detectInputSource } from "./input_size_guard.js";
|
|
23
|
+
export type { SizeCheckResult, InputSource, CheckInputSizeOptions } from "./input_size_guard.js";
|
|
24
|
+
export { runPrism, lensFakeAuthority, lensFakeCommit, lensStatisticalReality, lensMagicNumber, lensNullInformation, } from "./prism.js";
|
|
25
|
+
export type { PrismResult, PrismVerdict, LensResult, FakeCommitOptions } from "./prism.js";
|
|
26
|
+
export { TideGuard, DEFAULT_TIDE } from "./tide_guard.js";
|
|
27
|
+
export type { TideGuardConfig, TideRequest, TideDecision } from "./tide_guard.js";
|
|
28
|
+
export { Cull, DEFAULT_CULL } from "./cull.js";
|
|
29
|
+
export type { CullConfig, CullHeartbeat, CullReport, CullPolicy } from "./cull.js";
|
|
20
30
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,kBAAkB,EAAE,cAAc,EAAE,cAAc,GACnD,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,kBAAkB,EAAE,cAAc,EAAE,UAAU,GAC/C,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGnF,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAC5D,SAAS,EAAE,gBAAgB,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,SAAS,GACvE,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EACL,kBAAkB,EAAE,cAAc,EAAE,cAAc,GACnD,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,kBAAkB,EAAE,cAAc,EAAE,UAAU,GAC/C,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGnF,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAC5D,SAAS,EAAE,gBAAgB,GAC5B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,kBAAkB,EAAE,SAAS,GACvE,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AACrE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGhG,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG/D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAGjG,OAAO,EACL,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EACnE,eAAe,EAAE,mBAAmB,GACrC,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG3F,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGlF,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -17,4 +17,14 @@ export { Negspace } from "./negspace.js";
|
|
|
17
17
|
export { computeChshWitness, defaultScoreExtractor, instantiateProbes, probeSeed, CANONICAL_PROBES, } from "./chsh_witness.js";
|
|
18
18
|
// 4. STRS
|
|
19
19
|
export { runStrs, strsBadgeUrl, STRS_PROBE_SET_V1 } from "./strs.js";
|
|
20
|
+
// 5. HOMOGRAPH GUARD — closes v2.70 vuln #1 (Unicode bypass)
|
|
21
|
+
export { canonicalize, shouldReVerify } from "./homograph_guard.js";
|
|
22
|
+
// 6. INPUT SIZE GUARD — closes v2.70 vuln #2 (silent 28K reject)
|
|
23
|
+
export { checkInputSize, emitEnvelope, detectInputSource } from "./input_size_guard.js";
|
|
24
|
+
// 7. PRISM — closes v2.70 vuln #3 (multi-lens scope narrow → 86% claims got 0 lenses)
|
|
25
|
+
export { runPrism, lensFakeAuthority, lensFakeCommit, lensStatisticalReality, lensMagicNumber, lensNullInformation, } from "./prism.js";
|
|
26
|
+
// 8. TIDE GUARD — closes v2.70 vuln #1 (rate limit removed regression)
|
|
27
|
+
export { TideGuard, DEFAULT_TIDE } from "./tide_guard.js";
|
|
28
|
+
// 9. CULL — closes v2.70 vuln #4 (process leak — 6 procs per session)
|
|
29
|
+
export { Cull, DEFAULT_CULL } from "./cull.js";
|
|
20
30
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,iBAAiB;AACjB,OAAO,EACL,kBAAkB,EAAE,cAAc,EAAE,cAAc,GACnD,MAAM,kBAAkB,CAAC;AAK1B,cAAc;AACd,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAC5D,SAAS,EAAE,gBAAgB,GAC5B,MAAM,mBAAmB,CAAC;AAK3B,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,iBAAiB;AACjB,OAAO,EACL,kBAAkB,EAAE,cAAc,EAAE,cAAc,GACnD,MAAM,kBAAkB,CAAC;AAK1B,cAAc;AACd,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAGzC,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAAE,qBAAqB,EAAE,iBAAiB,EAC5D,SAAS,EAAE,gBAAgB,GAC5B,MAAM,mBAAmB,CAAC;AAK3B,UAAU;AACV,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAGrE,6DAA6D;AAC7D,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGpE,iEAAiE;AACjE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGxF,sFAAsF;AACtF,OAAO,EACL,QAAQ,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EACnE,eAAe,EAAE,mBAAmB,GACrC,MAAM,YAAY,CAAC;AAGpB,uEAAuE;AACvE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG1D,sEAAsE;AACtE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🛡 INPUT SIZE GUARD — fail-loud envelope + truncation receipt
|
|
3
|
+
*
|
|
4
|
+
* Closes the v2.70 vuln: 28K char input → exit 1, 0 bytes, no warning.
|
|
5
|
+
*
|
|
6
|
+
* Strategy stacks 3 lenses:
|
|
7
|
+
* 1. Fail-loud: never silent. Every reject emits JSON envelope.
|
|
8
|
+
* 2. Truncation receipt: when allowTruncate=true, accept first N + flag
|
|
9
|
+
* "INPUT_TRUNCATED" so verdict consumer sees the caveat.
|
|
10
|
+
* 3. Auto-detect: if input came via argv and is too large, suggest stdin.
|
|
11
|
+
*
|
|
12
|
+
* Cross-platform argv limits (real-world safe values):
|
|
13
|
+
* Windows cmd.exe : ~8K (legacy)
|
|
14
|
+
* Windows powershell: ~32K (varies)
|
|
15
|
+
* Linux execve() : ~128K-2M
|
|
16
|
+
* macOS execve() : ~256K
|
|
17
|
+
*
|
|
18
|
+
* Hard limit chosen: 24K = safely below Windows cmd while still allowing
|
|
19
|
+
* substantial claims. For larger input, pipe via stdin.
|
|
20
|
+
*/
|
|
21
|
+
export type InputSource = "argv" | "stdin" | "file" | "unknown";
|
|
22
|
+
export interface SizeCheckResult {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
inputSize: number;
|
|
25
|
+
limit: number;
|
|
26
|
+
source: InputSource;
|
|
27
|
+
truncated: boolean;
|
|
28
|
+
truncatedAt?: number;
|
|
29
|
+
receipt: string;
|
|
30
|
+
reason?: string;
|
|
31
|
+
suggestion?: string;
|
|
32
|
+
envelope: {
|
|
33
|
+
ok: boolean;
|
|
34
|
+
error?: string;
|
|
35
|
+
sizeReceived: number;
|
|
36
|
+
sizeLimit: number;
|
|
37
|
+
source: InputSource;
|
|
38
|
+
hint?: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export interface CheckInputSizeOptions {
|
|
42
|
+
source: InputSource;
|
|
43
|
+
allowTruncate?: boolean;
|
|
44
|
+
customLimit?: number;
|
|
45
|
+
}
|
|
46
|
+
export declare function checkInputSize(input: string, opts: CheckInputSizeOptions): SizeCheckResult;
|
|
47
|
+
/**
|
|
48
|
+
* Emit JSON envelope to stdout. Caller in CLI should call this on EVERY
|
|
49
|
+
* exit path so the user never gets silent 0-byte exit.
|
|
50
|
+
*
|
|
51
|
+
* Returns suggested process exit code:
|
|
52
|
+
* 0 if ok
|
|
53
|
+
* 2 if input rejected (distinct from generic crash exit 1)
|
|
54
|
+
*/
|
|
55
|
+
export declare function emitEnvelope(result: SizeCheckResult, write?: (s: string) => void): number;
|
|
56
|
+
/** Detect input source heuristically from argv/stdin state. */
|
|
57
|
+
export declare function detectInputSource(): InputSource;
|
|
58
|
+
//# sourceMappingURL=input_size_guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input_size_guard.d.ts","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/input_size_guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAEhE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE;QACR,EAAE,EAAE,OAAO,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,EAAE,MAAM,CAAC;QACrB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,WAAW,CAAC;QACpB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AASD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAWD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,eAAe,CAkD1F;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAqC,GAAG,MAAM,CAGzH;AAED,+DAA+D;AAC/D,wBAAgB,iBAAiB,IAAI,WAAW,CAI/C"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🛡 INPUT SIZE GUARD — fail-loud envelope + truncation receipt
|
|
3
|
+
*
|
|
4
|
+
* Closes the v2.70 vuln: 28K char input → exit 1, 0 bytes, no warning.
|
|
5
|
+
*
|
|
6
|
+
* Strategy stacks 3 lenses:
|
|
7
|
+
* 1. Fail-loud: never silent. Every reject emits JSON envelope.
|
|
8
|
+
* 2. Truncation receipt: when allowTruncate=true, accept first N + flag
|
|
9
|
+
* "INPUT_TRUNCATED" so verdict consumer sees the caveat.
|
|
10
|
+
* 3. Auto-detect: if input came via argv and is too large, suggest stdin.
|
|
11
|
+
*
|
|
12
|
+
* Cross-platform argv limits (real-world safe values):
|
|
13
|
+
* Windows cmd.exe : ~8K (legacy)
|
|
14
|
+
* Windows powershell: ~32K (varies)
|
|
15
|
+
* Linux execve() : ~128K-2M
|
|
16
|
+
* macOS execve() : ~256K
|
|
17
|
+
*
|
|
18
|
+
* Hard limit chosen: 24K = safely below Windows cmd while still allowing
|
|
19
|
+
* substantial claims. For larger input, pipe via stdin.
|
|
20
|
+
*/
|
|
21
|
+
const DEFAULT_LIMITS = {
|
|
22
|
+
argv: 24_000,
|
|
23
|
+
stdin: 10_000_000, // 10MB
|
|
24
|
+
file: 100_000_000, // 100MB
|
|
25
|
+
unknown: 24_000,
|
|
26
|
+
};
|
|
27
|
+
function makeReceipt(input, source) {
|
|
28
|
+
// Lightweight non-crypto receipt — caller can verify they sent X bytes
|
|
29
|
+
// without needing HMAC key
|
|
30
|
+
const size = input.length;
|
|
31
|
+
const head = input.slice(0, 24).replace(/\s/g, "·");
|
|
32
|
+
const tail = input.slice(-24).replace(/\s/g, "·");
|
|
33
|
+
return `[mneme-rcpt ${source}:${size}B head="${head}" tail="${tail}"]`;
|
|
34
|
+
}
|
|
35
|
+
export function checkInputSize(input, opts) {
|
|
36
|
+
const limit = opts.customLimit ?? DEFAULT_LIMITS[opts.source];
|
|
37
|
+
const inputSize = input.length;
|
|
38
|
+
const receipt = makeReceipt(input, opts.source);
|
|
39
|
+
if (inputSize <= limit) {
|
|
40
|
+
return {
|
|
41
|
+
ok: true, inputSize, limit, source: opts.source,
|
|
42
|
+
truncated: false, receipt,
|
|
43
|
+
envelope: { ok: true, sizeReceived: inputSize, sizeLimit: limit, source: opts.source },
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
// Over limit. Truncate or reject?
|
|
47
|
+
if (opts.allowTruncate) {
|
|
48
|
+
return {
|
|
49
|
+
ok: true, inputSize, limit, source: opts.source,
|
|
50
|
+
truncated: true, truncatedAt: limit,
|
|
51
|
+
reason: `input ${inputSize}B > limit ${limit}B; --allow-truncate accepted first ${limit}B`,
|
|
52
|
+
receipt,
|
|
53
|
+
envelope: {
|
|
54
|
+
ok: true,
|
|
55
|
+
sizeReceived: inputSize,
|
|
56
|
+
sizeLimit: limit,
|
|
57
|
+
source: opts.source,
|
|
58
|
+
hint: `Verdict computed on first ${limit}B only — re-run via stdin for full input.`,
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Hard reject — but LOUD. Caller MUST get JSON envelope.
|
|
63
|
+
const suggestion = opts.source === "argv"
|
|
64
|
+
? "Input too large for command-line args. Pipe via stdin: `echo $CLAIM | mneme verify --stdin` (limit then becomes 10MB)."
|
|
65
|
+
: `Input ${inputSize}B exceeds ${opts.source} limit of ${limit}B. Use --allow-truncate or split into chunks.`;
|
|
66
|
+
return {
|
|
67
|
+
ok: false, inputSize, limit, source: opts.source,
|
|
68
|
+
truncated: false,
|
|
69
|
+
reason: `input ${inputSize}B exceeds ${opts.source} limit of ${limit}B`,
|
|
70
|
+
suggestion,
|
|
71
|
+
receipt,
|
|
72
|
+
envelope: {
|
|
73
|
+
ok: false,
|
|
74
|
+
error: "INPUT_TOO_LARGE",
|
|
75
|
+
sizeReceived: inputSize,
|
|
76
|
+
sizeLimit: limit,
|
|
77
|
+
source: opts.source,
|
|
78
|
+
hint: suggestion,
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Emit JSON envelope to stdout. Caller in CLI should call this on EVERY
|
|
84
|
+
* exit path so the user never gets silent 0-byte exit.
|
|
85
|
+
*
|
|
86
|
+
* Returns suggested process exit code:
|
|
87
|
+
* 0 if ok
|
|
88
|
+
* 2 if input rejected (distinct from generic crash exit 1)
|
|
89
|
+
*/
|
|
90
|
+
export function emitEnvelope(result, write = (s) => process.stdout.write(s)) {
|
|
91
|
+
write(JSON.stringify(result.envelope) + "\n");
|
|
92
|
+
return result.ok ? 0 : 2;
|
|
93
|
+
}
|
|
94
|
+
/** Detect input source heuristically from argv/stdin state. */
|
|
95
|
+
export function detectInputSource() {
|
|
96
|
+
if (!process.stdin.isTTY)
|
|
97
|
+
return "stdin";
|
|
98
|
+
if (process.argv.length > 2)
|
|
99
|
+
return "argv";
|
|
100
|
+
return "unknown";
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=input_size_guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input_size_guard.js","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/input_size_guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 🔮 PRISM — Universal Multi-Lens Verification Engine
|
|
3
|
+
*
|
|
4
|
+
* Closes v2.70 Vuln #3: multi-lens engine activated only on Mneme-self
|
|
5
|
+
* claims (6/7 generic test claims → 0 lenses → unknown). PRISM extends
|
|
6
|
+
* the lens engine to fire on ANY claim by adding 5 universal lenses
|
|
7
|
+
* that need no Mneme-specific entity to activate.
|
|
8
|
+
*
|
|
9
|
+
* 5 UNIVERSAL LENSES:
|
|
10
|
+
* 1. FAKE_AUTHORITY — "According to MIT, X" without verifiable cite
|
|
11
|
+
* 2. FAKE_COMMIT — "commit deadbeef" / "PR #N" that doesn't exist
|
|
12
|
+
* 3. STATISTICAL_REALITY — "all X are Y" / "every X is Y" absolutes
|
|
13
|
+
* 4. MAGIC_NUMBER — implausible numeric claim vs reality table
|
|
14
|
+
* 5. NULL_INFORMATION — TODO / AAAAAA / empty / noise → honest refusal
|
|
15
|
+
*
|
|
16
|
+
* Each lens emits {triggered, verdict, evidence, confidence}.
|
|
17
|
+
* Caller combines with Mneme-self lenses for unified verdict.
|
|
18
|
+
*
|
|
19
|
+
* Design principle: NO lens should produce false positives on legitimate
|
|
20
|
+
* factual claims. Each lens has narrow trigger pattern. If no pattern
|
|
21
|
+
* matches, lens returns {triggered: false} — caller stacks lenses freely.
|
|
22
|
+
*/
|
|
23
|
+
export type PrismVerdict = "REFUTED" | "SUSPICIOUS" | "INSUFFICIENT_DATA" | "PASSTHROUGH";
|
|
24
|
+
export interface LensResult {
|
|
25
|
+
lens: string;
|
|
26
|
+
triggered: boolean;
|
|
27
|
+
verdict?: PrismVerdict;
|
|
28
|
+
evidence?: string;
|
|
29
|
+
confidence?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface PrismResult {
|
|
32
|
+
claim: string;
|
|
33
|
+
lensesActivated: number;
|
|
34
|
+
lensesAvailable: number;
|
|
35
|
+
results: LensResult[];
|
|
36
|
+
combinedVerdict: PrismVerdict;
|
|
37
|
+
combinedConfidence: number;
|
|
38
|
+
rationale: string;
|
|
39
|
+
}
|
|
40
|
+
export declare function lensFakeAuthority(claim: string): LensResult;
|
|
41
|
+
export interface FakeCommitOptions {
|
|
42
|
+
validateSha?: (sha: string) => boolean;
|
|
43
|
+
validatePR?: (n: number) => boolean;
|
|
44
|
+
}
|
|
45
|
+
export declare function lensFakeCommit(claim: string, opts?: FakeCommitOptions): LensResult;
|
|
46
|
+
export declare function lensStatisticalReality(claim: string): LensResult;
|
|
47
|
+
export declare function lensMagicNumber(claim: string): LensResult;
|
|
48
|
+
export declare function lensNullInformation(claim: string): LensResult;
|
|
49
|
+
export declare function runPrism(claim: string, opts?: FakeCommitOptions): PrismResult;
|
|
50
|
+
//# sourceMappingURL=prism.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prism.d.ts","sourceRoot":"","sources":["../../../src/protoplasm/super_quan/prism.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,YAAY,GAAG,mBAAmB,GAAG,aAAa,CAAC;AAE1F,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,eAAe,EAAE,YAAY,CAAC;IAC9B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAmB3D;AAOD,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IACvC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;CACrC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,UAAU,CAwCtF;AASD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAchE;AAoBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA2BzD;AAWD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CA0B7D;AAGD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,iBAAsB,GAAG,WAAW,CAyCjF"}
|