tool_name_glob) y qué argumentos (cláusulas
args_match sobre campos JSONPath). Esta página es
la gramática precisa de ambos — qué coincide un patrón, qué no, y cómo cada operador
coacciona tipos — para que una regla que autoras en la consola se comporte exactamente
como la lees aquí.
El caso de uso titular: convertir un romo “bloquear shell.exec” en un quirúrgico
“bloquear shell.exec solo cuando el comando parece rm -rf”. El glob elige la
familia de herramienta; los operadores de argumento eligen la llamada peligrosa dentro de
ella.
Esta es la referencia de sintaxis. Para saber dónde viven estas cláusulas en una regla, el
orden de reglas y los veredictos, ve la referencia profunda de
Reglas del firewall. Para los campos de regla en sí, ve la
visión general de Firewall.
1. Dónde aplica esta sintaxis
Ambas formas se autoran en una regla de firewall, en la consola bajo/console/firewall
(las escrituras requieren Developer+). Nunca llamas al matcher directamente — el
gateway lo evalúa en cada llamada a herramienta contra la
política resuelta. Una regla coincide cuando
su superficie, su tool_name_glob, su glob de skill opcional, y sus cláusulas
args_match coinciden todos; gana la primera coincidencia.
2. Gramática de glob de nombre de herramienta
Eltool_name_glob es una gramática deliberadamente pequeña y predecible — no un regex
completo. Los patrones se coinciden distinguiendo mayúsculas/minúsculas (los nombres
de herramienta MCP son convencionalmente minúsculas-con-puntos, así que un plegado de
mayúsculas te sorprendería cuando copias un nombre de la pestaña Discovered tools).
* (o vacío) — coincide con cada herramienta
* (o vacío) — coincide con cada herramienta
Un patrón vacío o un
* solo coinciden con todas las herramientas. Úsalo en una regla
catch-all, o confía en el default_verdict de la política en su lugar.foo.* — coincidencia de prefijo
foo.* — coincidencia de prefijo
shell.* coincide con shell.exec, shell.read, shell.write. No coincide con
el shell desnudo (el punto es requerido — un glob de prefijo solo cubre hijos con
espacio de nombres).*.exec — coincidencia de sufijo
*.exec — coincidencia de sufijo
*.exec coincide con el shell.exec con espacio de nombres y con el exec
desnudo, sin espacio de nombres (las llamadas a función nativas del proveedor y los
servidores MCP que no usan espacios de nombres exponen herramientas bajo el verbo
desnudo, así que una regla de sufijo cubre ambas formas). El sufijo permanece anclado
en un punto o el inicio de la cadena, así que *.exec no coincide con
shell.execute.*.X.* — coincidencia media (infijo)
*.X.* — coincidencia media (infijo)
*.shell.* coincide con cualquier forma <server>.shell.<verb> —
local.shell.exec, byo.shell.run. Requiere al menos un carácter a cada lado del
infijo, así que *.shell.* no coincide con el shell desnudo ni con .shell.
solo. Solo la forma simétrica *.X.* se trata como un infijo; un patrón mixto como
foo.*.bar cae a coincidencia exacta.cualquier otra cosa — coincidencia exacta
cualquier otra cosa — coincidencia exacta
Cualquier patrón que no sea una de las cuatro formas comodín de arriba (incluyendo un
nombre de herramienta literal, o un combo malformado como
foo.*.bar) se compara como
una cadena exacta, distinguiendo mayúsculas/minúsculas.3. Cláusulas de argumento JSONPath
args_match es un conjunto de cláusulas, cada una un triple {path, op, value}. El
path es un JSONPath dentro del objeto de argumentos de la llamada a herramienta; op es
uno de siete operadores; value es contra qué comparar. Todas las cláusulas en una regla
se AND-ean juntas — cada cláusula debe coincidir para que la regla se dispare.
Subconjunto de JSONPath soportado
| Forma | Coincide |
|---|---|
$.foo | Una clave de nivel superior. |
$.foo.bar | Una clave anidada. |
$.foo[0] | Un elemento de array por índice. |
$.arr[1].k | Índice luego clave (combinaciones de lo anterior). |
$.*), filtros ($.foo[?(...)]),
slices ($.foo[0:2]) ni descenso recursivo ($..foo).
Fail-closed en el path. Si el path de una cláusula resuelve a nada — la clave falta,
los argumentos no son JSON válido, o el valor es del tipo equivocado para el operador —
esa cláusula evalúa a false, la regla no se dispara, y la evaluación cae a la
siguiente regla o al valor por defecto de la política. Un argumento malformado nunca
auto-deniega y nunca tumba el motor.
4. Operadores de argumento
Siete operadores, un conjunto cerrado. El validador de la consola y el motor en vivo comparten exactamente el mismo vocabulario, así que una cláusula que se guarda es una cláusula que se ejecuta.| Operador | Compara | Reglas de tipo |
|---|---|---|
eq | Igualdad exacta. | Tipado: string↔string, bool↔bool, o number↔number. Los tipos mixtos nunca coinciden. |
contains | Contención de subcadena. | Ambos lados deben ser strings; cualquier otra cosa es una no-coincidencia. Un valor vacío coincide con cualquier string. |
regex | Un patrón RE2 (tiempo lineal, sin retrorreferencias) contra un string. | El valor y el arg resuelto deben ser ambos strings. Un patrón inválido deshabilita la cláusula (nunca coincide). |
in | Pertenencia — el valor es igual a cualquier elemento de una lista. | El valor debe ser un array JSON; cada elemento compara con semántica eq. |
cidr_match | El valor resuelto es una IP dentro de la red dada. | El valor es una cadena CIDR (IPv4 o IPv6, p. ej. 10.0.0.0/8, fd00::/8); el arg debe parsearse como una IP. |
gt | Mayor-que, numérico. | Ambos lados deben coaccionar a un número. Un string de apariencia numérica no se coacciona — es una discrepancia de tipo (no-coincidencia). |
lt | Menor-que, numérico. | Misma regla solo-numérica que gt. |
5. Un ejemplo trabajado
Bloquea una exportación de base de datos destructiva, pero solo cuando apunta a una conexión de producción sobre un host de red privada:db.* acota la regla a la familia de herramientas de base
de datos; las tres cláusulas se AND-ean juntas así que el veredicto (un deny, digamos)
se dispara solo cuando la sentencia es destructiva y la conexión es uno de dos
destinos prod nombrados y su host cae en el rango privado 10.0.0.0/8. Una
db.query contra una conexión de dev en una IP pública pasa de largo esta regla sin
tocar.
6. Reglas de egress (host / CIDR)
El operadorcidr_match de arriba coincide con una IP que una herramienta reporta en sus
argumentos. Eso es diferente de una regla de superficie egress, que evalúa el destino
saliente que una herramienta realmente alcanza con una lista de permitidos o denegación de
host/CIDR — la defensa principal contra SSRF y
exfiltración de datos. Las reglas de egress usan
la misma notación CIDR pero viven en la superficie egress; ve
Reglas del firewall para el formato de la lista de egress.
Ningún preset trae reglas de egress CIDR por ti — el nivel de autonomía
tight deniega
los nombres de herramienta comunes con forma de fetch (http_fetch, fetch_url,
web_search, request), no rangos de red. Autora tu propia regla de denegación host/CIDR
cuando necesites fijar el egress a destinos específicos.7. Referencia rápida
Formas de glob
* todo · foo.* prefijo · *.exec sufijo (+ verbo desnudo) · *.X.*
infijo · cualquier otra cosa exacta. Distingue mayúsculas/minúsculas.JSONPath
$.foo · $.foo.bar · $.foo[0] · $.arr[1].k. Sin comodines, filtros, slices ni
descenso recursivo.Operadores de string
eq (tipado) · contains (subcadena) · regex (RE2) ·
in (pertenencia a lista).Operadores numéricos y de red
gt / lt (solo numérico, sin coerción de string) · cidr_match
(IPv4/IPv6 en rango).Relacionado
Reglas del firewall
El modelo de regla completo — superficies, orden, saneadores, secuencias y listas de
egress.
Llamadas a herramienta peligrosas
La amenaza contra la que defienden estas cláusulas, y cómo acotar una regla a ella.
Glosario de veredictos
Qué hacen
allow, audit, deny, sanitize y el resto una vez que una regla
coincide.¿Por qué se bloqueó esto?
Rastrea un bloqueo específico hasta la regla y cláusula que se disparó.
