Bibliothèque Python pour l'analyse de sécurité locale assistée par LLM avec analyse binaire Ghidra, scan de vulnérabilités C/C++ et intégration d'outils MCP pour la rétro-ingénierie automatisée et la génération de rapports.
La bibliothèque LLM de TrustedSec est une bibliothèque Python permettant d'interagir avec des LLM locaux prenant en charge l'utilisation d'outils. Elle permet d'exécuter de grands workflows traditionnellement possibles uniquement avec des modèles de pointe en exploitant des points de terminaison LLM locaux et l'intégration MCP (Model Context Protocol).
# Clonez ou copiez le dépôt
git clone https://github.com/trustedsec/ts_llmlib.git
cd ts_llmlib
# Installez avec pip
pip install -e .
Copiez le répertoire ts_llmlib/ dans votre projet :
cp -rf ts_llmlib /chemin/vers/votre/projet/
from ts_llmlib import ChatSession
# Initialisation avec les valeurs par défaut (se connecte à http://localhost:1234/v1/chat/completions)
chat = ChatSession()
# Exécuter une requête
response = chat.run_prompt("Quels fichiers se trouvent dans le répertoire actuel ?")
print(response['content'])
from ts_llmlib import ChatSession
# Configuration avec des paramètres personnalisés
chat = ChatSession(
system_prompt="Vous êtes un assistant utile qui utilise des outils de fichiers.",
tool_list=[], # Vide = utilise les outils de fichiers par défaut
mcp_servers={
"default": "http://localhost:3000/mcp"
},
llm_endpoint_url="http://localhost:1234/v1/chat/completions",
model_name="qwen3-coder-next",
timeout=60,
max_runtime=300
)
response = chat.run_prompt("Écris 'hello' dans /tmp/greeting.txt")
print(response['content'])
from ts_llmlib import ChatSession
chat = ChatSession()
history = [
{"role": "user", "content": "Combien font 2+2 ?"},
{"role": "assistant", "content": "La réponse est 4."}
]
response = chat.run_prompt("Peux-tu écrire cela dans un fichier ?", history=history)
| Outil | Paramètres | Description |
|---|---|---|
read_local_file | path: str | Lit le contenu d'un fichier local |
write_local_file | path: str, content: str | Écrit du contenu dans un fichier local |
list_directory | path: str | Liste les fichiers et répertoires dans un chemin |
MCP (Model Context Protocol) permet l'intégration avec des outils et services externes. Lorsque des serveurs MCP sont configurés, ts_llmlib :
from ts_llmlib import ChatSession
chat = ChatSession(
mcp_servers={
"ghidraSvr": "http://localhost:8081/sse"
},
llm_endpoint_url="http://localhost:1234/v1/chat/completions",
model_name="qwen3-coder-next"
)
# La session de chat récupérera et intégrera automatiquement les outils Ghidra
# comme list_methods, decompile_function, get_xrefs_to, etc.
ts_llmlib prend en charge les points de terminaison de style RPC et SSE (Server-Sent Events) :
http://localhost:3000/mcphttp://localhost:3000/sse (converti automatiquement en /mcp pour les appels RPC)ChatSession(
system_prompt: str | None = None,
tool_list: list | None = None,
mcp_servers: dict[str, str] | None = None,
llm_endpoint_url: str = "http://localhost:1234/v1/chat/completions",
model_name: str = "default",
timeout: int = 60,
max_runtime: int = 300
)
Paramètres :
system_prompt (str | None) : Prompt système personnalisé. Par défaut, un prompt d'assistant minimal.tool_list (list | None) : Liste de définitions d'outils personnalisés. Une liste vide utilise les outils intégrés.mcp_servers (dict[str, str] | None) : Dictionnaire associant les noms de serveurs à leurs URL.llm_endpoint_url (str) : URL du point de terminaison de l'API LLM.model_name (str) : Identifiant du modèle pour le point de terminaison LLM.timeout (int) : Délai d'expiration de la requête HTTP en secondes.max_runtime (int) : Temps d'exécution maximal pour une requête en secondes.response = chat.run_prompt(
user_prompt: str,
conversation_history: list[dict] | None = None,
disable_tools: list[str] | None = None,
max_runtime: int | None = None
) -> dict
Paramètres :
user_prompt (str) : Le message ou la question de l'utilisateur.conversation_history (list[dict] | None) : Historique de conversation optionnel sous forme de liste de paires rôle/contenu.disable_tools (list[str] | None) : Liste des noms d'outils à désactiver pour cet appel.max_runtime (int | None) : Remplace la durée d'exécution maximale par défaut pour cet appel spécifique.Retourne :
{
"content": str, # Texte de réponse du LLM
"tool_calls": list, # Liste des appels d'outils effectués (le cas échéant)
"usage": dict | None, # Utilisation des tokens si disponible depuis le LLM
"error": str | None # Message d'erreur en cas d'échec
}
Le ToolRegistry gère tous les outils disponibles pour la session de chat :
tool_listPour remplacer les chemins par défaut, vous pouvez définir les variables suivantes, qui sont vérifiées dans ChatSession.
TS_LLM_MODEL=qwen3-coder-next TS_LLM_ENDPOINT=http://HOSTNAME:1234/v1/chat/completions
# Exemple d'utilisation
export TS_LLM_MODEL=qwen3-coder-next
export TS_LLM_ENDPOINT=http://HOSTNAME:1234/v1/chat/completions
ts_llmlib-redclippy
# OU
TS_LLM_MODEL=qwen3-coder-next TS_LLM_ENDPOINT=http://HOSTNAME:1234/v1/chat/completions ts_llmlib-redclippy
Analyse les fichiers sources C/C++ pour détecter les vulnérabilités de sécurité :
ts_llmlib-cpp-analyze <dossier_source> <dossier_sortie>
Analyse de rétro-ingénierie binaire avec intégration Ghidra :
# Analyse de base
ts_llmlib-ghidra-analyze <dossier_sortie>
# Mode uniquement renommage (première passe)
ts_llmlib-ghidra-analyze --rename_only <dossier_sortie>
# Traiter uniquement les fonctions précédemment sans nom
ts_llmlib-ghidra-analyze --process_unnamed_only <dossier_sortie>
# Analyse groupée pour le regroupement par relations d'appel
ts_llmlib-ghidra-analyze --grouped <dossier_sortie>
Une fois terminé (sans --rename_only), vous pouvez nettoyer la structure en exécutant :
ts_llmlib-ghidra-cleanup <dossier_entree> <dossier_sortie>
Générer des rapports de vulnérabilités formatés à partir de fichiers JSON de revue :
ts_llmlib-ghidra-report <dossier_revue>
Lancer l'interface de chat Qt RedClippy (cet exemple nécessite pyside6) :
ts_llmlib-redclippy
ts_llmlib se connecte à tout point de terminaison d'API compatible OpenAI. Serveurs LLM locaux courants :
| Serveur | URL par défaut |
|---|---|
| Ollama | http://localhost:11434/v1/chat/completions |
| LM Studio | http://localhost:1234/v1/chat/completions |
| vLLM | http://localhost:8000/v1/chat/completions |
Deux paramètres de délai contrôlent l'exécution :
timeout) : Temps maximum pour une seule requête APImax_runtime) : Temps total autorisé pour le traitement d'une requête (y compris les appels d'outils)Si l'une ou l'autre limite est dépassée, la réponse contiendra un message d'erreur.
Toutes les erreurs sont retournées dans le dictionnaire de réponse :
response = chat.run_prompt("Une requête")
if response.get('error'):
print(f"Erreur : {response['error']}")
else:
print(response['content'])
max_runtimets_llmlib/
├── __init__.py # Initialisation du package, exporte ChatSession
├── client.py # LLMClient pour les requêtes HTTP vers les points de terminaison LLM
├── chat.py # Classe ChatSession (API principale)
├── mcp.py # MCPClient pour l'intégration du Model Context Protocol
├── tools.py # ToolRegistry pour la gestion des outils
├── HOW_TO_TS_LLMLIB.md # Documentation originale
└── examples/ # Scripts d'exemple
├── c_cpp_analyze.py # Script d'analyse de vulnérabilités C/C++
├── redclippy.py # Application de chat graphique basée sur Qt
├── ghidra_analyze.py # Analyse binaire Ghidra avec intégration MCP
├── ghidra_vuln_report.py # Générateur de rapports de vulnérabilités
├── ghidra_cleanup.py # Utilitaire de réorganisation des fichiers de sortie
└── example_ts_llmlib.py # Script d'exemple montrant l'utilisation de la bibliothèque
pyproject.toml # Configuration moderne du package Python (scripts définis ici)
LICENSE.txt # Licence BSD-3-Clause
README.md # Ce fichier
Licence BSD-3-Clause - Voir le fichier LICENSE.txt pour plus de détails.
Les contributions sont les bienvenues ! N'hésitez pas à soumettre une Pull Request.
git checkout -b feature/AmazingFeature)git commit -m 'Ajout d'une fonctionnalité incroyable')git push origin feature/AmazingFeature)