
Una herramienta de análisis estático para asegurar código Go.
GoKart es una herramienta de análisis estático para Go que encuentra vulnerabilidades utilizando la forma SSA (asignación única estática) del código fuente Go. Es capaz de rastrear el origen de variables y argumentos de funciones para determinar si las fuentes de entrada son seguras, lo que reduce el número de falsos positivos en comparación con otros escáneres de seguridad de Go. Por ejemplo, una consulta SQL que se concatena con una variable tradicionalmente podría marcarse como inyección SQL; sin embargo, GoKart puede determinar si la variable es realmente una constante o equivalente de constante, en cuyo caso no hay vulnerabilidad.
GoKart también ayuda a impulsar Chariot, la plataforma de seguridad de Praetorian que ayuda a encontrar, gestionar y corregir vulnerabilidades en su código fuente y entornos en la nube. Chariot simplifica la ejecución de escaneos automatizados y continuos de GoKart en su código fuente. Si desea probar GoKart, puede crear una cuenta gratuita de Chariot en minutos haciendo clic aquí.
El análisis estático es una técnica poderosa para encontrar vulnerabilidades en el código fuente. Sin embargo, este enfoque ha sufrido de ser ruidoso, es decir, muchas herramientas de análisis estático encuentran bastantes "vulnerabilidades" que en realidad no son reales. Esto ha generado fricción con los desarrolladores, cansados de que las herramientas "llamen al lobo" una vez de más.
La motivación de GoKart fue abordar esto: ¿Podríamos crear un escáner con tasas de falsos positivos significativamente más bajas que las herramientas existentes? Según nuestra experimentación, la respuesta es sí. Al aprovechar el rastreo de fuente a sumidero y SSA, GoKart es capaz de rastrear la contaminación de variables entre asignaciones, mejorando significativamente la precisión de los hallazgos. Nuestro enfoque está en la usabilidad: pragmáticamente, eso significa que hemos optimizado nuestros enfoques para reducir las falsas alarmas.
Para más información, lea nuestra publicación en el blog.
Puede instalar GoKart localmente utilizando cualquiera de las opciones listadas a continuación.
go install$ go install github.com/praetorian-inc/gokart@latest
Descargue el binario para su sistema operativo desde la página de lanzamientos.
(OPCIONAL) Descargue el archivo checksums.txt para verificar la integridad del archivo
# Check the checksum of the downloaded archive
$ shasum -a 256 gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ cat gokart_${VERSION}_${ARCH}_checksums.txt | grep gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ tar -xvf gokart_${VERSION}_${ARCH}.tar.gz
gokart a su PATH:$ mv ./gokart /usr/local/bin/
# clone the GoKart repo
$ git clone https://github.com/praetorian-inc/gokart.git
# navigate into the repo directory and build
$ cd gokart
$ go build
# Move the gokart binary into your path
$ mv ./gokart /usr/local/bin
Construir la imagen Docker
docker build -t gokart .
Ejecutar el contenedor con un escaneo local (el directorio de escaneo local debe estar montado en la imagen del contenedor)
docker run -v /path/to/scan-dir:/scan-dir gokart scan /scan-dir
Ejecutar el contenedor con un escaneo remoto (al especificar una clave privada para autenticación, también deberá montarse en el contenedor)
docker run gokart scan -r https://github.com/praetorian-inc/gokart
# specifying a private key for private repository ssh authentication
docker run -v /path/to/key-dir/:/key-dir gokart scan -r [email protected]:praetorian-inc/gokart.git -k /key-dir/ssh_key
# running without a directory specified defaults to '.'
gokart scan <flags>
gokart scan <directory> <flags>
gokart help
Puede seguir los pasos a continuación para ejecutar GoKart en Go Test Bench, una aplicación Go intencionalmente vulnerable del equipo de Contrast Security.
# Clone sample vulnerable application
git clone https://github.com/Contrast-Security-OSS/go-test-bench.git
gokart scan go-test-bench/
La salida debería mostrar algunas vulnerabilidades identificadas, cada una con una Función Vulnerable y una Fuente de Entrada de Usuario identificada.
Para probar algunas características adicionales de GoKart, puede escanear con las banderas de CLI sugeridas a continuación.
# Use verbose flag to show full traces of these vulnerabilities
gokart scan go-test-bench/ -v
# Use globalsTainted flag to ignore whitelisted Sources
# may increase false positive results
gokart scan go-test-bench/ -v -g
# Use debug flag to display internal analysis information
# which is useful for development and debugging
gokart scan go-test-bench/ -d
# Output results in sarif format
gokart scan go-test-bench/ -s
# Output results to file
gokart scan go-test-bench/ -o gokart-go-test-bench.txt
# Output scarif results to file
gokart scan go-test-bench/ -o gokart-go-test-bench.txt -s
# Scan remote public repository
# Repository will be cloned locally, scanned and deleted afterwards
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -v
# Specify the remote branch to scan
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -b actions_fix
# Scan remote private repository via ssh
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git
# Scan remote private repository and optionally specify a key for ssh authentication
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git -k /home/gokart/.ssh/github_rsa_key
# Use remote scan and output flags together for seamless security reviews
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -v
# Use remote scan, output and sarif flags for frictionless integration into CI/CD
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -s
Para probar la extensibilidad de GoKart, puede modificar el archivo de configuración que GoKart utiliza para
introducir un nuevo sumidero vulnerable en el análisis. Hay un analizador de Sumidero de Prueba definido en el archivo
de configuración por defecto incluido en util/analyzers.yml. Modifique util/analyzers.yml para eliminar los comentarios
del analizador de Sumidero de Prueba y luego indique a GoKart que use el archivo de configuración modificado con la bandera -i.
# Scan using modified analyzers.yml file and output full traces
gokart scan go-test-bench/ -v -i <path-to-gokart>/util/analyzers.yml
La salida ahora debería contener vulnerabilidades adicionales, incluyendo nuevas vulnerabilidades de "Sumidero de Prueba alcanzable por entrada de usuario".
Puede ejecutar las pruebas incluidas con el siguiente comando, invocado desde el directorio raíz de GoKart.
go test -v ./...