Inspecte le code source pour les problèmes de sécurité en numérisant la représentation du code GO AST et SSA.
Licencié sous la licence Apache, version 2.0 (la "licence"). Vous ne pouvez pas utiliser ce fichier sauf conforme à la licence. Vous pouvez obtenir une copie de la licence ici.
# 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 Vous pouvez exécuter gosec en tant qu'action GitHub comme suit:
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 : ./...Vous pouvez intégrer des outils d'analyse de code tiers avec la numérisation du code GitHub en téléchargeant des données sous forme de fichiers Sarif.
Le workflow montre un exemple de l'exécution du gosec comme une étape d'un flux de travail GitHub Action qui publie le fichier results.sarif . Le workflow télécharge ensuite le fichier results.sarif 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 peut être configuré pour exécuter uniquement un sous-ensemble de règles, pour exclure certains chemins de fichier et produire des rapports dans différents formats. Par défaut, toutes les règles seront exécutées par rapport aux fichiers d'entrée fournis. Pour scanner récursivement à partir du répertoire actuel, vous pouvez fournir ./... comme argument d'entrée.
Par défaut, GOSEC exécutera toutes les règles par rapport aux chemins de fichier fournis. Il est cependant possible de sélectionner un sous-ensemble de règles à exécuter via le Flag -include= ou de spécifier un ensemble de règles pour exclure explicitement en utilisant le Flag -exclude= .
# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
# Run everything except for rule G303
$ gosec -exclude=G303 ./... Chaque problème détecté par gosec est cartographié à une CWE (énumération de faiblesse commune) qui décrit en termes plus génériques la vulnérabilité. La cartographie exacte peut être trouvée ici.
Un certain nombre de paramètres globaux peuvent être fournis dans un fichier de configuration comme suit:
{
"global" : {
"nosec" : " enabled " ,
"audit" : " enabled "
}
}nosec : Ce paramètre écrasera toutes les directives #nosec définies tout au long de la base de codeaudit : s'exécute en mode Audit qui permet aux vérifications d'ajout que pour l'analyse du code normal, pourrait être trop foutue # Run with a global configuration file
$ gosec -conf config.json . Certaines règles acceptent également les indicateurs de configuration; Ces drapeaux sont documentés dans les règles.md.
Certaines règles nécessitent une version GO spécifique qui est récupérée à partir du fichier de module GO présent dans le projet. Si cette version ne peut être trouvée, elle se reproduira pour aller à la version d'exécution.
La version du module Go est analysée à l'aide de la commande go list qui, dans certains cas, pourrait conduire à une dégradation des performances. Dans cette situation, la version du module Go peut être facilement fournie en définissant la variable d'environnement GOSECGOVERSION=go1.21.1 .
GOSEC récupérera automatiquement les dépendances du code qui est analysée lorsque le module Go est activé (par exemple GO111MODULE=on ). Si ce n'est pas le cas, les dépendances doivent être explicitement téléchargées en exécutant la commande go get -d avant la numérisation.
GOSEC ignorera les fichiers de test sur tous les packages et toutes les dépendances de votre répertoire fournisseur.
La numérisation des fichiers de test peut être activée avec le drapeau suivant:
gosec -tests ./...Les dossiers supplémentaires peuvent également être exclus comme suit:
gosec -exclude-dir=rules -exclude-dir=cmd ./...GOSEC peut ignorer les fichiers GO générés avec le commentaire de code généré par défaut.
// Code generated by some generator DO NOT EDIT.
gosec -exclude-generated ./...Le GOSEC peut suggérer des correctifs basés sur la recommandation de l'IA. Il appellera une API AI pour recevoir une suggestion pour une conclusion de sécurité.
Vous pouvez activer cette fonctionnalité en fournissant les arguments de ligne de commande suivants:
ai-api-provider : Le nom du fournisseur API AI, actuellement seul gemini sont pris en charge.ai-api-key ou définissez la variable d'environnement GOSEC_AI_API_KEY : La clé pour accéder à l'API AI, pour Gemini, vous pouvez créer une clé API suivant ces instructions.ai-endpoint : le point de terminaison du fournisseur d'IA, c'est un argument facultatif. gosec -ai-api-provider= " gemini " -ai-api-key= " your_key " ./... Comme pour tous les outils de détection automatisés, il y aura des cas de faux positifs. Dans les cas où GOSEC rapporte un échec qui a été vérifié manuellement comme étant en sécurité, il est possible d'annoter le code avec un commentaire qui commence par #nosec .
Le commentaire #nosec devrait avoir le format #nosec [RuleList] [-- Justification] .
Le commentaire #nosec doit être placé sur la ligne où l'avertissement est signalé.
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 )
}
} Lorsqu'un faux positif spécifique a été identifié et vérifié comme sûr, vous souhaiterez peut-être supprimer que cette règle unique (ou un ensemble spécifique de règles) dans une section du code, tout en continuant à rechercher d'autres problèmes. Pour ce faire, vous pouvez répertorier la ou les règles pour être supprimée dans l'annotation #nosec , par exemple: /* #nosec G401 */ ou //#nosec G201 G202 G203
Vous pouvez mettre le texte de description ou de justification pour l'annotation. La justification doit être après la ou les règles pour supprimer et commencer par deux ou plusieurs tirets, par exemple: //#nosec G101 G102 -- This is a false positive
Dans certains cas, vous voudrez peut-être également revisiter des endroits où les annotations #nosec ont été utilisées. Pour exécuter le scanner et ignorer toutes les annotations #nosec , vous pouvez effectuer ce qui suit:
gosec -nosec=true ./... Comme décrit ci-dessus, nous pourrions supprimer les violations à l'extérieur (en utilisant -include / -exclude ) ou en ligne (en utilisant #nosec Annotations) dans GOSEC. Cette inflammation de suppression peut être utilisée pour générer des signaux correspondants à des fins d'audit.
Nous pourrions suivre les suppressions par le drapeau -track-suppressions comme suit:
gosec -track-suppressions -exclude=G101 -fmt=sarif -out=results.sarif ./...kind est external et justification est une certaine phrase "supprimée à l'échelle mondiale".kind est inSource et justification est le texte après deux tirets ou plus dans le commentaire.Remarque: Seuls les formats Sarif et JSON prennent en charge les suppressions de suivi.
GOSEC est capable de passer vos balises GO Build à l'analyseur. Ils peuvent être fournis en tant que liste séparée comme suit:
gosec -tags debug,ignore ./... GOSEC prend actuellement en charge text , json , yaml , csv , sonarqube , JUnit XML , html et golint de sortie. Par défaut, les résultats seront signalés à STDOUT, mais peuvent également être écrits dans un fichier de sortie. Le format de sortie est contrôlé par l'indicateur -fmt , et le fichier de sortie est contrôlé par l'indicateur -out comme suit:
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json * .go Les résultats seront rapportés à STDOUT ainsi qu'au fichier de sortie fourni par l'indicateur -stdout . L'indicateur -verbose remplace le format de sortie lorsque les résultats de Stdout lors de l'enregistrement dans le fichier de sortie
# 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 Remarque: GOSEC génère le format d'importation de problèmes génériques pour SonarQube, et un rapport doit être importé dans Sonarqube à l'aide de sonar.externalIssuesReportPaths=path/to/gosec-report.json .
Contribution.md contient des informations détaillées sur l'ajout de nouvelles règles à GOSEC.
Vous pouvez construire le binaire avec:
makeInstallez l'outil avec:
go get -u github.com/a-h/generate/cmd/schema-generateGénérez ensuite les types avec:
schema-generate -i sarif-schema-2.1.0.json -o mypath/types.goLa plupart des Marshalljson / Unmarshaljson sont supprimés, sauf celui du sac de propriété qui est pratique pour associer les propriétés supplémentaires. Le reste peut être supprimé. L'URI, ID, UUID, GUID a été renommé afin qu'il ait la convention GO définie ici
Vous pouvez exécuter tous les tests unitaires en utilisant:
make testVous pouvez créer une version en marquant la version comme suit:
git tag v1.0.0 -m " Release version v1.0.0 "
git push origin v1.0.0Le workflow de libération de GitHub se déclenche immédiatement après la poussée de la balise en amont. Ce flux publiera les binaires à l'aide de l'action GoreleSer, puis il construire et publiera l'image Docker dans Docker Hub.
Les artefacts publiés sont signés à l'aide de cosign. Vous pouvez utiliser la clé publique à partir du fichier Cosign.pub pour vérifier la signature de Docker Image and Binaires Fichiers.
La signature d'image Docker peut être vérifiée avec la commande suivante:
cosign verify --key cosign.pub securego/gosec:<TAG>
La signature des fichiers binaires peut être vérifiée avec la commande suivante:
cosign verify-blob --key cosign.pub --signature gosec_<VERSION>_darwin_amd64.tar.gz.sig gosec_<VERSION>_darwin_amd64.tar.gz
Vous pouvez également construire localement l'image docker en utilisant la commande:
make image Vous pouvez exécuter l'outil gosec dans un conteneur contre votre projet GO local. Vous n'avez qu'à monter le projet dans un volume comme suit:
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /... Remarque: Le répertoire de travail actuel doit être défini avec l'option -w afin de résoudre avec succès les dépendances du fichier du module Go
La configuration de la règle TLS peut être générée à partir de la recommandation TLS Ciphers de Mozilla.
Vous devez d'abord installer l'outil de générateur:
go get github.com/securego/gosec/v2/cmd/tlsconfig/... Vous pouvez invoquer maintenant le go generate à la racine du projet:
go generate ./... Cela générera le fichier rules/tls_config.go qui contiendra la recommandation de Ciphers actuelle de Mozilla.
Il s'agit d'une liste avec certains des utilisateurs du GOSEC.
Soutenez ce projet en devenant un sponsor. Votre logo apparaîtra ici avec un lien vers votre site Web