|
Download README.md from brosgor/BrosNet: direct link, hf CLI and curl.
- Browser
- Download file 5.15 kB
-
https://huggingface.co/brosgor/BrosNet/resolve/main/README.md
- Command line
-
hf download hf://brosgor/BrosNet/README.md
-
curl -L -o README.md https://huggingface.co/brosgor/BrosNet/resolve/main/README.md
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. | |