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 ("<script>alert(1)</script>") 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) | ~74k peticiones web normales (clase normal) | Dataset público de investigación (CSIC); uso académico libre |
| SecLists | payloads SQLi, XSS, LFI, RCE | MIT |
| Web Application Payloads (Kaggle) | payloads SSRF / inyección de comandos | según la página del dataset |
| SQL Injection Dataset (Kaggle) | consultas SQLi | según la página del dataset |
| XSS Dataset for Deep Learning (Kaggle) | payloads XSS | según la página del dataset |
| SQL Injection Dataset (Kaggle) | 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.
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:
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).
SSRFtiene pocas muestras de entrenamiento (~100); trata sus predicciones con menor confianza.- Una petición clasificada como
normalno descarta ataques indistinguibles de texto benigno (p. ej. CSRF). Se recomienda revisión humana antes de actuar sobre las predicciones.
Licencia
MIT.