Глава 24. Безопасность векторных баз данных
Глава 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. Поверхность атаки векторного слоя
Векторный движок хранит три типа данных:
- Сам эмбеддинг: вектор float32/float16/int8, размерность 384-4096.
- Метаданные: filter-поля, namespace, tenant_id, document_id, source URL, author, timestamp, permission_tag.
- Оригинальный текстовый 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: не экспонировать эмбеддинги наружу
- Любой
/embeddingendpoint 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_secondsspike (массовый scroll).
Дальше — практика и артефакты
Полная версия главы «Глава 24. Безопасность векторных баз данных» с готовыми артефактами, шаблонами, чек-листами и подробными процедурами доступна по подписке.
- Полный доступ ко всем главам и обновлениям 30 дней
- Готовые playbook'и, шаблоны и runbook'и под копирование
- Поддержка автора — paywall не для заработка, а для развития справочника
Можно отменить в любой момент. Возврат средств в первые 7 дней без вопросов.
17. Связи с другими главами
- Глава 03: Presidio sanitization на этапе ingest.
- Глава 08: управление API keys Vector DB, Vault dynamic secrets.
- Глава 10: RAG в агентных системах, MCP.
- Глава 16: атаки на RAG (общее), Anti-EchoLeak.
- Глава 17: DP для эмбеддингов.
- Глава 18: требования 152-ФЗ, ФСТЭК к хранению PII в векторном виде.
- Глава 19: backdoor embedding модели, model scan.
- Глава 22: DoW через embedding спам, budget cap.
- Глава 25: prompt injection через RAG chunks.
- Глава 26: CV-based RAG (image-document).
- opa/rag-retrieval.rego: политика retrieval.
- opa/agent-tool.rego: политика агентского доступа.
- siem/README.md: правила ml-02, ml-04, llm-02.
- playbooks/IR-03-prompt-injection-campaign.md: реакция на RAG-splicing.
- ci/github-actions/red-team-weekly.yml: еженедельный regression.
С чего начать по вашей роли
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-роли."}