
gosec v2.28.0
Herramienta de análisis estático que inspecciona el código fuente de Go en busca de vulnerabilidades de seguridad mediante análisis AST, SSA y de taint, con integración en CI/CD y mapeo de CWE.
gosec - Verificador de Seguridad de Go
Inspecciona el código fuente en busca de problemas de seguridad escaneando el AST de Go y la representación de código SSA.
Enlaces rápidos
Características
- Reglas basadas en patrones para detectar problemas de seguridad comunes en código Go
- Analizadores basados en SSA para conversiones de tipo, límites de slices y problemas de criptografía
- Análisis de flujo de datos (taint analysis) para rastrear el flujo de datos desde la entrada del usuario hasta funciones peligrosas (inyección SQL, inyección de comandos, path traversal, SSRF, XSS, inyección de logs, inyección SMTP, SSTI, deserialización insegura, redirección abierta)
Licencia
Licenciado bajo la Licencia Apache, Versión 2.0 (la "Licencia"). No puede usar este archivo excepto en cumplimiento de la Licencia. Puede obtener una copia de la Licencia aquí.
Estado del proyecto
Instalación
GitHub Action
Puede ejecutar gosec como una GitHub action de la siguiente manera:
Use la etiqueta versionada con @master que está fijada a la última versión estable. Esto proporcionará un comportamiento estable.```yaml
name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@master
with:
args: ./...
#### Escaneo de proyectos con módulos privados
Si tu proyecto importa módulos Go privados, necesitas configurar la autenticación para que `gosec` pueda obtener las dependencias. Establece las siguientes variables de entorno en tu flujo de trabajo:
- `GOPRIVATE`: Una lista separada por comas de prefijos de rutas de módulos que deben considerarse privados (por ejemplo, `github.com/your-org/*`).
- `GITHUB_AUTHENTICATION_TOKEN`: Un token de GitHub con acceso de lectura a tus repositorios privados.```yaml
name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
GOPRIVATE: github.com/your-org/*
GITHUB_AUTHENTICATION_TOKEN: ${{ secrets.PRIVATE_REPO_TOKEN }}
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@v2
with:
args: ./...
Integración con el escaneo de código
Puede integrar herramientas de análisis de código de terceros con el escaneo de código de GitHub subiendo datos como archivos SARIF.
El flujo de trabajo muestra un ejemplo de ejecución de gosec como un paso
en un flujo de trabajo de GitHub Action que produce el archivo results.sarif.
Luego, el flujo de trabajo sube el archivo results.sarif a
GitHub utilizando la acción upload-sarif.```yaml
name: "Security Scan"
Run workflow each time code is pushed to your repository and on a schedule.
The scheduled workflow runs every at 00:00 on Sunday UTC time.
on: push: schedule:
- cron: '0 0 * * 0'
jobs: tests: runs-on: ubuntu-latest env: GO111MODULE: on steps: - name: Checkout Source uses: actions/checkout@v3 - name: Run Gosec Security Scanner uses: securego/gosec@v2 with: # we let the report trigger content trigger a failure using the GitHub Security features. args: '-no-fail -fmt sarif -out results.sarif ./...' - name: Upload SARIF file uses: github/codeql-action/upload-sarif@v2 with: # Path to SARIF file relative to the root of the repository sarif_file: results.sarif
### Análisis de Go
El paquete `goanalysis` proporciona un
[`golang.org/x/tools/go/analysis.Analyzer`](https://pkg.go.dev/golang.org/x/tools/go/analysis)
para la integración con herramientas que soportan la interfaz
estándar de análisis de Go, como el framework
[nogo](https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst)
de Bazel:```starlark
nogo(
name = "nogo",
deps = [
"@com_github_securego_gosec_v2//goanalysis",
# add more analyzers as needed
],
visibility = ["//visibility:public"],
)
Instalación Local
gosec requiere Go 1.25 o más reciente.```bash go install github.com/securego/gosec/v2/cmd/gosec@latest
## Inicio rápido```bash
# Scan all packages in current module
gosec ./...
# Write JSON report
gosec -fmt json -out results.json ./...
# Write SARIF report for code scanning
gosec -fmt sarif -out results.sarif ./...
Códigos de salida
0: escaneo finalizado sin hallazgos/errores no suprimidos1: al menos un hallazgo no suprimido o error de procesamiento- Usa
-no-failpara devolver siempre0
Uso
Gosec se puede configurar para ejecutar solo un subconjunto de reglas, excluir ciertas rutas de archivo y generar informes en diferentes formatos. De forma predeterminada, todas las reglas se ejecutarán sobre los archivos de entrada proporcionados. Para escanear recursivamente desde el directorio actual, puedes proporcionar ./... como argumento de entrada.
Reglas disponibles
gosec incluye reglas en estas categorías:
G1xx: problemas generales de codificación segura (por ejemplo, credenciales codificadas, uso inseguro, endurecimiento HTTP, seguridad de cookies)G2xx: riesgos de inyección en la construcción de consultas/plantillas/comandosG3xx: riesgos en el manejo de archivos y rutas (permisos, path traversal, archivos temporales, extracción de archivos)G4xx: debilidades de criptografía y TLSG5xx: importaciones en lista negraG6xx: comprobaciones de corrección/seguridad específicas de Go (por ejemplo, alias de rango y límites de slice)G7xx: reglas de análisis de taint (inyección SQL, inyección de comandos, path traversal, SSRF, XSS, log, inyección SMTP, SSTI, deserialización insegura y redirección abierta)
Para la lista completa, descripciones de reglas y configuración por regla, consulta RULES.md.
Reglas retiradas
- G105: Auditar el uso de math/big.Int.Exp - CVE corregido
- G307: Aplazar un método que devuelve un error - causando más inconvenientes que solucionar un problema de seguridad, a pesar de los detalles de esta publicación de blog
Selección de reglas
De forma predeterminada, gosec ejecutará todas las reglas sobre las rutas de archivo proporcionadas. Sin embargo, es posible seleccionar un subconjunto de reglas para ejecutar mediante el flag -include=, o especificar un conjunto de reglas para excluir explícitamente usando el flag -exclude=.```bash
Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
Run everything except for rule G303
$ gosec -exclude=G303 ./...
### Mapeo de CWE
Cada problema detectado por `gosec` se mapea a un
[CWE (Common Weakness Enumeration)](http://cwe.mitre.org/data/index.html)
que describe en términos más generales la vulnerabilidad. El
mapeo exacto se puede encontrar
[aquí](https://github.com/securego/gosec/blob/master/issue/issue.go#L50).
### Configuración
Se pueden proporcionar varias configuraciones globales en un archivo
de configuración de la siguiente manera:```JSON
{
"global": {
"nosec": "enabled",
"audit": "enabled"
}
}
nosec: esta configuración sobrescribirá todas las directivas#nosecdefinidas en toda la base de códigoaudit: se ejecuta en modo auditoría que habilita verificaciones adicionales que para el análisis de código normal podrían ser demasiado entrometidas```bash
Run with a global configuration file
$ gosec -conf config.json .
### Exclusiones de reglas basadas en rutas
Los repositorios grandes con múltiples componentes pueden necesitar diferentes
reglas de seguridad para diferentes rutas. Use `exclude-rules` para
suprimir reglas específicas para rutas específicas.
**Archivo de configuración:**```json
{
"exclude-rules": [
{
"path": "cmd/.*",
"rules": ["G204", "G304"]
},
{
"path": "scripts/.*",
"rules": ["*"]
}
]
}
Bandera de CLI:```bash
Exclude G204 and G304 from cmd/ directory
gosec --exclude-rules="cmd/.*:G204,G304" ./...
Exclude all rules from scripts/ directory
gosec --exclude-rules="scripts/.:" ./...
Multiple exclusions
gosec --exclude-rules="cmd/.:G204,G304;test/.:G101" ./...
| Campo | Tipo | Descripción |
|-------|------|-------------|
| `path` | string (regex) | Regex que coincide con rutas de archivos |
| `rules` | []string | IDs de reglas a excluir. `*` para todas |
#### Configuración de reglas
Algunas reglas también aceptan banderas de configuración; estas banderas están documentadas en
[RULES.md](https://github.com/securego/gosec/blob/master/RULES.md).
#### Versión de Go
Algunas reglas requieren una versión específica de Go que se obtiene del archivo de módulo Go presente en el proyecto. Si no se puede encontrar esta versión, se recurrirá a la versión de ejecución de Go.
La versión del módulo Go se analiza usando el comando `go list`, lo que en algunos casos puede provocar degradación del rendimiento. En esta situación, la versión del módulo Go se puede proporcionar fácilmente estableciendo la variable de entorno `GOSECGOVERSION=go1.21.1`.
### Dependencias
gosec carga paquetes usando módulos de Go. En la mayoría de los proyectos, las dependencias se resuelven automáticamente durante el escaneo.
Si faltan dependencias, ejecute:```bash
go mod tidy
go mod download
Excluir archivos y carpetas de prueba
gosec ignorará los archivos de prueba en todos los paquetes y cualquier dependencia en su directorio vendor.
El escaneo de archivos de prueba se puede habilitar con la siguiente bandera:```bash gosec -tests ./...
También se pueden excluir carpetas adicionales de la siguiente manera:```bash
gosec -exclude-dir=rules -exclude-dir=cmd ./...
Excluyendo archivos generados
gosec puede ignorar los archivos go generados con el comentario de código generado por defecto.``` // Code generated by some generator DO NOT EDIT.
# Tecnologías utilizadas
- Python 3.x
- [dnstwist](https://github.com/elceef/dnstwist) - Motor de permutación de nombres de dominio
- [Shodan](https://www.shodan.io) - Motor de búsqueda para dispositivos conectados a Internet
- [Nmap](https://nmap.org) - Escaneo de redes
- [PyPi library](https://pypi.org/project/borealiscanner/) - Instalar y ejecutar con pip
- Docker - Entorno contenerizado```bash
gosec -exclude-generated ./...
Corrección automática de vulnerabilidades
gosec puede sugerir correcciones basadas en recomendaciones de IA. Llamará a una API de IA para recibir una sugerencia para un hallazgo de seguridad.
Puedes habilitar esta función proporcionando los siguientes argumentos de línea de comandos:
ai-api-provider: el nombre del proveedor de la API de IA. Proveedores compatibles:- Atlas Cloud:
atlas(modelo predeterminadodeepseek-ai/deepseek-v4-flash),atlas-deepseek-v4-flash,atlas-qwen3-coder-next,atlas-kimi-k2.6, oatlas:<model-id>para cualquier modelo de chat alojado en Atlas Cloud. Atlas Cloud es un proveedor compatible con OpenAI disponible en atlascloud.ai - Gemini:
gemini-3-pro-preview(predeterminado),gemini-2.5-pro,gemini-2.5-flash,gemini-2.5-flash-lite - Claude:
claude-sonnet-4-6(predeterminado),claude-opus-4-7,claude-opus-4-6,claude-sonnet-4-5,claude-opus-4-5,claude-haiku-4-5 - OpenAI:
gpt-5.4(predeterminado),gpt-5.4-mini,gpt-5.4-nano - Personalizado compatible con OpenAI: Cualquier nombre de modelo personalizado
(requiere
ai-base-url)
- Atlas Cloud:
ai-api-keyo establece la variable de entornoGOSEC_AI_API_KEY: la clave para acceder a la API de IA- Para Gemini, puedes crear una clave de API siguiendo estas instrucciones
- Para Claude, obtén tu clave de API desde Anthropic Console
- Para OpenAI, obtén tu clave de API desde OpenAI Platform
ai-base-url: (opcional) URL base personalizada para APIs compatibles con OpenAI (p. ej., Azure OpenAI, LocalAI, Ollama)- Atlas Cloud usa
https://api.atlascloud.ai/v1por defecto, por lo queai-base-urles opcional para el proveedoratlasincorporado
- Atlas Cloud usa
GOSEC_AI_PROVIDER: (opcional) variable de entorno alternativa aai-api-providerGOSEC_AI_BASE_URL: (opcional) variable de entorno alternativa aai-base-urlai-skip-ssl: (opcional) omitir la verificación del certificado SSL para la API de IA (útil para certificados autofirmados)
🎁 Atlas Cloud es una plataforma de inferencia de IA multimodal que brinda a los desarrolladores una única API de IA para acceder a APIs de generación de video, generación de imágenes y LLM. En lugar de gestionar múltiples integraciones de proveedores, te conectas una vez y obtienes acceso unificado a más de 300 modelos seleccionados en todas las modalidades.
Consulta la nueva promoción del plan de codificación de Atlas Cloud para un acceso a la API más económico: https://www.atlascloud.ai/console/coding-plan
Ejemplos:```bash
Using Atlas Cloud with the default DeepSeek V4 Flash model
export GOSEC_AI_API_KEY="your_key" export GOSEC_AI_PROVIDER="atlas" gosec ./...
Using Atlas Cloud with an explicit hosted model
GOSEC_AI_API_KEY="your_key"
gosec -ai-api-provider="atlas:qwen/qwen3-coder-next" ./...
Using Gemini
gosec -ai-api-provider="gemini-3-pro-preview"
-ai-api-key="your_key" ./...
Using Claude
gosec -ai-api-provider="claude-sonnet-4-6"
-ai-api-key="your_key" ./...
Using OpenAI
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_key" ./...
Using Azure OpenAI
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_azure_key"
-ai-base-url="https://your-resource.openai.azure.com/openai/deployments/your-deployment"
./...
Using local Ollama with custom model
gosec -ai-api-provider="llama3.2"
-ai-base-url="http://localhost:11434/v1"
./...
Using self-signed certificate API
gosec -ai-api-provider="custom-model"
-ai-api-key="your_key"
-ai-base-url="https://internal-api.company.com/v1"
-ai-skip-ssl
./...
### Anotando código
Como con todas las herramientas de detección automatizadas, habrá casos de
falsos positivos. En los casos donde gosec reporte un fallo que
ha sido verificado manualmente como seguro, es posible
anotar el código con un comentario que comience con `#nosec`.
El comentario `#nosec` debe tener el formato
`#nosec [RuleList] [-- Justification]`.
El comentario `#nosec` debe colocarse en la línea donde se
reporta la advertencia.```go
func main() {
tr := &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, // #nosec G402
},
}
client := &http.Client{Transport: tr}
_, err := client.Get("https://go.dev/")
if err != nil {
fmt.Println(err)
}
}
Cuando se ha identificado y verificado un falso positivo concreto como seguro, es posible que desees suprimir solo esa regla (o un conjunto específico de reglas) dentro de una sección de código, mientras sigues escaneando en busca de otros problemas. Para ello, puedes listar la(s) regla(s) que se suprimirán dentro de la anotación #nosec, por ejemplo: /* #nosec G401 */ o //#nosec G201 G202 G203
Puedes incluir la descripción o el texto de justificación para la anotación. La justificación debe ir después de la(s) regla(s) a suprimir y comenzar con dos o más guiones, por ejemplo: //#nosec G101 G102 -- Este es un falso positivo
Alternativamente, gosec también admite la directiva //gosec:disable, que funciona de manera similar a #nosec:```go
//gosec:disable G101 -- This is a false positive
En algunos casos también es posible que quieras revisar los lugares donde se han usado anotaciones `#nosec` o `//gosec:disable`. Para ejecutar el escáner e ignorar cualquier anotación `#nosec` puedes hacer lo siguiente:```bash
gosec -nosec=true ./...
Requerir IDs de reglas y justificaciones
Para evitar que las anotaciones supriman inadvertidamente reglas no relacionadas, o que se añadan sin explicación, gosec acepta dos indicadores opt-in. Ambos tienen como valor predeterminado false, por lo que las bases de código existentes continúan funcionando sin cambios.
-nosec-require-rulesrechaza directivas#nosec///gosec:disabledesnudas que no enumeren ningún ID de regla.-nosec-require-justificationrechaza directivas que no incluyan un-- justificationdespués de la lista de reglas.
Cuando está habilitado, una directiva que falla la verificación ya no suprime ningún hallazgo y se reporta como un error en la salida, junto con cualquier problema subyacente en la línea.```bash gosec -nosec-require-rules -nosec-require-justification ./...
Las mismas opciones se pueden configurar mediante el bloque de configuración global:```json
{
"global": {
"nosec-require-rules": "enabled",
"nosec-require-justification": "enabled"
}
}
Seguimiento de supresiones
Como se describió anteriormente, podemos suprimir violaciones externamente (usando -include/-exclude) o en línea (usando anotaciones #nosec). Los metadatos de supresión se pueden emitir para auditoría.
Habilite el seguimiento de supresiones con -track-suppressions:```bash
gosec -track-suppressions -exclude=G101
-fmt=sarif -out=results.sarif ./...
- Para supresiones externas, gosec registra información de supresión
donde `kind` es `external` y `justification` es
`Globally suppressed.`.
- Para supresiones en línea, gosec registra información de supresión
donde `kind` es `inSource` y `justification` es el texto
después de dos o más guiones en el comentario.
**Nota:** Solo los formatos SARIF y JSON admiten el seguimiento
de supresiones.
### Etiquetas de compilación
gosec es capaz de pasar tus
[Go build tags](https://pkg.go.dev/go/build/) al analizador.
Se pueden proporcionar como una lista separada por comas de la siguiente manera:```bash
gosec -tags debug,ignore ./...
Formatos de salida
gosec soporta text, json, yaml, csv, junit-xml,
html, sonarqube, golint, y sarif. Por defecto,
los resultados se reportarán a stdout, pero también se pueden escribir en
un archivo de salida. El formato de salida se controla mediante la bandera -fmt,
y el archivo de salida se controla mediante la bandera -out de la
siguiente manera:```bash
Write output in json format to results.json
$ gosec -fmt=json -out=results.json *.go
Use `-stdout` para imprimir resultados mientras también escribe `-out`. Use `-verbose` para sobrescribir el formato de stdout mientras se preserva el formato del archivo.```bash
# Write output in json format to results.json as well as stdout
$ gosec -fmt=json -out=results.json -stdout *.go
# Overrides the output format to 'text' when stdout the results,
# while writing it to results.json
$ gosec -fmt=json -out=results.json -stdout -verbose=text *.go
Nota: gosec genera el
formato de importación de incidencias genérico
para SonarQube, y un informe debe importarse en SonarQube
usando
sonar.externalIssuesReportPaths=path/to/gosec-report.json.
Patrones de uso comunes```bash
Fail only on medium+ severity findings
gosec -severity medium ./...
Fail only on medium+ confidence findings
gosec -confidence medium ./...
Exclude specific rules for specific paths
gosec --exclude-rules="cmd/.:G204,G304;scripts/.:*" ./...
Exclude generated files in scan
gosec -exclude-generated ./...
Include test files in scan
gosec -tests ./...
## Desarrollo
La documentación de desarrollo se trasladó a
[DEVELOPMENT.md](https://github.com/securego/gosec/blob/master/DEVELOPMENT.md).
## ¿Quién está usando gosec?
Esta es una [lista](https://github.com/securego/gosec/blob/master/USERS.md) con algunos de los usuarios de gosec.
## Patrocinadores
Apoya este proyecto convirtiéndote en patrocinador. Tu logo
aparecerá aquí con un enlace a tu sitio web
<a href="https://github.com/mercedes-benz" target="_blank"><img src="https://assets.kitploit.com/production/public/readmes/2947/08b6f9da5faff0e986172b0c77fed0865a2cb26e6f8c58a8ae588c74bcf16f5f.png"></a>