In this article
Eine Zusammenfassung der Sicherheitsnews mit einem CrewAI-KI-Agenten erstellen
Zahlreiche Quellen für Sicherheitsnews und Schwachstellendatenbanken zu durchforsten, ist mühsam. Doch dank agentischer KI-Workflows können wir diese Arbeit an ein LLM delegieren. Dieser Artikel zeigt, wie Sie mit dem Open-Source-Framework CrewAI einen KI-Agenten erstellen, der Sicherheitsnews kuratiert.
KI-Agenten zum Kuratieren von Sicherheitsnews
Bei der Anwendung, die wir erstellen, konzentrieren wir uns darauf, neue Sicherheitslücken aus der Snyk Vulnerability Database als Sicherheitsnews-Feed zu kuratieren.
Unser KI-Agent wird ein Kommandozeilen-Tool sein, das die Webseite der Snyk Vulnerability Database für ein bestimmtes Ökosystem öffnet (wir verwenden das npm-JavaScript-Ökosystem) und die drei relevantesten CVE-Berichte auswählt, die er für besonders wichtig hält.
Erste Schritte mit CrewAI
Im ersten Schritt richten wir in einem Verzeichnis Ihrer Wahl in Ihrer lokalen Entwicklungsumgebung ein neues Projektverzeichnis ein und initialisieren dort das CrewAI-Framework.
Voraussetzungen:
Der uv-Paketmanager ist installiert und lokal verfügbar.
Eine Python-Laufzeitumgebung >= 3.x (kann mit
uvinstalliert werden)
Beginnen wir im Verzeichnis Ihrer Wahl mit der Installation der crewai-Bibliothek und der Tools:
uv tool install crewaiFügen Sie sie anschließend Ihrer Shell-Umgebung hinzu, damit wir den Befehl crewai wie ein globales ausführbares Programm ausführen können:
uv tool update-shellJetzt können wir ein neues crewai-Projekt einrichten:
crewai create crew <your_project_name>Installieren Sie anschließend die Abhängigkeiten dieses Projekts mit folgendem Befehl:
crewai installDas eingerichtete Projektverzeichnis sollte nun wie folgt aussehen:

Auf hoher Ebene enthält CrewAI eine crew.py-Datei, in der die Agenten und Aufgaben definiert werden:
@agent
def researcher(self) -> Agent:
return Agent(
config=self.agents_config['researcher'], # type: ignore[index]
verbose=True
)
@agent
def reporting_analyst(self) -> Agent:
return Agent(
config=self.agents_config['reporting_analyst'], # type: ignore[index]
verbose=True
)
Dieselbe Datei enthält auch die Aufgaben, die wir mit diesen Agenten ausführen möchten:
@task
def research_task(self) -> Task:
return Task(
config=self.tasks_config['research_task'], # type: ignore[index]
)
@task
def reporting_task(self) -> Task:
return Task(
config=self.tasks_config['reporting_task'], # type: ignore[index]
output_file='report.md'
)Die Datei main.py enthält mehrere exportierte Funktionen wie run(), train() und weitere, die die Agenten aufrufen und ihnen die benötigten Eingaben für ihre Arbeit bereitstellen.
So sieht der Ablauf zum Starten der Agenten in der Python-Hauptdatei aus:
def run():
"""
Run the crew.
"""
inputs = {
'topic': 'AI LLMs',
'current_year': str(datetime.now().year)
}
try:
SecurityNewsSummary().crew().kickoff(inputs=inputs)
except Exception as e:
raise Exception(f"An error occurred while running the crew: {e}")Das oben Beschriebene entspricht der standardmäßigen Projektverzeichnisstruktur, die CrewAI erstellt. Wir nehmen jedoch Änderungen vor, definieren eigene Agenten und Aufgaben und entwickeln ein eigenes Tool, das die Agenten aufrufen können.
Individuelle agentische Workflows mit CrewAI erstellen
Wir nehmen Änderungen an drei zentralen Bestandteilen des eingerichteten CrewAI-Projektverzeichnisses vor:
Änderungen an den Agenten in
config/agents.yamlÄnderungen an den Aufgaben in
config/tasks.yamlÄnderungen am CrewAI-Python-Hauptprogramm crew.py
Außerdem erstellen wir im Verzeichnis tools/ ein eigenes Tool, das den HTML-Code einer Webseite mit der verbreiteten Python-Bibliothek BeautifulSoup ausliest.
KI-Agenten
Eine gute Faustregel für KI-Agenten lautet, ihre Aufgaben möglichst kleinteilig aufzuschlüsseln. Wie auch beim Software-Engineering und -Design ist es hilfreich, große Probleme in kleinere zu zerlegen.
Dementsprechend definieren wir zwei Agenten:
Einen CVE-Kurator, der auf der Webseite Links zu den seiner Einschätzung nach wichtigsten CVEs findet.
Einen CVE-Rechercheur, der die einzelnen CVE-Links (Webseiten) aufruft und Daten daraus extrahiert.
Öffnen Sie config/agents.yaml und ersetzen Sie die von CrewAI erstellte Agentendefinition durch Folgendes:
1cve_curator:
2 role: >
3 Senior Security Analyst
4 goal: >
5 Find the links to the top most interesting CVEs reported in {security_vulnerabilities_url}.
6 backstory: >
7 You're a seasoned web scraper with a knack for parsing HTML pages and extracting the most relevant information.
8
9cve_researcher:
10 role: >
11 Senior Security Researcher
12 goal: >
13 Summarize and format the CVE information found by the CVE curator.
14 backstory: >
15 You're a meticulous security researcher with a keen eye for detail. You're known for
16 your ability to turn complex data into clear and concise reports, making
17 it easy for others to understand and act on the information you provide.Aufgaben
Als Nächstes müssen wir die Aufgaben für die oben genannten Agenten definieren:
Die erste Aufgabe besteht darin, Links zu den CVEs aus dem Verzeichnis der Schwachstellendatenbank zu extrahieren (der Hauptwebseite mit den Suchergebnissen bzw. der Liste der Schwachstellen).
Bei der Folgeaufgabe extrahiert der CVE-Rechercheur die CVE-Schwachstellendaten von der Informationsseite zu jeder CVE.
Öffnen Sie die Datei config/tasks.yaml und ersetzen Sie den von der CrewAI-Bibliothek erstellten Inhalt durch Folgendes:
cve_curation_task:
description: >
Parse the HTML page to find the top most interesting CVEs reported in {security_vulnerabilities_url}.
You need to select 3 CVEs from the page and extract the link to their vulnerability page.
For example, the link to the vulnerability for the package @trpc/server is: https://security.snyk.io/vuln/SNYK-JS-TRPCSERVER-10060256
You should de-prioritize choosing CVEs for malicious packages. Instead, you should prioritize CVEs for popular packages and those that are likely
to have a high impact on the open-source ecosystem.
expected_output: >
A total of 3 CVEs, each formatted as a bullet point in the following markdown format
```
- https://security.snyk.io/vuln/SNYK-JS-TRPCSERVER-10060256
```
agent: cve_curator
cve_research_task:
description: >
For each of the CVE you should extract information by visiting the link to the vulnerability and extracting the information from the page.
For example, the link to the vulnerability for the package @trpc/server is: https://security.snyk.io/vuln/SNYK-JS-TRPCSERVER-10060256
Once you have the link, visit the page and extract the following information:
1) CVE ID (example: CVE-2025-12345)
2) Type of Vulnerability (example: RCE, SQL Injection, etc.)
3) CVE Publication Date (example: 2025-01-01)
4) Link to the CVE vulnerability page (example: https://security.snyk.io/vuln/SNYK-JS-KIBANA-10339388). The link exists as the href attribute of the anchor tag in the HTML page, set on the name of the vulnerability.
5) Package name that was found vulnerable (example: kibana)
expected_output: >
A total of 3 CVEs, each formatted as a bullet point in the following markdown format (strict markdown formatting for example links should not have space between the [] and () chars):
```
**@trpc/server** found vulnerable to CVE-2025-43855 [Uncaught Exception](https://security.snyk.io/vuln/SNYK-JS-TRPCSERVER-10060256), 24 Apr 2025
```
agent: cve_researcherSie werden feststellen, dass die Aufgaben für unsere KI-Agenten sorgfältig formuliert sind, damit sie diese interpretieren und einhalten können. Dazu gehören ein Beispiel für die erwartete Ausgabe und Regeln, die zu befolgen sind.
Eigene Tools
Für die erste Aufgabe und unseren ersten Agenten, die CVE-Kuration, müssen wir ein eigenes Tool in Python entwickeln. Das ist nötig, weil das integrierte CrewAI-Tool ScrapeWebsiteTool lediglich Text von einer Webseite extrahiert und den HTML-Quellcode nicht weiter analysieren kann, um Ankerelemente (<a href>) mit Links zu den CVE-Daten auf der Seite auszulesen.
Um ein neues eigenes Tool zu erstellen, das unsere Agenten verwenden können, öffnen Sie zunächst die Datei tools/__init__.py und aktualisieren Sie sie, sodass das neue Tool TableScraperTool wie folgt exportiert wird:
from .custom_tool import MyCustomTool
from .table_scraper import TableScraperTool
__all__ = ['MyCustomTool', 'TableScraperTool']Beachten Sie, dass MyCustomTool bereits im von CrewAI erstellten Beispielprojekt enthalten war.
Als Nächstes erstellen wir das TableScraperTool. Legen Sie dazu die neue Datei tools/table_scraper.py an und fügen Sie den folgenden Python-Code ein:
from typing import List, Dict, Any
from bs4 import BeautifulSoup
import requests
from crewai.tools import BaseTool
class TableScraperTool(BaseTool):
name: str = "table_scraper"
description: str = "Scrapes table data from a webpage, extracting rows, links, and other relevant information"
def _run(self, url: str) -> List[Dict[str, Any]]:
"""
Scrapes table data from the given URL.
Args:
url: The URL to scrape
Returns:
List of dictionaries containing table row data
"""
try:
response = requests.get(url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# Find all table rows
rows = soup.find_all('tr', class_='table__row')
table_data = []
for row in rows:
row_data = {}
# Extract severity
severity_elem = row.find('li', class_='severity__item')
if severity_elem:
row_data['severity'] = severity_elem.get('class', [''])[0].replace('severity__item--', '')
# Extract vulnerability title and link
title_link = row.find('a', class_='anchor--underline')
if title_link:
row_data['title'] = title_link.text.strip()
row_data['vuln_link'] = title_link.get('href', '')
# Extract package name and link
package_link = row.find('a', attrs={'data-snyk-test-package-manager': True})
if package_link:
row_data['package_name'] = package_link.text.strip()
row_data['package_link'] = package_link.get('href', '')
# Extract version ranges
version_spans = row.find_all('span', class_='vulns-table__semver')
if version_spans:
row_data['version_ranges'] = [span.text.strip() for span in version_spans]
# Extract package manager and date
package_manager = row.find('span', attrs={'type': True})
if package_manager:
row_data['package_manager'] = package_manager.get('type', '')
row_data['published_date'] = package_manager.get('published', '')
if row_data: # Only add if we found some data
table_data.append(row_data)
return table_data
except Exception as e:
return [{"error": f"Failed to scrape table data: {str(e)}"}]
async def _arun(self, url: str) -> List[Dict[str, Any]]:
"""Async implementation of the tool"""
return self._run(url)Zuletzt müssen wir die Python-Bibliothek BeautifulSoup als Projektabhängigkeit hinzufügen. Aktualisieren Sie dazu die Liste dependencies in myproject.toml wie folgt:
dependencies = [
...
"beautifulsoup4>=4.12.0"Wenden Sie die Änderung anschließend mit folgendem Befehl an:
uv pip install -e .CrewAI-Hauptdatei für die Ausführung
Sehen wir uns nun die Hauptdatei crew.py an. Sie finden sie unter src/security_news_summary oder in einem anderen Verzeichnis, in dem Sie das CrewAI-Projekt eingerichtet haben.
Bearbeiten Sie die Datei und passen Sie zunächst den Import wie folgt an (wir fügen unser eigenes TableScraperTool hinzu):
from crewai import Agent, Crew, Process, Task
from crewai.project import CrewBase, agent, crew, task
from crewai.agents.agent_builder.base_agent import BaseAgent
from crewai_tools import ScrapeWebsiteTool
from typing import List
from .tools import TableScraperToolScrollen Sie anschließend nach unten und suchen Sie die Funktionen mit den Annotationen für Agenten (gekennzeichnet durch die Annotation @agent) und Aufgaben (gekennzeichnet durch die Annotation @task). Aktualisieren Sie sie so, dass sie unseren oben definierten Agenten und Aufgaben entsprechen:
@agent
def cve_curator(self) -> Agent:
return Agent(
config=self.agents_config['cve_curator'], # type: ignore[index]
verbose=True,
tools=[ScrapeWebsiteTool(), TableScraperTool()]
)
@agent
def cve_researcher(self) -> Agent:
return Agent(
config=self.agents_config['cve_researcher'], # type: ignore[index]
verbose=True,
tools=[ScrapeWebsiteTool()]
)
# To learn more about structured task outputs,
# task dependencies, and task callbacks, check out the documentation:
# https://docs.crewai.com/concepts/tasks#overview-of-a-task
@task
def cve_curation_task(self) -> Task:
return Task(
config=self.tasks_config['cve_curation_task'], # type: ignore[index]
output_file='cves.md'
)
@task
def cve_research_task(self) -> Task:
return Task(
config=self.tasks_config['cve_research_task'], # type: ignore[index]
output_file='cves.md'
)KI-Agenten mit CrewAI ausführen
Das war’s. Jetzt können wir unsere KI-Agenten ausführen, die anhand der Snyk Vulnerability Database als Datenquelle neue Sicherheitslücken für uns kuratieren.
Starten Sie die CrewAI-Agenten einfach mit folgendem Befehl im Terminal:
crewai runDie KI-Agenten beginnen nun mit ihrer Arbeit:

Im weiteren Verlauf werden die Aufgaben und ihr Fortschritt angezeigt:

Über KI-Sicherheit und agentische Workflows
KI-Agenten zu entwickeln, fühlt sich magisch an. Wenn alles funktioniert, laufen sie überraschend gut, und die CrewAI-Bibliothek zur Agenten-Orchestrierung ist einfach zu bedienen.
Da sich KI und agentische Coding-Workflows rasant weiterentwickeln, sollten Sie die Vertrauenswürdigkeit von KI genau im Blick behalten und Sicherheitsvorkehrungen für KI einrichten. So vermeiden Sie Risiken und Sicherheitsprobleme wie unsichere MCP-Server-Bereitstellungen, Prompt-Injection-Angriffe und andere Angriffsflächen für KI-Sicherheitslücken.
Ich empfehle folgende Ressourcen:
Lesen Sie Snyks Leitlinien für KI-Code-Sicherheitsvorkehrungen
Sicheres KI-Coding mit Snyk (und MCP-Servern)
Prompt-Injection verstehen: von Techniken bis hin zu Herausforderungen und Risiken.
Sichere KI-Entwicklung von Anfang an
Erfahren Sie, wie Sie Sicherheit in jeden Schritt Ihres KI-Entwicklungsworkflows integrieren – mit konkreten Umsetzungstipps von Expertinnen und Experten.