
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.
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í.
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: ./...
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"
on: push: schedule:
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"],
)
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 ./...
0: escaneo finalizado sin hallazgos/errores no suprimidos1: al menos un hallazgo no suprimido o error de procesamiento-no-fail para devolver siempre 0Gosec 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.
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.
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
$ gosec -include=G101,G203,G401 ./...
$ 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 #nosec
definidas 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$ 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
gosec --exclude-rules="cmd/.*:G204,G304" ./...
gosec --exclude-rules="scripts/.:" ./...
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
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 ./...
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 ./...
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 (modelo predeterminado deepseek-ai/deepseek-v4-flash),
atlas-deepseek-v4-flash,
atlas-qwen3-coder-next, atlas-kimi-k2.6, o
atlas:<model-id> para cualquier modelo de chat alojado en Atlas Cloud.
Atlas Cloud es un proveedor compatible con OpenAI disponible en
atlascloud.aigemini-3-pro-preview (predeterminado),
gemini-2.5-pro, gemini-2.5-flash,
gemini-2.5-flash-liteclaude-sonnet-4-6 (predeterminado),
, ,
, ,
🎁 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
export GOSEC_AI_API_KEY="your_key" export GOSEC_AI_PROVIDER="atlas" gosec ./...
GOSEC_AI_API_KEY="your_key"
gosec -ai-api-provider="atlas:qwen/qwen3-coder-next" ./...
gosec -ai-api-provider="gemini-3-pro-preview"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="claude-sonnet-4-6"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_key" ./...
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"
./...
gosec -ai-api-provider="llama3.2"
-ai-base-url="http://localhost:11434/v1"
./...
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 ./...
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-rules rechaza directivas #nosec /
//gosec:disable desnudas que no enumeren ningún ID de regla.-nosec-require-justification rechaza directivas que no
incluyan un -- justification despué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"
}
}
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 ./...
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
$ 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.
gosec -severity medium ./...
gosec -confidence medium ./...
gosec --exclude-rules="cmd/.:G204,G304;scripts/.:*" ./...
gosec -exclude-generated ./...
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>
claude-opus-4-7claude-opus-4-6claude-sonnet-4-5claude-opus-4-5claude-haiku-4-5gpt-5.4 (predeterminado), gpt-5.4-mini,
gpt-5.4-nanoai-base-url)ai-api-key o establece la variable de entorno
GOSEC_AI_API_KEY: la clave para acceder a la API de IA
ai-base-url: (opcional) URL base personalizada para
APIs compatibles con OpenAI (p. ej., Azure OpenAI, LocalAI,
Ollama)
https://api.atlascloud.ai/v1 por defecto,
por lo que ai-base-url es opcional para el proveedor atlas
incorporadoGOSEC_AI_PROVIDER: (opcional) variable de entorno
alternativa a ai-api-providerGOSEC_AI_BASE_URL: (opcional) variable de entorno
alternativa a ai-base-urlai-skip-ssl: (opcional) omitir la verificación del certificado SSL
para la API de IA (útil para certificados autofirmados)