Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
bandjacks — Моделирование мира киберугроз и защиты | Kitploit
Инструменты/GitHubGitHub/blevene/bandjacks
OSINT (Разведка открытых источников)РазведкаФиды и агрегаторы угрозАнализ уязвимостейСбор информацииРазведка угрозМашинное ОбучениеОбучение и ОбразованиеПодобранные РесурсыАнализ Журналов
GitHubblevene/bandjacks

bandjacks

2543 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Моделирование мира киберугроз и защиты

Репозиторий

Bandjacks

Система моделирования мира для киберугроз

Обзор

Bandjacks — это всеобъемлющая система киберразведки угроз (CTI), которая:

  • Извлекает техники MITRE ATT&CK из отчетов об угрозах за 12–40 секунд
  • Строит граф знаний угрозных акторов, техник и защит
  • Генерирует совместимые с STIX 2.1 пакеты с полным отслеживанием происхождения
  • Интегрирует онтологию D3FEND для рекомендаций по защите
  • Предоставляет возможности векторного поиска и аналитики графов
  • Вычисляет анализ совместной встречаемости для выявления паттернов техник
  • Обеспечивает извлечение на 94% быстрее предыдущих версий благодаря кэшированию ответов LLM
  • Включает фронтенд на Next.js для проверки отчетов и визуализации аналитики

📚 Документация

РуководствоОписание
Быстрый стартЗапуск за 5 минут
Полная настройкаПолная настройка окружения
Использование CLIРуководство по интерфейсу командной строки
Справочник APIДокументация REST API
Анализ совместной встречаемостиДокументация по аналитике
Генерация AttackFlowРуководство по созданию потоков
Система проверкиПроверка с участием человека

Основные архитектурные особенности

TechniqueCache

  • Кэш в памяти всех техник MITRE ATT&CK, загружаемых при запуске
  • Поиск за O(1) по external_id (например, T1557) для мгновенного определения имени
  • 1376 техник кэшированы с полными метаданными (название, описание, тактики, платформы)
  • Единообразие имен гарантирует, что в интерфейсе проверки всегда отображаются читаемые названия техник

ActorCache

  • Кэш в памяти всех наборов вторжений и угрозных акторов
  • Быстрый поиск для определения имени актора и его поиска
  • Поддерживает сопоставление псевдонимов и нечеткий поиск

Быстрый старт

Необходимые компоненты

  • Python 3.11+
  • Neo4j 5.x (графовая база данных)
  • OpenSearch 2.x (векторное хранилище)
  • Redis (опционально, для кэширования)
  • Node.js 18+ (для фронтенда)
  • Доступ к LLM: облачные ключи API (Gemini или OpenAI) или локальный сервер, совместимый с OpenAI

Установка```bash

Clone the repository

git clone https://github.com/yourusername/bandjacks.git cd bandjacks

Install Python dependencies with uv (recommended)

uv sync

Or with pip

pip install -e .

Install frontend dependencies

cd ui && npm install && cd ..

root@kitploit:~
### Настройка окружения

**ВАЖНО:** Перед запуском приложения необходимо настроить переменные окружения. Приложению требуется установить `NEO4J_PASSWORD`.

Создайте файл `.env` в корне проекта:```bash
# Copy the sample file
cp infra/env.sample .env

# Edit .env and set your actual passwords
nano .env

Требуемая конфигурация в .env:```bash

Neo4j Configuration (REQUIRED)

NEO4J_URI=bolt://localhost:7687 NEO4J_USER=neo4j NEO4J_PASSWORD=your-actual-neo4j-password # MUST BE SET - no default provided

OpenSearch Configuration

OPENSEARCH_URL=http://localhost:9200 OPENSEARCH_USER=admin OPENSEARCH_PASSWORD=your-opensearch-password # Optional if security is disabled

LLM Configuration — pick ONE of the options below:

Option A: Local OpenAI-compatible API (vLLM, llama.cpp, Ollama, LocalAI, LM Studio, etc.)

LOCAL_LLM_API_BASE=http://192.168.1.100:8080/v1 # Base URL of your local server LOCAL_LLM_MODEL=mistral-nemo # Model name as the server reports it LOCAL_LLM_API_KEY=no-key # Most local servers accept any value

Option B: Cloud LLM providers

PRIMARY_LLM=gemini GOOGLE_API_KEY=your-gemini-api-key

Optional: OpenAI as fallback (or primary if PRIMARY_LLM=openai)

OPENAI_API_KEY=your-openai-api-key

ATT&CK Configuration

ATTACK_INDEX_URL=https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/index.json ATTACK_COLLECTION=enterprise-attack ATTACK_VERSION=latest

Redis (optional, for caching)

REDIS_URL=redis://localhost:6379

root@kitploit:~
**Примечание:** Приложение не запустится, если не задан `NEO4J_PASSWORD`. Подробнее см. [Исправление переменных окружения](https://github.com/blevene/bandjacks/blob/HEAD/ENV_VARIABLES_FIX.md).

### Запуск сервисов```bash
# Start the FastAPI backend server
uv run uvicorn bandjacks.services.api.main:app --reload --port 8000

# In another terminal, start the Next.js frontend
cd ui && npm run dev

# Access the applications
open http://localhost:8000/docs    # API documentation
open http://localhost:3000         # Frontend UI

Интерфейс командной строки (CLI)

Bandjacks включает полноценный CLI для операций разведки угроз:```bash

Show all available commands

uv run python -m bandjacks.cli.main --help

root@kitploit:~
> **Примечание:** CLI требует установки переменных окружения (NEO4J_PASSWORD и т.д.). Запускайте из корня проекта, где находится `.env`.

### Команды запросов```bash
# Search for threat intelligence
uv run python -m bandjacks.cli.main query search "ransomware encryption techniques" --top-k 10

# Explore graph relationships
uv run python -m bandjacks.cli.main query graph "attack-pattern--abc123" --depth 2

Управление очередью проверок```bash

Show review queue

uv run python -m bandjacks.cli.main review queue --status pending --limit 20

Approve a candidate

uv run python -m bandjacks.cli.main review approve "candidate-123" --reviewer analyst-1

Reject with reason

uv run python -m bandjacks.cli.main review reject "candidate-456" --reviewer analyst-1 --reason "False positive"

root@kitploit:~
### Извлечение документов```bash
# Extract CTI from a document
uv run python -m bandjacks.cli.main extract document ./report.pdf --confidence-threshold 80 --show-evidence

Команды аналитики

Примечание: Команды аналитики требуют данных AttackEpisode в Neo4j для возврата результатов.```bash

Show top co-occurring technique pairs

uv run python -m bandjacks.cli.main analytics top-cooccurrence --limit 25 --min-episode-size 2

Compute conditional co-occurrence P(B|A) for a technique

uv run python -m bandjacks.cli.main analytics conditional "attack-pattern--abc123" --limit 25

Analyze a specific threat actor

uv run python -m bandjacks.cli.main analytics actor "intrusion-set--xyz789" --metric npmi

Extract technique bundles

uv run python -m bandjacks.cli.main analytics bundles --min-support 3 --min-size 3 --max-size 5 --format json --output bundles.json

Global co-occurrence metrics

uv run python -m bandjacks.cli.main analytics global --min-support 2 --limit 50 --format csv --output pairs.csv

root@kitploit:~
### Команды рабочего процесса```bash
# Process a directory of reports with analytics
uv run python -m bandjacks.cli.main workflow process-reports ./reports/ --workers 3 --analyze --export-dir ./results/

# Bulk export all analytics data
uv run python -m bandjacks.cli.main workflow bulk-export --export-dir ./analytics_export/

Команды администратора```bash

Check system health

uv run python -m bandjacks.cli.main admin health

View cache statistics

uv run python -m bandjacks.cli.main admin cache-stats

Clear cache

uv run python -m bandjacks.cli.main admin cache-clear --pattern "search:*"

Optimize database

uv run python -m bandjacks.cli.main admin optimize

root@kitploit:~
## Интерфейс фронтенда

Фронтенд на Next.js предоставляет современный интерфейс для работы с системой.

### Управление отчетами (`/reports`)
- **Список отчетов**: Просмотр всех загруженных отчетов с указанием статуса и количества техник
- **Новый отчет** (`/reports/new`): Загрузка PDF/TXT файлов или вставка содержимого отчета
- **Детали отчета** (`/reports/[id]`): Просмотр извлеченных техник, сущностей и доказательств
- **Интерфейс рецензирования** (`/reports/[id]/review`): Рабочий процесс проверки с участием человека (Human-in-the-loop)

### Аналитика совместной встречаемости (`/analytics/cooccurrence`)

> **Примечание:** Для этих страниц требуются данные `AttackEpisode` в Neo4j. Сначала обработайте отчеты через конвейер извлечения или используйте `POST /v1/flows/build` для генерации эпизодов на основе данных о наборах вторжений.

- **Главная страница**: Обзор с количеством эпизодов/техник/субъектов
- **Лучшие пары** (`/pairs`): Пары совместно встречающихся техник с метриками NPMI/Lift
- **Условное** (`/conditional`): Условные вероятности P(B|A)
- **Пакеты** (`/bundles`): Часто совместно встречающиеся пакеты техник
- **Субъекты** (`/actors`): Характерные для субъекта шаблоны техник
- **Связи** (`/bridging`): Техники, используемые несколькими субъектами

### Состояние системы (`/health`)
- Состояние в реальном времени всех компонентов (Neo4j, OpenSearch, Redis)
- Статистика кэша и использование памяти
- Эндпоинты состояния, совместимые с Kubernetes

### Запуск фронтенда```bash
cd ui
npm run dev     # Development mode with hot reload
npm run build   # Production build
npm run start   # Start production server

# Ensure backend is running
# API_URL defaults to http://localhost:8000/v1

Руководство по использованию

1. Загрузка данных MITRE ATT&CK

Сначала загрузите структуру MITRE ATT&CK в ваш граф знаний:```bash

Load the latest enterprise ATT&CK release

curl -X POST "http://localhost:8000/v1/stix/load/attack"
-H "Content-Type: application/json"
-d '{ "collection": "enterprise-attack", "version": "latest", "adm_strict": false }'

root@kitploit:~
### 2. Извлечение техник из отчетов

Извлечение техник MITRE ATT&CK из отчетов по разведке угроз:```python
import httpx
import time

# For small reports (<5KB) - synchronous processing
response = httpx.post(
    "http://localhost:8000/v1/reports/ingest",
    json={
        "content": "APT29 used spearphishing emails with malicious attachments...",
        "title": "APT29 Campaign Analysis",
        "config": {
            "use_optimized_extractor": True,
            "span_score_threshold": 0.7,
            "top_k": 5
        }
    }
)

result = response.json()
print(f"Extracted {len(result['extraction']['techniques'])} techniques")

# For large reports (>5KB) - asynchronous processing
response = httpx.post(
    "http://localhost:8000/v1/reports/ingest_async",
    json={
        "content": large_report_text,
        "title": "Large Report Analysis"
    }
)

job_id = response.json()["job_id"]

# Check job status
status = httpx.get(f"http://localhost:8000/v1/reports/jobs/{job_id}/status")
while status.json()["status"] == "processing":
    time.sleep(2)
    status = httpx.get(f"http://localhost:8000/v1/reports/jobs/{job_id}/status")

# Get results from completed job
result = status.json()["result"]
print(f"Extracted {result['techniques_count']} techniques in {result['elapsed_time']} seconds")

3. Прямое использование Python

Для программного доступа без API:```python from bandjacks.llm.extraction_pipeline import run_extraction_pipeline

Configure extraction

config = { "use_optimized_extractor": True, # Use optimized pipeline "span_score_threshold": 0.7, # Minimum span confidence "max_spans": 20, "top_k": 5, "chunk_size": 2000, # For large documents "max_chunks": 100 }

Run extraction pipeline

result = run_extraction_pipeline( report_text, config, source_id="report_123", neo4j_config=neo4j_config )

Access results

techniques = result["techniques"] # Dict of technique_id -> details bundle = result.get("bundle") # STIX 2.1 bundle if configured entities = result.get("entities") # Extracted entities

Example: Print extracted techniques

for tech_id, info in techniques.items(): print(f"{tech_id}: {info['name']}") print(f" Confidence: {info['confidence']}%") print(f" Evidence: {info['evidence']}")

root@kitploit:~
## Архитектура конвейера извлечения

Конвейер извлечения Bandjacks использует мультиагентную архитектуру для извлечения структурированных угроз:

### Компоненты конвейера

Конвейер извлечения использует 9 специализированных агентов в последовательности:

#### 1. **EntityExtractionAgent** — Распознавание сущностей
- Извлекает субъекты угроз, вредоносное ПО, инструменты и кампании
- Запускается первым для обеспечения контекста извлечения техник
- Использует few-shot-подсказки с валидацией JSON-схемы
- Обрабатывает фрагментированные документы с прогрессивным оконным извлечением

#### 2. **SpanFinderAgent** — Обнаружение поведенческого текста
- Обнаруживает текстовые промежутки, содержащие угрожающее поведение, используя 14 тактико-специфичных regex-шаблонов
- Выявляет явные идентификаторы техник (T1566.001) и поведенческие паттерны
- Оценивает промежутки по уверенности с повышающим индексом ключевых слов
- Не использует LLM — чистое сопоставление шаблонов для скорости

#### 3. **BatchRetrieverAgent** — Извлечение кандидатов
- Использует векторный поиск OpenSearch KNN для поиска техник-кандидатов для каждого промежутка
- Дедуплицирует одинаковые тексты промежутков перед кодированием для избежания избыточных эмбеддингов
- Возвращает top-k кандидатов с оценками схожести для каждого промежутка

#### 4. **Pre-filter** — Сокращение промежутков
- Ограничивает промежутки значением `max_spans_per_technique` (по умолчанию 2) на каждую технику-кандидат
- Сохраняет промежутки с наибольшим рейтингом для каждого кандидата для поддержания качества доказательств
- Сокращает вызовы LLM сопоставления примерно на 46% при минимальной потере техник

#### 5. **DiscoveryAgent** — Обнаружение с помощью LLM (условное)
- Запускается, когда уверенность извлекателя низкая (<0,7 в среднем)
- Использует LLM для обнаружения техник, пропущенных векторным поиском
- Одиночный пакетный вызов для всех промежутков с низкой уверенностью

#### 6. **BatchMapperAgent** — Сопоставление техник (LLM)
- Пакетная обработка промежутков группами до 10 (`MAX_MAPPER_BATCH_SIZE`, по умолчанию снижено с 25 в мае 2026 כדי ограничить усечение облачных LLM)
- Извлекает ВСЕ релевантные техники для каждого промежутка с оценками уверенности
- Использует валидацию JSON-схемы для структурированного вывода

#### 7. **EvidenceVerifierAgent** — Проверка доказательств
- Основанная на шаблонах проверка цитат и ссылок на строки
- Оценивает качество доказательств по шкале от 40 до 100 баллов
- Не использует LLM — regex и сопоставление текста

#### 8. **ConsolidatorAgent** — Сведение доказательств
- Объединяет дублирующиеся техники, найденные в нескольких промежутках
- Агрегирует доказательства с использованием сходства Жаккара (порог >85%)
- Выдает финальный список техник со сводными оценками уверенности

#### 9. **AttackFlowSynthesizer** — Генерация последовательности (LLM)
- Анализирует временные маркеры ("сначала", "затем", "после")
- Выводит причинно-следственные связи из повествования
- Создает объекты STIX Attack Flow с вероятностными ребрами
- Использует моделирование совместной встречаемости, когда последовательность неясна

### Оптимизация производительности

- **Умное фрагментирование**: документы разделяются на фрагменты по 2 КБ с перекрытием
- **Пакетная обработка**: маппер обрабатывает до 25 промежутков за один вызов LLM
- **Параллельная обработка**: фрагменты обрабатываются одновременно в рабочих потоках
- **Кэширование ответов**: ответы LLM кэшируются для избежания повторных вызовов
- **Досрочное завершение**: извлечения с высокой степенью уверенности пропускают проверку
- **TechniqueCache**: все техники ATT&CK загружаются при запуске для O(1)-поиска
- **Pre-filter**: ограничивает количество промежутков на одну технику-кандидат перед LLM-маппером (на 46% меньше вызовов)
- **Пакетные эмбеддинги**: эмбеддинги техник генерируются пакетами (в 2-5 раз быстрее)
- **Пул соединений**: общие соединения Neo4j/OpenSearch между запросами
- **Пакеты UNWIND**: записи в Neo4j отправляются пакетами через UNWIND (30-40 запросов → 6-7)
- **Прогрев модели**: модель эмбеддингов загружается при запуске, чтобы избежать задержки холодного старта

### Время обработки

| Размер документа | Время обработки | Извлечено техник |
|-----------------|-----------------|------------------|
| Маленький (<5 КБ) | 10-20 секунд | 5-10 техник |
| Средний (5-15 КБ) | 20-40 секунд | 10-15 техник |
| Большой (>15 КБ) | 30-60 секунд | 15-25 техник |

## Аналитика совместной встречаемости

Bandjacks предоставляет аналитику для понимания взаимосвязей между техниками. 

> **Примечание:** Для аналитики требуются данные `AttackEpisode` и `AttackAction` в Neo4j. Они создаются, когда:
> - Отчеты обрабатываются через конвейер извлечения
> - Потоки атак строятся через `/v1/flows/build`
> - Пакеты STIX с эпизодами атак импортируются
>
> Если эпизоды отсутствуют, аналитика вернет пустые результаты.

### Глобальная совместная встречаемость

Вычисление техник, которые часто появляются вместе во всех эпизодах атак:```python
# Via API
response = httpx.post(
    "http://localhost:8000/v1/analytics/cooccurrence/global",
    json={"min_support": 2, "min_episodes_per_pair": 2, "limit": 50}
)

for pair in response.json()["pairs"]:
    print(f"{pair['name_a']} + {pair['name_b']}: NPMI={pair['npmi']:.3f}")

Условная вероятность

Вычислить P(B|A) - при условии, что был использован метод A, какова вероятность метода B:```python response = httpx.get( "http://localhost:8000/v1/analytics/cooccurrence/conditional", params={"technique_id": "attack-pattern--abc123", "limit": 25} )

root@kitploit:~
### Связки техник

Определите часто совместно встречающиеся связки техник (3-5 техник):```python
response = httpx.post(
    "http://localhost:8000/v1/analytics/cooccurrence/bundles",
    json={"min_support": 3, "min_size": 3, "max_size": 5}
)

Анализ по конкретным субъектам угроз

Анализируйте шаблоны техник для конкретных субъектов угроз:```python response = httpx.post( "http://localhost:8000/v1/analytics/cooccurrence/actor", json={"intrusion_set_id": "intrusion-set--xyz789", "min_support": 1} )

root@kitploit:~
## Система проверки с участием человека

Bandjacks включает комплексную систему проверки для валидации извлеченных разведывательных данных:

### Единый интерфейс проверки

Система проверки представляет все извлеченные элементы в едином интерфейсе:```typescript
// Review workflow
1. Upload/ingest report → Extraction pipeline runs
2. Navigate to /reports/{id}/review
3. Review extracted items across three tabs:
   - Entities (threat actors, malware, tools)
   - Techniques (ATT&CK mappings with evidence)
   - Attack Flow (sequenced steps)
4. Take actions on each item:
   - Approve: Accept as correct
   - Reject: Mark as incorrect
   - Edit: Modify details (name, confidence, etc.)
5. Submit all decisions atomically

Функции рецензирования

  • Ссылки на доказательства: Прямые ссылки на исходный текст с номерами строк
  • Корректировка уверенности: Изменение оценок уверенности на основе знаний аналитика
  • Массовые операции: Выбор нескольких элементов для массового одобрения/отклонения
  • Сочетания клавиш: A (одобрить), R (отклонить), E (редактировать), Space (далее)
  • Отслеживание прогресса: Визуальные индикаторы завершения проверки
  • Фильтрация: Фильтрация по типу, уровню уверенности или статусу

Интеграция с API```python

Submit review decisions

response = httpx.post( f"http://localhost:8000/v1/reports/{report_id}/unified-review", json={ "decisions": [ { "item_id": "technique-0", "action": "approve", "confidence_adjustment": 5, "notes": "Confirmed via external CTI" }, { "item_id": "entity-malware-1", "action": "edit", "edited_value": { "name": "Corrected Malware Name", "confidence": 95 } } ], "global_notes": "Review completed by analyst-1" } )

Review creates:

- Approved entities as Neo4j nodes

- Technique-to-report relationships

- Audit trail of decisions

root@kitploit:~
### 4. Поиск техник

Поиск техник ATT&CK с использованием естественного языка:```python
# Vector search for similar techniques
response = httpx.post(
    "http://localhost:8000/v1/search/ttx",
    json={
        "query": "ransomware that encrypts files and demands payment",
        "top_k": 5
    }
)

techniques = response.json()["results"]
for tech in techniques:
    print(f"{tech['external_id']}: {tech['name']} (score: {tech['score']:.2f})")

5. Запросы к графу

Запросите граф знаний для поиска связей:```python

Get all techniques used by a specific group

response = httpx.get( "http://localhost:8000/v1/graph/group/G0016/techniques" )

Get defensive techniques for an attack

response = httpx.get( "http://localhost:8000/v1/defense/technique/T1566.001" )

root@kitploit:~
### 6. Создание моделей AttackFlow

Создайте модели совместной встречаемости, которые показывают, как субъекты угроз используют техники вместе:```python
# Generate flow for a specific intrusion set (e.g., APT29)
response = httpx.post(
    "http://localhost:8000/v1/flows/build",
    json={
        "intrusion_set_id": "intrusion-set--899ce53f-13a0-479b-a0e4-67d46e241542"
    }
)

flow = response.json()
print(f"Generated flow '{flow['name']}' with {len(flow['steps'])} techniques")
print(f"Co-occurrence edges: {len(flow['edges'])}")

Массовая генерация: Сгенерировать потоки для всех субъектов угроз с техниками:```bash

Run the bulk generation script

uv run python scripts/build_intrusion_flows_simple.py

Monitor progress - creates flows for 165+ intrusion sets

Handles rate limiting automatically

Skips existing flows to avoid duplicates

root@kitploit:~
Модели AttackFlow используют **ко-встречаемость**, а не последовательное упорядочивание, поскольку наборы вторжений не содержат информации о последовательности. Техники соединяются с помощью:
- **Внутритактические ребра**: Между техниками в одной тактике цепочки уничтожения
- **Межтактические ребра**: Между техниками из смежных тактик
- **Шаблоны «хаб-спица»**: Для больших наборов техник, чтобы избежать взрыва ребер

Подробное использование см. в [Руководстве по генерации AttackFlow](https://github.com/blevene/bandjacks/blob/HEAD/docs/ATTACKFLOW_GENERATION.md).

## Поддерживаемые форматы ввода

Конвейер извлечения поддерживает несколько форматов ввода:

- **Обычный текст** — Прямое текстовое содержимое
- **Markdown** — Форматированные документы Markdown
- **PDF** — Извлечение через pdfplumber
- **HTML** — Парсинг через BeautifulSoup
- **JSON** — Извлечение структурированных данных

### Извлечение из обычного текста```python
# Direct text extraction
plaintext_report = """
The threat actors used spearphishing emails with malicious attachments.
After gaining access, they deployed Mimikatz to harvest credentials and
used RDP for lateral movement across the network.
"""

result = asyncio.run(run_agentic_v2_async(plaintext_report, {
    "cache_llm_responses": True,
    "single_pass_threshold": 500
}))

Извлечение из Markdown```python

Markdown document extraction

markdown_report = """

APT Campaign Analysis

Attack Methods

  • Initial Access: Spearphishing with malicious Office documents
  • Execution: PowerShell scripts and scheduled tasks
  • Persistence: Registry modifications and service installation

Tools Used

ToolPurpose
MimikatzCredential dumping
PsExecRemote execution
Cobalt StrikeC2 communications
"""

result = run_extraction_pipeline(markdown_report, { "use_optimized_extractor": True, "span_score_threshold": 0.7 }, source_id="markdown_report")

root@kitploit:~
### Извлечение из PDF```python
import pdfplumber
from bandjacks.llm.extraction_pipeline import run_extraction_pipeline

# Read PDF with pdfplumber (recommended)
with pdfplumber.open("threat_report.pdf") as pdf:
    text = ""
    for page in pdf.pages:
        page_text = page.extract_text()
        if page_text:
            text += page_text + "\n"

# Extract techniques using extraction pipeline
result = run_extraction_pipeline(text, {
    "use_optimized_extractor": True,
    "span_score_threshold": 0.7,
    "chunk_size": 2000
}, source_id="threat_report")

print(f"Found {len(result['techniques'])} techniques")

Пакетная обработка отчетов```python

from pathlib import Path import json

reports_dir = Path("./reports") results = []

for pdf_file in reports_dir.glob("*.pdf"): # Extract text and techniques # ... (see above)

root@kitploit:~
results.append({
    "file": pdf_file.name,
    "techniques": list(result["techniques"].keys()),
    "count": len(result["techniques"])
})

Save summary

with open("extraction_summary.json", "w") as f: json.dump(results, f, indent=2)

root@kitploit:~
### Построение потоков атак```python
# Generate attack flow from extracted techniques
response = httpx.post(
    "http://localhost:8000/v1/flows/build",
    json={
        "source_id": "report-123",
        "technique_ids": ["T1566.001", "T1059.001", "T1003.001"]
    }
)

flow = response.json()
print(f"Generated flow with {len(flow['steps'])} steps")

Тестирование

Запустите набор тестов, чтобы проверить установку:```bash

Run all tests

uv run pytest

Test extraction pipeline

python tests/test_optimized_extraction.py

Test graph integration

python tests/test_graph_upsert.py

Test STIX validation

python tests/test_bundle_validation.py

Run frontend tests

cd ui && npm test

root@kitploit:~
## API Эндпоинты

### Основные эндпоинты

- `POST /v1/stix/load/attack` - Загрузить данные MITRE ATT&CK
- `POST /v1/reports/ingest` - Синхронная загрузка отчётов (<5KB)
- `POST /v1/reports/ingest_async` - Асинхронная загрузка отчётов (>5KB)
- `POST /v1/reports/ingest/upload` - Загрузить PDF/TXT файлы
- `GET /v1/reports/jobs/{id}/status` - Проверить статус задачи
- `POST /v1/reports/{id}/unified-review` - Отправить решения по рецензированию
- `POST /v1/search/ttx` - Поиск техник
- `GET /v1/graph/technique/{id}` - Получить детали техники

### Потоки атак

- `POST /v1/flows/build` - Создать модели совместной встречаемости AttackFlow
- `GET /v1/flows/{flow_id}` - Получить детали конкретного AttackFlow
- `POST /v1/flows/search` - Поиск похожих потоков атак
- `GET /v1/flows/dump` - Массовый экспорт потоков с пагинацией и фильтрацией

### Аналитика

- `GET /v1/analytics/cooccurrence/global` - Глобальные метрики совместной встречаемости
- `GET /v1/analytics/cooccurrence/conditional` - Условные вероятности
- `GET /v1/analytics/cooccurrence/bundles` - Пакеты техник
- `GET /v1/analytics/cooccurrence/actor` - Паттерны для конкретного актора
- `GET /v1/coverage/gaps` - Пробелы в покрытии техник

### Защита и обнаружение

- `GET /v1/defense/technique/{id}` - Получить рекомендации по защите
- `GET /v1/detections/technique/{id}` - Стратегии обнаружения
- `POST /v1/sigma/validate` - Валидировать правила Sigma

### Мониторинг

- `GET /health` - Базовая проверка работоспособности
- `GET /health/live` - Проверка liveness для Kubernetes
- `GET /health/ready` - Проверка readiness для Kubernetes
- `GET /health/components/{component}` - Работоспособность отдельного компонента
- `GET /v1/costs/stats` - Отслеживание затрат LLM (ежедневная сводка по моделям)
- `GET /v1/cache/stats` - Получить статистику кэша LLM
- `POST /v1/cache/clear` - Очистить кэш LLM
- `GET /v1/compliance/report` - Метрики соответствия
- `GET /v1/drift/status` - Статус обнаружения дрейфа
- `GET /v1/ml-metrics/performance` - Метрики модели ML

### Акторы и происхождение

- `GET /v1/actors` - Список угрозных акторов
- `GET /v1/actors/{id}` - Получить детали актора
- `GET /v1/provenance/{object_id}` - Происхождение объекта
- `GET /v1/provenance/{object_id}/lineage` - Полная цепочка происхождения
- `GET /v1/provenance/{object_id}/evidence` - Фрагменты доказательств

### Функции только через API (нет UI/CLI)

Эти эндпоинты полностью функциональны, но доступны только через REST API (нет страниц интерфейса или команд CLI):

#### Симуляция путей атак
- `POST /v1/simulation/paths` - Симулировать пути атак от начальной техники/группы
- `POST /v1/simulation/predict` - Предсказать следующие вероятные техники на основе текущего состояния
- `POST /v1/simulation/whatif` - Анализ «что если» для сценариев защиты
- `POST /v1/simulation/scenario` - Симулировать на основе наборов групп/программного обеспечения/техник
- `GET /v1/simulation/statistics/{technique_id}` - Статистика использования техники
- `GET /v1/simulation/groups/{group_id}/patterns` - Паттерны атак группы
- `POST /v1/simulation/compare` - Сравнить несколько путей атак

#### Политика MDP и развертывание
- `POST /v1/simulate/rollout` - Симуляция развертывания PTG
- `POST /v1/simulate/mdp` - Вычислить оптимальную политику защиты MDP
- `GET /v1/simulate/models` - Список доступных моделей PTG

#### Обнаружение дрейфа и мониторинг
- `GET /v1/drift/status` - Текущий статус дрейфа по всем метрикам
- `POST /v1/drift/analyze` - Запустить анализ дрейфа с настраиваемыми порогами
- `GET /v1/drift/alerts` - Получить активные оповещения о дрейфе
- `POST /v1/drift/alerts/{alert_id}/acknowledge` - Подтвердить оповещение
- `GET /v1/drift/metrics/{metric_name}` - Получить конкретную метрику дрейфа

#### Отслеживание метрик ML
- `POST /v1/ml-metrics/prediction` - Записать предсказание модели для отслеживания
- `POST /v1/ml-metrics/review` - Записать метрики решения по рецензированию
- `POST /v1/ml-metrics/coverage-gap` - Записать пробел в покрытии
- `GET /v1/ml-metrics/performance` - Получить метрики производительности модели
- `GET /v1/ml-metrics/dashboard` - Экспортировать метрики панели управления

#### Уведомления
- `GET /v1/notifications/history` - Получить историю уведомлений
- `POST /v1/notifications/clear-history` - Очистить историю уведомлений
- `GET /v1/notifications/config` - Получить конфигурацию уведомлений
- `POST /v1/notifications/test` - Отправить тестовое уведомление

#### Управление обновлением векторов
- `GET /v1/vectors/status` - Статус системы обновления векторов
- `GET /v1/vectors/metrics` - Детальные метрики обновления векторов
- `POST /v1/vectors/update` - Вручную запустить обновление векторов
- `POST /v1/vectors/process-batch` - Принудительно обработать пакет
- `DELETE /v1/vectors/queue` - Очистить очередь ожидающих обновлений
- `GET /v1/vectors/health` - Проверка работоспособности векторной системы

#### Список игнорируемых сущностей
- `GET /v1/ignorelist` - Получить текущее состояние списка игнорирования
- `POST /v1/ignorelist/add` - Добавить сущность в список игнорирования
- `DELETE /v1/ignorelist/remove` - Удалить сущность из списка игнорирования
- `POST /v1/ignorelist/reload` - Перезагрузить список игнорирования с диска

#### Проверка кандидатных паттернов
- `GET /v1/review/candidates` - Список кандидатных паттернов атак
- `POST /v1/review/candidates` - Создать кандидатный паттерн
- `GET /v1/review/candidates/{id}` - Получить детали кандидата
- `POST /v1/review/candidates/{id}/approve` - Одобрить кандидата
- `POST /v1/review/candidates/{id}/reject` - Отклонить кандидата
- `GET /v1/review/candidates/{id}/similar` - Найти похожие паттерны
- `GET /v1/review/candidates/stats/summary` - Статистика кандидатов

### Полная документация API

Полная документация API доступна по адресам:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
- OpenAPI JSON: http://localhost:8000/openapi.json

## Архитектура

### Структура проекта```
bandjacks/
├── bandjacks/
│   ├── analysis/         # Graph analysis & interdiction
│   │   ├── graph_analyzer.py
│   │   └── interdiction.py
│   ├── analytics/        # Co-occurrence & clustering
│   │   ├── clustering.py
│   │   ├── cooccurrence.py
│   │   └── detection_bundles.py
│   ├── cli/              # Command-line interface
│   │   ├── main.py       # CLI entry point
│   │   ├── batch_extract.py
│   │   ├── formatters.py
│   │   └── workflows.py
│   ├── config/           # Configuration files
│   │   └── entity_ignorelist.yaml
│   ├── core/             # Core utilities
│   │   ├── cache.py      # Redis caching
│   │   ├── connection_pool.py
│   │   └── query_optimizer.py
│   ├── llm/              # Extraction pipeline
│   │   ├── extraction_pipeline.py
│   │   ├── agents_v2.py  # Core extraction agents
│   │   ├── chunked_extractor.py
│   │   ├── optimized_chunked_extractor.py
│   │   ├── entity_extractor.py
│   │   ├── flow_builder.py
│   │   ├── cache.py      # LLM response caching
│   │   └── experimental/ # Experimental features
│   ├── loaders/          # Data loading & indexing
│   │   ├── attack_catalog.py
│   │   ├── attack_upsert.py
│   │   ├── opensearch_index.py
│   │   ├── hybrid_search.py
│   │   └── sigma_loader.py
│   ├── monitoring/       # Metrics & monitoring
│   │   ├── compliance_metrics.py
│   │   ├── defense_metrics.py
│   │   ├── drift_detector.py
│   │   └── ml_metrics.py
│   ├── services/         # API & services
│   │   ├── api/          # FastAPI application
│   │   │   ├── main.py
│   │   │   ├── routes/   # API route handlers
│   │   │   └── middleware/
│   │   ├── technique_cache.py
│   │   └── actor_cache.py
│   ├── simulation/       # Attack simulation
│   │   ├── attack_simulator.py
│   │   ├── mdp_solver.py
│   │   └── ptg_rollout.py
│   └── store/            # Data stores
│       ├── report_store.py
│       ├── candidate_store.py
│       └── review_store.py
├── ui/                   # Next.js frontend
│   ├── app/              # App Router pages
│   │   ├── reports/      # Report management
│   │   ├── analytics/    # Analytics dashboards
│   │   └── health/       # Health monitoring
│   ├── components/       # React components
│   └── hooks/            # Custom React hooks
├── tests/                # Test suite
├── samples/              # Sample reports
├── scripts/              # Utility scripts
└── docs/                 # Documentation

Компоненты

  1. Конвейер извлечения (bandjacks/llm/)

    • extraction_pipeline.py - Главный оркестратор извлечения
    • chunked_extractor.py - Стандартная обработка по частям
    • optimized_chunked_extractor.py - Продвинутая оптимизированная обработка
    • agents_v2.py - Основные агенты извлечения (SpanFinder, Mapper, Consolidator)
    • entity_extractor.py - Агент распознавания сущностей
    • flow_builder.py - Генерация потока атак
    • memory.py - Общая рабочая память
    • cache.py - Кэширование ответов LLM
  2. Слой данных (bandjacks/loaders/)

    • Граф свойств Neo4j для связей
    • OpenSearch для векторных вложений
    • Модель данных STIX 2.1
  3. Слой API (bandjacks/services/api/)

Производительность

  • Скорость извлечения: 12–40 секунд на отчет (на 94% быстрее v1)
  • Небольшие документы: 4–8 секунд при однопроходном извлечении
  • Коэффициент попаданий в кэш: ускорение на 87,5% при повторных извлечениях
  • Поиск: <300 мс для поиска по векторным схожестям
  • Графовые запросы: <100 мс для большинства обходов

Конфигурация

Выбор модели

Система поддерживает облачные LLM и любой локальный API, совместимый с OpenAI:```bash

In your .env file

--- Option A: Local inference (highest priority when set) ---

Works with vLLM, llama.cpp (server), Ollama, LocalAI, LM Studio,

text-generation-webui, or any server that exposes an /v1/chat/completions endpoint.

LOCAL_LLM_API_BASE=http://192.168.1.100:8080/v1 LOCAL_LLM_MODEL=mistral-nemo LOCAL_LLM_API_KEY=no-key # optional — most local servers don't require a key

--- Option B: Cloud providers ---

PRIMARY_LLM=gemini # "gemini" (default) or "openai" GOOGLE_API_KEY=your-key # Gemini OPENAI_API_KEY=your-key # OpenAI (used as fallback when Gemini is primary)

root@kitploit:~
**Приоритет провайдера:** Local API > Gemini > OpenAI > LiteLLM proxy.
Когда настроен локальный сервер, облачные провайдеры автоматически добавляются в качестве запасных вариантов.

#### Примеры распространенных локальных серверов

| Сервер | `LOCAL_LLM_API_BASE` | `LOCAL_LLM_MODEL` |
|--------|---------------------|-------------------|
| vLLM | `http://host:8000/v1` | `mistralai/Mistral-Nemo-Instruct-2407` |
| llama.cpp | `http://host:8080/v1` | `mistral-nemo` |
| Ollama | `http://host:11434/v1` | `mistral-nemo` |
| LM Studio | `http://host:1234/v1` | `mistral-nemo` |
| LocalAI | `http://host:8080/v1` | `mistral-nemo` |

### Конфигурация извлечения

Система использует единый высокопроизводительный асинхронный конвейер с настраиваемыми опциями:```python
{
    "cache_llm_responses": True,         # Enable LLM caching (default: True)
    "single_pass_threshold": 500,        # Max words for single-pass (default: 500)
    "early_termination_confidence": 90,  # Skip verification above this (default: 90)
    "disable_discovery": False,          # Disable LLM discovery agent
    "max_spans": 20,                     # Maximum spans to process
    "span_score_threshold": 0.7,         # Minimum span quality
    "top_k": 5,                          # Candidates per span

    # Cost optimization options
    "max_spans_per_technique": 2,        # Pre-filter: max spans per candidate technique (0=disable, default=2)
    "enable_span_dedup": False,          # Text-based span dedup before mapping (default=False)
}

Оптимизация затрат

Конвейер извлечения отслеживает затраты LLM через litellm.completion_cost() с метриками по каждому отчету и конечной точкой дневного агрегата.

Контроль затрат:

Мониторинг:```bash

Daily cost aggregate by model

curl http://localhost:8000/v1/costs/stats

Per-report cost in extraction metrics

curl http://localhost:8000/v1/reports/{id} # -> extraction.metrics.cost_usd

root@kitploit:~
### Пороги уверенности

Управляйте качеством извлечения:```python
{
    "confidence_threshold": 50.0,  # Minimum confidence (0-100)
    "auto_ingest": True            # Auto-add high-confidence results
}

Мониторинг здоровья

API предоставляет комплексные конечные точки мониторинга здоровья для оперативного контроля и развертываний Kubernetes:

Конечные точки здоровья```bash

Basic health check (always returns 200 if API is running)

curl http://localhost:8000/health

Kubernetes liveness probe (process alive check)

curl http://localhost:8000/health/live

Kubernetes readiness probe (full dependency checks)

curl http://localhost:8000/health/ready

Individual component health

curl http://localhost:8000/health/components/neo4j curl http://localhost:8000/health/components/opensearch curl http://localhost:8000/health/components/redis curl http://localhost:8000/health/components/caches curl http://localhost:8000/health/components/system

root@kitploit:~
### Пример ответа о состоянии здоровья```json
{
  "status": "healthy",
  "timestamp": "2025-01-28T17:43:30.184036Z",
  "version": "1.0.0",
  "components": {
    "neo4j": {
      "status": "healthy",
      "latency_ms": 5
    },
    "opensearch": {
      "status": "degraded",
      "cluster_status": "yellow",
      "indices": {
        "attack_nodes": false,
        "bandjacks_reports": true
      }
    },
    "redis": {
      "status": "healthy",
      "latency_ms": 2,
      "memory_mb": 1.69
    },
    "caches": {
      "status": "healthy",
      "technique_cache": {
        "count": 993,
        "loaded": true
      },
      "actor_cache": {
        "count": 145,
        "loaded": true
      }
    },
    "system": {
      "status": "healthy",
      "memory": {
        "available_gb": 8.84,
        "percent_used": 72.4
      },
      "disk": {
        "available_gb": 353.11,
        "percent_used": 2.9
      },
      "cpu": {
        "percent_used": 7.7
      }
    }
  }
}

Status Levels

  • healthy: Component fully operational
  • degraded: Partially functional (e.g., missing some indices but operational)
  • unhealthy: Component failed or unreachable

Kubernetes Integration

For Kubernetes deployments, configure probes as follows:```yaml livenessProbe: httpGet: path: /health/live port: 8000 initialDelaySeconds: 30 periodSeconds: 10

readinessProbe: httpGet: path: /health/ready port: 8000 initialDelaySeconds: 45 periodSeconds: 5

root@kitploit:~
## Оптимизация производительности

### Кэширование

Система включает автоматическое кэширование ответов LLM для повышения производительности:```python
# Check cache statistics
response = httpx.get("http://localhost:8000/v1/cache/stats")
stats = response.json()
print(f"Cache hit rate: {stats['hit_rate']}")

# Clear cache if needed
httpx.post("http://localhost:8000/v1/cache/clear")

Профили производительности

Выберите профиль в зависимости от ваших потребностей:```python

Fast extraction (4-15 seconds)

fast_config = { "single_pass_threshold": 1000, "max_spans": 5, "skip_verification": True, "top_k": 3 }

Balanced (default, 12-40 seconds)

balanced_config = { "single_pass_threshold": 500, "max_spans": 10, "early_termination_confidence": 90, "top_k": 5 }

High quality (40-120 seconds)

quality_config = { "single_pass_threshold": 200, "max_spans": 20, "disable_discovery": False, "min_quotes": 3, "top_k": 10 }

root@kitploit:~
## Безопасность

### Проверка входных данных

- **Предотвращение внедрения Cypher**: Все конечные точки запросов к графу проверяют предоставляемые пользователем параметры `relationship_types` по белому списку известных типов связей (USES, MITIGATES, HAS_TACTIC и т.д.) и строгому регулярному выражению (`^[A-Z][A-Z0-9_]*$`). Неверный ввод возвращает 400 до построения запроса.
- **Проверка JSON-схем**: Ответы LLM проверяются на соответствие JSON-схемам, чтобы предотвратить попадание некорректных данных в конвейер.
- **Проверка ADM**: Все STIX-содержимое должно пройти проверку модели данных ATT&CK (ADM) перед загрузкой.

### Аутентификация и авторизация

- **JWT-аутентификация**: Необязательное промежуточное ПО для аутентификации API (`JWTAuthMiddleware`)
- **Ограничение скорости**: Лимитирование запросов на каждую конечную точку с настраиваемыми порогами
- **CORS**: Настраиваемый обмен ресурсами между источниками

## Расширенные возможности

### Отслеживание происхождения

Каждая извлеченная сущность содержит полное происхождение:```python
# Get provenance for an object
response = httpx.get(
    "http://localhost:8000/v1/provenance/attack-pattern--abc123"
)

Активное обучение

Система включает очередь проверки для улучшения извлечения:```python

Get next item for review

response = httpx.get("http://localhost:8000/v1/review_queue/next")

Submit feedback

response = httpx.post( "http://localhost:8000/v1/feedback/extraction", json={ "extraction_id": "ext-123", "correct": True, "corrections": [] } )

root@kitploit:~
### Coverage Analytics

Analyze your threat intelligence coverage:```python
# Get coverage analysis
response = httpx.get("http://localhost:8000/v1/analytics/coverage")
coverage = response.json()

print(f"Summary: {coverage['summary']}")
for tactic in coverage['tactics']:
    print(f"  {tactic['tactic']}: {tactic['coverage_percentage']}%")

Примечание: Покрытие платформ (_analyze_platforms_coverage) в настоящее время возвращает фиктивные данные. Покрытие тактик и групп использует реальные запросы Neo4j.

Симуляция атак (Экспериментально)

Модуль симуляции предоставляет прогнозирование пути атаки на основе MDP:```python

Note: This feature is experimental and may require additional setup

from bandjacks.simulation.attack_simulator import AttackSimulator from bandjacks.simulation.mdp_solver import MDPSolver

See bandjacks/simulation/ for implementation details

root@kitploit:~
## Статус функций

В этом разделе представлена информация о статусе реализации различных функций:

### Полностью функционально ✅
- **Конвейер извлечения отчетов** - Извлечение техник на основе LLM работает от начала до конца
- **Загрузка MITRE ATT&CK** - Загрузка данных ATT&CK для enterprise/mobile/ICS в Neo4j
- **Векторный поиск** - Семантический поиск техник на основе OpenSearch
- **Система рецензирования** - Рабочий процесс рецензирования с участием человека через API и UI
- **Мониторинг состояния** - Проверки состояния компонентов и пробы Kubernetes
- **Команды CLI для запросов/администрирования** - Поиск, обход графа, управление кэшем
- **Генерация потоков атак** - Построение потоков на основе совместной встречаемости для наборов вторжений
- **Симуляция атак** - Симуляция путей на основе MDP через `/simulation/*` и `/simulate/*`
- **Отчеты о покрытии** - Отчеты в формате JSON для руководителей, технических специалистов, тактического и оперативного уровней

### Функционально с зависимостями от данных ⚠️
- **Анализ совместной встречаемости** - Требует узлов `AttackEpisode` из обработки отчетов
- **Анализ субъектов** - Требует эпизодов, приписанных наборам вторжений
- **Пакеты техник** - Требует достаточного количества данных эпизодов для поиска закономерностей
- **Команды CLI для аналитики** - Работают, но возвращают пустой результат, если эпизоды отсутствуют

### Только API (без UI/CLI) 🔌
Это полностью реализованные функции, доступные только через REST API:
- **Симуляция путей атак** - Маршруты `/simulation/*` для прогнозирования путей и анализа «что если»
- **Решатель политик MDP** - `/simulate/mdp` для вычисления оптимальной политики защиты
- **Обнаружение дрейфа** - Маршруты `/drift/*` для мониторинга дрейфа качества данных
- **Метрики ML** - `/ml-metrics/*` для отслеживания производительности модели с течением времени
- **Управление векторами** - `/vectors/*` для управления векторными представлениями
- **Список игнорирования сущностей** - `/ignorelist/*` для фильтрации ложноположительных сущностей
- **Кандидаты закономерностей** - `/review/candidates/*` для кандидатов новых техник
- **Уведомления** - `/notifications/*` для настройки и истории оповещений
- **Происхождение** - `/provenance/*` для отслеживания цепочки извлечения
- **Соответствие требованиям** - `/compliance/*` для отчетности по метрикам соответствия

### Экспериментальное (в `llm/experimental/`) 🧪
- **PTG (Probabilistic Threat Graph)** - Базовая логика реализована, ограниченное тестирование
- **Интеграция Judge** - Валидация последовательностей на основе LLM
- **Симулятор потоков атак** - Движок симуляции на основе потоков
- **Извлекатель последовательностей** - Извлечение последовательностей из потоков

### Удалено/Очищено 🗑️
Следующие заглушки функций были удалены из API:
- ~~Анализ покрытия платформ~~ - Возвращал жестко закодированные данные-заглушки
- ~~Анализ трендов~~ - Возвращал случайные синтетические данные
- ~~Экспорт отчетов в CSV/PDF~~ - Возвращал 501; теперь только JSON
- ~~Вывод последовательностей Gemini~~ - Был заглушкой 501; используйте `/sequence/propose` вместо него

### Матрица подключения

| Область функции | Frontend UI | CLI | REST API |
|-----------------|-------------|-----|----------|
| Управление отчетами | ✅ | ✅ | ✅ |
| Рабочий процесс рецензирования | ✅ | ✅ | ✅ |
| Поиск (TTX) | ✅ | ✅ | ✅ |
| Анализ совместной встречаемости | ✅ | ✅ | ✅ |
| Анализ покрытия | ✅ | - | ✅ |
| Мониторинг состояния | ✅ | - | ✅ |
| Обнаружения/Sigma | ✅ | - | ✅ |
| Потоки атак | ✅ | - | ✅ |
| Наложение защиты | ✅ | - | ✅ |
| Последовательности/PTG | ✅ | - | ✅ |
| Субъекты | ✅ | - | ✅ |
| Симуляция атак | - | - | ✅ |
| Обнаружение дрейфа | - | - | ✅ |
| Метрики ML | - | - | ✅ |
| Управление векторами | - | - | ✅ |
| Список игнорирования сущностей | - | - | ✅ |
| Кандидаты закономерностей | - | - | ✅ |
| Уведомления | - | - | ✅ |
| Происхождение | - | - | ✅ |
| Соответствие требованиям | - | - | ✅ |

### Страницы Frontend
| Страница | Статус | Примечания |
|----------|--------|------------|
| `/reports` | ✅ Работает | Список, создание, просмотр отчетов |
| `/reports/[id]/review` | ✅ Работает | Полный рабочий процесс рецензирования |
| `/analytics/cooccurrence` | ⚠️ Зависит от данных | Показывает KPI, если эпизоды существуют |
| `/analytics/cooccurrence/pairs` | ⚠️ Зависит от данных | Вызывает реальный API |
| `/analytics/cooccurrence/bundles` | ⚠️ Зависит от данных | Вызывает реальный API |
| `/analytics/cooccurrence/actors` | ⚠️ Зависит от данных | Вызывает реальный API |
| `/health` | ✅ Работает | Состояние в реальном времени |

## Устранение неполадок

### Типичные проблемы

1. **Не удалось подключиться к OpenSearch**
   - Убедитесь, что OpenSearch запущен: `curl http://localhost:9200`
   - Проверьте, существует ли индекс: `curl http://localhost:9200/bandjacks_attack_nodes-v1`

2. **Не удалось подключиться к Neo4j**
   - Проверьте, что Neo4j запущен: `neo4j status`
   - Проверьте, что `NEO4J_PASSWORD` установлен в файле `.env`
   - Убедитесь, что пароль соответствует вашему экземпляру Neo4j
   - Если вы видите сообщение "NEO4J_PASSWORD environment variable is required", вам нужно задать его в файле `.env`

3. **Низкая полнота извлечения**
   - Убедитесь, что вы используете метод `agentic_v2`
   - Проверьте, действителен ли ключ API LLM
   - Проверьте, правильное ли имя модели (gemini-flash-latest)

4. **Ошибки тайм-аута**
   - Увеличьте настройки тайм-аута для больших документов
   - Рассмотрите возможность разбивки очень больших отчетов на части

5. **Frontend не подключается к API**
   - Убедитесь, что API запущен на порту 8000
   - Проверьте настройки CORS в конфигурации API

### Режим отладки

Включить подробное логирование:```python
import logging
logging.basicConfig(level=logging.DEBUG)

# Run extraction with debug output
result = run_agentic_v2(text, config)

Разработка

Запуск тестов```bash

Unit tests

uv run pytest tests/unit

Integration tests

uv run pytest tests/integration

Specific test

uv run pytest tests/test_agentic_v2.py::test_extraction

With coverage

uv run pytest --cov=bandjacks

Frontend tests

cd ui && npm test cd ui && npm run test:coverage

root@kitploit:~
### Вклад

1. Форкните репозиторий
2. Создайте ветку для новой функции
3. Внесите изменения
4. Запустите тесты: `uv run pytest`
5. Выполните линтинг: `uv run ruff check`
6. Отправьте pull request

### Качество кода```bash
# Format code
uv run ruff format

# Check linting
uv run ruff check

# Type checking
uv run mypy bandjacks

Лицензия

[Your License Here]

Поддержка

  • Быстрый старт: docs/QUICKSTART.md
  • Полная настройка: docs/SETUP.md
  • Документация API: http://localhost:8000/docs (при запуске)
  • Проблемы на GitHub: [Сообщить об ошибках или запросить функции]

Благодарности

  • MITRE ATT&CK® framework
  • D3FEND ontology
  • STIX 2.1 specification
Скачать инструмент
  • REST-эндпоинты FastAPI
  • Поддержка WebSocket для обновлений в реальном времени
  • Полная документация OpenAPI
  • Фронтенд (ui/)

    • Next.js 15 с App Router
    • React Query для получения данных
    • Radix UI + Tailwind для компонентов
    • ReactFlow для визуализации графов
  • ОпцияПо умолчаниюЭффектВлияние на качество
    MAX_MAPPER_BATCH_SIZE (env var)10Количество спанов на вызов LLM маппера (снижено с 25 в мае 2026; облачные ответы ограничены ~800 токенами, ~12% более крупных пакетов возвращали усеченный JSON)Нет
    max_spans_per_technique (config)2Предварительная фильтрация: N лучших спанов на каждую технику-кандидат~19% меньше техник, выше уверенность
    enable_span_dedup (config)falseУдаление дублирующегося текста спанов перед маппингом~15% меньше техник