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
matchlock — Sandbox de microVM efímero para agentes de IA con listas de permitidos de red, inyección de secretos mediante proxy MITM y aislamiento a nivel de VM. Arranca en menos de un segundo, compatible con SDKs de Go/Python/TypeScript. | Kitploit
Herramientas/GitHubGitHub/jingkaihe/matchlock
Seguridad de ContenedoresVirtualización de SeguridadSeguridad de RedesSeguridad en la NubeDevSecOpsDetección de SecretosSeguridad de APIsSeguridad de IA
GitHubjingkaihe/matchlock

matchlock

Sandbox de microVM efímero para agentes de IA con listas de permitidos de red, inyección de secretos mediante proxy MITM y aislamiento a nivel de VM. Arranca en menos de un segundo, compatible con SDKs de Go/Python/TypeScript.

Ver Repositorio
611376hace 1 mesRevisado por Kitploit

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

Matchlock

Experimental: Este proyecto aún está en desarrollo activo y sujeto a cambios importantes.

Matchlock es una herramienta CLI para ejecutar agentes de IA en microVMs efímeras, con listas de permisos de red, inyección de secretos a través de un proxy MITM y aislamiento a nivel de VM. Tus secretos nunca entran en la VM.

¿Por qué Matchlock?

Los agentes de IA necesitan ejecutar código, pero darles acceso sin restricciones a tu máquina es un riesgo. Matchlock te permite darle a un agente un entorno Linux completo que arranca en menos de un segundo, aislado y desechable.

Cuando pasas --allow-host o --secret, Matchlock sella la red; solo el tráfico hacia hosts explícitamente permitidos pasa, y todo lo demás queda bloqueado. Cuando tu agente llama a una API, las credenciales reales se inyectan en pleno vuelo por el host. El sandbox solo ve un marcador de posición. Incluso si el agente es engañado para ejecutar algo malicioso, tus claves no se filtran y no hay a dónde ir los datos. Dentro, el agente obtiene un entorno Linux completo para hacer lo que necesite. Puede instalar paquetes, escribir archivos y desordenar. Fuera, tu máquina no siente nada. Los montajes de superposición de volúmenes son instantáneas aisladas que desaparecen cuando terminas. Misma CLI y mismo comportamiento tanto si estás en un servidor Linux como en un MacBook.

Inicio rápido

Requisitos del sistema

  • Linux con soporte KVM
  • macOS en Apple Silicon

Instalación

Consulta docs/install.md para obtener detalles completos de instalación.

Instalación rápida

El siguiente script detecta el sistema operativo e instala matchlock usando Homebrew en macOS y rpm/deb en distribuciones Linux basadas en Debian/RHEL.

root@kitploit:~
curl -fsSL https://raw.githubusercontent.com/jingkaihe/matchlock/main/scripts/install.sh | bash

# O instala una versión específica
curl -fsSL https://raw.githubusercontent.com/jingkaihe/matchlock/main/scripts/install.sh | bash -s -- --version 0.2.4

Homebrew

La instalación basada en Homebrew es compatible tanto en macOS como en Linux:

root@kitploit:~
brew tap jingkaihe/essentials
brew install matchlock

Debian / Ubuntu (.deb)

root@kitploit:~
sudo dpkg -i ./matchlock_<version>_linux_amd64.deb
sudo apt-get install -f
matchlock diagnose

Fedora / RHEL / CentOS Stream (.rpm)

root@kitploit:~
sudo dnf install ./matchlock_<version>_linux_amd64.rpm
matchlock diagnose

Si matchlock diagnose informa que falta la configuración del host, ejecuta:

root@kitploit:~
sudo matchlock setup linux

Para inscribir explícitamente a un usuario específico, ejecuta:

root@kitploit:~
sudo matchlock setup user <name>

Uso

root@kitploit:~
# Básico
matchlock run --image alpine:latest cat /etc/os-release
matchlock run --image alpine:latest -it sh
matchlock run --image alpine:latest --no-network -- sh -lc 'echo offline'

# Lista de permisos de red
matchlock run --image python:3.12-alpine \
  --allow-host "api.openai.com" python agent.py

# Mantener la interceptación activada incluso con una lista de permisos vacía,
# para que se puedan agregar/eliminar hosts en tiempo de ejecución.
matchlock run --image alpine:latest --rm=false --network-intercept
matchlock allow-list add <vm-id> api.openai.com,api.anthropic.com
matchlock allow-list delete <vm-id> api.openai.com

# Inyección de secretos (nunca entra en la VM)
export ANTHROPIC_API_KEY=sk-xxx
matchlock run --image python:3.12-alpine \
  --secret [email protected] python call_api.py

# Sandboxes de larga duración
matchlock run --image alpine:latest --rm=false   # imprime el ID de la VM
matchlock run --image nginx:latest -d             # igual que arriba, en modo separado
matchlock exec vm-abc12345 -it sh                # conéctate a ella
matchlock port-forward vm-abc12345 8080:8080     # reenvía host:8080 -> guest:8080

# Publicar puertos al inicio
matchlock run --image alpine:latest --rm=false -p 8080:8080

# Ciclo de vida
matchlock list | kill | rm | prune

# Construir desde Dockerfile (usa BuildKit-en-VM)
matchlock build -f Dockerfile -t myapp:latest .

# Pre-construir rootfs desde una imagen de registro (cachea para inicio más rápido)
matchlock build alpine:latest

# Gestión de imágenes
matchlock image ls                                           # Lista todas las imágenes
matchlock image rm myapp:latest                              # Elimina una imagen local
docker save myapp:latest | matchlock image import myapp:latest  # Importa desde tarball

SDK

Matchlock incluye SDKs para Go, Python y TypeScript para integrar sandboxes directamente en tu aplicación. Puedes lanzar VMs, ejecutar comandos, transmitir salida y gestionar archivos mediante programación.

Go

root@kitploit:~
package main

import (
	"context"
	"fmt"
	"os"

	"github.com/jingkaihe/matchlock/pkg/sdk"
)

func main() {
	ctx := context.Background()

	client, err := sdk.NewClient(sdk.DefaultConfig())
	if err != nil {
		panic(err)
	}
	defer client.Close(0)
	defer client.Remove()

	sandbox := sdk.New("alpine:latest").
		AllowHost("dl-cdn.alpinelinux.org", "api.anthropic.com").
		AddSecret("ANTHROPIC_API_KEY", os.Getenv("ANTHROPIC_API_KEY"), "api.anthropic.com")
	if _, err := client.Launch(sandbox); err != nil {
		panic(err)
	}
	if _, err := client.Exec(ctx, "apk add --no-cache curl"); err != nil {
		panic(err)
	}
	// La VM solo ve un marcador de posición: la clave real nunca entra en el sandbox
	result, err := client.Exec(ctx, "echo $ANTHROPIC_API_KEY")
	if err != nil {
		panic(err)
	}
	fmt.Print(result.Stdout) // imprime "SANDBOX_SECRET_a1b2c3d4..."

	curlCmd := `curl -s --no-buffer https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{"model":"claude-haiku-4-5-20251001","max_tokens":1024,"stream":true,
       "messages":[{"role":"user","content":"Explain TCP to me"}]}'`
	if _, err := client.ExecStream(ctx, curlCmd, os.Stdout, os.Stderr); err != nil {
		panic(err)
	}
}

Comportamiento de IP privadas en el SDK de Go (10/8, 172.16/12, 192.168/16):

  • Por defecto (sin configurar): las IP privadas se bloquean siempre que se envía una configuración de red.
  • Bloqueo explícito: llama a .WithBlockPrivateIPs(true) (o .BlockPrivateIPs()).
  • Permitir explícito: llama a .AllowPrivateIPs() o .WithBlockPrivateIPs(false).
root@kitploit:~
sandbox := sdk.New("alpine:latest").
	AllowHost("api.openai.com").
	AddHost("api.internal", "10.0.0.10").
	WithNetworkMTU(1200).
	AllowPrivateIPs() // anulación explícita: block_private_ips=false

// Interceptación de red del SDK (mutación de solicitud/respuesta, modelado del cuerpo, transformación de líneas de datos SSE)
sandbox = sandbox.WithNetworkInterception(&sdk.NetworkInterceptionConfig{
	Rules: []sdk.NetworkHookRule{
		{
			Phase:      sdk.NetworkHookPhaseBefore,
			Action:     sdk.NetworkHookActionMutate,
			Hosts:      []string{"api.openai.com"},
			SetHeaders: map[string]string{"X-Trace-Id": "trace-123"},
		},
		{
			Phase:  sdk.NetworkHookPhaseAfter,
			Action: sdk.NetworkHookActionMutate,
			Hosts:  []string{"api.openai.com"},
			BodyReplacements: []sdk.NetworkBodyTransform{
				{Find: "internal-id", Replace: "redacted"},
			},
		},
	},
})

Si usas client.Create(...) directamente (sin el builder), establece:

  • BlockPrivateIPsSet: true
  • BlockPrivateIPs: false (o true)

Para sandboxes completamente desconectados (sin NIC invitado / sin salida), usa:

  • CLI: --no-network
  • Builder de Go SDK: .WithNoNetwork()
  • Builder de Python SDK: .with_no_network()
  • Builder de TypeScript SDK: .withNoNetwork()

Python (PyPI)

root@kitploit:~
pip install matchlock
# or
uv add matchlock
root@kitploit:~
import os
import sys

from matchlock import Client, Sandbox

sandbox = (
    Sandbox("python:3.12-alpine")
    .allow_host(
        "dl-cdn.alpinelinux.org",
        "files.pythonhosted.org", "pypi.org",
        "astral.sh", "github.com", "objects.githubusercontent.com",
        "api.anthropic.com",
    )
    .add_secret(
        "ANTHROPIC_API_KEY", os.environ["ANTHROPIC_API_KEY"], "api.anthropic.com"
    )
)

SCRIPT = """\
# /// script
# requires-python = ">=3.12"
# dependencies = ["anthropic"]
# ///
import anthropic, os

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
with client.messages.stream(
    model="claude-haiku-4-5-20251001",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Explain TCP/IP."}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
print()
"""

with Client() as client:
    client.launch(sandbox)
    client.exec("pip install --quiet uv")
    client.write_file("/workspace/ask.py", SCRIPT)
    client.exec_stream("uv run /workspace/ask.py", stdout=sys.stdout, stderr=sys.stderr)

client.remove()

TypeScript

root@kitploit:~
npm install matchlock-sdk
root@kitploit:~
import { Client, Sandbox } from "matchlock-sdk";

const SCRIPT = `import Anthropic from "@anthropic-ai/sdk";

const anthropic = new Anthropic({
  apiKey: process.env.ANTHROPIC_API_KEY,
});

const stream = anthropic.messages
  .stream({
    model: "claude-haiku-4-5-20251001",
    max_tokens: 1024,
    messages: [{ role: "user", content: "Explain TCP/IP." }],
  })
  .on("text", (text) => {
    process.stdout.write(text);
  });

await stream.finalMessage();
process.stdout.write("\\n");
`;

const client = new Client();
try {
  const sandbox = new Sandbox("node:22-alpine")
    .allowHost("registry.npmjs.org", "*.npmjs.org", "api.anthropic.com")
    .addSecret("ANTHROPIC_API_KEY", process.env.ANTHROPIC_API_KEY ?? "", "api.anthropic.com");

  await client.launch(sandbox);
  await client.exec(
    "npm init -y >/dev/null 2>&1 && npm install --quiet --no-bin-links @anthropic-ai/sdk",
    { workingDir: "/workspace" },
  );
  await client.writeFile("/workspace/ask.mjs", SCRIPT);
  await client.execStream("node ask.mjs", {
    workingDir: "/workspace",
    stdout: process.stdout,
    stderr: process.stderr,
  });
} finally {
  await client.close();
  await client.remove();
}

Más ejemplos en el directorio examples/:

Arquitectura

root@kitploit:~
graph LR
    subgraph Host
        CLI["Matchlock CLI"]
        Policy["Policy Engine"]
        Proxy["Transparent Proxy + TLS MITM"]
        VFS["VFS Server"]

        CLI --> Policy
        CLI --> Proxy
        Policy --> Proxy
    end

    subgraph VM["Micro-VM (Firecracker / Virtualization.framework)"]
        Agent["Guest Agent"]
        FUSE["/workspace (FUSE)"]
        Image["Any OCI Image (Alpine, Ubuntu, etc.)"]

        Agent --- Image
        FUSE --- Image
    end

    Proxy -- "vsock :5000" --> Agent
    VFS -- "vsock :5001" --> FUSE

Modos de red

Plataforma

Documentación

  • Manual de ciclo de vida y limpieza
  • Interceptación de red
  • Interceptación VFS
  • Referencia para desarrolladores

Licencia

MIT

Descargar herramienta
DescripciónEjemplo
Transmite la respuesta de la API de Anthropic con inyección de secretos (Go)examples/go/basic/
Terminal interactivo con PTY usando ExecInteractive (Go)examples/go/exec_modes/
Inyecta clave API a través del hook de interceptación de red (Go)examples/go/network_interception/
Hooks de interceptación VFS para mutaciones de operaciones de archivos (Go)examples/go/vfs_hooks/
Transmite la respuesta de la API de Anthropic (Python)examples/python/basic/
Modos de ejecución: stream, pipe e interactivo (Python)examples/python/exec_modes/
Inyecta clave API a través del hook de interceptación de red (Python)examples/python/network_interception/
Hooks de interceptación VFS para mutaciones de operaciones de archivos (Python)examples/python/vfs_hooks/
Transmite la respuesta de la API de Anthropic (TypeScript)examples/typescript/basic/
Modos de ejecución: stream, pipe e interactivo (TypeScript)examples/typescript/exec_modes/
Inyecta clave API a través del hook de interceptación de red (TypeScript)examples/typescript/network_interception/
CLI de Claude Code en micro-VM con bootstrap de GitHubexamples/claude-code/
Claude Code con Docker dentro del sandbox mediante SDKexamples/claude-code-with-docker/
Claude Code con suscripción Claude Pro/Max en el sandboxexamples/claude-danger/
CLI de OpenAI Codex en micro-VM con bootstrap de GitHubexamples/codex/
Daemon de Docker dentro del sandbox con systemdexamples/docker-in-sandbox/
Chatbot Streamlit usando Agent Client Protocolexamples/agent-client-protocol/
Automatización del navegador con Kodelet y Playwright MCPexamples/playwright/
Modo
Mecanismo
LinuxProxy transparentenftables DNAT en puertos 80/443
macOSNAT (predeterminado)NAT integrado de Virtualization.framework
macOSInterceptación (con --allow-host/--secret)TCP/IP en espacio de usuario de gVisor en L4