Communitygithub.com

Evaluación de Debilidades en Vectores y Embeddings

Prueba almacenes de vectores RAG (Pinecone, Qdrant, Weaviate, Chroma, pgvector) y modelos de embedding para identificar vulnerabilidades como inversión de embeddings, inferencia de pertenencia, fugas multiinquilino, envenenamiento de la base de conocimiento y manipulación de recuperación.

¿Qué es Evaluación de Debilidades en Vectores y Embeddings?

Esta habilidad proporciona una metodología repetible para evaluar las cinco clases de debilidades cubiertas por OWASP LLM08:2025 (Debilidades en Vectores y Embeddings) en sistemas de Generación Aumentada por Recuperación (RAG). Incluye pruebas de inversión de embeddings (recuperación de texto original a partir de vectores), inferencia de pertenencia (determinar si un documento específico está en el corpus), fugas entre inquilinos en sistemas multiinquilino, envenenamiento de la base de conocimiento (inserción de fragmentos maliciosos que dominan la recuperación) y manipulación de la recuperación (secuestro de recuperación). Está diseñada para evaluadores de seguridad que trabajan con almacenes de vectores como Pinecone, Qdrant, Weaviate, Chroma y pgvector. La habilidad asigna cada prueba a técnicas de MITRE ATLAS, proporciona fragmentos de código Python listos para usar y guía al usuario a través de un flujo de trabajo paso a paso que incluye inventario de la tubería RAG, pruebas de aislamiento de inquilinos y detección de inyección indirecta de prompts. La salida final son hallazgos con recomendaciones de remediación para cada clase de debilidad.

Compatible con~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/mukul975/Anthropic-Cybersecurity-Skills/tree/main/skills/assessing-vector-and-embedding-weaknesses

Preguntar en tu IA favorita

Abre un nuevo chat con esta habilidad de agente ya precargada.

Documentación

¿Qué hace Evaluación de Debilidades en Vectores y Embeddings?

Solo para uso autorizado: Estas pruebas interactúan con almacenes de vectores y modelos de embedding en sistemas RAG que usted posee o está autorizado a evaluar. La inversión de embeddings y la prueba entre inquilinos contra sistemas que no controla pueden exponer datos de terceros y está prohibida sin autorización.

Resumen

Los sistemas de Generación Aumentada por Recuperación (RAG) convierten documentos en vectores de embedding almacenados en una base de datos vectorial (Pinecone, Qdrant, Weaviate, Chroma, pgvector, FAISS) y recuperan los vectores más cercanos para fundamentar las respuestas del LLM. La vulnerabilidad LLM08:2025 Debilidades en Vectores y Embeddings de OWASP cubre los riesgos de seguridad únicos de esta capa:

  • Inversión de embeddings — los embeddings no son unidireccionales. Un modelo de inversión entrenado (o un ataque de reconstrucción de caja negra) puede recuperar partes sustanciales del texto original a partir de su vector, filtrando documentos fuente (se asigna a MITRE ATLAS AML.T0024.001 Invertir Modelo ML).
  • Inferencia de pertenencia — consultar si un registro específico contribuyó al corpus (AML.T0024.000).
  • Fuga entre inquilinos / multiinquilino — cuando un espacio de nombres/colección se comparte o falta el aislamiento de filtro, un inquilino recupera fragmentos de otro inquilino.
  • Envenenamiento de la base de conocimiento — un atacante que puede escribir en el corpus inserta fragmentos manipulados que dominan la recuperación (alta similitud coseno con consultas esperadas) y transportan cargas útiles de inyección indirecta de prompts.
  • Manipulación de la recuperación — documentos adversariales ajustados para ser recuperados para muchas consultas no relacionadas ("secuestro de recuperación").

La técnica principal es AML.T0024 — Filtración a través de la API de Inferencia ML: un atacante utiliza acceso legítimo de inferencia/consulta para filtrar datos (texto fuente mediante inversión, pertenencia o extracción del modelo). Esta habilidad proporciona una evaluación repetible de las cinco clases de debilidades.

Cuándo Usar

  • Durante una evaluación de seguridad de cualquier aplicación RAG / búsqueda vectorial (cobertura OWASP LLM08).
  • Cuando un almacén de vectores es multiinquilino y debe demostrar el aislamiento de espacio de nombres/metadatos.
  • Cuando el corpus acepta documentos proporcionados por el usuario o de terceros (superficie de envenenamiento).
  • Cuando el endpoint de embedding es accesible externamente (superficie de inversión/pertenencia).
  • Al validar los controles de filtrado de recuperación antes de la puesta en producción.

Requisitos Previos

  • Autorización y alcance que cubra el endpoint de embedding objetivo y el almacén de vectores.
  • Python 3.10+.
  • Acceso de lectura (y, para pruebas de envenenamiento, de escritura) a una colección de prueba — nunca al corpus de producción.
# Clientes de BD vectoriales + embeddings + herramientas de similitud
python -m pip install numpy scikit-learn sentence-transformers
python -m pip install qdrant-client chromadb pinecone-client weaviate-client
# (opcional) línea base de investigación de inversión de embeddings
python -m pip install vec2text

Objetivos

  • Medir la exposición a la inversión de embeddings en el modelo de embedding objetivo.
  • Ejecutar una prueba de inferencia de pertenencia contra el corpus.
  • Probar el aislamiento multiinquilino (espacio de nombres, filtro de metadatos, RBAC) para fugas entre inquilinos.
  • Insertar fragmentos envenenados benignos en una colección de prueba y medir el dominio de recuperación.
  • Detectar contenido de inyección indirecta de prompts que sobrevive en fragmentos recuperados.
  • Recomendar controles: filtros con ámbito de inquilino, validación de contenido, límites de acceso a embeddings.

Mapeo MITRE ATT&CK

IDTácticaNombre Oficial de la TécnicaRol en esta habilidad
AML.T0024ATLAS: FiltraciónFiltración a través de la API de Inferencia MLUsar acceso a consultas/embedding para filtrar datos fuente
AML.T0024.000ATLAS: FiltraciónInferir Pertenencia a Datos de EntrenamientoPrueba de inferencia de pertenencia contra el corpus
AML.T0024.001ATLAS: FiltraciónInvertir Modelo MLReconstrucción de texto fuente mediante inversión de embeddings
AML.T0020ATLAS: Desarrollo de RecursosEnvenenar Datos de EntrenamientoEnvenenamiento de la base de conocimiento del corpus
AML.T0051.001ATLAS: Acceso InicialInyección de Prompts en LLM: IndirectaCargas útiles de inyección incrustadas en fragmentos recuperados

Flujo de Trabajo

Paso 1: Inventariar la tubería RAG

Documentar el modelo de embedding + dimensiones, el almacén de vectores y su modelo de tenencia, la estrategia de fragmentación, el top_k de recuperación y la métrica de similitud (coseno/punto/L2), y cualquier filtro de metadatos aplicado en el momento de la consulta.

# Ejemplo: inspeccionar una colección de Qdrant
from qdrant_client import QdrantClient
client = QdrantClient(url="http://localhost:6333")
info = client.get_collection("docs")
print(info.config.params.vectors)   # tamaño + métrica de distancia
print(client.count("docs"))         # tamaño del corpus

Paso 2: Probar la exposición a la inversión de embeddings

Los embeddings de texto similar están cerca; un atacante con el endpoint de embedding puede reconstruir iterativamente texto cuyo embedding coincida con un vector objetivo. Mida cuánto recupera un vecino más cercano en el espacio de embeddings, usando la similitud coseno entre reconstrucciones candidatas y el objetivo.

import numpy as np
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity

model = SentenceTransformer("all-MiniLM-L6-v2")
secret = "Paciente Juan Pérez, MRN 553120, diagnosticado con hipertensión."
target_vec = model.encode([secret])

# El atacante solo tiene target_vec y el endpoint de embedding. Escalar texto candidato.
candidates = [
    "Nombre del paciente y número de historia clínica con un diagnóstico.",
    "Juan Pérez hipertensión historia clínica diagnóstico",
    "Paciente Juan Pérez MRN diagnosticado hipertensión",
]
cand_vecs = model.encode(candidates)
sims = cosine_similarity(target_vec, cand_vecs)[0]
for c, s in sorted(zip(candidates, sims), key=lambda x: -x[1]):
    print(f"{s:.3f}  {c}")
# Similitud alta para una conjetura casi textual => el riesgo de inversión es real para este modelo.

Para una línea base de reconstrucción de nivel de investigación, se puede usar vec2text contra modelos de embedding compatibles para demostrar la recuperación completa del texto.

Paso 3: Inferencia de pertenencia

Determinar si un documento específico está en el corpus midiendo la similitud de recuperación top-1 para una consulta de cita exacta: los elementos dentro del corpus devuelven una similitud máxima notablemente más alta que los controles fuera del corpus.

def membership_score(client, collection, embed, text):
    vec = embed([text])[0].tolist()
    hits = client.search(collection_name=collection, query_vector=vec, limit=1)
    return hits[0].score if hits else 0.0

in_corpus = membership_score(client, "docs", model.encode, "<cita exacta de un fragmento conocido>")
control  = membership_score(client, "docs", model.encode, "Una oración aleatoria no relacionada.")
print(f"en-corpus={in_corpus:.3f}  control={control:.3f}  delta={in_corpus-control:.3f}")
# Un delta grande y positivo indica que el elemento está en el corpus (fuga de pertenencia).

Paso 4: Probar el aislamiento multiinquilino

Confirmar que el inquilino B no puede recuperar fragmentos del inquilino A. Emitir consultas autenticadas como inquilino B que deberían estar filtradas, y verificar que ningún tenant_id del inquilino A aparezca en los resultados.

# Consultar como inquilino B; esperar SOLO resultados con tenant_id == "B".
from qdrant_client.models import Filter, FieldCondition, MatchValue

vec = model.encode(["información salarial confidencial"])[0].tolist()
hits = client.search(
    collection_name="docs",
    query_vector=vec,
    limit=10,
    query_filter=Filter(must=[FieldCondition(key="tenant_id", match=MatchValue(value="B"))]),
)
leaked = [h for h in hits if h.payload.get("tenant_id") != "B"]
print("FUGA ENTRE INQUILINOS" if leaked else "aislamiento OK", "->", len(leaked), "filas extrañas")

# Prueba crítica: repetir SIN el filtro para confirmar que el servidor, no el cliente,
# aplica el aislamiento. Si las consultas sin filtro devuelven datos del inquilino A, el aislamiento es solo del lado del cliente.
hits_nofilter = client.search(collection_name="docs", query_vector=vec, limit=10)
print("el aislamiento del lado del servidor FALLA" if any(h.payload.get("tenant_id") != "B" for h in hits_nofilter) else "OK")

Paso 5: Envenenamiento de la base de conocimiento (solo colección de prueba)

Insertar un fragmento envenenado benigno diseñado para ser recuperado para muchas consultas no relacionadas, luego medir con qué frecuencia aparece en top_k.

from qdrant_client.models import PointStruct

# Carga útil marcadora benigna (sin inyección real) para medir el dominio de recuperación.
poison = "POISON-CANARY. " + " ".join(
    ["restablecer contraseña facturación reembolso cuenta inicio de sesión soporte error ayuda"] * 8
)
client.upsert("docs_test", points=[
    PointStruct(id=999999, vector=model.encode([poison])[0].tolist(),
                payload={"tenant_id": "B", "source": "poison-test"})
])

queries = ["cómo obtener un reembolso", "restablecer mi contraseña", "cómo está el clima"]
for q in queries:
    hits = client.search("docs_test", model.encode([q])[0].tolist(), limit=5)
    dominated = any(h.payload.get("source") == "poison-test" for h in hits)
    print(f"{'VENENO en top5' if dominated else 'limpio'}: {q}")

Paso 6: Detectar inyección indirecta de prompts en fragmentos recuperados

Escanear el texto de los fragmentos recuperados en busca de marcadores de inyección antes de que se concatenen en el prompt.

import re
INJECTION_PATTERNS = [
    r"ignora (todas|las instrucciones anteriores|las instrucciones anteriores)",
    r"prompt del sistema", r"ahora eres", r"ignorar", r"</?(sistema|instrucciones)>",
]
def chunk_is_injection(text):
    low = text.lower()
    return [p for p in INJECTION_PATTERNS if re.search(p, low)]

for hit in client.search("docs", model.encode(["ayuda"])[0].tolist(), limit=10):
    flags = chunk_is_injection(hit.payload.get("text", ""))
    if flags:
        print("INYECCIÓN INDIRECTA en fragmento", hit.id, flags)

Paso 7: Informar y remediar

  • Inversión/pertenencia: limitar la tasa y autenticar el endpoint de embedding; evitar devolver puntuaciones de similitud sin procesar; restringir quién puede consultar embeddings.
  • Entre inquilinos: aplicar filtros de inquilino del lado del servidor (colecciones/espacios de nombres separados por inquilino cuando sea factible); nunca depender de filtros proporcionados por el cliente.
  • Envenenamiento: validar y etiquetar el origen de cada fragmento ingerido; escanear las entradas en busca de inyecciones; limitar la cuota de cualquier fuente única en la recuperación.
  • Inyección indirecta: sanitizar los fragmentos recuperados y aplicar barreras de seguridad de salida (consulte defending-llms-with-guardrails).

Herramientas y Recursos

HerramientaPropósitoFuente Principal
OWASP LLM08Guía de Debilidades en Vectores y Embeddingshttps://genai.owasp.org/llmrisk/llm082025-vector-and-embedding-weaknesses/
sentence-transformersGeneración de embeddings para pruebashttps://www.sbert.net/
Cliente QdrantAlmacén de vectores + búsqueda filtradahttps://qdrant.tech/documentation/
Chroma / Weaviate / PineconeAlmacenes de vectores alternativoshttps://docs.trychroma.com/
vec2textLínea base de investigación de inversión de embeddingshttps://github.com/jxmorris12/vec2text
MITRE ATLASAML.T0024 Filtración a través de la API de Inferencia MLhttps://atlas.mitre.org/

Criterios de Validación

  • Tubería RAG inventariada (modelo de embedding, almacén, tenencia, métrica, top_k, filtros).
  • Exposición a inversión de embeddings medida y clasificada.
  • Delta de inferencia de pertenencia calculado para elementos dentro del corpus vs. controles.
  • Aislamiento multiinquilino probado tanto con como sin filtros del cliente (confirmación de aplicación del lado del servidor).
  • Dominio de envenenamiento medido solo en una colección de prueba.
  • Fragmentos recuperados escaneados en busca de contenido de inyección indirecta.
  • Hallazgos informados con remediación para cada clase de debilidad.
  • Ningún corpus de producción modificado durante la evaluación.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

abusing-dpapi-for-credential-access

Extract and decrypt Windows DPAPI-protected secrets (Credential Manager, browser logins/cookies, Wi-Fi credentials, KeePass keys) online or offline using SharpDPAPI, SharpChrome, Mimikatz, or Impacket

abusing-shadow-credentials-for-privesc

Take over Active Directory accounts by writing attacker-controlled public keys to msDS-KeyCredentialLink (Shadow Credentials) with pyWhisker, Whisker, or Certipy, then authenticate via PKINIT to recover the target

achieving-cmmc-level-2-compliance

>-

acquiring-disk-image-with-dd-and-dcfldd

Create forensically sound bit-for-bit disk images with dd or dcfldd on a Linux forensic workstation, preserving evidence integrity through hash verification (MD5/SHA) during acquisition. Use when imaging a suspect drive, USB device, or memory card for investigation, preserving volatile disk evidence during incident response, or producing a verified copy for legal or law-enforcement proceedings before any destructive analysis.

analyzing-active-directory-acl-abuse

Detect dangerous ACL misconfigurations in Active Directory using ldap3

analyzing-android-malware-with-apktool

Perform static analysis of Android APK malware using apktool for resource decompilation, jadx for Java source recovery, and androguard for manifest inspection, dangerous permission-combination detection, and identification of obfuscated code, dynamic code loading, and reflection-based API calls. Use to statically triage a suspicious APK without executing it or to build mobile malware detection rules.

analyzing-api-gateway-access-logs

Parses API Gateway access logs (AWS API Gateway, Kong, Nginx) to detect

analyzing-apt-group-with-mitre-navigator

Query ATT&CK data with attackcti, mitreattack-python, and stix2, then build MITRE ATT&CK Navigator layers and multi-layer heatmap overlays mapping one or more APT groups

analyzing-azure-activity-logs-for-threats

Queries Azure Monitor activity logs and sign-in logs via azure-monitor-query

analyzing-bootkit-and-rootkit-samples

Analyzes bootkit and advanced rootkit malware infecting the Master

analyzing-browser-forensics-with-hindsight

Parse Chromium-based browser databases with Hindsight to extract and correlate browsing history, downloads, cookies, cached content, autofill data, saved passwords, and extensions from Chrome, Edge, Brave, Opera, and Vivaldi into a unified timeline (XLSX, JSON, or SQLite output). Use during incident response, insider-threat investigations, or criminal cases when you need to reconstruct a user

analyzing-campaign-attribution-evidence

Systematically evaluate cyber-campaign evidence to attribute an operation to a threat actor, using the Diamond Model and Analysis of Competing Hypotheses (ACH) to weigh infrastructure overlaps, TTP consistency, malware code similarity, and timing/language artifacts into confidence-weighted attribution assessments. Use when an incident investigation needs a defensible attribution confidence level.

analyzing-certificate-transparency-for-phishing

Monitor Certificate Transparency logs using crt.sh and Certstream to

analyzing-cloud-storage-access-patterns

Detect abnormal access in AWS S3, GCS, and Azure Blob Storage by analyzing CloudTrail Data Events, GCS audit logs, and Azure Storage Analytics for after-hours bulk downloads, new-IP access, and API-call spikes (e.g. GetObject) via statistical baselines and time-series anomaly detection. Use when investigating suspected cloud data exfiltration or building related detection rules.

analyzing-cobalt-strike-beacon-configuration

Extract and analyze Cobalt Strike beacon configuration from PE files

analyzing-cobaltstrike-malleable-c2-profiles

Parse and analyze Cobalt Strike Malleable C2 profiles with dissect.cobaltstrike (profiles and beacon-payload configs) and pyMalleableC2 (AST parsing) to extract HTTP/DNS transforms, URIs, headers, sleep/jitter, and injection behavior, then generate network detection signatures. Use when reverse-engineering a captured malleable profile or building detections against Cobalt Strike Beacon traffic.

analyzing-command-and-control-communication

Analyzes malware C2 communication over HTTP, HTTPS, DNS, and custom

analyzing-cyber-kill-chain

Analyzes intrusion activity against the Lockheed Martin Cyber Kill Chain

analyzing-disk-image-with-autopsy

Perform comprehensive forensic analysis of raw (dd), E01, or AFF disk images with Autopsy and The Sleuth Kit, recovering deleted files, examining metadata and embedded artifacts, keyword searching, and building investigation timelines with visual reports. Use for structured analysis of a forensic disk image or when stakeholders need visual reports from evidence.

analyzing-dns-logs-for-exfiltration

Analyzes DNS query logs to detect data exfiltration via DNS tunneling,

Skills relacionados