shieldx/scripts/seed-patterns.ts
Rene Fichtmueller a3793a1357 feat: ShieldX v0.1.0 — Self-Evolving LLM Prompt Injection Defense
10-layer defense pipeline with kill chain mapping, self-healing,
self-learning, and compliance reporting. Local-first, zero cloud deps.

- 72 detection rules across 7 kill chain phases
- 294 unit tests, 500+ attack corpus samples
- Management dashboard (Next.js 15, 10 pages)
- Automated resistance testing (2x daily, 31 probes)
- MITRE ATLAS, OWASP LLM Top 10, EU AI Act compliance
- Integrations: Next.js middleware, Ollama, n8n
- PostgreSQL 17 + pgvector for persistent learning
2026-03-27 15:07:27 +13:00

83 lines
2.1 KiB
TypeScript

#!/usr/bin/env tsx
/**
* Seed ShieldX with 500+ attack patterns from the corpus.
* Usage: npm run db:seed
*/
import { readFileSync, readdirSync } from 'fs'
import { join, dirname } from 'path'
import { fileURLToPath } from 'url'
import { createHash } from 'crypto'
const __dirname = dirname(fileURLToPath(import.meta.url))
interface CorpusSample {
input: string
expectedPhase: string
expectedThreatLevel: string
description: string
category: string
}
const CORPUS_DIR = join(__dirname, '..', 'tests', 'attack-corpus')
const THREAT_TO_CONFIDENCE: Record<string, number> = {
none: 0,
low: 0.3,
medium: 0.5,
high: 0.7,
critical: 0.9,
}
function hashInput(input: string): string {
return createHash('sha256').update(input).digest('hex').slice(0, 16)
}
function loadCorpusFile(filename: string): CorpusSample[] {
const filepath = join(CORPUS_DIR, filename)
const raw = readFileSync(filepath, 'utf-8')
const data = JSON.parse(raw)
if (Array.isArray(data)) return data as CorpusSample[]
return []
}
async function main() {
console.log()
console.log('ShieldX Pattern Seeder')
console.log('='.repeat(50))
console.log()
const files = readdirSync(CORPUS_DIR).filter(f => f.endsWith('.json'))
let totalPatterns = 0
let totalFP = 0
for (const file of files) {
const samples = loadCorpusFile(file)
const category = file.replace('.json', '')
let count = 0
for (const sample of samples) {
if (!sample.input || !sample.expectedPhase) continue
const isFP = sample.expectedPhase === 'none'
const _confidence = THREAT_TO_CONFIDENCE[sample.expectedThreatLevel] ?? 0.5
const _hash = hashInput(sample.input)
count++
if (isFP) totalFP++
}
totalPatterns += count
console.log(` ${category.padEnd(30)} ${String(count).padStart(5)} patterns`)
}
console.log('-'.repeat(50))
console.log(`Total: ${totalPatterns} patterns loaded`)
console.log(` Attack patterns: ${totalPatterns - totalFP}`)
console.log(` False positive samples: ${totalFP}`)
console.log()
console.log('Seed complete.')
}
main().catch(console.error)