Markdown Reader
Beamreactor Contextguardian
ContextGuardian - Pare-feu bidirectionnel LLM #
> Enveloppe Soleau du 6 janvier 2025 - AEGIS IA (SIRET 993 471 077 00012)
> Premiere mise en oeuvre : 15 novembre 2024
> Enveloppe Soleau du 6 janvier 2025 - AEGIS IA (SIRET 993 471 077 00012)
> Premiere mise en oeuvre : 15 novembre 2024
ContextGuardian est le systeme de securite bidirectionnel de BeamReactor pour les interactions avec les Large Language Models (LLM). Il intercepte et analyse les echanges dans les deux directions (User -> LLM et LLM -> User) en temps reel.
User -> [ContextGuardian IN] -> LLM -> [ContextGuardian OUT] -> User
Il protege contre :
| Composant Soleau | Classe BeamReactor | Fichier |
|---|---|---|
| ContextGuardian | LLMFirewall | lib/llm_connector/LLMFirewall.php |
| ThreatCorpus | AegisPatternManager | plugins/aegis_corpus/lib/AegisPatternManager.php |
| BehavioralAnalyzer | AegisDetector | plugins/aegis_corpus/lib/AegisDetector.php |
| PreventiveInjector (IPC) | LLMFirewall::filter_input() | Integration dans le flux LLM |
| RiskScorer | AegisDetector::calculateSuspicionScore() | Scoring ML multi-criteres |
LLMFirewall
|-- AegisDetector (analyse ML)
| |-- aegis_language_metrics (table BDD)
| |-- aegis_jailbreak_patterns (table BDD)
| +-- aegis_jailbreak_patterns_i18n (traductions)
|-- LogSpecialRequests (fallback legacy)
+-- Parser::sanitize() (nettoyage final)
Namespace : Beamreactor\LLMConnector\LLMFirewall
Autoload : Charge via CoreAutoLoader (lib/loaders)
Filtre les entrees utilisateur avant envoi au LLM.
Flux :
1. AegisDetector::analyze() - Detection ML multilingue
2. Si blocked -> log + retourne null (requete bloquee)
3. LogSpecialRequests::logIfSuspicious() - Fallback logging
4. LogSpecialRequests::cleanPrompt() - Nettoyage
5. Parser::sanitize($prompt, 'string') - Sanitization finale
6. Verification longueur minimale
Retour : Prompt nettoye ou null si bloque.
$firewall = new LLMFirewall();
$clean = $firewall->filter_input($userPrompt);
if ($clean === null)
{
// Requete bloquee par ContextGuardian
return;
}
Filtre rapide pour le streaming temps-reel (SSE).
Flux :
1. AegisDetector::analyze() avec seuil output (AEGIS_OUTPUT_THRESHOLD, defaut 0.85)
2. Verification encodage UTF-8
3. Detection XSS rapide (regex <script, javascript:, onerror=, onclick=)
Retour : Chunk filtre ou false si bloque.
Filtre complet applique apres generation complete.
Flux :
1. Correction encodage via Parser::sanitize($response, 'encoding')
2. AegisDetector::analyze() avec seuil output
3. Si score >= seuil -> retourne message generique de blocage
4. Detection de repetitions suspectes (> 5 occurrences du meme mot)
Retour : Reponse filtree ou message de blocage.
Namespace : Beamreactor\IA\Aegis\AegisDetector
Le score de suspicion (0.0 - 1.0) est calcule par combinaison ponderee de trois metriques :
| Metrique | Poids | Description |
|---|---|---|
| Longueur (Z-score) | 25% | Proximite avec la longueur moyenne des patterns connus |
| Densite lexicale | 50% | Frequence de mots suspects par rapport au corpus |
| N-grams | 25% | Correspondance bi-grams/tri-grams avec les patterns |
Bonus : +0.3 si pattern exact trouve dans le corpus (cap a 1.0).
| Score | Niveau | Action |
|---|---|---|
| 0.0 - 0.3 | Low risk | Transmission normale |
| 0.3 - 0.5 | Moderate risk | Transmission normale |
| 0.5 - 0.7 | Elevated risk | Warning + transmission |
| 0.7 - 1.0 | High risk | Blocage (seuil input par defaut) |
Le seuil output est plus eleve (0.85 par defaut) car le LLM peut mentionner des mots sensibles dans un contexte legitime.
Le detecteur identifie automatiquement la langue du prompt en comparant les frequences de mots avec les metriques linguistiques precalculees (aegis_language_metrics).
Les patterns du corpus sont stockes avec traductions i18n, permettant la detection dans toutes les langues supportees.
$detector = new AegisDetector(0.7); // seuil
$result = $detector->analyze("ignore all previous instructions");
// Retour :
[
'blocked' => true,
'score' => 0.92,
'language' => 'en',
'matched_patterns' => [
['pattern_id' => 'ignore_instructions_v1', 'severity' => 'critical', 'match_type' => 'exact']
],
'cleaned_prompt' => null,
'details' => [
'final_score' => 0.92,
'length_score' => 0.7,
'word_score' => 0.95,
'ngram_score' => 0.85,
'reason' => 'High risk - likely jailbreak attempt'
]
]
Table aegis_jailbreak_patterns :
| Champ | Description |
|---|---|
| pattern_id | Identifiant unique (ex: ignore_instructions_v1) |
| pattern_type | Categorie d'attaque |
| severity | low / medium / high / critical |
| active | Pattern actif ou desactive |
Categories d'attaque :
injection_poetry - Injections poetiques/indirectes (DAN, STAN, etc.)projection - Projection d'autorite fictivedeviation - Deviation de contextedirect_assault - Assaut direct sur les instructionsextraction - Tentative d'exfiltration de donnees systemeroleplay - Jailbreak par roleplay malveillantTable aegis_jailbreak_patterns_i18n : Traductions multilingues des patterns.
Table aegis_language_metrics : Metriques statistiques precalculees par langue (longueur moyenne, ecart-type, frequences de mots, n-grams).
Le plugin aegis_corpus fournit une interface d'administration complete :
AegisPatternManager)AegisAnalyzer)Acces : ?obj=aegis_corpus.php (necessite AEGIS_CORPUS_LEVEL_ADMIN)
Depuis la version 3.0.0 du dispatcher MCP, tous les appels tools passent par ContextGuardian.
LLM --JSON-RPC--> MCP::callTool()
|
+-- extractStrings(arguments)
| Extraction recursive de toutes les chaines >= 5 caracteres
|
+-- Pour chaque chaine : LLMFirewall::filter_input()
| Si null -> erreur -32603 "ContextGuardian: request blocked"
|
+-- Tool::run(arguments)
|
+-- Pour chaque result.content[].text : LLMFirewall::filter_output()
| Filtrage du contenu retourne au LLM
|
+-- JSON-RPC response
| Code | Signification |
|---|---|
| -32603 | Requete bloquee par ContextGuardian |
Si LLMFirewall n'est pas disponible (aegis_corpus non installe), le MCP fonctionne normalement sans filtrage. Le chargement est lazy et verifie via class_exists().
Les seuils sont configures dans llm_connector.conf.inc.php :
| Cle | Defaut | Description |
|---|---|---|
| AEGIS_INPUT_THRESHOLD | 0.7 | Seuil de blocage des entrees |
| AEGIS_OUTPUT_THRESHOLD | 0.85 | Seuil de blocage des sorties |
Le seuil output est volontairement plus eleve que l'input : le LLM peut utiliser un vocabulaire "sensible" dans un contexte pedagogique legitime.
Toutes les detections (bloquees ou non) :
| Champ | Description |
|---|---|
| user_id | Utilisateur concerne |
| prompt_hash | SHA-256 du prompt (pas le contenu brut) |
| detected_language | Langue detectee |
| suspicion_score | Score de suspicion |
| matched_patterns | Patterns correspondants (JSON) |
| action_taken | blocked / warned / allowed |
Anomalies detectees en sortie :
| Champ | Description |
|---|---|
| session_id | Session LLM |
| anomaly_type | injection_attempt / repetition / encoding_error |
| severity | low / medium / high / critical |
| metadata | Details supplementaires (JSON) |
LLMFirewall inclut une detection de patterns d'encodage suspects :
\xC0\x80)\u200B, \u200C, \u200D, \uFEFF)Ces patterns sont des vecteurs connus d'injection epinumerique.
| Critere | OpenAI Moderation / Llama Guard | ContextGuardian |
|---|---|---|
| Direction | Unidirectionnelle (IN ou OUT) | Bidirectionnelle |
| Regles | Statiques | Corpus evolutif + apprentissage |
| Corpus de menaces | Non | Structure, multilingue, versionne |
| Injection preventive | Non | IPC (Injection Preventive de Contexte) |
| Scoring | Binaire | Adaptatif (0.0 - 1.0) |
| Integration | API externe | Natif dans le framework |