BrosNet / README.md
brosgor's picture
Upload README.md with huggingface_hub
73dca11 verified
|
Raw History Blame Contribute Delete
5.15 kB
---
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.
<div align="center">
**J2K Security Group** · I+D (Innovation & Development) Department
*Working for innovation*
</div>
## 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)](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.