Volver a la wiki

Saneo de chunks con defensa de inyección de prompt

Resumen

Tercera cherry-pick de ArcRift: nueva capa de seguridad en el MCP handler que recupera chunks del corpus antes de construir prompts para Gemma. Dos defensas de bajo riesgo de falso positivo (ambas siempre activas):

  1. Redacción automática de secretos — API keys (sk-*, AIza*), tokens Bearer, GitHub PAT (ghp_*), Slack (xox*) se sustituyen por placeholders ([REDACTED_KEY], [REDACTED_TOKEN]).
  2. Envuelto de inyecciones de prompt — patrones de “ignora instrucciones”, “sistema prompt:”, etc. se marcan como <<DATOS NO CONFIABLES>> para que el modelo no los obedezca como instrucciones.

Motivación

Un secreto en un chunk recuperado del corpus es siempre un error — nunca debe llegar al modelo LLM ni al usuario. Las inyecciones de prompt (data exfiltration, jailbreak) pueden malinterpretarse como instrucciones de sistema si no se marca explícitamente. Ambas defensas son idempotentes y no destructivas (no borran contenido legítimo).

Lo que NO hace

No redacta PII genérica (emails, IPs internas). El corpus de CreaRack es técnico y controlado internamente; redactar 192.168.1.1 o usuario@crearack.local provocaría muchos falsos positivos. Si en el futuro entra PII de clientes, se añadirá una capa opt-in aparte.

Implementación

Función: sanitizeChunk()

export function sanitizeChunk(content: string): { content: string; flags: string[] }

Parámetros:

Retorna:

Lógica:

  1. Itera sobre patrones de secretos (OpenAI, Google, Bearer, GitHub, Slack).
  2. Si coincide un patrón, redacta y añade flag 'secret'.
  3. Prueba expresión regular de inyección contra el contenido (ya parcialmente redactado).
  4. Si hay inyección, envuelve el bloque completo en marcadores <<DATOS NO CONFIABLES>> y añade flag 'injection'.
  5. Retorna contenido final + flags.

Patrones de secretos soportados

TipoPatrónReemplazo
OpenAI keysk-[A-Za-z0-9]{20,}[REDACTED_KEY]
Google APIAIza[A-Za-z0-9_-]{30,}[REDACTED_KEY]
Bearer tokenBearer [A-Za-z0-9._-]{20,} (case-insensitive)Bearer [REDACTED]
GitHub PATgh[ps]_[A-Za-z0-9]{30,}[REDACTED_TOKEN]
Slack tokenxox[baprs]-[A-Za-z0-9-]{10,}[REDACTED_TOKEN]

Patrón de inyección

Expresión regular que detecta:

Captura variantes con espacios y es case-insensitive.

Integración

Se aplica en dos funciones generadoras de prompt:

En ambas, cada chunk se pasa por sanitizeChunk() antes de concatenarse al bloque de contexto:

const contextBlocks = chunks
  .map(
    (c, i) =>
      `[${i + 1}] ${c.title} (${c.sourcePath || 'sin ruta'})\n${sanitizeChunk(c.content).content}`,
  )
  .join('\n\n---\n\n');

Verificación

Riesgo de falso positivo

Próximos pasos

Véase también

Subir