Skip to main content

Proaktive AppSec und kontinuierliches Schwachstellenmanagement für Entwickler und Sicherheitsteams

Artikel von
blog feature snyk code green

2. Oktober 2024

0 Min. Lesezeit

Welche wachsenden Cybersicherheitsrisiken in der modernen Softwareentwicklung halten CISOs auf Trab?

Entwickler und Sicherheitsteams sehen sich einer stetig wachsenden Bedrohungslandschaft gegenüber: von ausgeklügelten Angriffen auf die Open-Source- und die von Anbietern kontrollierte Supply-Chain bis hin zu Schwachstellen, die durch KI-generierten Code entstehen, etwa Prompt-Injection und mangelhafte Codesicherheit bei GitHub Copilot. Die Komplexität moderner Anwendungen, die häufig stark auf Open-Source-Komponenten (wie jene auf npm, PyPI oder RubyGems) und containerisierte Deployments setzen, verschärft die Herausforderung zusätzlich.

Angesichts des Ausmaßes und der Komplexität dieser Risiken ist die Automatisierung des Schwachstellenmanagements unverzichtbar geworden. Manuelle Cybersicherheitsprozesse können mit der Menge und Geschwindigkeit potenzieller Schwachstellen und der Softwareentwicklung schlicht nicht Schritt halten. Automatisierung beschleunigt nicht nur das Erkennen und Beheben von Sicherheitsproblemen, sondern gewährleistet auch, dass diese routinemäßig von Sicherheitsteams ausgeführten Prozesse in allen Phasen des Softwareentwicklungslebenszyklus konsequent angewendet werden.

Die Bedeutung eines kontinuierlichen Schwachstellenmanagements in bestimmten Bereichen

  • Zunehmende Abhängigkeit von Open-Source-Komponenten: Open-Source-Komponenten sind aus der modernen Softwareentwicklung nicht mehr wegzudenken. Sie beschleunigen zwar die Entwicklung von Anwendungen und helfen, Kosten zu senken, bringen aber auch erhebliche Sicherheitsrisiken mit sich. Angriffe auf die Supply-Chain mit großer Tragweite, wie die XZ-Backdoor und der SolarWinds-Angriff, haben das Potenzial weitreichender Schäden verdeutlicht, wenn Schwachstellen in Open-Source-Abhängigkeiten und geschlossenen, von Anbietern kontrollierten Komponenten ausgenutzt werden.

  • Zunehmender Einsatz von KI-generiertem Code in der Entwicklung: Der Aufstieg generativer KI (GenAI) in der Softwareentwicklung bringt sowohl Chancen als auch Herausforderungen mit sich. GenAI kann Programmieraufgaben erheblich beschleunigen, aber auch neue Schwachstellen einführen. KI-generiertem Code fehlen möglicherweise die Sicherheitsaspekte, die erfahrene Entwickler üblicherweise berücksichtigen. Dadurch können Sicherheitslücken entstehen. Ein Beispiel dafür ist, dass GitHub Copilot eine XSS-Schwachstelle in React einführte.

  • Rasantes Wachstum containerisierter Anwendungen: Containerisierte Apps sind zum Standard für das Deployment moderner Software geworden. Container bieten zahlreiche Vorteile, darunter Konsistenz über verschiedene Umgebungen hinweg und einfache Skalierbarkeit. Gleichzeitig bringen sie neue Sicherheitsherausforderungen mit sich, insbesondere bei der Verwaltung von Schwachstellen in Container-Images. Entwickler benötigen daher Unterstützung dabei, das beste Container-Image auszuwählen und allgemeine Tipps zu Containern zu lernen. Die Automatisierung beim Umgang mit Schwachstellen in Docker-Container-Images ist jedoch unverzichtbar.

Sehen wir uns das etwas genauer an … Ein weiteres Beispiel für einen folgenschweren Angriff auf die Supply-Chain ist der Angriff auf Codecov. Dabei gelangten Angreifer durch die Ausnutzung von Schwachstellen in einem beliebten Tool zur Codeabdeckung an sensible Daten. Zum Arbeitsalltag von Entwicklern gehört es, die Risiken im Zusammenhang mit Open-Source-Abhängigkeiten zu verwalten. Diese können sowohl direkte als auch transitive Schwachstellen in Ihre Codebasis einbringen. Direkte Schwachstellen finden sich in Bibliotheken, die Sie explizit einbinden. Transitive Schwachstellen stecken hingegen in den Abhängigkeiten dieser Bibliotheken. Die manuelle Verwaltung dieser Risiken ist eine enorme Herausforderung. Automatisierung ist daher ein entscheidender Bestandteil einer robusten Sicherheitsstrategie.

KI-Codeassistenten wie GitHub Copilot oder ChatGPT bringen mit GenAI reale potenzielle Schwachstellen mit sich. GenAI kann unbeabsichtigt unsichere Programmierpraktiken einführen oder kontextspezifische Sicherheitsanforderungen übersehen. Ein KI-Modell könnte beispielsweise Code generieren, der anfällig für SQL-Injection- oder Cross-Site-Scripting-Angriffe (XSS) ist. Die Überwachung und Absicherung von KI-generiertem Code ist daher entscheidend für die Sicherheit von Anwendungen.

Auch die Komplexität, mit neuen Container-Schwachstellen Schritt zu halten, stellt Sicherheitsteams vor Herausforderungen. Das rasante Auftreten neuer Container-Schwachstellen kann überwältigend sein. Jede neue Schwachstelle muss rechtzeitig erkannt und behoben werden, um mögliche Exploits zu verhindern. Um die Container-Sicherheit wirksam zu verwalten, sind automatisierte Lösungen mit Sicherheitsexpertise erforderlich.

Schwachstellen in Containern können sich erheblich auf die Gesamtsicherheit Ihrer Anwendungen auswirken. Ein einziges anfälliges Container-Image kann den gesamten Anwendungsstack gefährden. Tools wie Snyk Container automatisieren das Erkennen und Beheben von Schwachstellen in Container-Images. Snyk Container kann neue Basis-Image-Tags vorschlagen, die die Anzahl der Schwachstellen minimieren, und Pull Requests zur Aktualisierung Ihrer Code-Repositories automatisieren.

Wie können wir all diese Cybersicherheitsbedrohungen für die AppSec eindämmen?

Proaktive AppSec und kontinuierliches Schwachstellenmanagement mit Snyk


Um die Risiken durch KI-generierten Code einzudämmen, sollten Sie Tools wie Snyk Code verwenden. Dieses schnelle SAST-Tool basiert auf Snyk DeepCode AI und lässt sich über ein Plugin direkt in die IDE von Entwicklern integrieren. Es nutzt sicherheitsspezifische Trainingsdaten, um anfälligen und unsicheren Code zu erkennen. So können Probleme frühzeitig in der Entwicklung identifiziert und behoben werden.

Der Einstieg in Snyk DeepCode AI ist unkompliziert. Das Plugin unterstützt beliebte IDEs wie Visual Studio Code, IntelliJ IDEA, VS Code und PyCharm.

Kurzanleitung zur Installation und Integration von Snyk DeepCode AI in Visual Studio Code

1. Snyk-Erweiterung installieren:

  • Öffnen Sie Visual Studio Code.

  • Öffnen Sie die Erweiterungsansicht, indem Sie in der Aktivitätsleiste am Rand des Fensters auf das Symbol für Erweiterungen klicken.

  • Suchen Sie nach „Snyk“ und klicken Sie bei der Snyk-Erweiterung auf „Installieren“.

2. Bei Snyk authentifizieren:

  • Nach der Installation werden Sie aufgefordert, sich mit Ihrem Snyk-Konto zu authentifizieren.

  • Folgen Sie den Anweisungen auf dem Bildschirm, um sich hier anzumelden oder ein Konto zu erstellen.

3. Snyk DeepCode AI aktivieren:

  • Wechseln Sie nach der Authentifizierung in der Aktivitätsleiste zur Snyk-Ansicht.

  • Aktivieren Sie Snyk DeepCode AI, um Ihren Code auf Schwachstellen zu scannen.

Nach der Installation zeigt das Snyk-Logo in der Seitenleiste Schwachstellen und Sicherheitsprobleme an, die in Ihren Open-Source-Abhängigkeiten, Ihrem eigenen Code (oder GenAI-generiertem Code) und Ihrer IaC gefunden wurden.

Dunkler Code-Editor mit Snyk-Sicherheitslücken neben JavaScript-Code für eine Express-App und eine SQLite-Datenbank.

Die Vorteile von SAST-Tools: unsichere Codemuster direkt in der IDE erkennen

  1. Feedback in Echtzeit: Während Sie Code schreiben, analysiert Snyk DeepCode AI ihn in Echtzeit und gibt sofort Rückmeldung zu möglichen Sicherheitsproblemen. So können Entwickler Schwachstellen beheben, bevor sie sich dauerhaft in der Codebasis festsetzen.

  2. KI-gestützte Einblicke: Das KI-Modell wurde mit umfangreichen sicherheitsspezifischen Daten trainiert. Dadurch kann es unsichere Codemuster erkennen, auch wenn diese durch GenAI oder schlechte Programmierpraktiken eingeführt wurden.

  3. Nahtlose Integration: Dank der direkten Integration in die IDE fügt sich Snyk DeepCode AI natürlich in den Workflow von Entwicklern ein. So werden Unterbrechungen minimiert und die Produktivität maximiert.

Sehen wir uns ein Beispiel dafür an, wie sich durch GenAI eingeführte Schwachstellen eindämmen lassen. In diesem Projekt habe ich GitHub Copilot verwendet, um den Code für eine Express-POST-Endpunkt-Route zur Abfrage der OpenAI-API automatisch zu vervollständigen. Anschließend habe ich res.send() verwendet, um die Antwort an den Browser zu senden.

Was aber, wenn die Antwort in dieser Payload direkt im Browser gerendert würde? Wenn für diese Anfrage der standardmäßige Content-Type-Header text/html verwendet würde, wäre die laufende Anwendung von einer Cross-Site-Scripting-Schwachstelle betroffen. Was können wir dagegen tun?

Code-Editor mit einem OpenAI-Chat-Completion-Endpunkt und hervorgehobenem Cross-Site-Scripting-Problem (XSS)

Wie Sie in der Anmerkung über Zeile 31 sehen, schlägt Snyk eine Lösung für dieses Sicherheitsproblem vor. Ich habe darauf geklickt und innerhalb weniger Sekunden schlug die Snyk-DeepCode-AI-Erweiterung folgende Abwehrmaßnahme vor: res.send() wurde durch res.json ersetzt:

res.json(response.choices[0].message.content);

Mit dieser Änderung erzwingt die Express-Anwendung den content-type der Antwort als application/json. Dabei handelt es sich um einen allgemeinen Texttyp, der Text wie <script>alert()</script> zulässt.

Wenn Entwickler Snyk in ihrer IDE einsetzen, können sie mithilfe der zugrunde liegenden Snyk-DeepCode-AI-Engine Schwachstellen proaktiv erkennen und eindämmen. So ist ihr Code von Anfang an sicher. Dieser proaktive Ansatz für die Anwendungssicherheit ist in der heutigen Umgebung unverzichtbar, in der die Risiken durch Open-Source-Supply-Chains und GenAI-generierten Code allgegenwärtig sind.

Abhängigkeitsmanagement mit Snyk Open Source automatisieren

Snyk Open Source ist ein leistungsstarkes Tool, mit dem Entwickler und Sicherheitsteams die Risiken im Zusammenhang mit Open-Source-Abhängigkeiten verwalten können. Angesichts der zunehmenden Abhängigkeit von Open-Source-Bibliotheken war ein robustes und automatisiertes Abhängigkeitsmanagement noch nie so wichtig. Snyk Open Source bietet umfassende Funktionen zum Scannen und Beheben von Schwachstellen und trägt so dazu bei, dass Ihre Projekte sicher und konform bleiben.

In meiner vorherigen Node.js-Anwendung verwende ich auch eine SQLite-Abhängigkeit. Snyk weist mich auf ein Sicherheitsproblem hin:

Der Code-Editor markiert eine anfällige sqlite3-Abhängigkeit und zeigt einen detaillierten Bericht zur Schwachstelle „Freigabe einer Ressource nach Ende ihrer effektiven Lebensdauer fehlt“.

Diese Informationen zu Schwachstellen helfen dabei, zu verstehen, welche transitive Abhängigkeit das Sicherheitsrisiko verursacht und wie es sich beheben lässt – sofern das überhaupt möglich ist. In diesem Fall wurde für die transitive Abhängigkeit inflight eine Schwachstelle mit mittlerem Schweregrad erkannt.

Snyk erkennt, dass meine Lockdatei und Abhängigkeit möglicherweise nicht mehr aktuell sind, und kann deshalb keinen Behebungspfad finden. Sehen wir uns aber an, wie die Automatisierung funktioniert, wenn wir das GitHub-Code-Repository in Snyk importieren. Anschließend werden in der Snyk-Anwendung folgende Informationen angezeigt:

Sicherheits-Dashboard mit einer Liste von Codeanalyseprojekten, Import- und Testzeitpunkten sowie der Anzahl der Probleme nach Schweregrad

Von diesem Zeitpunkt an öffnet Snyk automatisch neue Pull Requests, um Aktualisierungen von Abhängigkeiten vorzuschlagen, wenn Sicherheitslücken in meinem Paketmanifest erkannt werden.

Beim Verwalten von Abhängigkeiten geht es nicht nur um die Bibliotheken, die Sie direkt in Ihr Projekt einbinden. Auch transitive Abhängigkeiten – also jene, die von Ihren direkten Abhängigkeiten eingebunden werden – können Schwachstellen verursachen. Snyk erkennt und behebt Schwachstellen sowohl in direkten als auch in transitiven Abhängigkeiten.

Betrachten wir das folgende Szenario:

{
  "dependencies": {
    "express": "^4.17.1",
    "lodash": "^4.17.20"
  }
}

In diesem Beispiel sind express und lodash direkte Abhängigkeiten. express kann jedoch eigene Abhängigkeiten haben, die ihrerseits weitere Abhängigkeiten mitbringen können. Snyk durchläuft den gesamten Abhängigkeitsbaum und erkennt und behebt Schwachstellen auf jeder Ebene.

Beim Verwalten von Container-Schwachstellen hilft Snyk Container dabei, den Aufwand für die Aktualisierung von Basis-Image-Tags mit Sicherheitspatches zu reduzieren.

Snyk Container ist eine umfassende Lösung, mit der Entwickler und Sicherheitsteams Schwachstellen in Containern wirksam verwalten können. Containerisierte Anwendungs-Workloads sind in Unternehmen weit verbreitet, und damit steigt auch der Bedarf, diese Umgebungen abzusichern. Snyk Container lässt sich nahtlos in Ihre CI/CD-Pipeline integrieren und bietet kontinuierliche Überwachung sowie proaktive Behebung von Schwachstellen in Ihren Container-Images.

Eine der herausragenden Funktionen von Snyk Container ist die Möglichkeit, die Erstellung von Pull Requests zur Behebung von Schwachstellen in Ihren Container-Images zu automatisieren. Diese Automatisierung ist sowohl für Entwickler als auch für Sicherheitsteams ein echter Gewinn, da sie den manuellen Aufwand für die Absicherung von Container-Images erheblich reduziert.

Hier sehen Sie ein Beispiel dafür, wie Snyk Container einen PR automatisieren könnte, um ein anfälliges Paket in einem Dockerfile zu aktualisieren:

FROM node:14.1.0
RUN npm install express
COPY . /app
CMD ["node", "/app/index.js"]

Wenn Snyk Container eine Sicherheitslücke erkennt, erstellt es automatisch einen PR mit den erforderlichen Änderungen, um das Problem zu beheben. Dazu kann gehören, ein anfälliges Paket zu aktualisieren oder einen Sicherheitspatch anzuwenden. Durch die Automatisierung dieses Prozesses stellt Snyk Container sicher, dass Sicherheitslücken zeitnah behoben werden und sich das Zeitfenster für mögliche Angriffe verkürzt.

Tabelle zum Vergleich aktueller Node.js-Basis-Images und solcher mit Minor-Upgrade nach Anzahl und Schweregrad der Sicherheitslücken.

Wenn Sie diese empfohlenen Basis-Images verwenden, können Sie die Anzahl der Sicherheitslücken in Ihren Container-Images deutlich reduzieren und so die Sicherheit Ihrer Anwendungen insgesamt verbessern.

Fix-PR-Ansicht mit Upgrade des Dockerfile-Basis-Images von node:14.1.0 auf node:14.21.0

Snyk Container identifizierte mehrere Sicherheitslücken in diesem Basis-Image und erstellte automatisch PRs, um das Image und die zugehörigen Abhängigkeiten zu aktualisieren. Das Team konnte diese PRs schnell prüfen und mergen und die Anzahl der Sicherheitslücken innerhalb von Sekunden um über 30 % senken. Nach dem Mergen des Pull Requests bestanden die Tests in der CI/CD-Pipeline mit Bravour.

GitHub-Pull-Request zur Aktualisierung eines Snyk-Security-Node von Version 14.1.0 auf 14.21.0 mit Angaben zu Sicherheitslücken und Schweregradbewertungen

Dieser proaktive Ansatz verbesserte nicht nur die Sicherheitslage ihrer Anwendungen, sondern verschaffte den Entwicklern auch wertvolle Zeit, um sich auf die Entwicklung neuer Funktionen zu konzentrieren, anstatt Sicherheitslücken zu verwalten.

Sichern Sie Ihren Code während der Entwicklung

Snyk scannt Ihren Code auf Qualitäts- und Sicherheitsprobleme und gibt Ihnen direkt in Ihrer IDE Empfehlungen zur Behebung.