Inspecciona el código fuente de problemas de seguridad escaneando la representación del código GO AST y SSA.
Con licencia bajo la licencia Apache, versión 2.0 (la "licencia"). No puede usar este archivo, excepto de conformidad con la licencia. Puede obtener una copia de la licencia aquí.
# binary will be $(go env GOPATH)/bin/gosec
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s -- -b $( go env GOPATH ) /bin vX.Y.Z
# or install it into ./bin/
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# In alpine linux (as it does not come with curl by default)
wget -O - -q https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# If you want to use the checksums provided on the "Releases" page
# then you will have to download a tar.gz file for your operating system instead of a binary file
wget https://github.com/securego/gosec/releases/download/vX.Y.Z/gosec_vX.Y.Z_OS.tar.gz
# The file will be in the current folder where you run the command
# and you can check the checksum like this
echo " <check sum from the check sum file> gosec_vX.Y.Z_OS.tar.gz " | sha256sum -c -
gosec --help Puedes ejecutar gosec como una acción de GitHub de la siguiente manera:
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 : ./...Puede integrar herramientas de análisis de código de terceros con escaneo de código GitHub mediante la carga de datos como archivos SARIF.
El flujo de trabajo muestra un ejemplo de ejecutar el gosec como un paso en un flujo de trabajo de acción GitHub que genera el archivo results.sarif . El flujo de trabajo luego carga el archivo results.sarif a GitHub utilizando la acción upload-sarif .
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@master
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.sarifgo install github.com/securego/gosec/v2/cmd/gosec@latest Gosec se puede configurar para ejecutar solo un subconjunto de reglas, excluir ciertas rutas de archivo y producir informes en diferentes formatos. Por defecto, todas las reglas se ejecutarán con los archivos de entrada suministrados. Para escanear recursivamente desde el directorio actual que puede suministrar ./... como el argumento de entrada.
Por defecto, GOSEC ejecutará todas las reglas con las rutas de archivo suministradas. Sin embargo, es posible seleccionar un subconjunto de reglas para ejecutarse a través del indicador -include= Flag, o para especificar un conjunto de reglas para excluir explícitamente el uso de -exclude= flag.
# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
# Run everything except for rule G303
$ gosec -exclude=G303 ./... Cada problema detectado por gosec se asigna a una CWE (enumeración de debilidad común) que describe en términos más genéricos la vulnerabilidad. El mapeo exacto se puede encontrar aquí.
Se pueden proporcionar una serie de configuraciones globales en un archivo de configuración de la siguiente manera:
{
"global" : {
"nosec" : " enabled " ,
"audit" : " enabled "
}
}nosec : Esta configuración sobrescribirá todas las directivas #nosec definidas en toda la base del códigoaudit : se ejecuta en modo de auditoría que permite verificaciones adicionales que para el análisis de código normal pueden ser demasiado curiosos # Run with a global configuration file
$ gosec -conf config.json . Algunas reglas también aceptan banderas de configuración; Estas banderas están documentadas en reglas.
Algunas reglas requieren una versión GO específica que se recupera del archivo del módulo GO presente en el proyecto. Si no se puede encontrar esta versión, será retroalimentación de la versión de tiempo de ejecución.
La versión del módulo GO se analiza utilizando el comando go list que en algunos casos podría conducir a la degradación del rendimiento. En esta situación, la versión del módulo GO se puede proporcionar fácilmente configurando la variable de entorno GOSECGOVERSION=go1.21.1 .
Gosec obtendrá automáticamente las dependencias del código que se analiza cuando el módulo GO se enciende (por ejemplo, GO111MODULE=on ). Si este no es el caso, las dependencias deben descargarse explícitamente ejecutando el comando go get -d antes del escaneo.
GOSEC ignorará los archivos de prueba en todos los paquetes y cualquier dependencia en su directorio de proveedores.
El escaneo de archivos de prueba se puede habilitar con el siguiente indicador:
gosec -tests ./...También se pueden excluir carpetas adicionales de la siguiente manera:
gosec -exclude-dir=rules -exclude-dir=cmd ./...Gosec puede ignorar los archivos GO generados con comentarios de código generado por defecto.
// Code generated by some generator DO NOT EDIT.
gosec -exclude-generated ./...Gosec puede sugerir soluciones basadas en la recomendación de IA. Llamará a una API AI para recibir una sugerencia para un hallazgo de seguridad.
Puede habilitar esta función proporcionando los siguientes argumentos de línea de comando:
ai-api-provider : El nombre del proveedor de AI AI, actualmente solo es compatible gemini .ai-api-key o Establecer la variable de entorno GOSEC_AI_API_KEY : la clave para acceder a la API AI, para Gemini, puede crear una clave API siguiendo estas instrucciones.ai-endpoint : El punto final del proveedor de IA, este es un argumento opcional. gosec -ai-api-provider= " gemini " -ai-api-key= " your_key " ./... Al igual que con todas las herramientas de detección automatizadas, habrá casos de falsos positivos. En los casos en que Gosec informa una falla que se ha verificado manualmente como segura, es posible anotar el código con un comentario que comienza con #nosec .
El comentario #nosec debe tener el formato #nosec [RuleList] [-- Justification] .
El comentario #nosec debe colocarse en la línea donde se informa la advertencia.
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 específico como seguro, es posible que desee suprimir solo esa regla única (o un conjunto específico de reglas) dentro de una sección de código, mientras continúa escaneando otros problemas. Para hacer esto, puede enumerar las reglas para ser suprimidas dentro de la anotación #nosec , por ejemplo, /* #nosec G401 */ o //#nosec G201 G202 G203
Puede poner el texto de descripción o justificación para la anotación. La justificación debe ser después de la (s) regla (s) para suprimir y comenzar con dos o más guiones, por ejemplo, //#nosec G101 G102 -- This is a false positive
En algunos casos, es posible que también desee volver a visitar lugares donde se han utilizado las anotaciones #nosec . Para ejecutar el escáner e ignorar cualquier anotación #nosec , puede hacer lo siguiente:
gosec -nosec=true ./... Como se describió anteriormente, podríamos suprimir las violaciones externamente (usando -include / -exclude ) o en línea (usando anotaciones #nosec ) en Gosec. Esta inflamación de supresión se puede utilizar para generar señales correspondientes con fines de auditoría.
Podríamos rastrear las supresiones por la bandera de -track-suppressions de la siguiente manera:
gosec -track-suppressions -exclude=G101 -fmt=sarif -out=results.sarif ./...kind es external y justification es una cierta oración "suprimida globalmente".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 supresiones de seguimiento.
Gosec puede pasar sus etiquetas de construcción Go al analizador. Se pueden proporcionar como una lista separada por coma de la siguiente manera:
gosec -tags debug,ignore ./... Gosec actualmente es compatible con text , json , yaml , csv , sonarqube , JUnit XML , html y golint Formatos de salida. Por defecto, los resultados se informarán a STDOUT, pero también se pueden escribir en un archivo de salida. El formato de salida está controlado por el indicador -fmt , y el archivo de salida está controlado por el indicador -out de la siguiente manera:
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json * .go Los resultados se informarán a STDOUT, así como al archivo de salida proporcionado por el indicador -stdout . El indicador -verbose anula el formato de salida cuando no se guarda los resultados al guardarlos en el archivo de salida
# 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 problemas genéricos para Sonarqube, y un informe debe importarse a Sonarqube utilizando sonar.externalIssuesReportPaths=path/to/gosec-report.json .
Contribuir.MD contiene información detallada sobre cómo agregar nuevas reglas a Gosec.
Puedes construir el binario con:
makeInstale la herramienta con:
go get -u github.com/a-h/generate/cmd/schema-generateLuego genere los tipos con:
schema-generate -i sarif-schema-2.1.0.json -o mypath/types.goLa mayoría de los Marshalljson/Unmarshaljson se eliminan, excepto el de Propertybag, que es útil para en línea las propiedades adicionales. El resto se puede quitar. El URI, ID, UUID, GUID se renombraron para que se ajuste a la Convención GO definida aquí
Puede ejecutar todas las pruebas unitarias usando:
make testPuede crear una versión etiquetando la versión de la siguiente manera:
git tag v1.0.0 -m " Release version v1.0.0 "
git push origin v1.0.0El flujo de trabajo de lanzamiento de GitHub se desencadena inmediatamente después de que la etiqueta se empuja aguas arriba. Este flujo lanzará los binarios utilizando la acción Goreleaser y luego construirá y publicará la imagen Docker en Docker Hub.
Los artefactos lanzados están firmados usando Cosign. Puede usar la clave pública desde el archivo cosign.pub para verificar la firma de los archivos de imagen y binarios de Docker.
La firma de imagen Docker se puede verificar con el siguiente comando:
cosign verify --key cosign.pub securego/gosec:<TAG>
La firma de archivos binarios se puede verificar con el siguiente comando:
cosign verify-blob --key cosign.pub --signature gosec_<VERSION>_darwin_amd64.tar.gz.sig gosec_<VERSION>_darwin_amd64.tar.gz
También puede construir localmente la imagen Docker utilizando el comando:
make image Puede ejecutar la herramienta gosec en un contenedor contra su proyecto GO local. Solo tiene que montar el proyecto en un volumen de la siguiente manera:
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /... Nota: El directorio de trabajo actual debe establecerse con la opción -w para resolver con éxito las dependencias del archivo del módulo GO
La configuración de la regla TLS se puede generar a partir de la recomendación de TLS Ciphers de Mozilla.
Primero debe instalar la herramienta Generator:
go get github.com/securego/gosec/v2/cmd/tlsconfig/... Puede invocar ahora el go generate en la raíz del proyecto:
go generate ./... Esto generará el archivo rules/tls_config.go que contendrá la recomendación actual de CIPHER de Mozilla.
Esta es una lista con algunos de los usuarios de Gosec.
Apoye este proyecto al convertirse en patrocinador. Su logotipo aparecerá aquí con un enlace a su sitio web