CyberOwl Security Check
Cross-reference recent cybersecurity alerts from 10 international CERTs
against the user's project to surface vulnerabilities that actually matter to
them.
High-level workflow
- Discover the project's full tech stack (dependencies, infra, frameworks)
- Fetch the alert feed from
https://cyberowlai.com/alerts.json
- Match alerts against the stack using tiered confidence
- Report only what's relevant, plus always-flag critical alerts
Run steps 1 and 2 in parallel when possible — don't make the user wait.
Step 1 — Deep project discovery
Build a comprehensive inventory. Go beyond top-level deps — look at
transitive dependencies, container base images, CI tool versions, and code
import patterns.
1a. Find all dependency and config files
Use Glob to locate files. Search for all of the following (skip categories
that return nothing):
| Category |
Files to find |
| Node.js |
package.json, package-lock.json, yarn.lock, pnpm-lock.yaml |
| Python |
requirements.txt, Pipfile, Pipfile.lock, pyproject.toml, poetry.lock, setup.py, setup.cfg |
| Go |
go.mod, go.sum |
| Ruby |
Gemfile, Gemfile.lock |
| Java/Kotlin |
pom.xml, build.gradle, build.gradle.kts |
| Rust |
Cargo.toml, Cargo.lock |
| PHP |
composer.json, composer.lock |
| C#/.NET |
*.csproj, packages.config, Directory.Packages.props |
| Swift |
Package.swift |
| Dart/Flutter |
pubspec.yaml |
| Elixir |
mix.exs |
| Perl |
cpanfile |
| Containers |
Dockerfile, Containerfile, docker-compose.yml, docker-compose.yaml |
| Kubernetes |
*.yaml in k8s/, kubernetes/, deploy/, manifests/ |
| Helm |
Chart.yaml, values.yaml |
| Terraform |
*.tf |
| Ansible |
*.yml in ansible/, playbooks/ |
| Vagrant |
Vagrantfile |
| CI/CD |
.github/workflows/*.yml, .gitlab-ci.yml, Jenkinsfile, .circleci/config.yml, azure-pipelines.yml |
| Build |
Makefile, Taskfile.yml, Justfile |
| Web servers |
nginx.conf, nginx/*.conf, apache2.conf, .htaccess, httpd.conf, Caddyfile, traefik.yml, traefik.toml |
| Databases |
prisma/schema.prisma, config/database.yml, alembic.ini |
| Env files |
.env.example, .env.sample |
| Version files |
.node-version, .nvmrc, .python-version, .ruby-version, .go-version, .java-version, .tool-versions, runtime.txt |
| Security |
.snyk, snyk.json, .trivyignore, security.txt, renovate.json, dependabot.yml |
1b. Read discovered files and extract
From each file, extract:
- Package names and versions (direct + transitive where lock files exist)
- Base images from Dockerfiles (
FROM lines) — note the OS, runtime, and version
- System packages installed via
apt-get install, apk add, yum install
- Action versions from CI workflows (e.g.
actions/checkout@v4)
- Cloud providers from Terraform (
provider "aws", resource prefixes)
- Database types from ORMs, connection strings, Docker services
- Service names from env variable patterns (
REDIS_URL, POSTGRES_HOST, MONGO_URI, KAFKA_BROKER)
1c. Grep for framework and library patterns in code
Use Grep to detect frameworks and libraries that might not appear in
dependency files. Search source directories for these import patterns:
- Frameworks:
import express, from django, import spring, using Microsoft.AspNetCore, import React, import Vue, from angular
- Auth:
passport, jsonwebtoken, jwt, oauth, auth0, firebase-auth, keycloak
- Crypto:
bcrypt, argon2, crypto, openssl, sodium
- HTTP clients:
axios, fetch, requests, httpx, okhttp, urllib3
- Message queues:
rabbitmq, kafka, celery, bull, sidekiq, nats
- Cloud SDKs:
aws-sdk, @google-cloud, azure, boto3
1d. Compile the stack inventory
Organize everything you found into a structured inventory:
- Languages (with versions where known)
- Frameworks (with versions)
- Direct dependencies (key ones — no need to list every tiny utility)
- Databases & data stores
- Infrastructure (container images, cloud providers, orchestration)
- CI/CD (platform and notable tool versions)
- Web servers & proxies
- Security tools already in use
This inventory drives the matching in Step 3 and is shown to the user in the
final output so they can verify completeness.
Step 2 — Fetch the alert feed
Use WebFetch to retrieve https://cyberowlai.com/alerts.json.
The JSON structure:
{
"generated_at": "2026-04-23T10:00:54Z",
"sources": {
"<SOURCE_NAME>": {
"items": [
{
"title": "...",
"link": "https://...",
"description": "...",
"date": "Apr 20, 2026"
}
]
}
}
}
Sources: US-CERT, CERT-FR, MA-CERT, IBM-X-FORCE-EXCHANGE, ZERODAYINITIATIVE,
OBS-Vigilance, VulDB, HK-CERT, CA-CCS, EU-CERT (~90 alerts total).
If the fetch fails: Tell the user the feed is unavailable, suggest they
check https://cyberowlai.com/activity/ directly, and still show the detected
stack inventory so the visit isn't wasted.
Step 3 — Intelligent matching
Cross-reference every alert's title and description against the full
stack inventory. Classify matches into tiers:
HIGH — Direct dependency or component match
The alert explicitly names a package, library, or tool the project uses.
Examples:
- Alert says "jQuery 3.6 vulnerability" → project has jQuery → MATCH
- Alert says "OpenSSL" → Dockerfile installs openssl → MATCH
- Alert says "nginx" → docker-compose has nginx service → MATCH
- Alert says "PostgreSQL" → project uses PostgreSQL → MATCH
MEDIUM — Framework or platform match
The alert targets a broader platform that encompasses something in the stack.
Examples:
- Alert says "Spring Framework" → project uses Spring Boot → MATCH
- Alert says "Linux kernel" → Dockerfile uses a Linux base image → MATCH
- Alert says "Chrome/Chromium" → project uses Puppeteer or Playwright → MATCH
- Alert says "Node.js" → project is a Node app → MATCH
LOW — Category match
The alert is about a class of technology the project uses, even without a
direct name match.
Examples:
- Alert about "DNS vulnerability" → project uses a DNS library → FLAG
- Alert about "TLS/SSL" → project uses HTTPS → FLAG
- Alert about "container escape" → project uses Docker → FLAG
CRITICAL — Always flag regardless of stack
Some alerts are important enough to surface no matter what the project uses.
Flag any alert where:
- Title contains: "actively exploited", "zero-day", "0-day", "critical RCE",
"remote code execution", "supply chain", "pre-auth", "unauthenticated"
- A CVE with CVSS ≥ 9.0 is mentioned
- The alert comes from CISA's Known Exploited Vulnerabilities catalog
(look for "Known Exploited Vulnerabilities" in title or description)
Step 4 — Output format
Use this structure for the report. Keep it concise — only show alerts that
matched or are critical. Don't dump the full 90-alert feed.
## CyberOwl Security Check
Last updated: [generated_at timestamp] | [N] sources checked | [total] alerts scanned
### Alerts matching your project ([count] found)
**HIGH — Direct dependency match:**
| Alert | Source | Matched Component | Date |
|---|---|---|---|
| [Title](link) | SOURCE | component-name (where detected) | date |
**MEDIUM — Platform/framework match:**
| Alert | Source | Related To | Date |
|---|---|---|---|
| [Title](link) | SOURCE | platform (context) | date |
**LOW — Category match:**
| Alert | Source | Related To | Date |
|---|---|---|---|
| [Title](link) | SOURCE | category (context) | date |
### Critical alerts (always worth knowing)
| Alert | Source | Why Flagged | Date |
|---|---|---|---|
| [Title](link) | SOURCE | Actively exploited / Zero-day / etc. | date |
### Your detected stack
- **Languages:** ...
- **Frameworks:** ...
- **Databases:** ...
- **Infrastructure:** ...
- **CI/CD:** ...
When no direct matches are found: Skip the matching tables and show only
the "Critical alerts" section with a note: "No alerts directly matched your
detected stack, but these critical advisories are worth reviewing." Always
include the detected stack section so the user can verify nothing was missed.
Omit empty tiers. If there are no HIGH matches, don't show that table.
Same for MEDIUM and LOW.
Important notes
- Be specific about where you found each component. Don't just say
"nginx" — say "nginx (from docker-compose.yml service)" or "OpenSSL (apt-get
install in Dockerfile)". This helps the user triage.
- Don't over-match. A generic alert about "multiple vulnerabilities in
various products" with no specific technology named should not match
anything. Matching must be based on actual technology names in the alert.
- Conciseness matters. The user wants a quick answer: "Am I affected?"
Don't pad the output. If there are 0 matches and 2 critical alerts, the
report should be short.
- Show your work on the stack so the user can catch anything you missed
and re-run if needed.
1---2name: cyberowlai3description: Check if recent cybersecurity alerts from 10 international CERTs affect your current project. Use when the user asks about security vulnerabilities, CVEs, "is my project affected", "any new security alerts", "check for vulnerabilities", "cyberowlai", or "/cyberowlai". Also trigger when the user is working on dependency updates, Dockerfile changes, security audits, or any security-related task — even if they don't explicitly mention CyberOwl AI. Trigger on questions like "should I update my dependencies", "are there any new CVEs for X", "security check", or "what vulnerabilities should I worry about". If the user mentions a specific CVE or advisory ID, use this skill to cross-reference it against their stack.4---5
6# CyberOwl Security Check
7
8Cross-reference recent cybersecurity alerts from 10 international CERTs
9against the user's project to surface vulnerabilities that actually matter to
10them.
11
12## High-level workflow
13
141. **Discover the project's full tech stack** (dependencies, infra, frameworks)
152. **Fetch the alert feed** from `https://cyberowlai.com/alerts.json`
163. **Match alerts against the stack** using tiered confidence
174. **Report** only what's relevant, plus always-flag critical alerts
18
19Run steps 1 and 2 in parallel when possible — don't make the user wait.
20
21---
22
23## Step 1 — Deep project discovery
24
25Build a comprehensive inventory. Go beyond top-level deps — look at
26transitive dependencies, container base images, CI tool versions, and code
27import patterns.
28
29### 1a. Find all dependency and config files
30
31Use Glob to locate files. Search for all of the following (skip categories
32that return nothing):
33
34| Category | Files to find |
35|---|---|
36| **Node.js** | `package.json`, `package-lock.json`, `yarn.lock`, `pnpm-lock.yaml` |
37| **Python** | `requirements.txt`, `Pipfile`, `Pipfile.lock`, `pyproject.toml`, `poetry.lock`, `setup.py`, `setup.cfg` |
38| **Go** | `go.mod`, `go.sum` |
39| **Ruby** | `Gemfile`, `Gemfile.lock` |
40| **Java/Kotlin** | `pom.xml`, `build.gradle`, `build.gradle.kts` |
41| **Rust** | `Cargo.toml`, `Cargo.lock` |
42| **PHP** | `composer.json`, `composer.lock` |
43| **C#/.NET** | `*.csproj`, `packages.config`, `Directory.Packages.props` |
44| **Swift** | `Package.swift` |
45| **Dart/Flutter** | `pubspec.yaml` |
46| **Elixir** | `mix.exs` |
47| **Perl** | `cpanfile` |
48| **Containers** | `Dockerfile`, `Containerfile`, `docker-compose.yml`, `docker-compose.yaml` |
49| **Kubernetes** | `*.yaml` in `k8s/`, `kubernetes/`, `deploy/`, `manifests/` |
50| **Helm** | `Chart.yaml`, `values.yaml` |
51| **Terraform** | `*.tf` |
52| **Ansible** | `*.yml` in `ansible/`, `playbooks/` |
53| **Vagrant** | `Vagrantfile` |
54| **CI/CD** | `.github/workflows/*.yml`, `.gitlab-ci.yml`, `Jenkinsfile`, `.circleci/config.yml`, `azure-pipelines.yml` |
55| **Build** | `Makefile`, `Taskfile.yml`, `Justfile` |
56| **Web servers** | `nginx.conf`, `nginx/*.conf`, `apache2.conf`, `.htaccess`, `httpd.conf`, `Caddyfile`, `traefik.yml`, `traefik.toml` |
57| **Databases** | `prisma/schema.prisma`, `config/database.yml`, `alembic.ini` |
58| **Env files** | `.env.example`, `.env.sample` |
59| **Version files** | `.node-version`, `.nvmrc`, `.python-version`, `.ruby-version`, `.go-version`, `.java-version`, `.tool-versions`, `runtime.txt` |
60| **Security** | `.snyk`, `snyk.json`, `.trivyignore`, `security.txt`, `renovate.json`, `dependabot.yml` |
61
62### 1b. Read discovered files and extract
63
64From each file, extract:
65
66- **Package names and versions** (direct + transitive where lock files exist)
67- **Base images** from Dockerfiles (`FROM` lines) — note the OS, runtime, and version
68- **System packages** installed via `apt-get install`, `apk add`, `yum install`
69- **Action versions** from CI workflows (e.g. `actions/checkout@v4`)
70- **Cloud providers** from Terraform (`provider "aws"`, resource prefixes)
71- **Database types** from ORMs, connection strings, Docker services
72- **Service names** from env variable patterns (`REDIS_URL`, `POSTGRES_HOST`, `MONGO_URI`, `KAFKA_BROKER`)
73
74### 1c. Grep for framework and library patterns in code
75
76Use Grep to detect frameworks and libraries that might not appear in
77dependency files. Search source directories for these import patterns:
78
79- **Frameworks:** `import express`, `from django`, `import spring`, `using Microsoft.AspNetCore`, `import React`, `import Vue`, `from angular`
80- **Auth:** `passport`, `jsonwebtoken`, `jwt`, `oauth`, `auth0`, `firebase-auth`, `keycloak`
81- **Crypto:** `bcrypt`, `argon2`, `crypto`, `openssl`, `sodium`
82- **HTTP clients:** `axios`, `fetch`, `requests`, `httpx`, `okhttp`, `urllib3`
83- **Message queues:** `rabbitmq`, `kafka`, `celery`, `bull`, `sidekiq`, `nats`
84- **Cloud SDKs:** `aws-sdk`, `@google-cloud`, `azure`, `boto3`
85
86### 1d. Compile the stack inventory
87
88Organize everything you found into a structured inventory:
89
90- **Languages** (with versions where known)
91- **Frameworks** (with versions)
92- **Direct dependencies** (key ones — no need to list every tiny utility)
93- **Databases & data stores**
94- **Infrastructure** (container images, cloud providers, orchestration)
95- **CI/CD** (platform and notable tool versions)
96- **Web servers & proxies**
97- **Security tools** already in use
98
99This inventory drives the matching in Step 3 and is shown to the user in the
100final output so they can verify completeness.
101
102---
103
104## Step 2 — Fetch the alert feed
105
106Use WebFetch to retrieve `https://cyberowlai.com/alerts.json`.
107
108The JSON structure:
109
110```
111{
112 "generated_at": "2026-04-23T10:00:54Z",
113 "sources": {
114 "<SOURCE_NAME>": {
115 "items": [
116 {
117 "title": "...",
118 "link": "https://...",
119 "description": "...",
120 "date": "Apr 20, 2026"
121 }
122 ]
123 }
124 }
125}
126```
127
128Sources: US-CERT, CERT-FR, MA-CERT, IBM-X-FORCE-EXCHANGE, ZERODAYINITIATIVE,
129OBS-Vigilance, VulDB, HK-CERT, CA-CCS, EU-CERT (~90 alerts total).
130
131**If the fetch fails:** Tell the user the feed is unavailable, suggest they
132check https://cyberowlai.com/activity/ directly, and still show the detected
133stack inventory so the visit isn't wasted.
134
135---
136
137## Step 3 — Intelligent matching
138
139Cross-reference every alert's **title** and **description** against the full
140stack inventory. Classify matches into tiers:
141
142### HIGH — Direct dependency or component match
143
144The alert explicitly names a package, library, or tool the project uses.
145
146Examples:
147- Alert says "jQuery 3.6 vulnerability" → project has jQuery → **MATCH**
148- Alert says "OpenSSL" → Dockerfile installs openssl → **MATCH**
149- Alert says "nginx" → docker-compose has nginx service → **MATCH**
150- Alert says "PostgreSQL" → project uses PostgreSQL → **MATCH**
151
152### MEDIUM — Framework or platform match
153
154The alert targets a broader platform that encompasses something in the stack.
155
156Examples:
157- Alert says "Spring Framework" → project uses Spring Boot → **MATCH**
158- Alert says "Linux kernel" → Dockerfile uses a Linux base image → **MATCH**
159- Alert says "Chrome/Chromium" → project uses Puppeteer or Playwright → **MATCH**
160- Alert says "Node.js" → project is a Node app → **MATCH**
161
162### LOW — Category match
163
164The alert is about a *class* of technology the project uses, even without a
165direct name match.
166
167Examples:
168- Alert about "DNS vulnerability" → project uses a DNS library → **FLAG**
169- Alert about "TLS/SSL" → project uses HTTPS → **FLAG**
170- Alert about "container escape" → project uses Docker → **FLAG**
171
172### CRITICAL — Always flag regardless of stack
173
174Some alerts are important enough to surface no matter what the project uses.
175Flag any alert where:
176
177- Title contains: "actively exploited", "zero-day", "0-day", "critical RCE",
178 "remote code execution", "supply chain", "pre-auth", "unauthenticated"
179- A CVE with CVSS ≥ 9.0 is mentioned
180- The alert comes from CISA's Known Exploited Vulnerabilities catalog
181 (look for "Known Exploited Vulnerabilities" in title or description)
182
183---
184
185## Step 4 — Output format
186
187Use this structure for the report. Keep it concise — only show alerts that
188matched or are critical. Don't dump the full 90-alert feed.
189
190```
191## CyberOwl Security Check
192Last updated: [generated_at timestamp] | [N] sources checked | [total] alerts scanned
193
194### Alerts matching your project ([count] found)
195
196**HIGH — Direct dependency match:**
197| Alert | Source | Matched Component | Date |
198|---|---|---|---|
199| [Title](link) | SOURCE | component-name (where detected) | date |
200
201**MEDIUM — Platform/framework match:**
202| Alert | Source | Related To | Date |
203|---|---|---|---|
204| [Title](link) | SOURCE | platform (context) | date |
205
206**LOW — Category match:**
207| Alert | Source | Related To | Date |
208|---|---|---|---|
209| [Title](link) | SOURCE | category (context) | date |
210
211### Critical alerts (always worth knowing)
212| Alert | Source | Why Flagged | Date |
213|---|---|---|---|
214| [Title](link) | SOURCE | Actively exploited / Zero-day / etc. | date |
215
216### Your detected stack
217- **Languages:** ...
218- **Frameworks:** ...
219- **Databases:** ...
220- **Infrastructure:** ...
221- **CI/CD:** ...
222```
223
224**When no direct matches are found:** Skip the matching tables and show only
225the "Critical alerts" section with a note: "No alerts directly matched your
226detected stack, but these critical advisories are worth reviewing." Always
227include the detected stack section so the user can verify nothing was missed.
228
229**Omit empty tiers.** If there are no HIGH matches, don't show that table.
230Same for MEDIUM and LOW.
231
232---
233
234## Important notes
235
236- **Be specific about where you found each component.** Don't just say
237 "nginx" — say "nginx (from docker-compose.yml service)" or "OpenSSL (apt-get
238 install in Dockerfile)". This helps the user triage.
239- **Don't over-match.** A generic alert about "multiple vulnerabilities in
240 various products" with no specific technology named should not match
241 anything. Matching must be based on actual technology names in the alert.
242- **Conciseness matters.** The user wants a quick answer: "Am I affected?"
243 Don't pad the output. If there are 0 matches and 2 critical alerts, the
244 report should be short.
245- **Show your work on the stack** so the user can catch anything you missed
246 and re-run if needed.