Skip to main content
Blog
Blog

Cazar bots que no quieren ser cazados: por dentro de un stack neuronal de detección en dos etapas

Cómo un stack neuronal de dos etapas caza stealth browsers, scrapers con proxy residencial y agentes LLM que pasan toda huella, y sus límites reales.

Jun 22, 2026 18 min read
Cazar bots que no quieren ser cazados: por dentro de un stack neuronal de detección en dos etapas

TL;DR

La mayor parte del tráfico automatizado es fácil de frenar. Una expresión regular sobre el user-agent y un CAPTCHA cazan la parte baja del mercado. El tráfico que importa no vive ahí. Los navegadores con parches stealth, los scrapers con proxy residencial y los agentes impulsados por LLM ejecutan motores de navegador reales, llevan huellas limpias y mueven un puntero como lo haría una persona. Una huella limpia no demuestra que haya un humano, y una dirección de centro de datos no demuestra que haya un bot.

Este es un informe de campo sobre un stack de detección construido para ese adversario: una capa de reglas determinista más dos modelos neuronales compactos, uno que lee señales de huella y de red y otro que lee comportamiento, combinados mediante un OR lógico. El embedding congelado del modelo de comportamiento separa bots de humanos casi a la perfección. Una búsqueda sobre 16 arquitecturas muestra que el techo de rendimiento viene de la señal, no del modelo. Y el resultado honesto: sobre la población de producción completa, con un presupuesto estricto de falsos positivos, el recall queda por debajo del listón que el stack supera en su distribución de entrenamiento, por razones de composición de la población más que de calidad del modelo.

Las señales de detección concretas, los nombres de las features y los umbrales se omiten a propósito, para que la ingeniería sea reproducible en espíritu sin convertirse en una guía de evasión.

El adversario contra el que merece la pena diseñar

Una regex sobre el user-agent y un CAPTCHA frenan la parte baja del mercado de la automatización y dejan pasar el resto. Los adversarios contra los que merece la pena construir no están en ese nivel inferior. Ejecutan Chromium real. Parchean la superficie de huella que leen las comprobaciones ingenuas. Se enrutan a través de espacio de direcciones residencial. Los más capaces son agentes de modelos de lenguaje que persiguen un objetivo a lo largo de un flujo de varios pasos en lugar de reproducir un guion fijo.

La propiedad que define a este adversario es que ningún observable por sí solo zanja la cuestión. Esta es la misma razón por la que los CAPTCHA ya no hacen un trabajo real contra la automatización motivada, y por la que los stealth browsers y navegadores antidetección existen como categoría de producto. No puedes leer la respuesta a partir de un solo valor. Tienes que combinar señales independientes y aceptar que cada una, por sí sola, se equivoca parte del tiempo.

El stack de detección: una capa determinista y dos modelos compactos

El stack decide si una visita está automatizada con una cascada de dos etapas precedida por una capa de reglas determinista.

  • Capa de reglas determinista. Codifica el puñado de condiciones que por sí solas constituyen una prueba de automatización.
  • Modelo 1, huella (MorphNet). Puntúa una única evaluación de página a partir de señales de dispositivo, navegador y red.
  • Modelo 2, comportamiento (GammaNet). Puntúa una sesión entera a partir de la telemetría de comportamiento, y toma la puntuación del primer modelo como entrada.

La etiqueta final es el OR lógico de los tres. Una visita se marca si la capa de reglas se dispara, o si cualquiera de los modelos se dispara. Esa estructura tiene una consecuencia que da forma a todo lo demás: como la capa de reglas ya caza los casos que puede probar, los modelos no tienen que hacerlo. Los modelos solo entrenan sobre el residual, el tráfico que las reglas no pueden zanjar, que es a la vez la parte difícil del problema y la parte en la que un modelo se gana su sitio.

El listón que se mantiene en todo momento es un recall de al menos 0.90 con una tasa de falsos positivos de como mucho 0.01, medido sobre tráfico de producción real a nivel de sesión.

Cómo se mantiene honesta la evaluación

Las cifras de abajo solo significan algo gracias a cómo está construida la evaluación, así que conviene enunciar las salvaguardas primero.

Los datos de entrenamiento y de evaluación son evaluaciones de página reales agrupadas en sesiones. Las etiquetas son deterministas, aplicadas solo cuando una señal constituye una prueba; cualquier cosa ambigua se deja sin etiquetar en lugar de adivinarla, lo que mantiene el ruido de etiquetas fuera de la verdad de referencia. Para las clases stealth que evaden la huella por construcción, la verdad de referencia proviene de un arnés controlado de generación de tráfico que ejecuta automatización conocida contra objetivos instrumentados, así que la etiqueta se conoce por procedencia en lugar de inferirse.

Tres salvaguardas contra fugas mantienen honestas las cifras reportadas:

  1. Las señales que lee la capa de reglas determinista se excluyen del entrenamiento del modelo, de modo que el modelo aprende el residual en lugar de volver a memorizar lo que las reglas ya cubren.
  2. Los eventos que anuncian directamente a un agente de automatización se eliminan del flujo de comportamiento antes de calcular las features, de modo que el modelo de comportamiento aprende la estructura de movimiento y de cadencia en lugar de la presencia de un tipo de evento revelador.
  3. La cascada se conecta con puntuaciones fuera de fold: la contribución del primer modelo al segundo es su puntuación validada de forma cruzada, nunca una predicción de un modelo que ya ha visto la sesión.

Cada partición es por sesión, nunca por fila, ya que varias evaluaciones comparten una sesión y una partición a nivel de fila dejaría que la misma sesión apareciera en ambos lados. Todos los resultados usan una semilla fija.

Modelo 1: MorphNet, el modelo de huella

El primer modelo lee aproximadamente 90 features por evaluación que describen la coherencia de la huella, las características de la capa de transporte y el contexto de red. La primera versión de producción era un conjunto de árboles con gradient boosting. Era preciso con el tráfico fácil, pesado de desplegar en una ruta de petición sensible a la latencia y difícil de introspeccionar. Se sustituyó por una red construida desde cero.

MorphNet le da a una red diminuta la forma expresiva de un conjunto de árboles: una reducción lineal aprendida hacia un espacio interno compacto, después activaciones por canal donde cada canal ajusta su propia curva de respuesta, después una capa de interacción de bajo rango que permite que pares de señales se modulen mutuamente, una lectura ponderada y un embudo corto hacia una única salida. El modelo entero tiene unos 6,500 parámetros y entrena en aproximadamente 25 segundos en la GPU de un portátil.

Dos fallos latentes en el primer borrador se detectaron en la revisión de diseño, antes de escribir nada de código de entrenamiento. Uno era un softmax terminal sobre una única salida, que es matemáticamente constante y no lleva gradiente, así que el modelo no podía aprender. El otro era una lectura de interacción que colapsaba a un vector constante, una capa muerta que no aporta nada. Una tercera lección vino del entrenamiento: la elección de la normalización es determinante. Las estadísticas en ejecución de la batch normalization bajaron el AUC de validación de 0.99 a 0.50, y la layer normalization es la opción correcta para el modelo de un solo ejemplo que corre en producción.

En una partición honesta a nivel de sesión, los resultados de MorphNet:

MétricaValor
AUC0.9994
Recall en el punto de operación0.9959
Recall en 5 semillas0.9962 ± 0.0007
Concordancia numérica inferencia-vs-entrenamientodentro de 5e-7

Cada semilla supera la puerta, y la concordancia entre el grafo de inferencia exportado y el framework de entrenamiento significa que el modelo servido es el modelo entrenado.

El contraste con el baseline antiguo es más marcado en el conjunto residual difícil, el tráfico que la capa de reglas no puede zanjar. En una partición de estrés reservada de 6,004 sesiones:

ModeloRecall en el conjunto residual difícil
Versión anterior con gradient boosting A0.139
Versión anterior con gradient boosting B0.039
MorphNet0.996

La reconstrucción no es una ganancia marginal en este tramo. Es la diferencia entre un modelo que funciona en los casos difíciles y dos que no.

Modelo 2: GammaNet, el modelo de comportamiento

El comportamiento es más difícil que la huella, así que el segundo modelo tiene más estructura. Lee 179 entradas de comportamiento agregadas que describen la forma de una sesión, y está construido en dos piezas.

La parte frontal es un encoder de autoencoder que mapea las entradas limpiadas y estandarizadas a través de una capa oculta hacia un latente de 32 dimensiones sobre la hiperesfera unidad. Este encoder se entrena una vez, sin etiquetas, y luego se congela. La parte trasera es una pequeña cabeza supervisada: cada canal latente pasa por una no linealidad aprendida y compacta, inicializada para que el entrenamiento comience desde la representación congelada, seguida de un embudo lineal corto hacia una única salida. El modelo tiene unos 14,000 parámetros, la mayoría de ellos en el encoder congelado y solo unos pocos cientos entrenables en la cabeza.

Congelar el encoder es la decisión que hace que este modelo se comporte. Un encoder entrenado para reconstruir generaliza al tráfico en vivo; uno entrenado para separar las clases con la mayor nitidez posible no lo hace. En una partición reservada a nivel de sesión, GammaNet alcanza un AUC de 0.9989 y un recall de 0.9964 en el punto de operación, a un pelo de un baseline de árboles reentrenado de cero sobre la partición idéntica. En una repetición en vivo contra bots conocidos, su recall solo del modelo fue del 99.4%, frente al 96.4% del modelo de comportamiento desplegado anteriormente.

El embedding de comportamiento separa casi a la perfección

El artefacto más llamativo del proyecto es la geometría del latente congelado de GammaNet. Unas 17,000 sesiones se mapearon a través del encoder para ver dónde caen bots y humanos. Se sitúan en regiones opuestas de la esfera.

MétricaValorQué significa
Pureza del vecino más cercano (k=1)99.6%Casi todo punto comparte clase con su vecino más cercano
Separación coseno de centroides-0.99Los centroides de bot y humano están casi antipodales en la esfera
Entropía local media (k=20)0.010Casi nada de mezcla de clases en los vecindarios locales

En la práctica no hay zona de confusión. Las clases se sitúan cerca de polos opuestos, la región entre ellas apenas contiene masa de probabilidad, y el modelo está seguro casi en todas partes.

La proyección de abajo hace tangible esa geometría: cada punto es una sesión mapeada a través del encoder congelado, y las variaciones sintéticas de estrés se alejan del grupo del campo real en lugar de fundirse con él. Arrástrala para rotarla.

Proyección UMAP 3D interactiva del embedding comportamental de GammaNet: 1000 variaciones sintéticas de bots realistas, coloreadas por la puntuación de GammaNet, frente al tráfico de campo real. Una vista de estrés de nivel 0 de la geometría latente, no etiquetas reales. Abrir vista completa

La separación no es obra de una sola dirección. Cuando se puntúa cada eje latente por su cuenta, el poder discriminativo se reparte por toda la representación, con una docena o más de ejes que llevan cada uno señal real en lugar de un solo eje haciendo el trabajo. Esa distribución importa para un modelo de seguridad. Una representación que concentrara su señal en un eje también concentraría el objetivo del adversario. Una distribuida no ofrece ese único punto sobre el que presionar.

La búsqueda de arquitecturas, y un muro

Este es el punto en el que un informe suele declarar la victoria. Pasó lo contrario: un intento de superar al modelo. Si 32 dimensiones separan las clases con esta limpieza, quizá un embedding más rico elevaría aún más el rendimiento en vivo.

La prueba fue una comparativa de 16 familias de modelos sobre el conjunto de features de comportamiento, evaluadas con una batería que incluía la tarea de producción en vivo. El conjunto fue deliberadamente amplio: autoencoders variacionales de varios tipos, objetivos supervisados contrastivos e hiperesféricos, encoders parametrizados por rotación y factorizados por grupos de features, backbones hipercomplejos de cuaterniones y octoniones, variantes de denoising y contractivas, y un transformer de auto-atención sobre bloques de features.

Volvieron dos hallazgos, y ambos fueron claros.

Primero, el techo en vivo es invariante a la arquitectura. Cada familia, desde un autoencoder atado simple hasta una red de octoniones o un transformer, cayó en una banda estrecha, y el mejor de ellos solo igualó al encoder existente. La sofisticación arquitectónica no movió el límite.

Segundo, una separación más nítida dentro de la distribución venía acompañada de una peor generalización en vivo. Los modelos con la partición más nítida en la distribución de entrenamiento, los objetivos contrastivos agresivos que alcanzaron recall perfecto sobre los datos de entrenamiento, estuvieron entre los más débiles con el tráfico en vivo. Sobre-separar la distribución de entrenamiento es sobreajuste con otro nombre, que es exactamente por lo que el encoder se congela en lugar de remodelarse a partir del clasificador.

Después, el control que zanjó la cuestión: descartar el embedding por completo y entrenar clasificadores directamente sobre las features en bruto. Un árbol con gradient boosting sin restricción, al que se le dan todas las features en bruto sin cuello de botella, un modelo lineal sobre las mismas features y el embedding compacto aterrizan todos esencialmente en el mismo AUC en vivo: un techo duro que medimos en lugar de suponer. El techo en vivo es una propiedad de lo que mides más que de cómo lo modelas. Ese es un resultado más útil que otra cifra decimal de AUC, porque dice, con evidencia, que más trabajo de modelado sobre las señales actuales es un callejón sin salida, y que el camino a seguir es una señal nueva e independiente.

Una nota a pie de página se convirtió en un modelo. Como los que mejor generalizaban eran las cabezas generativas, el equipo construyó una. VMFNet puntúa una sesión con una mezcla von Mises-Fisher por clase sobre la esfera, comparando la verosimilitud bajo una mezcla humana frente a una mezcla de bots. Con alrededor de un tercio del tamaño del stack de embedding anterior, alcanza el mismo techo de features en bruto. Las cabezas generativas generalizaron de forma más estable que las discriminativas, la misma lección que llevó a congelar el encoder.

Defensa en profundidad: capas que fallan de forma independiente

La precisión dentro de la distribución es por sí sola una garantía débil, así que cada modelo se sometió a red team interno contra perturbación de la entrada y telemetría parcial. Los presupuestos de perturbación se omiten, ya que esas cifras equivalen a una receta, pero el panorama cualitativo guía el diseño. El modelo de huella se degrada con elegancia bajo ruido de entrada moderado y tolera telemetría incompleta, que es lo que un modelo en la ruta de la petición necesita cuando a veces ve datos parciales.

La conclusión sobre la que actúa el diseño es que ningún modelo por sí solo debería cargar con el sistema. Por eso el stack es una cascada y no un único clasificador. Un adversario que degrada la evidencia más fuerte de un modelo todavía se enfrenta a la capa determinista y a un segundo modelo que lee una familia de señales completamente distinta, y la decisión final se dispara si lo hace cualquiera de los tres. La resiliencia aquí viene de mantener varias pistas no correlacionadas a la vez en lugar de una sola fuerte. Derrotar al stack significa derrotarlas a todas juntas.

Huella en producción

Como el stack se diseñó para la ruta de la petición desde el principio, la versión neuronal es tan ligera como precisa.

MedidaStack de árbolesStack neuronalCambio
Tamaño en disco (ONNX)6.465 MB0.079 MBunas 82x más pequeño
RAM de inferencia añadida+89 MB+14 MBunas 6.4x más ligero
Throughput0.56 M rows/s1.74 M rows/sunas 3x más rápido

La métrica que importa se mantiene firme mientras la huella cae cerca de dos órdenes de magnitud. El modelo de comportamiento desplegado entero ocupa 79 kilobytes, lo bastante pequeño como para tratarlo como insignificante frente al resto de la ruta de la petición.

Cobertura por clase, y la cifra honesta

En la evaluación de referencia, 5,997 bots etiquetados y 7,964 humanos extraídos de los registros de producción con particiones a nivel de sesión y salvaguardas contra fugas, la cascada desplegada caza cada clase de adversario con recall completo.

Clase de adversarioRecall del stack desplegado
Automatización básica100%
Stealth browsers difíciles100%
Agentes LLM100%
Stealth + parche de huella100%
Bots en vivo no mapeados100%

Eso incluye las clases difíciles: stealth browsers con huellas parcheadas, agentes de modelos de lenguaje y bots en vivo que se comportan como usuarios corrientes. Sesiones que un modelo anterior puntuaba cerca de cero ahora puntúan cerca de uno tras una corrección dirigida a la distribución de la que provenían.

Después, el resultado que mantiene honesto el trabajo. En el punto de operación estricto, el recall sobre la población de producción completa queda por debajo del listón que el stack supera en su distribución de entrenamiento. La razón merece enunciarse con claridad, porque no es un problema de calidad del modelo. La brecha tiene que ver con la composición de la población y el coste de un presupuesto estricto de falsos positivos. Una población humana real contiene grupos grandes cuyo tráfico se parece a la automatización con ese presupuesto, así que mantenerlo deja necesariamente recall sin recoger. La búsqueda de arquitecturas ya mostró que casi toda la señal separadora que contienen las features actuales se ha extraído. Cerrar la brecha restante exige una señal nueva e independiente, o puntos de operación específicos por población, en lugar de un mejor clasificador sobre las mismas entradas.

Qué significa esto para los equipos que operan detección

Quita las particularidades y unas pocas lecciones operativas se trasladan a cualquier equipo que intente separar humanos de automatización construida para parecer humana:

  1. Las comprobaciones solo de huella y solo de red pasan por alto al adversario que importa. Las clases que te cuestan dinero pasan esas comprobaciones por diseño. Las señales de comportamiento y de runtime son donde se separan.
  2. El techo es la señal, no el modelo. Cuando una búsqueda de modelos converge en la misma cifra a lo largo de 16 familias, más modelado no ayudará. La siguiente ganancia viene de una señal nueva e independiente capturada donde el bot realmente se ejecuta.
  3. Construye capas que fallen de forma independiente. Una cascada de una capa determinista más modelos no correlacionados es más difícil de evadir que un único clasificador fuerte, porque un atacante tiene que derrotarlas todas a la vez.
  4. Elige puntos de operación por población y por acción. Un único umbral global con un presupuesto estricto de falsos positivos deja recall sin recoger. Acota la decisión a la acción, y ajusta el presupuesto a quién estás protegiendo.

Aquí es también donde cside encaja operativamente. cside observa el runtime del navegador en tiempo real, captura el dispositivo y la IP real del cliente, expone señales de script en runtime y de automatización, lee la coherencia de la huella y la continuidad de la sesión, y marca agentes de IA y stealth browsers dentro de la página, y luego expone esas señales mediante una API para que puedas impulsar una decisión de permitir, monitorizar, retar o bloquear en tu propio flujo de trabajo. Esa telemetría de la capa del navegador es exactamente la señal independiente que se le agota a un stack solo de huella o solo de red, y la capa donde un humano, un bot bueno y un agente malicioso por fin dejan de parecerse. Para la mecánica de las señales que hay debajo de esa decisión, consulta la guía para detectar tráfico de agentes de IA y cómo bloquear agentes de IA en tu sitio web.

Más lecturas en cside

Las cifras y métricas de este informe provienen de artefactos de modelo en caché y de evaluaciones de tráfico de producción. Las señales de detección concretas, los nombres de las features y los umbrales de decisión se omiten a propósito.

Avneh
AI Researcher

Making machines learn. Applied math major currently developing the next generation of bot detection models at cside.

FAQ

Frequently Asked Questions

Porque los adversarios contra los que merece la pena diseñar ejecutan Chromium real, parchean la superficie de huella para que las comprobaciones ingenuas la lean como limpia y se enrutan a través de espacio de direcciones residencial. Una huella limpia no demuestra que haya un humano, y una dirección de centro de datos no demuestra que haya un bot. Ningún observable por sí solo zanja la cuestión, así que la detección tiene que combinar la coherencia de la huella, el contexto de red y el comportamiento en lugar de fiarse de una sola señal.

La detección por comportamiento puntúa una sesión entera a partir de cómo se mueve por tu sitio: la forma y la cadencia de las acciones en lugar de la identidad que dice tener. En el stack que se describe aquí, un autoencoder congelado mapea unas 179 entradas de comportamiento agregadas a un espacio latente de 32 dimensiones donde bots y humanos caen en regiones opuestas, y una pequeña cabeza supervisada lee esa geometría. El comportamiento es más difícil de falsificar de forma convincente que una cadena de user-agent o un único valor de huella, y por eso separa las clases difíciles.

En este problema, sí. Dos modelos compactos, de aproximadamente 6,500 y 14,000 parámetros, igualan o superan a un baseline pesado basado en gradient boosting mientras se despliegan con cerca de una ochentava parte del tamaño en disco. Una comparativa de 16 familias de modelos mostró que el techo en vivo es el mismo para un autoencoder simple y para un transformer. El límite proviene de la señal que recoges, no del tamaño ni de la sofisticación del clasificador, así que un modelo pequeño que cabe en la ruta de la petición es la opción práctica.

La composición de la población y el coste de un presupuesto estricto de falsos positivos. Con un presupuesto estricto de falsos positivos, el recall sobre la población de producción completa queda por debajo del listón interno estricto superado en la distribución de entrenamiento, aunque cada clase de adversario nombrada se detectó con recall completo en el conjunto de referencia (gold standard). Una población humana real contiene grupos grandes cuyo tráfico se parece a la automatización con ese presupuesto, así que un presupuesto estricto deja necesariamente recall sin recoger. Cerrar la brecha exige una señal nueva e independiente, no un mejor clasificador sobre las mismas entradas.

Monitoriza y Asegura tus Scripts de Terceros

Gain full visibility and control over every script delivered to your users to enhance site security and performance.

Comienza gratis, o prueba Business con una prueba de 14 días.

Interfaz del panel de cside mostrando monitorización de scripts y análisis de seguridad
Related Articles
Reservar una demo