Table of Contents

🇬🇧 English version

Sécurité, résilience et plugins

Sécurité

Le framework intègre plusieurs couches de sécurité :

  • Outils : ToolAccessPolicy (whitelist/blacklist/unrestricted) par agent, IPathValidator pour la protection path traversal, IUrlValidator pour la protection SSRF, HttpHeaderSanitizer. Les noms d'outils spĂ©cifiĂ©s dans les configurations YAML sont validĂ©s Ă  la crĂ©ation via IToolRegistry ; sous Orkeon:CrewFactory:StrictTools (le dĂ©faut des runners) aucun outil non enregistrĂ© ne peut ĂŞtre assignĂ© Ă  un agent — le dĂ©faut bibliothèque est tolĂ©rant (saut + Warning).
  • Code : RoslynCodeSecurityAnalyzer (ICodeSecurityAnalyzer) et les implĂ©mentations d'ICodeSandbox — DockerSandbox, HostProcessRunner derrière LazyProbingCodeSandbox (Orkeon.Infrastructure.Sandbox) — pour l'exĂ©cution sĂ©curisĂ©e de code C#
  • DonnĂ©es : IDatabaseSecurityPolicy (Orkeon.Tools.Abstractions.Data) pour la validation des requĂŞtes SQL/NoSQL, PiiDetector et les cinq implĂ©mentations d'IDlpInterceptor (sortie d'outil, dĂ©lĂ©gation, log, mĂ©moire, sortie externe — Orkeon.Infrastructure.Security.Dlp). Le sous-système DLP est opt-in (AddOrkeonDlp(), voir Sous-systèmes opt-in)
  • Chiffrement : IEncryptionProvider avec implĂ©mentation AES, applicable aux providers mĂ©moire via le pattern Decorator. La rotation de clĂ©s est opt-in (AddOrkeonKeyRotation())
  • Audit : AuditLogger (Orkeon.Infrastructure.Security) avec ses sinks (Orkeon.Infrastructure.Security.Sinks) ; ProvenanceTracker vit cĂ´tĂ© RAG (Orkeon.Rag.Validation)
  • ConformitĂ© : NistComplianceReportGenerator (INistComplianceReporter, Orkeon.Infrastructure.Compliance). Le reporting NIST est opt-in (AddOrkeonNistCompliance())

Résolution des outils en YAML

À la création d'une Crew depuis YAML, chaque nom d'outil dans agents[].tools[] est résolu via IToolRegistry.GetToolByNameAsync(toolName). Le sort d'un outil inexistant dépend de CrewFactoryOptions.StrictTools :

  • Mode strict (Orkeon:CrewFactory:StrictTools=true — le dĂ©faut d'orkeon run et des runners) : CrewFactory lève, nomme les outils manquants et liste les noms disponibles du registre. Aucun agent ne peut opĂ©rer avec des capacitĂ©s inexistantes.
  • Mode tolĂ©rant (le dĂ©faut bibliothèque, false) : l'outil est sautĂ© avec un log Warning et la crew se charge sans lui — un hĂ´te qui embarque la bibliothèque et veut la garantie active le mode strict.

TLS mutuel A2A

Le sous-système A2A opt-in (AddOrkeonA2A()) applique la posture de sécurité déclarée dans A2ASecurityOptions :

  • Serveur (RequireMutualTls = true) : le certificat client entrant est authentifiĂ©, pas seulement exigĂ© — il doit chaĂ®ner vers l'une des TrustedCertificateAuthorities configurĂ©es (chaĂ®ne X509 construite en CustomRootTrust, qui couvre aussi la fenĂŞtre de validitĂ©) ou correspondre Ă  une empreinte Ă©pinglĂ©e de TrustedClientCertificateThumbprints. Les certificats auto-signĂ©s non Ă©pinglĂ©s sont rejetĂ©s (403). DĂ©marrer le serveur avec RequireMutualTls sans aucune ancre de confiance lève une exception (fail-closed) : prĂ©sence + dates valides ne font pas une authentification. La rĂ©vocation n'est pas vĂ©rifiĂ©e — les ancres de confiance sont supposĂ©es ĂŞtre des CA privĂ©es sans endpoints CRL/OCSP.
  • Client : la validation TLS complète s'applique toujours — il n'existe dĂ©libĂ©rĂ©ment aucun opt-out « accepter n'importe quel certificat ». Configurer TrustedCertificateAuthorities Ă©pingle la confiance sur des CA privĂ©es (un serveur auto-signĂ© ou de dev local doit Ă©pingler sa CA ainsi) ; cet Ă©pinglage ne couvre que la chaĂ®ne inconnue (RemoteCertificateChainErrors) — un mismatch de nom d'hĂ´te ou un certificat absent n'est jamais contournĂ©.
  • La terminaison TLS mutuelle rĂ©elle requiert un binding HTTPS de HttpListener au niveau de l'OS — voir Limitations connues.

Repli web RAG & injection de prompt

Le pipeline RAG correctif peut, en option, se replier sur une recherche web (WebSearchDocumentRetriever, Orkeon.Rag.WebFallback) quand la récupération locale échoue. Le contenu web est le vecteur classique de l'injection de prompt indirecte : une page fabriquée pour que, une fois récupérée et insérée dans un prompt LLM, son texte soit interprété comme des instructions — détournant l'agent, exfiltrant la conversation, ou déclenchant des appels d'outils.

La défense est en couches ; aucune couche n'est digne de confiance à elle seule :

  • Opt-in strict : le repli est Ă©teint par dĂ©faut derrière deux interrupteurs indĂ©pendants — le transport (Orkeon:Rag:WebFallback:Enabled, câblĂ© par AddOrkeonRagWebFallback(configuration)) et la politique du graphe correctif (Orkeon:Rag:Corrective:WebFallback:Enabled) ; les deux doivent ĂŞtre actifs pour qu'un document web atteigne jamais le graphe. L'activer sans configurer d'endpoint le laisse inerte et journalise un avertissement — aucune sortie rĂ©seau silencieuse. La clĂ© d'API est lue depuis une variable d'environnement (ApiKeyEnvVar), jamais depuis les fichiers de configuration.
  • Validation dĂ©terministe : chaque page tĂ©lĂ©chargĂ©e passe par PromptInjectionDocumentValidator (Orkeon.Rag.Validation) — heuristiques pures, sans LLM, testables hors ligne. Signaux dĂ©tectĂ©s : directives adressĂ©es au modèle (EN + FR : « ignore previous instructions », « you are now… », « system: », « nouvelles instructions : »…), tokens de contrĂ´le de gabarits de chat (<|im_start|>, <<SYS>>, [INST]…) avec accumulation par occurrence, balisage HTML cachĂ© (display:none, visibility:hidden, opacitĂ©/taille de police quasi nulles, aria-hidden), commentaires HTML massifs, vecteurs d'exfiltration (images markdown auto-chargĂ©es avec payloads encodĂ©s en query, payloads de liens percent-encodĂ©s, data URIs base64) et longs blobs base64. Le verdict par document est Clean | Suspicious | Rejected avec raisons et extraits incriminĂ©s.
  • TraçabilitĂ©, pas de nettoyage silencieux : les documents Rejected ne quittent jamais le retriever et sont journalisĂ©s avec leurs raisons et leur URL. Les documents Suspicious sont — selon SuspiciousAction — soit Ă©cartĂ©s (journalisĂ©s), soit conservĂ©s marquĂ©s dans les mĂ©tadonnĂ©es (injection_verdict, injection_reasons, injection_risk_score). Le contenu n'est jamais réécrit : le validateur dĂ©tecte, il n'assainit pas. Sur le chemin d'ingestion, le mĂŞme validateur siège dans le DataValidationPipeline (chaĂ®ne IDataValidator) avec quarantaine et suivi de provenance.
  • Fail-quiet sur le rĂ©seau, fail-loud sur la sĂ©curitĂ© : les erreurs HTTP de recherche et les timeouts dĂ©gradent vers une liste de rĂ©sultats vide avec un avertissement (le graphe correctif poursuit simplement sans contexte web) ; les rejets sont toujours des avertissements avec les raisons complètes.

Limites honnêtes : ces heuristiques sont fondées sur des motifs et peuvent être contournées — directives paraphrasées, langues autres que l'anglais/le français, encodages inédits ou payloads fractionnés passeront. Inversement, des documents techniques légitimes sur les prompts ou le CSS peuvent scorer Suspicious (ils sont marqués, jamais écartés en silence). Un validateur de contenu est un filtre, pas une frontière de privilèges : le vrai confinement est architectural — le texte récupéré doit rester de la donnée (jamais exécuté comme instruction), les agents consommant du contenu web devraient tourner avec des outils au moindre privilège, et les actions sensibles ne doivent pas être déclenchables par du seul contenu récupéré.

Résilience

ResiliencePolicies (Orkeon.Infrastructure.Resilience) expose les politiques Polly — GetRetryPolicy, GetCircuitBreakerPolicy, GetTimeoutPolicy, GetCombinedPolicy, GetLlmApiPolicy — utilisées par les providers LLM et les outils HTTP.

Checkpointing

CheckpointManager et ResumeEngine (Orkeon.Application.Services.Checkpointing) permettent la sauvegarde et la reprise d'état des exécutions de crew. Utile pour les longs workflows qui doivent survivre aux redémarrages.

Depuis R3.8, les états d'exécution eux-mêmes (ICrewExecutionStateManager : statut, progression, sortie) peuvent aussi être persistés dans les mêmes state stores (IStateStore — in-memory, SQLite via AddOrkeonSqliteCheckpointing, PostgreSQL) pour la reprise après crash. Opt-in via AddCrewExecutionStatePersistence(...) — ou la section Orkeon:ExecutionState:Persistence, qui n'a d'effet qu'à travers la surcharge AddOrkeonInfrastructure(IConfiguration) (les runners livrés utilisent la surcharge sans paramètre : pour eux, l'appel explicite est la voie) ; défaut : in-memory only. Voir Sous-systèmes opt-in.

Système de plugins

IOrkeonPlugin, PluginAssemblyDiscovery, PluginLoader/PluginLoadContext et IPluginRegistry (Orkeon.Plugins) fournissent un système de plugins pour étendre le framework avec des outils et providers personnalisés : découverte sur répertoire via le VFS, chargement isolé par AssemblyLoadContext collectible, activation DI opt-in AddOrkeonPlugins(...).

⚠️ Frontière de confiance : charger un plugin exécute du code arbitraire avec les privilèges du processus hôte — pas de sandbox en v1, et l'AssemblyLoadContext n'est pas une frontière de sécurité. Ne charger que des plugins de confiance. Détails et règles d'exploitation : Système de plugins.


Voir aussi : Fournisseurs LLM · Événements et CQRS · Retour à l'index