
Python-библиотека для локального анализа безопасности с помощью LLM в сочетании с бинарным анализом Ghidra, сканированием уязвимостей C/C++ и интеграцией инструментов MCP для автоматизированной обратной разработки и генерации отчётов.
TrustedSec LLM Library — это библиотека Python для взаимодействия с локальными LLM, поддерживающими использование инструментов. Она позволяет выполнять крупные рабочие процессы, традиционно доступные только для передовых моделей, используя локальные конечные точки LLM и интеграцию с MCP (Model Context Protocol).
# Клонируйте или скопируйте репозиторий
git clone https://github.com/trustedsec/ts_llmlib.git
cd ts_llmlib
# Установите с помощью pip
pip install -e .
Скопируйте директорию ts_llmlib/ в ваш проект:
cp -rf ts_llmlib /path/to/your/project/
from ts_llmlib import ChatSession
# Инициализация с настройками по умолчанию (подключается к http://localhost:1234/v1/chat/completions)
chat = ChatSession()
# Выполнение промпта
response = chat.run_prompt("Какие файлы находятся в текущей директории?")
print(response['content'])
from ts_llmlib import ChatSession
# Настройка с пользовательскими параметрами
chat = ChatSession(
system_prompt="Вы — полезный помощник, использующий файловые инструменты.",
tool_list=[], # Пустой список = использовать файловые инструменты по умолчанию
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("Запиши 'hello' в /tmp/greeting.txt")
print(response['content'])
from ts_llmlib import ChatSession
chat = ChatSession()
history = [
{"role": "user", "content": "Сколько будет 2+2?"},
{"role": "assistant", "content": "Ответ — 4."}
]
response = chat.run_prompt("Можешь записать это в файл?", history=history)
MCP (Model Context Protocol) позволяет интегрироваться с внешними инструментами и сервисами. При настройке MCP-серверов 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"
)
# Чат-сессия автоматически получит и интегрирует инструменты Ghidra,
# такие как list_methods, decompile_function, get_xrefs_to и др.
ts_llmlib поддерживает как RPC-стиль, так и SSE (Server-Sent Events) эндпоинты:
http://localhost:3000/mcphttp://localhost:3000/sse (автоматически преобразуется в /mcp для 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
)
Параметры:
system_prompt (str | None): Пользовательский системный промпт. По умолчанию — минимальный промпт ассистента.tool_list (list | None): Список определений пользовательских инструментов. Пустой список использует встроенные инструменты.mcp_servers (dict[str, str] | None): Словарь, сопоставляющий имена серверов с URL.llm_endpoint_url (str): URL API-эндпоинта LLM.model_name (str): Идентификатор модели для эндпоинта LLM.timeout (int): Тайм-аут HTTP-запроса в секундах.max_runtime (int): Максимальное время выполнения промпта в секундах.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
Параметры:
user_prompt (str): Сообщение или вопрос пользователя.conversation_history (list[dict] | None): Необязательная история диалога в виде списка пар роль/содержание.disable_tools (list[str] | None): Список имён инструментов для отключения при этом вызове.max_runtime (int | None): Переопределение максимального времени выполнения для данного вызова.Возвращает:
{
"content": str, # Текст ответа LLM
"tool_calls": list, # Список выполненных вызовов инструментов (если есть)
"usage": dict | None, # Использование токенов, если доступно от LLM
"error": str | None # Сообщение об ошибке, если выполнение не удалось
}
ToolRegistry управляет всеми инструментами, доступными для чат-сессии:
tool_listЧтобы переопределить пути по умолчанию, можно установить следующие переменные; они проверяются в ChatSession.
TS_LLM_MODEL=qwen3-coder-next TS_LLM_ENDPOINT=http://HOSTNAME:1234/v1/chat/completions
# Пример использования
export TS_LLM_MODEL=qwen3-coder-next
export TS_LLM_ENDPOINT=http://HOSTNAME:1234/v1/chat/completions
ts_llmlib-redclippy
# ИЛИ
TS_LLM_MODEL=qwen3-coder-next TS_LLM_ENDPOINT=http://HOSTNAME:1234/v1/chat/completions ts_llmlib-redclippy
Анализирует исходные файлы C/C++ на наличие уязвимостей безопасности:
ts_llmlib-cpp-analyze <source_folder> <output_folder>
Обратный инжиниринг бинарного кода с интеграцией Ghidra:
# Базовый анализ
ts_llmlib-ghidra-analyze <output_folder>
# Режим только переименования (первый проход)
ts_llmlib-ghidra-analyze --rename_only <output_folder>
# Обработка только ранее безымянных функций
ts_llmlib-ghidra-analyze --process_unnamed_only <output_folder>
# Групповой анализ для группировки по отношениям вызовов
ts_llmlib-ghidra-analyze --grouped <output_folder>
После завершения работы, если не использовался --rename_only, можно очистить структуру командой:
ts_llmlib-ghidra-cleanup <input_folder> <output_folder>
Формирование форматированных отчётов об уязвимостях из JSON-файлов обзора:
ts_llmlib-ghidra-report <review_folder>
Запуск чат-интерфейса RedClippy на Qt (обратите внимание: требуется pyside6):
ts_llmlib-redclippy
ts_llmlib подключается к любому API-совместимому с OpenAI эндпоинту. Распространённые локальные серверы LLM:
| Сервер | URL по умолчанию |
|---|---|
| Ollama | http://localhost:11434/v1/chat/completions |
| LM Studio | http://localhost:1234/v1/chat/completions |
| vLLM | http://localhost:8000/v1/chat/completions |
Управление выполнением осуществляется двумя настройками тайм-аута:
timeout): Максимальное время для одного API-запросаmax_runtime): Общее астрономическое время, выделенное на обработку промпта (включая вызовы инструментов)При превышении любого из лимитов в ответе будет содержаться сообщение об ошибке.
Все ошибки возвращаются в словаре ответа:
response = chat.run_prompt("Какой-то промпт")
if response.get('error'):
print(f"Ошибка: {response['error']}")
else:
print(response['content'])
max_runtimets_llmlib/
├── __init__.py # Инициализация пакета, экспорт ChatSession
├── client.py # LLMClient для HTTP-запросов к эндпоинтам LLM
├── chat.py # Класс ChatSession (основной API)
├── mcp.py # MCPClient для интеграции Model Context Protocol
├── tools.py # ToolRegistry для управления инструментами
├── HOW_TO_TS_LLMLIB.md # Исходная документация
└── examples/ # Примеры скриптов
├── c_cpp_analyze.py # Скрипт анализа уязвимостей C/C++
├── redclippy.py # GUI-чат-приложение на Qt
├── ghidra_analyze.py # Анализ бинарного кода с Ghidra и MCP
├── ghidra_vuln_report.py # Генератор отчётов об уязвимостях
├── ghidra_cleanup.py # Утилита реорганизации выходных файлов
└── example_ts_llmlib.py # Пример скрипта, демонстрирующего использование библиотеки
pyproject.toml # Современная конфигурация пакета Python (скрипты определены здесь)
LICENSE.txt # Лицензия BSD-3-Clause
README.md # Этот файл
Лицензия BSD-3-Clause — подробнее в файле LICENSE.txt.
Приветствуются любые вклады! Пожалуйста, не стесняйтесь отправлять Pull Request.
git checkout -b feature/AmazingFeature)git commit -m 'Добавлена AmazingFeature')git push origin feature/AmazingFeature)| Инструмент | Параметры | Описание |
|---|
read_local_file | path: str | Читает содержимое локального файла |
write_local_file | path: str, content: str | Записывает содержимое в локальный файл |
list_directory | path: str | Выводит список файлов и директорий по пути |