
Motor de triaje estático de malware en Go: calcula hashes de archivos, extrae cadenas e IOC, analiza PE/ELF/Mach-O/APK, puntúa capacidades y genera informes en JSON, YARA, Sigma, STIX y PDF.
Motor de análisis estático de malware — sin dependencias externas, sin cgo, enlazado estáticamente
Repositorio: https://github.com/Masriyan/FlatScan
FlatScan es un motor de análisis estático de malware y generación de informes de nivel de producción escrito en Go puro. Está diseñado para analistas que necesitan triaje rápido, extracción de IOC, detección de capacidades sospechosas, informes ejecutivos y transferencia de reglas de caza — todo sin ejecutar la muestra.
FlatScan lee un archivo, calcula su hash, identifica el formato, extrae cadenas, decodifica datos codificados sospechosos, extrae y clasifica IOCs, inspecciona metadatos de ejecutables/contenedores, puntúa los hallazgos, los enriquece en un perfil de malware y produce salidas en texto, JSON, PDF, HTML, IOC, YARA, Sigma, STIX 2.1, base de datos de casos y paquetes de informes.
El triaje de malware a menudo tiene dos audiencias:
| Audiencia | Necesidades |
|---|---|
| Analistas de seguridad | Evidencia técnica: hashes, cadenas, importaciones, IOCs, entropía, secciones, datos decodificados, TTPs, reglas de caza |
| CISO / Dirección | Contexto de riesgo: qué es probablemente, por qué importa, impacto empresarial, acciones recomendadas |
FlatScan sirve a ambas. Realiza análisis estático por seguridad y velocidad, y luego convierte el resultado tanto en salida legible por máquina como en informes listos para la dirección.
graph LR
A[Malware Sample] --> B[FlatScan Engine]
B --> C[Analyst Reports]
B --> D[Executive Reports]
B --> E[Machine-Readable]
B --> F[Hunting Rules]
C -->|HTML, Full Text| G[SOC Team]
D -->|PDF, Executive MD| H[CISO / Board]
E -->|JSON, STIX 2.1| I[SIEM / SOAR]
F -->|YARA, Sigma| J[EDR / Hunt Team]
FlatScan está construido como una canalización de análisis de múltiples etapas con ejecución paralela, un sistema de plugins y sin dependencias externas — go.mod no requiere nada, y el motor de desensamblado en Go puro está incluido en el árbol como internal/x86asm (una copia sin modificar de golang.org/x/arch/x86/x86asm, BSD-3-Clause). Sin cgo, sin dependencias de tiempo de ejecución ni del sistema, sin necesidad de red para compilar.
graph TB
subgraph "Input Layer"
CLI[CLI Parser] --> CFG[Config]
INT[Interactive Mode] --> CFG
SHL[Shell Mode] --> CFG
WCH[Watch Mode] --> CFG
end
subgraph "I/O Layer"
CFG --> MMP{File > 100MB?}
MMP -->|Yes| MMAP[Memory-Mapped I/O]
MMP -->|No| BUF[Buffered Read]
MMAP --> DATA[Raw Bytes + Hashes]
BUF --> DATA
end
subgraph "Analysis Pipeline"
DATA --> DET[File Type Detection]
DET --> ENT[Entropy Analysis]
ENT --> STR[String Extraction]
STR --> IOC[IOC Extraction]
IOC --> DEC[Decoder Pass]
DEC --> CRP[Corpus Build]
CRP --> PAT[Pattern Matching]
PAT --> PG["Parallel Group"]
subgraph PG["⚡ Parallel Stages"]
FMT[Format Analysis]
CRV[Safe Carving]
CRY[Crypto/Config]
SIM[Similarity Hash]
end
PG --> SEQ[Sequential Stages]
SEQ --> PLG[Plugin Engine]
PLG --> SCR[Risk Scoring]
end
subgraph "Output Layer"
SCR --> TXT[Text Report]
SCR --> JSN[JSON]
SCR --> PDF[PDF Report]
SCR --> HTM[HTML Report]
SCR --> YAR[YARA Rule]
SCR --> SIG[Sigma Rule]
SCR --> STX[STIX 2.1]
SCR --> RPK[Report Pack]
end
style PG fill:#1a1a2e,stroke:#e94560,stroke-width:2px
style SCR fill:#0f3460,stroke:#e94560,stroke-width:2px
| Principio | Implementación |
|---|---|
| Cero dependencias externas | go.mod no requiere nada y no hay go.sum. La biblioteca estándar de Go más un paquete vendorizado y sin modificar — internal/x86asm, una copia de golang.org/x/arch/x86/x86asm (BSD-3-Clause, motor de desensamblado) mantenida en el árbol para que la compilación no necesite descargas ni red. Sin cgo, sin bibliotecas nativas, sin dependencias en tiempo de ejecución |
| Solo estático | Nunca ejecuta la muestra — lee bytes y metadatos |
| Seguro para hilos | parallelRun() con hallazgos protegidos por mutex, verificado con el detector de carreras. Las etapas de análisis recuperan los pánicos individualmente, de modo que una muestra malformada no puede abortar un lote |
| Portable entre plataformas | Compila para Linux, macOS, Windows; mmap en Linux con fallback transparente |
| Extensible | Interfaz de plugins + manifiestos JSON para detecciones personalizadas sin recompilar |
| Comprobación | Resultado |
|---|---|
go build / go vet / gofmt -l | Limpio |
go test ./... | 189 pruebas (344 casos incluyendo subtests), todas pasando |
go test -race ./... | Limpio |
go test -cover ./... | 50.6% de las sentencias |
golangci-lint run | 0 problemas (errcheck, govet, staticcheck, gosec, errorlint, ineffassign, unused, bodyclose, nilerr, misspell, unconvert, wastedassign) |
govulncheck ./... | No se encontraron vulnerabilidades |
Entorno de pruebas. Verificado en Fedora Linux 44 (x86_64, kernel 7.1.7) con Go 1.26.5. El
mínimo de go.mod es Go 1.25. La CI además ejecuta la misma suite en ubuntu-latest.
Linux es la única plataforma en la que se miden estos resultados: macOS y Windows son
objetivos soportados y el código compila de forma cruzada para ellos, pero las cifras anteriores
no se reproducen de forma independiente allí, y mmap_linux.go es exclusivo de Linux por
construcción (otras plataformas usan el fallback de lectura con búfer).
El motor procesa archivos a través de 18 etapas con ejecución paralela para operaciones independientes: