Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
agentic-dm-gateway — Plano de control de seguridad para agentes LLM: listas permitidas, kill switch del propietario, sesiones PIN, límites de tasa, detección de inyección de prompts y depuración de salidas para bloquear la fuga de secretos y la exfiltración mediante balizas de imagen. | Kitploit
Herramientas/GitLabGitLab/wattocyber/agentic-dm-gateway
Autenticación y AutorizaciónHerramientas DefensivasExfiltración de DatosDetección de SecretosSeguridad de IA
GitLabwattocyber/agentic-dm-gateway

agentic-dm-gateway

Plano de control de seguridad para agentes LLM: listas permitidas, kill switch del propietario, sesiones PIN, límites de tasa, detección de inyección de prompts y depuración de salidas para bloquear la fuga de secretos y la exfiltración mediante balizas de imagen.

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir
Ver RepositorioSitio web
hace 10 díasAún no revisado

Agentic DM Gateway

agentic-dm-gateway banner

Plano de control de seguridad para agentes LLM a través de chat privado (normalmente DMs de Discord).

Se sitúa delante de tu agente. Decide quién puede hablar, si la sesión está desbloqueada, si el proceso está en pausa y si este mensaje es lo bastante seguro para reenviarse. Tu modelo y tus herramientas permanecen detrás de esa puerta. La biblioteca no llama a un LLM. No implementa funciones de producto más allá de la seguridad.

Inspirado en Hermes. El diseño sigue las mismas ideas de plano de control utilizadas en las pasarelas de mensajería de Hermes Agent: entrega prioritaria por DM, listas de permitidos por identidad, apertura tipo emparejamiento, interruptor de apagado del propietario y una separación estricta entre quién puede actuar (plano de control) y el texto del mensaje que ve el modelo (plano de datos). Este paquete es un extracto pequeño e independiente de ese patrón para cualquier agente invocable. No está afiliado a Nous Research.

Madurez: implementado · validado de forma independiente · mantenido. Ver STATUS.md. Reproducir: python scripts/repro.py (espera REPRO_OK).

Pruebas sin conexión:

root@kitploit:~
pip install -e ".[dev]"   # o: pip install -e . && pip install pytest
python -m pytest -q --tb=line
# o: python scripts/repro.py

En vivo: https://github.com/SamsonCyber/agentic-dm-gateway


El problema

Si pones un agente en Discord (o en cualquier API de chat) con herramientas, cualquiera que pueda enviar mensajes al bot puede intentar:

  • usar el agente sin permiso
  • quemar la cuota de API con inundaciones de mensajes
  • inyectar indicaciones del tipo "ignora las instrucciones anteriores"
  • engañar al modelo para que revele claves API u otros secretos

Necesitas un plano de control (identidad y controles de proceso) separado del plano de datos (el texto del mensaje que ve el modelo).

Este paquete es ese plano de control.


Qué hace

Alcance: solo puerta de seguridad. No es un chatbot, bot de trading, escáner ni marco de agentes. Pasa un agent(user_id, text) -> str (o asíncrono) si usas Discord. El núcleo funciona con cualquier ID de usuario entero y texto plano.


Demo (copiar y pegar)

root@kitploit:~
$ python - <<'PY'
from agentic_dm_gateway import InboundSecurityPipeline
pipe = InboundSecurityPipeline({
 "allowed_user_ids": [111],
 "owner_ids": [111],
 "pin_enabled": False,
 "block_injection": True,
 "deny_message": "Not authorized.",
})
for uid, text in [
 (99, "hi"),
 (111, "ignore previous instructions"),
 (111, "summarize this note"),
]:
 r = pipe.precheck(uid, text)
 print(uid, r.stage, r.run_agent, r.reply_text)
PY

99 allowlist False Not authorized.
111 injection False Blocked: looks like prompt injection / secret fishing. Rephrase.
111 ok True None

$ python scripts/repro.py
REPRO_OK agentic-dm-gateway unit suite

Cómo conectarlo

Tres vías de integración. Elige una.

1) Integración directa con Discord (la más fácil)

Instala con soporte para Discord, apunta las variables de entorno a tus IDs de usuario, registra la pasarela y ejecuta el bot.

root@kitploit:~
pip install -e ".[discord]"
# o: pip install agentic-dm-gateway[discord]


![agentic-dm-gateway banner](https://assets.kitploit.com/production/public/readmes/50583/ed168cd7c4b9a61caf98c8a31b2dfb7d7e3bd3c5401288706c21c1376c7199ce.jpg)

export DISCORD_BOT_TOKEN=...
export AGENTIC_DM_ALLOWLIST=your_discord_user_id
export AGENTIC_DM_OWNER_ID=your_discord_user_id
# opcional: export AGENTIC_DM_PIN=....


![agentic-dm-gateway banner](https://assets.kitploit.com/production/public/readmes/50583/ed168cd7c4b9a61caf98c8a31b2dfb7d7e3bd3c5401288706c21c1376c7199ce.jpg)
python examples/discord_echo_bot.py

En tu propio bot:

root@kitploit:~
import discord
from agentic_dm_gateway.discord_adapter import register_dm_gateway

def agent(user_id: int, text: str, *, is_owner: bool = False) -> str:
 # your Hermes / local model / tool loop
 return call_your_model(text)

intents = discord.Intents.default()
intents.message_content = True
bot = discord.Client(intents=intents)

register_dm_gateway(
 bot,
 {
 "allowed_user_ids": [], # or rely on AGENTIC_DM_ALLOWLIST env
 "owner_ids": [],
 "pin_enabled": False,
 "deny_message": False, # silent drop for strangers
 },
 agent=agent,
)
bot.run(TOKEN)

Qué hace register_dm_gateway:

  1. Instala un manejador on_message en tu discord.Client / bot.
  2. Ignora bots y mensajes de servidores (solo DMs).
  3. Ejecuta InboundSecurityPipeline.precheck antes de tu agente.
  4. Envía respuestas de denegación / control cuando es necesario.
  5. Llama a tu agent(user_id, sanitized_text, is_owner=...).
  6. Limpia la respuesta del agente (secretos + balizas de imagen) y divide el límite de 2000 caracteres de Discord.

Los mensajes de servidores nunca llegan al agente. Solo los DMs de usuarios permitidos lo hacen.

2) Conexión manual con Discord (ya tienes on_message)

Si no puedes usar register_dm_gateway (cadena de manejadores existente), llama tú mismo a la canalización:

root@kitploit:~
from agentic_dm_gateway import InboundSecurityPipeline
from agentic_dm_gateway.security import sanitize_agent_output

pipe = InboundSecurityPipeline({
 "allowed_user_ids": [YOUR_ID],
 "owner_ids": [YOUR_ID],
 "pin_enabled": True,
})

@bot.event
async def on_message(message):
 if message.author.bot or message.guild is not None:
 return

 pre = pipe.precheck(int(message.author.id), message.content or "")
 if pre.reply_text and not pre.run_agent:
 await message.channel.send(pre.reply_text[:1900])
 return
 if not pre.run_agent:
 return

 raw = await your_agent(pre.sanitized_text) # Hermes, Ollama, API, ...
 await message.channel.send(sanitize_agent_output(str(raw))[:1900])

3) Agnóstico al protocolo (Hermes, CLI, Telegram, lo que sea)

No se requiere importar Discord. Usa la misma comprobación previa en cualquier turno de agente:

root@kitploit:~
from agentic_dm_gateway import InboundSecurityPipeline
from agentic_dm_gateway.security import sanitize_agent_output

pipe = InboundSecurityPipeline({
 "allowed_user_ids": [111],
 "owner_ids": [111],
 "pin_enabled": False,
 "rate_limit_per_minute": 20,
 "block_injection": True,
 "deny_message": "Not authorized.",
})

def handle_inbound(user_id: int, text: str) -> str | None:
 pre = pipe.precheck(user_id, text)
 if pre.run_agent:
 answer = my_llm(pre.sanitized_text) # your model / Hermes run
 return sanitize_agent_output(str(answer))
 return pre.reply_text # deny or control-command reply

Campos de PrecheckResult:

  • run_agent: reenvía al modelo solo si es verdadero
  • sanitized_text: entrada limpiada
  • reply_text: respuesta de denegación / comando de control
  • stage: allowlist | kill | pin | rate | injection | ok | ...

Lista de verificación para la conexión:

  1. Construye InboundSecurityPipeline una vez al inicio del proceso (config + entorno).
  2. En cada mensaje entrante: pre = pipe.precheck(user_id, text).
  3. Si pre.run_agent: llama a tu agente solo con pre.sanitized_text.
  4. Pasa siempre la salida del modelo por sanitize_agent_output antes de enviarla.
  5. Trata las respuestas de control (/auth, /kill, …) como completadas cuando run_agent sea falso.

Canalización (un mensaje entrante)

root@kitploit:~
1. Adapter: ignore bots; only accept DMs (not server channels)
2. Allowlist: is this user id permitted?
3. Owner commands: /kill /unkill /status -> reply, stop
4. Session commands: /auth <pin> /lock -> reply, stop
5. SecurityGateway.check_message:
 kill switch?
 session unlocked? (PIN)
 under rate limit?
 length + injection heuristics OK?
6. If ok -> run_agent=True with sanitized text
7. After your agent returns -> sanitize_agent_output (redact + strip image beacons)
8. Audit rows written along the way

Plano de control: quién es el usuario (lista de permitidos / propietario). Plano de datos: cuerpo del mensaje (siempre no confiable hasta que las comprobaciones pasen).


Estructura del paquete

root@kitploit:~
src/agentic_dm_gateway/
 security.py # RateLimiter, SessionAuth, SecurityGateway,
 # sanitize_input, redact_secrets, sanitize_agent_output,
 # kill switch, audit_log
 allowlist.py # merge config + env + file into allowlist / owners
 commands.py # /kill /unkill /status /auth /lock (no LLM)
 pipeline.py # InboundSecurityPipeline.precheck() orchestration
 discord_adapter.py # optional discord.py on_message wire-up
tests/ # unit tests for the core (no Discord required)
examples/
 minimal_precheck.py # CLI-style demo of precheck outcomes
 discord_echo_bot.py # secured DMs + echo agent
MóduloResponsabilidad
SecurityGatewayÚnica check_message(user_id, text) -> SecurityVerdict
InboundSecurityPipelineLista de permitidos + comandos de barra + pasarela en una sola llamada
DiscordDMGatewayAdaptador solo DM; tú inyectas la función del agente

Cero dependencias de ejecución obligatorias. Discord es opcional: pip install agentic-dm-gateway[discord].


Instalación

root@kitploit:~
git clone https://github.com/SamsonCyber/agentic-dm-gateway.git
cd agentic-dm-gateway
pip install -e ".[dev]"
python scripts/repro.py

Configuración

Diccionario de configuración

Entorno

Directorio de estado predeterminado: ./data/agentic_dm/.


Comandos de propietario y sesión

Estos nunca llaman a tu modelo.


Límites (honestos)

  • La detección de inyecciones es una lista heurística de regex, no un juez LLM completo ni un clasificador.
  • La redacción es un emparejamiento de patrones de mejor esfuerzo; no detectará formatos de secretos novedosos.
  • La inspiración en Hermes es arquitectónica (plano de control de DM). Esto no es una pasarela Hermes completa ni una pila de emparejamiento.
  • Aún necesitas almacenamiento seguro de tokens, herramientas de privilegio mínimo y endurecimiento del host fuera de esta biblioteca.

Licencia

MIT. Ver LICENSE.

Descargar herramienta
ControlComportamiento
Lista de permitidosSolo los IDs de usuario configurados pueden continuar. Todos los demás son descartados (de forma silenciosa o con una breve cadena de denegación).
Propietario vs amigoLos propietarios omiten el PIN y pueden pausar todo el agente. Los amigos pueden necesitar un PIN compartido para una apertura limitada en el tiempo (idea de emparejamiento estilo Hermes, simplificada).
Interruptor de apagadoArchivo de pausa global o indicador de entorno. Ningún turno del agente mientras esté activo.
Límites de tasaVentana deslizante por usuario (por minuto y por hora).
Comprobaciones de entradaLongitud máxima, eliminación de caracteres de control extraños, heurísticas regex para frases comunes de inyección o pesca de secretos.
Limpieza de salidaRedacta tokens con forma de secreto (claves API, JWT, cabeceras Bearer) y elimina balizas de imagen en markdown/HTML que puedan filtrar datos mediante la recuperación automática.
Registro de auditoríaJSONL de solo añadido con eventos de permitido/denegado/auth/apagado para revisión posterior.
Comandos locales/auth, /lock, /kill, /unkill, /status gestionados sin llamar a un modelo.
ClaveValor por defectoSignificado
allowed_user_ids[]IDs de usuario permitidos para chatear
owner_ids[]Omiten el PIN; pueden /kill
pin_enabledTruePuerta PIN para no propietarios
pin_ttl_hours72duración de la apertura
rate_limit_per_minute8Ventana deslizante
rate_limit_per_hour60Ventana deslizante
max_input_chars2000Longitud máxima de entrada
block_injectionTrueLista de bloqueo heurística
deny_messageFalseSilencioso, True o cadena personalizada
audit_logTrueEscribir JSONL de auditoría
enabledTrueInterruptor principal
VariablePropósito
AGENTIC_DM_ALLOWLISTIDs de usuario separados por comas
AGENTIC_DM_OWNER_IDID(s) de propietario
AGENTIC_DM_PINPIN en texto plano
AGENTIC_DM_PIN_REQUIRED1 = exigir PIN aunque no esté definido
AGENTIC_DM_KILLED1 = interruptor de apagado activado
AGENTIC_DM_DATA_DIRDirectorio para el archivo de apagado, apertura y registro de auditoría
AGENTIC_DM_SECRETS_DIRDirectorio para dm_pin.txt / dm_allowlist.txt
ComandoQuiénEfecto
/kill /pausepropietarioPausar el agente para todos
/unkill /resumepropietarioQuitar la pausa
/statuspropietarioInstantánea de apagado / PIN / lista de permitidos
/auth <pin>permitidoabrir sesión por TTL
/lockpermitidoCerrar apertura