CreaRack-SL

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:

  • content (string) — contenido del chunk tal como se recuperó

Retorna:

  • content (string) — contenido saneado
  • flags (string[]) — lista de defensas disparadas ('secret', 'injection'), para auditoría y debugging

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:

  • ignore (all|the)? (previous|above|prior) (instructions|prompts)
  • disregard (the|all)? (previous|above)
  • forget (everything|all|the above)
  • you are now ..., new instructions:, system prompt:, </system>, </assistant>, </user>

Captura variantes con espacios y es case-insensitive.

Integración

Se aplica en dos funciones generadoras de prompt:

  • buildHelpPrompts(chunks, lang) — asistente de ayuda in-app (línea ~803)
  • buildOraclePrompts(chunks, lang, history) — tutor conversacional interno (línea ~901)

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

  • ✅ TypeScript compilation (tsc --noEmit)
  • ✅ Smoke tests:
    • Redacta Google API key (AIza...) → [REDACTED_KEY]
    • Redacta Bearer token → Bearer [REDACTED]
    • Redacta GitHub PAT (ghp_...) → [REDACTED_TOKEN]
    • Envuelve “ignore previous instructions” → marcadores <<DATOS NO CONFIABLES>>
    • Sin falsos positivos: respeta IP 192.168.1.1, email de staff (usuario@crearack.local)

Riesgo de falso positivo

  • Muy bajo para secretos: los patrones son específicos de proveedores conocidos (OpenAI, Google, GitHub, Slack).
  • Muy bajo para inyección: la regex es conservadora (requiere palabras clave explícitas como “ignore”, “system prompt”, no patrones genéricos como “the”).

Próximos pasos

  • Considerar redacción de PII si el corpus crece más allá de equipos internos.
  • Ampliar patrones de secretos si se integran nuevos proveedores (AWS keys, etc.).
  • Auditar logs de flags para detectar falsos positivos en producción.

Véase también

  • [[concept—security—prompt-injection]]
  • [[concept—security—secret-management]]
  • [[entity—biblioteca—handler—archivo-core]]
  • [[feature—biblioteca—buildhelpprompts]]
  • [[feature—biblioteca—buildoracleprompts]]