Skip to main content

Snyk Open Source C/C++-Sicherheitsscans in CI-Pipelines integrieren

Artikel von
Headshot of Michal Brutvan

Michal Brutvan

blog feature oss cpp

8. September 2022

0 Min. Lesezeit

Snyk Open Source unterstützt das Scannen von C- und C++-Vendored-Open-Source-Abhängigkeiten über die CLI – und wir freuen uns, Ihnen mitteilen zu können, dass dies jetzt auch über unsere CI-Plugins verfügbar ist. Dieser Leitfaden zeigt Ihnen, wie Sie C/C++-Sicherheitsscans in Pipelines integrieren, damit Entwickler direkt Informationen zu Schwachstellen und Empfehlungen zur Behebung erhalten. Beachten Sie, dass wir uns in diesem Leitfaden der Einfachheit halber auf „C/C++“ als „C++“ beziehen.

Option 1: CI-Plugins verwenden

Snyk lässt sich in viele CI/CD-Plattformen integrieren, darunter Jenkins, Azure DevOps und GitHub Actions. Alle diese Plugins haben eines gemeinsam: Sie kapseln die Snyk CLI und weitere Tools, um Konfiguration und Nutzung zu vereinfachen. Das bedeutet auch, dass ihre Konfiguration identisch ist und Sie bei allen Plugins ein zusätzliches Befehlszeilenargument an die Snyk CLI übergeben können.

Um ein C++-Projekt zu scannen, müssen Sie lediglich --unmanaged als zusätzliches Argument hinzufügen. Hier sehen Sie eine Beispielkonfiguration des Snyk Security-Plugins für Jenkins:

Jenkins-Konfigurationsformular mit dem Projektnamen „cpp-goof“, der Snyk-Installation „snyk@latest“ und dem zusätzlichen Argument „--unmanaged“.

Nach dem Build ist ein Eintrag Snyk Security Report auf der Seite mit den Build-Details verfügbar:

Jenkins-Snyk-Testbericht mit 58 bekannten Schwachstellen in 14 C/C++-Abhängigkeiten, darunter ein kritischer Out-of-Bounds-Lesezugriff

Der Sicherheitsbericht führt die erkannten Schwachstellen auf, basierend auf den identifizierten Open-Source-Abhängigkeiten. Für jede Schwachstelle werden der Schweregrad, die betroffene Abhängigkeit und die Version des Open-Source-Projekts angegeben, in der die Schwachstelle behoben ist.

Sicherheitswarnung zu einem schwerwiegenden Heap-basierten Pufferüberlauf im Paket dnsmasq mit der Empfehlung, auf Version 2.83 oder höher zu aktualisieren.

Option 2: Ein Skript verwenden

Die beiden CLI-Befehle zum Scannen von C++-Projekten sind snyk test und snyk monitor, jeweils mit der Befehlszeilenoption --unmanaged. Beide scannen den Code nach Open-Source-Abhängigkeiten und deren Schwachstellen, erfüllen aber unterschiedliche Zwecke.

snyk test

Der Befehl snyk test --unmanaged ist der grundlegende Befehl zum Erstellen einer Liste der Schwachstellen. Er identifiziert Open-Source-Abhängigkeiten in Ihrem Code und fragt anschließend die Snyk Vulnerability Database nach bekannten Schwachstellen ab. Er ist für den Einsatz in CI-Pipelines vorgesehen (mit Unterstützung für JSON-Ausgaben) und gibt einen Exit-Code ungleich null zurück, wenn ein Problem erkannt wird. Wenn Sie Ihre Open-Source-Abhängigkeiten als Archive speichern, kann die Snyk CLI auch deren Inhalt analysieren.

snyk monitor

Anders als der vorherige Befehl übergibt snyk monitor --unmanaged die Berichterstattung über Probleme an die Snyk-Benutzeroberfläche. Der Befehl erstellt einen Snapshot der aktuell identifizierten Abhängigkeiten und ihrer Schwachstellen und importiert ihn in Ihr Snyk-Dashboard. Anschließend werden die identifizierten Abhängigkeiten auf neue Schwachstellen überwacht. Sie erhalten eine Benachrichtigung, sobald eine neue Schwachstelle in die Snyk Vulnerability Database aufgenommen wird. Dieser Befehl gibt bei Erkennung eines Problems keinen Exit-Code zurück.

Wichtig ist, dass dieser Befehl tatsächlich einen Snapshot der aktuell erkannten Abhängigkeiten erstellt. Snyk speichert die Signaturen auf den Servern nur für kurze Zeit, um Fehler zu beheben. Da sich unsere Open-Source-Datenbank weiterentwickelt, kann Snyk möglicherweise neue Bibliotheken und deren Schwachstellen erkennen. Deshalb sollten Sie den Befehl snyk monitor --unmanaged regelmäßig ausführen.

snyk-to-html

snyk-to-html ist ein eigenständiges Tool, das die JSON-Ausgabe von snyk test --json in ein für Menschen lesbares HTML-Dokument umwandelt. Ein typischer Aufruf mit dem unmanaged-Befehl snyk test sieht so aus:

snyk test --unmanaged --json | snyk-to-html -o snyk_results.html

Alles zusammenführen

Regelmäßige Überwachung ist wichtig, um Ihre Sicherheitslage zu erhalten. Am besten sichern Sie Ihren Code, indem Sie den Snapshot der identifizierten Abhängigkeiten in Ihr Snyk-Dashboard importieren und sich vom nächtlichen Überwachungsprozess über neue Schwachstellen benachrichtigen lassen. Wenn Sie snyk monitor --unmanaged regelmäßig ausführen, bleibt der Abhängigkeiten-Snapshot mit den neuesten Schwachstellendaten auf dem aktuellen Stand. Außerdem erhalten Sie Benachrichtigungen über neue Schwachstellen, sobald diese in unserer Vulnerability Database auftauchen.

Wenn Sie einzelne Commits oder Branches testen und die Pipeline bei Schwachstellen fehlschlagen lassen möchten, führen Sie nur den Befehl snyk test --unmanaged aus. Wenn Sie den Befehl test mit snyk monitor --unmanaged verketten, werden die Ergebnisse außerdem sofort in Ihr Dashboard importiert. Der Snapshot der Abhängigkeiten wird nur aktualisiert, wenn der Test erfolgreich ist:

$ snyk test --unmanaged && snyk monitor --unmanaged

Das lässt sich auch mit anderen Optionen verwenden, etwa severity-threshold=high. Damit schlägt Snyk den Build nur fehl, wenn Sie Schwachstellen mit dem Schweregrad high oder höher einführen. Eine vollständige Liste der unterstützten Befehlszeilenoptionen finden Sie in unserer Snyk-Dokumentation für C/C++.

Beispiel für eine GitLab-CI/CD-Pipeline-Definition

dependency_scanning:
  image: node:latest  # we need npm to install Snyk CLI and we don't need any C++ tooling to run the scan
  stage: test
  script:
    # Install npm, snyk, and snyk-to-html
    - npm install -g npm@latest
    - npm install -g snyk
    - npm install snyk-to-html -g
    # Run snyk help, snyk auth, snyk monitor, snyk test to break build and out report
    - snyk --help
    - snyk auth $SNYK_TOKEN
    - snyk monitor --unmanaged --project-name=cpp-goof-gitlab
    - snyk test --unmanaged --json | snyk-to-html -o snyk_results.html

  # Save report to artifacts
  artifacts:
    when: always
    paths: 
      - snyk_results.html

Probleme beheben

Um ein Problem zu beheben, muss der Quellcode des Open-Source-Pakets mit der erkannten Schwachstelle durch die neuere empfohlene Version ersetzt werden. Folgen Sie den Empfehlungen unter der URL des Problems, um herauszufinden, in welcher Version Ihrer Abhängigkeit das Sicherheitsproblem behoben ist.

$ snyk test --unmanaged
Testing c-example...

Issues:

 ✗ [Low] Race Condition
    Introduced through: https://curl.se|curl@7.58.0
    URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-CURL-2317489
Seite der Snyk Vulnerability Database mit einer Race Condition in curl, die die Versionen 7.10.4 und 7.77.0 betrifft, sowie einem Hinweis zum Upgrade.

Nach einer Aktualisierung des Quellcodes kann Folgendes passieren:

  1. Das Problem wird nicht mehr erkannt und ist behoben.

  2. Das Problem wird weiterhin erkannt, weil die Open-Source-Abhängigkeit nicht korrekt identifiziert wurde.

Zu Punkt 2: Der Grund dafür ist, dass wir unsere Open-Source-Datenbank monatlich mit neuen Releases aktualisieren. Möglicherweise wurde die neueste Version des Pakets, das Sie gerade in Ihren Code aufgenommen haben, noch nicht hinzugefügt. Um zu prüfen, ob Snyk die Abhängigkeit und ihre Version korrekt identifiziert hat, führen Sie den Befehl test mit der Option --print-deps aus:

$ snyk test --unmanaged --print-deps
Testing c-example...

Dependencies:

  https://curl.se|curl@7.58.0
  confidence: 0.800

Issues:

 ✗ [Low] Race Condition
    Introduced through: https://curl.se|curl@7.58.0
    URL: https://security.snyk.io/vuln/SNYK-UNMANAGED-CURL-2317489

Beachten Sie, dass die Kennzahl confidence angibt, wie sicher Snyk sich bei der Übereinstimmung ist.

Welcher Confidence-Wert ist gut?

Die Antwort lautet: Es kommt darauf an. Der Confidence-Wert entspricht dem Anteil lokaler Dateien, die mit einem tatsächlichen Release des Open-Source-Projekts übereinstimmen. Wenn beispielsweise ein bestimmtes Release eines Open-Source-Projekts (das Paket mit dem Quellcode) 1000 Dateien enthält und Ihr lokales Projekt 900 davon enthält, während der Rest aufgrund von Änderungen nicht übereinstimmt, beträgt der Confidence-Wert 900/1000 = 0,9. Derselbe Confidence-Wert gilt jedoch auch für ein Open-Source-Projekt mit 10 Dateien, von denen 9 mit lokalen Dateien übereinstimmen – ein ganz anderer Fall als das vorherige Beispiel. Sie entscheiden selbst, welcher Confidence-Wert ausreichend ist und welche identifizierten Abhängigkeiten Sie ignorieren möchten.

Wenn die Identifizierung nicht korrekt ist, können Sie den Befehl snyk ignore verwenden, um die Abhängigkeit vorübergehend zu ignorieren:

$ snyk ignore --file-path='./deps/curl-7.60.0/*' --expiry='2022-05-20' --reason='patched the release and waiting for Snyk OS database to update'

Die Zukunft des C/C++-Sicherheitsscannings

Wir arbeiten daran, die Genauigkeit unserer Scans zu verbessern. Dazu konzentrieren wir uns stärker auf die Kuratierung von Open-Source-Projekten und verbessern unsere Matching-Algorithmen, damit sie auch leicht veränderten Code (oder entfernte Tests und Dokumentation) berücksichtigen. Dazu gehören häufigere Aktualisierungen unserer Quellcode-Datenbank und das Hinzufügen von Projekten ohne Releases.

Als Alternative zur unmanaged (signaturbasierten) Erkennung von C++-Komponenten entwickeln wir eine API, über die Sie unsere Vulnerability Database direkt abfragen können. Haben Sie Feedback oder möchten Sie mehr über die neue API erfahren? Schreiben Sie uns an ccpp@snyk.io.

Starten Sie mit Capture-the-Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Challenges lösen.