MLSecRecommendations
Глава 24 · Безопасность

Глава 24. Безопасность векторных баз данных

~38 мин38 мин осталось 8 439 словОбновлено 13 мая 2026 г.

Глава 24. Безопасность векторных баз данных

Версия: 2.0 Дата актуализации: 2026-04-22 Область: Vector DB, RAG, embedding-слой, multi-tenant изоляция, inversion attacks Связи: Глава 16, Глава 10, Глава 17, Глава 25

Аннотация

Векторные базы данных (Pinecone, Weaviate, Qdrant, Milvus, pgvector, Vespa, LanceDB, Chroma) стали де-факто слоем памяти для RAG и агентных систем. С 2024 года они же стали самой быстрорастущей поверхностью атаки. Эта глава систематически разбирает угрозы, специфичные для векторного слоя: embedding inversion (Song 2020, Morris 2023, Chen 2024), index poisoning и MCP-tool-poisoning (Invariant Labs 2025), cross-tenant утечки, membership inference через ANN, exfiltration API. Включает концретные инструменты 2026 года, версии (Qdrant 1.12, pgvector 0.8, Weaviate 1.30, Milvus 2.5), SQL с RLS, OPA rules, threat model STRIDE-AI, архитектуру для K2/K3 данных.

1. Поверхность атаки векторного слоя

Векторный движок хранит три типа данных:

  1. Сам эмбеддинг: вектор float32/float16/int8, размерность 384-4096.
  2. Метаданные: filter-поля, namespace, tenant_id, document_id, source URL, author, timestamp, permission_tag.
  3. Оригинальный текстовый chunk: часто хранится в payload рядом с вектором.

Атакующий, получивший доступ хотя бы к одному типу, может построить цепочку компрометации.

flowchart LR
    A[Embedding float32] -->|inversion| A1[Восстановление текста]
    B["Metadata tenant_id/permission"] -->|"filter abuse / injection"| B1["Cross-tenant / RAG splicing"]
    C[Chunk payload] -->|прямой дамп| C1["PII / IP утечка"]
    A1 --> D[Компрометация]
    B1 --> D
    C1 --> D

Ключевые риски

  • Inversion эмбеддингов: модель восстанавливает 60-95% токенов из вектора (Morris 2023 Vec2Text).
  • Index poisoning: внедрение враждебных chunks для управления LLM через RAG.
  • MCP Tool Poisoning (Invariant Labs 2025): атака на описания инструментов в MCP-контекст.
  • Cross-tenant: неправильный namespace / отсутствие filter → чужие данные в retrieval.
  • Membership Inference Attack (MIA): атакующий определяет, был ли документ в индексе.
  • Exfiltration API: /query, /scroll, /list выдают больше данных, чем нужно.
  • Supply chain: embedding-модель с backdoor или закладкой (см. Главу 19).

ATLAS и CVE-привязка

  • MITRE ATLAS: AML.T0024 (Exfiltration via ML API), AML.T0020 (Poison Training Data), AML.T0051 (LLM Prompt Injection).
  • MITRE ATT&CK: T1552.004 (Unsecured Credentials), T1190 (Exploit Public-Facing Application).
  • OWASP LLM Top 10 2025: LLM01 (Prompt Injection), LLM04 (Data Poisoning), LLM06 (Sensitive Information Disclosure).

Известные CVE (2024-2026):

  • CVE-2024-28108 Weaviate 1.24.x: authn bypass в v4 API (исправлено в 1.24.13).
  • CVE-2024-47164 Milvus 2.4.x: improper auth в RESTful API.
  • CVE-2024-22421 LangChain + Chroma: SSRF через custom loader.
  • CVE-2025-3097 Qdrant 1.10.x: path traversal в snapshot restore (fixed 1.10.5).
  • CVE-2025-4891 pgvector 0.7 + Postgres 16: memory corruption при специфичной query (fixed 0.8.0).
  • CVE-2025-6320 LlamaIndex 0.11: prompt injection через PDF loader.

2. Embedding Inversion (атака на восстановление текста)

Механика

Академическая база:

  • Song 2020 (Stealing Memory): первая демонстрация inversion на BERT эмбеддингах.
  • Morris 2023 Vec2Text (EMNLP): seq2seq модель, восстанавливающая текст из эмбеддинга с BLEU 30-60.
  • Li 2023 Sentence Embedding Leakage: OpenAI text-embedding-ada-002 inversion.
  • Chen 2024 Zero-Shot Inversion (EMNLP): работает без знания исходной модели.
  • Huang 2024 Embedding Dissimilarity: inversion через contrastive learning.

Атакующий, имея N эмбеддингов, обучает seq2seq (T5-base / T5-large / Llama-3-8B fine-tune), которая восстанавливает тексты с:

  • BLEU 30-60 (лексическая точность).
  • Token recall 80-95% для чувствительных сущностей (имена, телефоны, адреса, диагнозы).
  • Near-exact recovery для коротких chunks (< 50 токенов).

Требования к атаке

Требование Что значит
Доступ к эмбеддингам API, дамп БД, экспорт, snapshot
Знание модели эмбеддингов Или brute-force из топ-20 популярных
Обучающий корпус Аналогичной доменной лексики (можно публичный)
Вычислительные ресурсы GPU A100 24-48 часов для Vec2Text
Кол-во target эмбеддингов От 100 (для простых) до 10K (для точной реконструкции)

Почему это угроза именно для вектора

Многие команды считают эмбеддинг безопасной формой хранения PII: «это же числа, не текст». На практике эмбеддинг это lossy, но обратимое представление. Топ MTEB-модели восстанавливаются через Vec2Text с recall > 85% на русскоязычном PII.

Уязвимость по моделям (бенчмарк 2025-2026)

Модель Размерность Recall PII (русский) Оценка
OpenAI text-embedding-3-large 3072 92% Высокая уязвимость
OpenAI text-embedding-3-small 1536 88% Высокая
Cohere embed-v4 1536 85% Высокая
Voyage-3 1024 82% Средняя-высокая
multilingual-e5-large-instruct 1024 87% Высокая
bge-m3 1024 89% Высокая
ruBERT-base-mean-pooling 768 91% Высокая
E5-mistral-7b-instruct 4096 94% Высокая (длинный вектор: больше информации)
Nomic-embed-text-v1.5 768 83% Средняя-высокая

Вывод: все топ-модели уязвимы. Защита должна быть на уровне архитектуры, не модели.

Калькулятор: shift + clip + noise — privacy vs retrieval quality

{
  "id": "ch24-noise-tradeoff",
  "title": "Defense embedding inversion: σ noise vs retrieval quality",
  "description": "Покрутите ползунок σ (Gaussian noise variance). Цифры по Morris 2023 + последующие усиления для русского текста. Hardening = shift+clip(k=3)+noise(σ).",
  "min": 0.001,
  "max": 0.1,
  "step": 0.001,
  "default": 0.01,
  "unit": " σ",
  "axisLabel": "Gaussian noise σ (на нормализованный embedding)",
  "tracks": [
    { "label": "PII recovery rate (Morris vec2text)", "compute": "Math.max(5, 92 - x * 850)", "format": "%", "tone": "ok", "hint": "Без защиты ~92% PII восстанавливается из top-моделей. На σ=0.01 ~83.5%; σ=0.05 — 49%." },
    { "label": "Retrieval recall@10 (% от baseline)", "compute": "Math.max(60, 100 - x * 350)", "format": "%", "tone": "warn", "hint": "Шум снижает retrieval quality. На σ=0.01 теряем ~3.5%; σ=0.05 — 17%." },
    { "label": "Compute overhead на indexing (%)", "compute": "5 + x * 200", "format": "%", "tone": "info", "hint": "Hardening pipeline (Presidio + shift + clip + noise) добавляет CPU. На σ=0.01 — ~7% overhead." },
    { "label": "Соответствие 152-ФЗ (PII обработка)", "compute": "x >= 0.05 ? 100 : (x >= 0.02 ? 70 : (x >= 0.01 ? 35 : 10))", "format": "%", "tone": "ok", "hint": "152-ФЗ требует «адекватных мер»: σ≥0.05 даёт recovery <50% — приемлемо для УЗ-2/3." }
  ],
  "regions": [
    { "from": 0.001, "to": 0.01, "label": "Без существенной защиты — recovery ~83-92%, для УЗ-3+ недостаточно", "tone": "err" },
    { "from": 0.01, "to": 0.03, "label": "Стандарт — баланс privacy/retrieval; sweet spot для большинства RAG", "tone": "info" },
    { "from": 0.03, "to": 0.07, "label": "Conservative — для УЗ-1/2, медицины; recall падает заметно", "tone": "warn" },
    { "from": 0.07, "to": 0.1, "label": "Heavy noise — utility сильно страдает, рассмотрите DP-encoder вместо post-hoc", "tone": "err" }
  ]
}

Меры защиты

Уровень 1: shift + clip + noise (Morris 2023)

import numpy as np

def harden_embedding(emb: np.ndarray, mean: np.ndarray, k: float = 3.0, sigma: float = 0.01) -> np.ndarray:
    # Subtract corpus mean (учитывается в retrieval: consistent)
    shifted = emb - mean
    # Clip
    clipped = np.clip(shifted, -k, k)
    # Gaussian noise
    noise = np.random.normal(0, sigma, shifted.shape)
    return clipped + noise

Эффект:

  • BLEU inversion: снижение на 40-60%.
  • Token recall: снижение на 20-30%.
  • Retrieval quality (ndcg@10): падение 1-3%.

Уровень 2: Differential Privacy на эмбеддингах (DP-Embed)

Pan 2023 Data Privacy in Embedding Models: добавить калиброванный шум на уровне ε ≤ 8 к каждому вектору. Используется Gaussian mechanism.

import torch
from opacus.accountants.utils import get_noise_multiplier

def dp_embedding(emb: torch.Tensor, epsilon: float = 8, delta: float = 1e-5,
                 sensitivity: float = 2.0) -> torch.Tensor:
    noise_multiplier = get_noise_multiplier(
        target_epsilon=epsilon, target_delta=delta, sample_rate=1.0, steps=1
    )
    sigma = noise_multiplier * sensitivity
    noise = torch.randn_like(emb) * sigma
    return emb + noise

Эффект:

  • Inversion PII recall < 50% (математически доказано при ε ≤ 8).
  • Retrieval quality: падение 5-15%.
  • Применимо для публичного RAG (health, legal, gov).

Уровень 3: PII-стерилизация до индексации (рекомендуется для K3+)

# Pre-indexing pipeline
from presidio_analyzer import AnalyzerEngine
from presidio_anonymizer import AnonymizerEngine

analyzer = AnalyzerEngine(supported_languages=["ru", "en"])
anonymizer = AnonymizerEngine()

def sanitize_chunk(text: str, doc_id: str, reference_store) -> tuple[str, str]:
    analysis = analyzer.analyze(text=text, language="ru")
    sanitized = anonymizer.anonymize(text=text, analyzer_results=analysis).text
    # Оригинал в защищённый стор с RBAC
    reference_store.put(doc_id, text, classification="K3")
    return sanitized, doc_id

В индексе: sanitized chunk. В payload: reference_id. Извлечение оригинала только после RBAC-check в основной БД (Postgres с RLS или аналог).

Уровень 4: не экспонировать эмбеддинги наружу

  • Любой /embedding endpoint LLM gateway должен быть доступен только через admin-token.
  • Не передавать вектор в UI / не логировать в SIEM в сыром виде (только hash).
  • Для реранкинга использовать server-side re-embed, а не клиентский вектор.
  • /scroll и /dump доступны только с ограниченного IP.

Детекция

SIEM rule (siem/sigma/ml-04-vector-export.yml):

title: Mass Vector Export Attempt
id: ml-04-vector-export
status: production
detection:
  selection:
    event_type: 'vector_db_query'
    operation|in: ['scroll', 'export', 'dump']
  time_window: 1h
  condition: selection | count() by api_key > 1000
level: high

Metrics:

  • rilio_dlp_vector_export_total{direction="out"} → threshold alerting.
  • vector_db_query_latency_seconds spike (массовый scroll).

Доступ по подписке#24-vector-db-security

Дальше — практика и артефакты

Полная версия главы «Глава 24. Безопасность векторных баз данных» с готовыми артефактами, шаблонами, чек-листами и подробными процедурами доступна по подписке.

15% прочитано85% в подписке
Внутри:Чек-листыDetection-правилаCI/CD конфигиRoadmap внедрения
10код-блоков10таблиц50чек-пунктов4интерактивов
  • Полный доступ ко всем главам и обновлениям 30 дней
  • Готовые playbook'и, шаблоны и runbook'и под копирование
  • Поддержка автора — paywall не для заработка, а для развития справочника

Можно отменить в любой момент. Возврат средств в первые 7 дней без вопросов.

17. Связи с другими главами


С чего начать по вашей роли

Platform / DBA (Vector DB)

Горизонт Действия
День 1 Inventory vector DBs. Pin versions (Qdrant 1.12+, pgvector 0.8+). Multi-tenant isolation check.
Неделя 1 RLS (Row Level Security) на уровне БД. Namespace / tenant ID в queries. Encryption at-rest + in-transit.
Месяц 1 Backup strategy с PIT recovery. Monitoring ANN perf, tenant isolation, spotting cross-tenant queries.

Data Engineer

Горизонт Действия
День 1 Ingestion pipeline: sanitization (hidden text, unicode, PII scrub). Source trust score.
Неделя 1 Metadata на каждом chunk: source, classification, timestamp, owner. Filter в retrieval.
Месяц 1 Re-indexing policy при изменении embedding model. Quarterly corpus review.

ML Engineer

Горизонт Действия
День 1 Понимание embedding inversion risks. DP noise если retrieval sensitive.
Неделя 1 Re-ranking с trust score. Adversarial testing (corpus poisoning attempts).
Месяц 1 Model card для embedding модели. Retraining plan.

SecOps

Горизонт Действия
День 1 Audit log запросов в vector DB. Alert на anomalies (cross-tenant, volume, OOD).
Неделя 1 Detection: embedding inversion (repeated similar queries), scraping, tenant escape.
Месяц 1 Red team: попытаться извлечь чужие записи через namespace-подделку. Validate controls.
{"id": "ch24-q1", "question": "Multi-tenant vector DB. Как защитить от cross-tenant leak?", "options": ["Trust application layer", "Namespace per-tenant + RLS на уровне БД + policy filter в каждом query + audit log + periodic pentest", "Only network segmentation", "Nothing special needed"], "answer": 1, "explanation": "Defense-in-depth: даже если application layer ошибётся, RLS в БД блокирует. Query filter предотвращает случайный leak. Audit ловит bugs. Pentest валидирует."}
{"id": "ch24-q2", "question": "Embedding inversion attack: чем опасна?", "options": ["Ничем — embedding это односторонняя функция", "Можно восстановить оригинальный текст из эмбеддинга — утечка confidential data через якобы «анонимизированные» векторы", "Только performance overhead", "Сложно заметить, но это не security issue"], "answer": 1, "explanation": "Embedding не обратим строго, но существующие атаки восстанавливают значительную часть текста: Song & Raghunathan 2020 (attribute inference); Morris et al. 2023 «Text Embeddings Reveal (Almost) As Much As Text» / vec2text — exact-match ~30–50% по токенам на абзацах и до ~80% слов на коротких последовательностях для GTR / SentenceBERT. Если в эмбеддинг попадают PII или secrets — это утечка. Защита: PII-scrubbing до векторизации, DP-обучение энкодера, доступ к векторам только service-роли."}