feat(lexicon): add injection-lexicon.json from verified llm-security dump
The four prompt-injection pattern families — 21 critical, 32 high, 22 medium, 8 hybrid — with per-pattern label, ECMAScript source and declared flags. Data only. The dump names checkCognitiveLoadTrap and scanForInjection's variant building (normalise → fold → rot13 → unicode-tag escalation) as ENGINE logic that never moves here; they are absent by intent, not omission. Proven, not transcribed: all four arrays were rebuilt from the commons JSON alone and diffed against the imported dump module — 83/83 identical on label, source and flags, 81 of them byte-identical. All 83 compile in Node bare, Node under `u`, and Python `re`. Two deliberate deviations from byte-identity, declared in the file: the zero-width and Cyrillic character classes carried raw code points, four of them invisible. Escaped to \uXXXX (the convention forbids raw invisible code points outside conformance inputs — an unreviewable class is where a silent false negative hides) and proven equivalent by differential match-set comparison over 208 adversarial inputs, 832 comparisons, 0 differences. Class membership was counted from the dump bytes: the zero-width class holds 4 code points and does NOT include U+00AD. HYBRID_PATTERNS' severity was not supplied and is left null rather than inferred from its siblings. Verification log in docs/extraction-plan.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FaYqid3mejFmd9ZHsiHgp3
This commit is contained in:
parent
0433240b14
commit
23cf3e383a
2 changed files with 552 additions and 0 deletions
|
|
@ -111,6 +111,28 @@ the property list is a lower bound; `scanner` and `severity` are required by des
|
|||
than by evidence; and the JSONL profile is left explicitly `unspecified` rather than
|
||||
invented, because "one finding per line" is inference.
|
||||
|
||||
### `lexicon/injection-lexicon.json` — extracted 2026-08-09
|
||||
|
||||
Source: `llm-security/scanners/lib/injection-patterns.mjs`, supplied as operator dump 2/2
|
||||
through the local coord mailbox. No commit hash accompanied it, so provenance is recorded
|
||||
as `unknown` rather than guessed.
|
||||
|
||||
| Check | Method | Result |
|
||||
| --- | --- | --- |
|
||||
| JSON well-formed, `version` present, LF, trailing newline, no raw invisible code points | `python3 -m json.tool` + a byte scan for U+200B/200C/200D/FEFF/00AD and the Tag block | pass, 0 raw invisible code points |
|
||||
| Pattern text and flags reproduce the source | rebuilt all four arrays **from the commons JSON alone** (`new RegExp(p.pattern, p.flags ?? '')`) and diffed label, `.source` and `.flags` against the imported dump module | 83/83 compared, 0 differences; 81/83 byte-identical, 2 declared-normalised |
|
||||
| Flags were read mechanically, not by eye | extracted from each literal via `.flags` | critical 15×`i` / 3×`m` / 3 none, high 32×`i`, medium 20×`i` / 2 none, hybrid 8×`i` |
|
||||
| Every pattern compiles in both runtimes | `new RegExp(src, flags)` and again with `u` in Node; `re.compile` with the equivalent `re.I`/`re.M` in Python | 83/83 in all three modes, 0 failures |
|
||||
| The 2 normalised patterns behave identically | differential match-set comparison (offsets + matched text) against the source objects, bare and under `u`, over a 208-input adversarial corpus: every class member, the near-misses excluded from each class (U+00AD, U+2060, U+180E, Cyrillic х, the uppercase set, Greek look-alikes), run boundaries, repeats, empty input | 832 comparisons, 0 differences |
|
||||
| Class membership was counted, not assumed | enumerated the code points inside each character class directly from the dump bytes | zero-width class = 4 (U+200B, U+200C, U+200D, U+FEFF — **not** U+00AD); Cyrillic class = 7 (U+0430, U+0435, U+043E, U+0440, U+0441, U+0456, U+0443) |
|
||||
| `\/` is portable, not a defect | 9 patterns carry the redundant escape a JS regex literal requires; compiled in Node bare, Node `u`, and Python `re` | accepted by all three — kept byte-identical, recorded as a translation note for engines that reject unknown escapes |
|
||||
|
||||
Not verified, and not claimed: that the dump matches the module it was transcribed from.
|
||||
Every check above proves this JSON agrees with **the dump**; dump-to-module fidelity is
|
||||
`llm-security`'s assertion, reproducible only in a session with read access to that
|
||||
repository. The severity the engine assigns to `HYBRID_PATTERNS` was not supplied and is
|
||||
left `null` rather than inferred from its three sibling arrays.
|
||||
|
||||
## Definition of done for v0.1.0
|
||||
|
||||
1. Repository initialized, Forgejo remote `open/llm-security-commons`, MIT, `STATE.md`
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue