🛡️ dsh-defend
September 3, 2026 · View on GitHub
🛡️ dsh-defend
- Canal 1024 store:
npm i -g dsh1024una vez, luegodsh1024 plugin --profile web add dsh-defend(cuenta para el ranking de instalaciones de deepseek1024.com).
Defensa contra inyección de prompts, jailbreak y fugas de secretos para DeepSeek Harness.
Las reglas deciden lo conocido. La intercepción decide el resto — y todo queda auditado.
Compatibilidad
| Superficie | Estado |
|---|---|
| Harness | DeepSeek Harness 0.1.2-alpha.5 (rangos de peer >=0.1.0-rc.8 <0.2.0; adaptado el 2026-09-02): el sobre de sesión conserva su campo ignorable solo para compatibilidad de lectura de logs almacenados - Session.append aún no puede estamparlo, por lo que el comportamiento de la puerta no cambia. |
| Node | ^22.19.0 || >=24.0.0 |
| Plataformas | Todas (solo host; sin código nativo, sin red) |
| Modelo | Cualquiera (la detección ocurre antes de que el contenido llegue al modelo) |
Qué obtienes
dsh-defend coloca dos capas independientes delante del agente:
- Guardia de borrado destructivo — la forma ejecutable de la lección del postmortem 8·14/8·16. En
tools/pre-execute, los comandos de shell que borran recursivamente se rechazan salvo que cada destino sea una ruta absoluta explícita dentro del espacio de trabajo de la sesión y fuera de los prefijos protegidos (configuración del home,.dsh/.claude, directorios del sistema). Los marcadores de dry-run (-WhatIf,--dry-run,git clean -n) pasan, porque son exactamente la verificación que la lección exige. - Capa de detección — portada de cuatro activos upstream (todos Apache-2.0, véase THIRD_PARTY_NOTICES.md): 25 reglas de Prompt-Injection-Payloads, 25 patrones de Jailbreak-Detector mediante un autómata Aho-Corasick en TypeScript puro, 12 gramáticas de secretos de Secret-Key-Leaker-Detect más las referencias públicas de los emisores, y el Prompt-Attack-Dataset conservado textualmente como referencia de regresión.
Tres puntos de intercepción, un mismo modelo de decisión:
| Punto | Contenido escaneado | Decisión |
|---|---|---|
agent/pre-step | mensajes entrantes | allow → next(); ask → aprobación; block → rechazar el paso |
tools/pre-execute | argumentos de herramientas | allow → next(); ask → aprobación; block → deny |
tools/post-execute | resultados de herramientas | allow → next(); ask → aprobación; block → feedback correctivo |
Por defecto: ask para cada familia, block para secretos critical (la semántica de interrupción inmediata del upstream). Sin respondedor de aprobación = fallo cerrado. Todo paso a través llama a next() — los plugins de política aguas abajo nunca se cortocircuitan.
Inicio rápido
# 1. instala el bundle en tu perfil
dsh plugin --profile web add "github:PerryLink/dsh-defend#main"
# o desde npm (versiones publicadas)
dsh plugin --profile web add dsh-defend
# 2. reinicia y verifica la fila
dsh --profile web --dump-config | grep -A3 'id: dsh-defend'
Instalación y desinstalación
- Canal git (último
main):dsh plugin --profile web add "github:PerryLink/dsh-defend#main"— el scriptpreparecompila solo con dependencias de producción. - Canal npm (versiones publicadas):
dsh plugin --profile web add dsh-defend. - Canal tarball:
pnpm packen este repositorio y luegodsh plugin --profile web add ./dsh-defend-<version>.tgz. - Desinstalar:
dsh plugin --profile web remove dsh-defend(o elimina la fila del parche del perfil).
Configuración
Todos los ajustes son campos Config de Schemastery (modificables desde cordis.yml). Una sobrescritura dirigida por id reemplaza toda la fila — vuelve a declarar cada clave. cordis.patch.yml documenta cada clave en línea.
| Clave | Por defecto | Significado |
|---|---|---|
enabled | true | Interruptor maestro de ambas capas |
action | deny | Acción de la guardia de borrado destructivo (deny / ask) |
toolNames | ['bash','persistent-bash','terminal-bash'] | Nombres de herramientas cuyos argumentos revisa la guardia |
detection.enabled | true | Interruptor de la capa de detección |
detection.maxScanChars | 10000 | Límite de escaneo por intercepción (solo la cabeza) |
detection.normalizeUnicode | true | Normalizar NFKC el texto antes de escanear (bloquea el bypass de Unicode lookalike) |
detection.secretMinEntropy | 3.0 | Entropía de Shannon mínima (bits/carácter) para admitir un acierto de secreto; 0 desactiva |
detection.injectionAction | ask | Familia inyección: allow / ask / block |
detection.jailbreakAction | ask | Familia jailbreak: allow / ask / block |
detection.secretAction | ask | Familia secretos: allow / ask / block |
detection.secretBlockCritical | true | Los secretos critical bloquean siempre, sin importar secretAction |
detection.audit | true | Escribir eventos de auditoría defend/detection |
detection.allowUnmarkedAudit | false | Seguir escribiendo auditoría de sesión en hosts cuyo Session.append es anterior al marcador ignorable (todas las líneas publicadas hasta ahora), aceptando el riesgo de sesiones irrecuperables |
detection.maxReportEntries | 200 | Límite del búfer circular en memoria |
registerCommand | true | Registrar el comando /defend |
registerTool | true | Registrar la herramienta defend_report |
Herramientas y superficies
| Superficie | Tipo | Notas |
|---|---|---|
defend_report | herramienta | Totales (registrados/bloqueados/preguntados), conteos por familia y las 20 coincidencias más recientes — nunca texto coincidente |
/defend | comando | El mismo resumen como texto |
agent/pre-step | listener | Escaneo de mensajes entrantes (enter/reject) |
tools/pre-execute | listener | Escaneo de argumentos (deny/ask) + la guardia de borrado destructivo |
tools/post-execute | listener | Escaneo de resultados (feedback de bloqueo) |
Permisos y datos
- Permisos: las decisiones
askvan por la costura oficial de aprobación; nada se reimplementa ni se esquiva. El plugin declarasession:appendynetwork:noneen su manifiesto de workshop. - Datos: nada se guarda en disco; el búfer circular del informe vive en memoria y está acotado. Sin peticiones de red, sin subprocesos.
- Registro de sesión: los eventos
defend/detectionllevan id de regla, familia, categoría, severidad, tipo de secreto, decisión y hechos del escaneo — el texto coincidente nunca llega al registro, y las coincidencias de secretos son solo de tipo por construcción.
Límites de seguridad
- Detección, no ejecución. La guardia y la capa de detección solo producen decisiones deny/ask/block en las costuras oficiales; el sandbox y los sistemas de aprobación siguen siendo la autoridad de ejecución.
- Fallo cerrado. Sin respondedor de aprobación, sin sesión o sin superficie de servicios, se degrada a la decisión más estricta — nunca al paso silencioso.
- Ningún contenido sale del proceso. El escaneo es local; los eventos de auditoría están sanitizados; los secretos nunca se registran, muestran ni reportan.
- Trabajo acotado. Límites de escaneo, una coincidencia por regla y cotas del búfer circular impiden que entradas hostiles consuman recursos sin límite.
Limitaciones conocidas
- Huecos de detección. La librería de reglas cubre los vocabularios portados y sus variantes tolerantes; frases nuevas, codificaciones Unicode lookalike (la normalización NFKC está como trabajo futuro) y ataques multi-paso pueden evadirla. La referencia fija el piso medido (27/28 en el dataset upstream) para que las regresiones sean visibles.
- Sin veredictos a nivel de modelo.
dsh-defendes determinista; nunca llama a un modelo y no puede juzgar intención nueva. - El rechazo de mensajes es silencioso. El reject de
agent/pre-stepno lleva razón al modelo (la costura no tiene campo de razón); el evento de auditoría registra los hechos de la regla. - Auditoría de sesión y el marcador
ignorable. Los appends de auditoría solicitan el marcadorignorable: truedel envelope para que cualquier build del harness pueda cargar el registro. Todas las líneas publicadas hasta ahora (0.1.0-rc.1–0.1.0-rc.8,0.1.1-rc.1–0.1.1-rc.2) lo descartan en silencio — el evento queda sin marcar y hace la sesión irrecuperable en builds más estrictos, por lo que dsh-defend detecta esos hosts en el primer uso (precomprobación de la versión del peer + sondeo del envelope devuelto) y desactiva la auditoría del registro de sesión con una advertencia única. Establecedetection.allowUnmarkedAudit: truepara reactivarla; las filasdefend/detectionexistentes sin marcar pueden repararse añadiendo"ignorable": truea sus envelopes. Véase issue #2.
Desarrollo
pnpm install # node ^22.19 || >=24
pnpm run typecheck # tsc: src + tests contra el checkout local del harness
pnpm run typecheck:ci # tsc contra los tipos publicados 0.1.2-alpha.5 (sin paths)
pnpm test # vitest: 75 tests, 8 suites (incluye la referencia de detección)
pnpm run build # bundle tsdown + declaraciones tsc (lib/)
pnpm run verify:self-contained # las especificaciones de dependencias resuelven desde el registry
pnpm run verify:artifacts # cara ESM construida + archivos publicados presentes
pnpm pack # el tarball publicado
Benchmark
El benchmark red-team (P/R/F1 por categoría sobre 105 muestras, más el suelo 27/28 del fixture) está en benchmark/RESULTS.md; regenéralo con node --experimental-strip-types benchmark/run.mjs (cero dependencias nuevas, sin build).
Topics
dsh, dsh-plugin, deepseek-harness, deepseek, cordis, security, prompt-injection, jailbreak, secret-scanning, ai-safety
Contributors
- @PerryLink — creador y mantenedor: guardia de borrado destructivo, portado de detección de cuatro activos, cableado de intercepción, superficie de auditoría y la documentación en cinco idiomas.
- @cuohua — el informe preciso sobre eventos
defend/detectionescritos sin marcar que hacen las sesiones irrecuperables en builds más estrictos (#2); la detección de capacidad de host en runtime y la disciplina del marcadorignorablederivan directamente de ese análisis.
PerryLink DSH Plugin Family
Este proyecto es uno de los 33 complementos de DeepSeek Harness mantenidos por PerryLink. Si este te ayuda, probablemente los demás también:
| Plugin | One-liner |
|---|---|
| dsh-dsh-auto-review | Auto-revisión de segundo modelo en la cadena de aprobación, con cierre en fallo por defecto |
| dsh-dsh-background-agents | Agentes hijos en segundo plano durables con barra lateral de UI web, mensajería e interrupción |
| dsh-dsh-budget | Gobernanza de costes para DeepSeek Harness: presupuestos, carbono y latencia en un panel. |
| dsh-dsh-checkpoint-rewind | Equivalente a /rewind de Claude Code: instantáneas, bifurcaciones de sesión, restauración de un solo uso |
| dsh-dsh-claude-move | Migra sesiones, memoria, habilidades y CLAUDE.md de Claude Code a DSH |
| dsh-dsh-click | Control de escritorio nativo multiplataforma para DeepSeek Harness — Windows primero. |
| dsh-dsh-composer-history | Historial de entrada estilo terminal para el compositor web: flechas, búsqueda Ctrl+R |
| dsh-dsh-data-quality | Comprobaciones de calidad de datasets y verificación de citas (el puente numérico opcional consumido aquí) |
| dsh-dsh-doublecheck | Guardián de disciplina de ingeniería: interrogatorio de requisitos, puertas de pruebas, revisión adversaria |
| dsh-dsh-draw | Enrutamiento unificado de generación de imágenes estáticas para DeepSeek Harness. |
| dsh-dsh-fast | Diagnóstico de rendimiento de solo lectura para DeepSeek Harness. |
| dsh-dsh-fund-research | Informes de investigación deterministas para fondos mutuos públicos chinos |
| dsh-dsh-github | Integración de PR/issues de GitHub para DSH, cada escritura controlada por aprobación |
| dsh-dsh-industry-research | Orquestación de investigación sectorial que sella sus entregables mediante el ctx.researchReport.assemble de este plugin |
| dsh-dsh-library | Base de conocimiento documental local para DeepSeek Harness. |
| dsh-dsh-local-ai | Integración de modelos locales (Ollama) para DeepSeek Harness. |
| dsh-dsh-lsp-actions | Diagnósticos, formato, autocompletado, acciones de código y renombrado LSP sobre servidores de lenguaje |
| dsh-dsh-mask | Middleware de enmascaramiento de PII: anonimiza en el límite del modelo, restaura en la capa de visualización |
| dsh-dsh-mcp-panel | Panel de tiempo de ejecución MCP de solo lectura: comando /mcp + pestaña Settings con estado, herramientas y errores |
| dsh-dsh-memento | Memoria entre sesiones controlada por aprobación: costura ctx.memory + SQLite + herramienta de memoria |
| dsh-dsh-observe | Exportador de observabilidad OpenTelemetry y Langfuse para DeepSeek Harness. |
| dsh-dsh-output-styles | Cambio de estilo en tiempo de ejecución equivalente a outputStyles de Claude Code |
| dsh-dsh-permission-rules | Reglas de permisos declarativas allow/deny/ask estilo Claude Code con auditoría |
| dsh-dsh-plugin-guide | Base de conocimiento de desarrollo de plugins como habilidad de agente bajo demanda |
| dsh-dsh-research-report | Motor de informes de investigación verificables con evidencia direccionada por contenido |
| dsh-dsh-score | Puntuación de calidad multidimensional para plugins de DeepSeek Harness. |
| dsh-dsh-session-pin | Fija sesiones en la barra lateral web con orden durable |
| dsh-dsh-session-sync | Sincronización de sesiones entre dispositivos para DeepSeek Harness — un espejo git dedicado de tu almacén de sesiones. |
| dsh-dsh-skill-pack-security | Paquete de habilidades de auditoría de seguridad: escaneo de secretos, revisión de dependencias y cadena de suministro |
| dsh-dsh-talk | Bucle de sesión con voz para DeepSeek Harness: háblale y escucha su respuesta. |
| dsh-dsh-test-drive | Pruebas de instalación y humo aisladas para plugins de DeepSeek Harness. |
| dsh-dsh-translate | Traducción de parámetros entre proveedores y reparación determinista de JSON para DeepSeek Harness. |
License
Apache License 2.0 © 2026 dsh-defend contributors
Instalar desde el mercado de DSH Desktop
Todos los plugins de PerryLink pueden explorarse en el mercado integrado de DSH Desktop: Market → Sources → add source → pegar https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.json → seleccionarlo. La instalación sigue pasando por la verificación de identidad npm del mercado y tu confirmación.