--- language: - es license: mit tags: - cybersecurity - web-security - intrusion-detection - text-classification - pytorch - char-cnn - threat-hunting library_name: pytorch pipeline_tag: text-classification --- # BrosNet Un CNN liviano a nivel de caracteres que clasifica payloads de peticiones HTTP en categorías de ataque web.
**J2K Security Group** · I+D (Innovation & Development) Department *Working for innovation*
## Descripción del modelo BrosNet es un clasificador char-CNN que recibe una línea de petición HTTP o un payload crudo y devuelve la categoría de ataque con su puntaje de confianza. Está pensado para **triaje de seguridad**: ante una petición que se escapó de los filtros existentes (o que nunca fue bloqueada), te dice *qué tipo* de ataque es. Etiquetas (6 clases): | Etiqueta | Significado | |---|---| | `normal` | petición benigna | | `SQLi` | inyección SQL | | `XSS` | cross-site scripting | | `LFI` | inclusión local de archivos / path traversal | | `RCE` | ejecución remota de comandos / inyección de comandos | | `SSRF` | server-side request forgery | Acepta tanto un payload suelto (`""`) como una línea de petición completa (`"GET /login?user=admin' OR '1'='1 HTTP/1.1"`). ## Arquitectura CNN 1D a nivel de caracteres (multi-kernel), ~50k parámetros, checkpoint de 267 KB. Inferencia en microsegundos en CPU. | Componente | Valor | |---|---| | Tipo | char-CNN 1D (multi-kernel, max-pool adaptativo) | | Tamaño de vocabulario | 97 (ASCII imprimible) | | Longitud máxima de secuencia | 512 caracteres | | Dimensión de embedding | 32 | | Filtros por kernel | 64 | | Tamaños de kernel | (2, 3, 4, 5) | | Dimensión oculta | 128 | | Dropout | 0.3 | ## Rendimiento Entrenado con **241.953 muestras**, evaluado en un holdout del 20% (48.391 muestras). - Exactitud (accuracy) global: **99.90%** - Macro-F1: **0.9986** | Clase | Precisión | Recall | F1 | |---|---|---|---| | normal | 0.9997 | 1.0000 | 0.9998 | | SQLi | 0.9994 | 0.9984 | 0.9989 | | XSS | 0.9977 | 0.9963 | 0.9970 | | LFI | 0.9987 | 0.9998 | 0.9993 | | RCE | 0.9933 | 0.9995 | 0.9964 | | SSRF | 1.0000 | 1.0000 | 1.0000 | ## Datos de entrenamiento Entrenado desde cero con **241.953 muestras** de datasets públicos más un corpus privado de líneas de petición reales (anonimizadas). | Fuente | Contenido | Licencia / nota | |---|---|---| | [CSIC 2010 (HTTP Dataset)](https://www.isi.csic.es/dataset/) | ~74k peticiones web normales (clase normal) | Dataset público de investigación (CSIC); uso académico libre | | [SecLists](https://github.com/danielmiessler/SecLists) | payloads SQLi, XSS, LFI, RCE | MIT | | [Web Application Payloads (Kaggle)](https://www.kaggle.com/datasets/cyberprince/web-application-payloads-dataset) | payloads SSRF / inyección de comandos | según la página del dataset | | [SQL Injection Dataset (Kaggle)](https://www.kaggle.com/datasets/sajid576/sql-injection-dataset) | consultas SQLi | según la página del dataset | | [XSS Dataset for Deep Learning (Kaggle)](https://www.kaggle.com/datasets/syedsaqlainhussain/cross-site-scripting-xss-dataset-for-deep-learning) | payloads XSS | según la página del dataset | | [SQL Injection Dataset (Kaggle)](https://www.kaggle.com/datasets/ayahkhaldi/sql-injection-dataset) | consultas SQLi | según la página del dataset | | Corpus privado de líneas de petición | líneas de petición normales diversas (anonimizadas) | propietario | **Nota de licencias:** este repositorio publica solo los pesos entrenados y el código, **no** los datos crudos de entrenamiento. SecLists es MIT; el dataset CSIC 2010 es un dataset público de investigación. Los datasets de Kaggle tienen sus propias licencias — verifica la página de cada dataset antes de redistribuir los *datos en sí*. Los pesos derivados de estos datasets públicos se publican aquí bajo MIT. ## Uso El repositorio incluye el paquete `brosnet/` con la clase del modelo y el helper de inferencia. ```python from brosnet.predict import classify label, confidence = classify("GET /login?user=admin' OR '1'='1 HTTP/1.1") print(label, confidence) # SQLi 0.9545 ``` Cargar el checkpoint directamente: ```python import torch from brosnet.model import BrosNet ckpt = torch.load("brosnet.pt", map_location="cpu", weights_only=False) model = BrosNet(vocab_size=ckpt["vocab_size"], max_len=ckpt["max_len"], num_classes=len(ckpt["class_names"])) model.load_state_dict(ckpt["state_dict"]) model.eval() ``` Dependencias: `torch` (CPU), `numpy`. ## Uso previsto y limitaciones - **Herramienta de triaje / anotación para analistas**, no un firewall en tiempo real ni un motor de auto-bloqueo. - Opera solo sobre texto del payload; **no** es un detector de flujo de red ni de DDoS (esos son modelos aparte). - `SSRF` tiene pocas muestras de entrenamiento (~100); trata sus predicciones con menor confianza. - Una petición clasificada como `normal` no descarta ataques indistinguibles de texto benigno (p. ej. CSRF). Se recomienda revisión humana antes de actuar sobre las predicciones. ## Licencia MIT.