cveye 3.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cveye-3.2.0/LICENSE +21 -0
- cveye-3.2.0/PKG-INFO +511 -0
- cveye-3.2.0/README.md +494 -0
- cveye-3.2.0/cveye/__init__.py +3 -0
- cveye-3.2.0/cveye/__main__.py +8 -0
- cveye-3.2.0/cveye/batch.py +204 -0
- cveye-3.2.0/cveye/cache.py +235 -0
- cveye-3.2.0/cveye/cli.py +129 -0
- cveye-3.2.0/cveye/colors.py +265 -0
- cveye-3.2.0/cveye/commands/__init__.py +1 -0
- cveye-3.2.0/cveye/commands/cve.py +339 -0
- cveye-3.2.0/cveye/commands/intel.py +323 -0
- cveye-3.2.0/cveye/commands/tools.py +200 -0
- cveye-3.2.0/cveye/config.py +139 -0
- cveye-3.2.0/cveye/cvss4.py +647 -0
- cveye-3.2.0/cveye/downloader.py +236 -0
- cveye-3.2.0/cveye/exploits.py +638 -0
- cveye-3.2.0/cveye/notify.py +119 -0
- cveye-3.2.0/cveye/output.py +213 -0
- cveye-3.2.0/cveye/parser.py +449 -0
- cveye-3.2.0/cveye/py.typed +0 -0
- cveye-3.2.0/cveye/report.py +263 -0
- cveye-3.2.0/cveye/sarif.py +129 -0
- cveye-3.2.0/cveye/sources.py +473 -0
- cveye-3.2.0/cveye/triage.py +162 -0
- cveye-3.2.0/cveye/utils.py +388 -0
- cveye-3.2.0/cveye.egg-info/PKG-INFO +511 -0
- cveye-3.2.0/cveye.egg-info/SOURCES.txt +38 -0
- cveye-3.2.0/cveye.egg-info/dependency_links.txt +1 -0
- cveye-3.2.0/cveye.egg-info/entry_points.txt +2 -0
- cveye-3.2.0/cveye.egg-info/top_level.txt +1 -0
- cveye-3.2.0/pyproject.toml +30 -0
- cveye-3.2.0/setup.cfg +4 -0
- cveye-3.2.0/tests/test_cvss4.py +52 -0
- cveye-3.2.0/tests/test_exploits.py +136 -0
- cveye-3.2.0/tests/test_intel.py +160 -0
- cveye-3.2.0/tests/test_platform.py +146 -0
- cveye-3.2.0/tests/test_sources.py +111 -0
- cveye-3.2.0/tests/test_triage.py +163 -0
- cveye-3.2.0/tests/test_utils.py +111 -0
cveye-3.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 PwnedBytes0x1
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
cveye-3.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cveye
|
|
3
|
+
Version: 3.2.0
|
|
4
|
+
Summary: Check latest CVEs and exploit availability without API keys
|
|
5
|
+
Author: PwnedBytes0x1
|
|
6
|
+
License: MIT
|
|
7
|
+
Keywords: cve,nvd,exploit,security,osv,kev
|
|
8
|
+
Classifier: Environment :: Console
|
|
9
|
+
Classifier: Intended Audience :: Information Technology
|
|
10
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Topic :: Security
|
|
13
|
+
Requires-Python: >=3.7
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Dynamic: license-file
|
|
17
|
+
|
|
18
|
+
<div align="center">
|
|
19
|
+
|
|
20
|
+
# C V E y e
|
|
21
|
+
|
|
22
|
+
<img src="https://img.shields.io/badge/version-3.2.0-blue?style=for-the-badge" alt="version">
|
|
23
|
+
<img src="https://img.shields.io/badge/license-MIT-green?style=for-the-badge" alt="license">
|
|
24
|
+
<img src="https://img.shields.io/badge/python-3.7%2B-informational?style=for-the-badge" alt="python">
|
|
25
|
+
<img src="https://img.shields.io/badge/platform-linux%20%7C%20macOS%20%7C%20Windows%20%7C%20Termux-success?style=for-the-badge" alt="platform">
|
|
26
|
+
<img src="https://img.shields.io/badge/API%20keys-none-critical?style=for-the-badge" alt="no api keys">
|
|
27
|
+
|
|
28
|
+
**Zero-dependency CLI for CVE details & exploit availability — without API keys**
|
|
29
|
+
|
|
30
|
+
NVD · OSV.dev · MITRE · CISA KEV · FIRST EPSS · ExploitDB · GitHub
|
|
31
|
+
|
|
32
|
+
*Clean tagged output, CVSS v4.0 scoring, concurrent batch mode*
|
|
33
|
+
|
|
34
|
+
[Quick Start](#-quick-start) ·
|
|
35
|
+
[Commands](#-commands) ·
|
|
36
|
+
[Configuration](#%EF%B8%8F-configuration) ·
|
|
37
|
+
[Contributing](CONTRIBUTING.md)
|
|
38
|
+
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
> [!WARNING]
|
|
44
|
+
> CVEye is for **defensive security research** only. You are responsible for
|
|
45
|
+
> your actions. Always obtain proper authorization before testing any system.
|
|
46
|
+
|
|
47
|
+
## 📖 Table of Contents
|
|
48
|
+
|
|
49
|
+
- [Why CVEye?](#-why-cveye)
|
|
50
|
+
- [Quick Start](#-quick-start)
|
|
51
|
+
- [Commands](#-commands)
|
|
52
|
+
- [Demo](#-demo)
|
|
53
|
+
- [Data Sources](#-data-sources)
|
|
54
|
+
- [Exploit Signal Model](#-exploit-signal-model)
|
|
55
|
+
- [Configuration](#%EF%B8%8F-configuration)
|
|
56
|
+
- [Caching](#%EF%B8%8F-caching)
|
|
57
|
+
- [Tool Interop](#-tool-interop)
|
|
58
|
+
- [Exit Codes](#-exit-codes)
|
|
59
|
+
- [Project Structure](#-project-structure)
|
|
60
|
+
- [Development](#-development)
|
|
61
|
+
- [FAQ](#-faq)
|
|
62
|
+
- [Contributing](#-contributing)
|
|
63
|
+
- [Acknowledgments](#-acknowledgments)
|
|
64
|
+
- [License](#-license)
|
|
65
|
+
|
|
66
|
+
## 🤔 Why CVEye?
|
|
67
|
+
|
|
68
|
+
Most CVE tooling forces you through API-key signup walls, pip dependency
|
|
69
|
+
hell, or rate-limit roulette. **CVEye does one thing well**: answer *"what is
|
|
70
|
+
this CVE, and can I exploit it?"* — instantly, from public sources, with
|
|
71
|
+
clean output that pipes beautifully.
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
✅ Zero dependencies Python stdlib only — runs anywhere, even Termux
|
|
75
|
+
✅ Zero API keys NVD, OSV, MITRE, KEV, EPSS, ExploitDB — all public
|
|
76
|
+
✅ CVSS v4.0 scoring Official FIRST MacroVector algorithm embedded
|
|
77
|
+
✅ Honest signals Confirmed exploits separated from weak "leads"
|
|
78
|
+
✅ Fast Disk cache + concurrent batch mode
|
|
79
|
+
✅ Clean UX Single-dash flags, stderr/stdout discipline
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## 🚀 Quick Start
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
# Run directly from a checkout
|
|
86
|
+
git clone https://github.com/PwnedBytes0x1/cveye.git
|
|
87
|
+
cd cveye
|
|
88
|
+
python3 main.py -h
|
|
89
|
+
|
|
90
|
+
# Or install as a proper console script
|
|
91
|
+
pip install .
|
|
92
|
+
cveye latest
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Requirements
|
|
96
|
+
|
|
97
|
+
| Requirement | Notes |
|
|
98
|
+
|-------------|-------|
|
|
99
|
+
| Python **3.7+** | stdlib only — no `pip install` needed |
|
|
100
|
+
| `git` | optional, only for `-clone-pocs` |
|
|
101
|
+
| `GITHUB_TOKEN` | optional env/config key; raises GitHub search limits |
|
|
102
|
+
| `NVD_API_KEY` | optional env/config key; raises NVD limit 5 → 50 req/30s ([free](https://nvd.nist.gov/developers/request-an-api-key)) |
|
|
103
|
+
|
|
104
|
+
## ⌨️ Commands
|
|
105
|
+
|
|
106
|
+
| Command | Purpose |
|
|
107
|
+
|---------|---------|
|
|
108
|
+
| [`latest`](#latest--newest-published-cves) | Newest published CVEs from NVD |
|
|
109
|
+
| [`search`](#search--cve-details) | Full details for one CVE |
|
|
110
|
+
| [`check`](#check--exploit-availability) | Exploit availability check |
|
|
111
|
+
| [`scan`](#scan--details--exploits) | Details + exploit check combined |
|
|
112
|
+
| [`affected`](#affected--am-i-affected) | Is my product (CPE) affected? |
|
|
113
|
+
| [`watch`](#watch--new-exploited-vulns) | Diff CISA KEV against last run |
|
|
114
|
+
| [`kev`](#kev--browse-the-kev-catalog) | Browse/search the KEV catalog |
|
|
115
|
+
| [`sbom`](#sbom--check-your-dependencies) | Check CycloneDX/SPDX components vs OSV |
|
|
116
|
+
| [`diff`](#diff--compare-two-result-sets) | Compare two CVEye JSON runs |
|
|
117
|
+
| [`report`](#report--htmlmarkdown-reports) | Render JSON as HTML / Markdown |
|
|
118
|
+
| [`completions`](#completions--shell-completions) | bash / zsh / fish scripts |
|
|
119
|
+
| `version` | Version information |
|
|
120
|
+
|
|
121
|
+
Flags use single-dash long options (`-json`, never `--json`) — short,
|
|
122
|
+
consistent, and easy to type.
|
|
123
|
+
|
|
124
|
+
### Global Flags
|
|
125
|
+
|
|
126
|
+
| Flag | Description |
|
|
127
|
+
|------|-------------|
|
|
128
|
+
| `-h, -help` | Show help and exit |
|
|
129
|
+
| `-V, -version` | Show version and exit |
|
|
130
|
+
| `-s, -silent` | Suppress info/warning messages (**errors still shown**) |
|
|
131
|
+
| `-no-color` | Disable ANSI colors |
|
|
132
|
+
| `-o, -output FILE` | Write stdout results to file |
|
|
133
|
+
| `-j, -json` | Machine-readable JSON output |
|
|
134
|
+
| `-no-cache` | Bypass the local response cache |
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
### `latest` — newest published CVEs
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
cveye latest # newest 10
|
|
142
|
+
cveye latest -l 20 -e # 20 entries + exploit checks
|
|
143
|
+
cveye latest -l 50 -c # compact, one line per CVE
|
|
144
|
+
cveye latest -json # machine-readable
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
True newest-first ordering via NVD tail pagination. Fallback chain:
|
|
148
|
+
publish-date query → recently-modified query → CISA KEV catalog.
|
|
149
|
+
|
|
150
|
+
### `search` — CVE details
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
cveye search CVE-2021-44228
|
|
154
|
+
cveye search CVE-2021-44228 -f # all references
|
|
155
|
+
cveye search CVE-2021-44228 -ghsa # + GitHub Advisory (CWEs, malware flags)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Severity badge, CVSS v3/v4 score, **EPSS probability**, aliases, description,
|
|
159
|
+
affected products and references. IDs are validated client-side — garbage
|
|
160
|
+
input fails instantly, offline.
|
|
161
|
+
|
|
162
|
+
### `check` — exploit availability
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
cveye check CVE-2021-44228
|
|
166
|
+
cveye check CVE-2021-44228 -D -clone-pocs # download + clone PoCs
|
|
167
|
+
printf 'CVE-2021-44228\nCVE-2024-3400\n' | cveye check - -c 10
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### `scan` — details + exploits
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
cveye scan CVE-2021-44228
|
|
174
|
+
cveye scan CVE-2021-44228 -json
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### `affected` — am I affected?
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
cveye affected CVE-2021-44228 -cpe apache:log4j
|
|
181
|
+
cveye affected CVE-2024-3400 \
|
|
182
|
+
-cpe "cpe:2.3:a:paloaltonetworks:pan-os:10.2:*:*:*:*:*:*:*"
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Accepts full CPE 2.3 URIs, legacy 2.2 notation, or `vendor:product`
|
|
186
|
+
shorthand. Wildcard-aware matching against NVD configuration data.
|
|
187
|
+
|
|
188
|
+
### `watch` — new exploited vulns
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
cveye watch # diff vs last run (state file)
|
|
192
|
+
cveye watch -since 168 # 7-day look-back window
|
|
193
|
+
cveye watch -json # machine-readable
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
First run seeds the baseline; every later run prints only *new* KEV
|
|
197
|
+
additions — ransomware usage flagged in red.
|
|
198
|
+
|
|
199
|
+
Push new entries straight to chat with `-notify` (Discord, Slack, Teams,
|
|
200
|
+
or any generic JSON webhook — auto-detected from the URL):
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
cveye watch -notify https://discord.com/api/webhooks/...
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### `kev` — browse the KEV catalog
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
cveye kev -l 50 # 50 most recent entries
|
|
210
|
+
cveye kev -vendor microsoft # filter by vendor/product substring
|
|
211
|
+
cveye kev -product exchange -days 90
|
|
212
|
+
cveye kev -ransomware # only ransomware-associated entries
|
|
213
|
+
cveye kev -priority # + compute triage priority per entry
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### `sbom` — check your dependencies
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
cveye sbom -i cyclonedx.json
|
|
220
|
+
cyclyx generate | cveye sbom # stdin works too
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
Reads CycloneDX or SPDX JSON, extracts Package URLs, and bulk-checks
|
|
224
|
+
every component against OSV in a single batched request. Exit code is
|
|
225
|
+
0 even when vulnerabilities are found (parse `-json` for CI gating).
|
|
226
|
+
|
|
227
|
+
### `diff` — compare two result sets
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
cveye latest -json -o old.json # ...later...
|
|
231
|
+
cveye latest -json -o new.json
|
|
232
|
+
cveye diff old.json new.json
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Reports added / removed / changed CVEs (severity, CVSS, EPSS, exploit
|
|
236
|
+
status). `-json` for machine-readable output; `-` reads one side from
|
|
237
|
+
stdin.
|
|
238
|
+
|
|
239
|
+
### `report` — HTML/Markdown reports
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
cveye scan CVE-2021-44228 -json | cveye report -o report.html
|
|
243
|
+
cveye latest -l 50 -json -o out.json && cveye report -i out.json -format md
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Accepts any CVEye JSON payload (`scan`, `check`, `latest`, `search`).
|
|
247
|
+
Self-contained dark-themed HTML; clean Markdown tables.
|
|
248
|
+
|
|
249
|
+
### `completions` — shell completions
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
cveye completions -shell bash >> ~/.bashrc # or zsh / fish
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
## 🎬 Demo
|
|
256
|
+
|
|
257
|
+
```text
|
|
258
|
+
$ cveye scan CVE-2021-44228
|
|
259
|
+
|
|
260
|
+
CVE Details: CVE-2021-44228
|
|
261
|
+
CVE-2021-44228
|
|
262
|
+
[CRITICAL] Severity: CRITICAL CVSS: 10.0
|
|
263
|
+
Source: OSV (aka GHSA-jfh8-c2jp-5v3q)
|
|
264
|
+
Published: 2021-12-10
|
|
265
|
+
Modified: 2026-08-13 04:01
|
|
266
|
+
EPSS: 100.0% exploitation probability (percentile 100.0)
|
|
267
|
+
|
|
268
|
+
Exploit Analysis
|
|
269
|
+
Strong signals found for CVE-2021-44228:
|
|
270
|
+
|
|
271
|
+
[!] CISA Known Exploited Vulnerability (exploited in the wild)
|
|
272
|
+
Name: Apache Log4j2 Remote Code Execution Vulnerability
|
|
273
|
+
Date Added: 2021-12-10
|
|
274
|
+
Known Ransomware Use: Known
|
|
275
|
+
|
|
276
|
+
[+] ExploitDB exploits found:
|
|
277
|
+
- [EDB-50592] Apache Log4j 2 - Remote Code Execution (RCE)
|
|
278
|
+
https://www.exploit-db.com/exploits/50592
|
|
279
|
+
|
|
280
|
+
[+] GitHub PoC repositories found:
|
|
281
|
+
- fullhunt/log4j-scan (3421 stars)
|
|
282
|
+
https://github.com/fullhunt/log4j-scan
|
|
283
|
+
|
|
284
|
+
[+] SUMMARY: Exploits found for CVE-2021-44228
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## 📡 Data Sources
|
|
288
|
+
|
|
289
|
+
| Source | What it provides | Key needed? |
|
|
290
|
+
|--------|------------------|-------------|
|
|
291
|
+
| [NVD 2.0 API](https://nvd.nist.gov/developers) | CVE details, CPE configs, CVSS | ❌ (5 req/30s) |
|
|
292
|
+
| [OSV.dev](https://osv.dev) | Rich vulnerability records | ❌ |
|
|
293
|
+
| [MITRE CVE Services](https://cveawg.mitre.org) | Authoritative CVE records | ❌ |
|
|
294
|
+
| [CISA KEV](https://www.cisa.gov/known-exploited-vulnerabilities-catalog) | Exploited-in-the-wild list | ❌ |
|
|
295
|
+
| [FIRST EPSS](https://www.first.org/epss/) | Exploitation probability | ❌ |
|
|
296
|
+
| [ExploitDB mirror](https://gitlab.com/exploit-database/exploitdb) | Full exploits CSV index | ❌ |
|
|
297
|
+
| [GitHub Search](https://docs.github.com/rest/search) | PoC repositories | ❌ *(token optional)* |
|
|
298
|
+
| [GitHub Advisory DB](https://github.com/advisories) | GHSA records, CWEs, malware flags (`-ghsa`) | ❌ *(token optional)* |
|
|
299
|
+
|
|
300
|
+
## 🔍 Exploit Signal Model
|
|
301
|
+
|
|
302
|
+
CVEye refuses to cry wolf:
|
|
303
|
+
|
|
304
|
+
| Signal class | Examples | Effect |
|
|
305
|
+
|--------------|----------|--------|
|
|
306
|
+
| ✅ **Confirmed** | CISA KEV listing, ExploitDB entry, relevant GitHub PoC repo (CVE ID in name/description), PacketStorm / Metasploit / VulnCheck | Drives `has_exploit`, green summary |
|
|
307
|
+
| 💡 **Reference leads** | Pages merely mentioning *poc/exploit* keywords | Dim, labeled *"unconfirmed"* — never triggers a verdict |
|
|
308
|
+
|
|
309
|
+
## 🎯 Triage Priority
|
|
310
|
+
|
|
311
|
+
`latest -priority` and `scan` compute a composite triage level from
|
|
312
|
+
everything CVEye knows — CVSS severity, EPSS probability, exploit signals,
|
|
313
|
+
and KEV status:
|
|
314
|
+
|
|
315
|
+
| Level | Meaning |
|
|
316
|
+
|-------|---------|
|
|
317
|
+
| `P0` | CISA KEV — exploited in the wild |
|
|
318
|
+
| `P1` | Confirmed exploits + EPSS ≥ 0.5 (very likely exploited) |
|
|
319
|
+
| `P2` | Confirmed exploits OR very high EPSS OR GitHub-flagged malware PoC |
|
|
320
|
+
| `P3` | HIGH/CRITICAL severity without confirmation |
|
|
321
|
+
| `P4` | Baseline |
|
|
322
|
+
|
|
323
|
+
Results are sorted worst-first. `scan -json` includes the full
|
|
324
|
+
`priority` object with human-readable reasons.
|
|
325
|
+
|
|
326
|
+
## 📤 SARIF & CI Integration
|
|
327
|
+
|
|
328
|
+
`-sarif` on `latest`, `search`, and `scan` emits SARIF 2.1.0 with
|
|
329
|
+
GitHub `security-severity` properties — uploadable to code scanning:
|
|
330
|
+
|
|
331
|
+
```yaml
|
|
332
|
+
# .github/workflows/security.yml (excerpt)
|
|
333
|
+
- run: python main.py latest -l 50 -priority -sarif -o results.sarif
|
|
334
|
+
- uses: github/codeql-action/upload-sarif@v3
|
|
335
|
+
with: { sarif_file: results.sarif }
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## ⚙️ Configuration
|
|
339
|
+
|
|
340
|
+
`~/.config/cveye/config.json` (Windows: `%APPDATA%\CVEye\config.json`).
|
|
341
|
+
Precedence: **CLI flag > config file > environment > default**.
|
|
342
|
+
|
|
343
|
+
```json
|
|
344
|
+
{
|
|
345
|
+
"limit": 10,
|
|
346
|
+
"download_dir": "exploits",
|
|
347
|
+
"concurrency": 5,
|
|
348
|
+
"silent": false,
|
|
349
|
+
"no_color": false,
|
|
350
|
+
"no_cache": false,
|
|
351
|
+
"github_token": "",
|
|
352
|
+
"nvd_api_key": ""
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
## ♻️ Caching
|
|
357
|
+
|
|
358
|
+
| Data | TTL | Storage |
|
|
359
|
+
|------|-----|---------|
|
|
360
|
+
| CVE details | 1 hour | `~/.cache/cveye/cache.json` |
|
|
361
|
+
| EPSS scores | 24 hours | same |
|
|
362
|
+
| CISA KEV index | 30 minutes | `~/.cache/cveye/big-cache.json` |
|
|
363
|
+
| ExploitDB CSV index | 24 hours | same |
|
|
364
|
+
|
|
365
|
+
Bypass everything with `-no-cache` or `CVEYE_NO_CACHE=1`. Delete the files
|
|
366
|
+
to reset.
|
|
367
|
+
|
|
368
|
+
For very large batches, switch to the SQLite backend (single `cache.db`,
|
|
369
|
+
stdlib `sqlite3` only):
|
|
370
|
+
|
|
371
|
+
```bash
|
|
372
|
+
CVEYE_CACHE_BACKEND=sqlite cveye check - < many-cves.txt
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
## 🔗 Tool Interop
|
|
376
|
+
|
|
377
|
+
nuclei/httpx JSON lines are auto-detected on stdin — CVEs are extracted per
|
|
378
|
+
line, deduplicated, and processed:
|
|
379
|
+
|
|
380
|
+
```bash
|
|
381
|
+
cat nuclei-results.jsonl | cveye check - -silent
|
|
382
|
+
printf 'CVE-2021-44228\nCVE-2024-3400\n' | cveye scan - -c 20 -json
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
Failed lookups never vanish silently:
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
$ cat cves.txt | cveye scan - -json | jq '.[] | select(.error)'
|
|
389
|
+
{"cve_id": "CVE-2099-00001", "error": "lookup failed"}
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
## 🚦 Exit Codes
|
|
393
|
+
|
|
394
|
+
| Code | Meaning |
|
|
395
|
+
|------|---------|
|
|
396
|
+
| `0` | Success |
|
|
397
|
+
| `1` | Operational failure (not found, fetch failed, invalid ID) |
|
|
398
|
+
| `2` | Usage error (bad arguments, unwritable output) |
|
|
399
|
+
|
|
400
|
+
## 🏗️ Project Structure
|
|
401
|
+
|
|
402
|
+
```text
|
|
403
|
+
├── main.py launcher shim (source checkouts)
|
|
404
|
+
├── Dockerfile container image (GHCR published)
|
|
405
|
+
├── termux-install.sh one-shot Termux installer
|
|
406
|
+
├── pyproject.toml packaging (console script: cveye)
|
|
407
|
+
├── cveye/
|
|
408
|
+
│ ├── cli.py entry point: global flags, stream redirection
|
|
409
|
+
│ ├── parser.py argparse tree, custom help formatter
|
|
410
|
+
│ ├── output.py banner, CVE printers, presentation helpers
|
|
411
|
+
│ ├── batch.py stdin batch engine (concurrent, JSONL-aware)
|
|
412
|
+
│ ├── commands/ command implementations
|
|
413
|
+
│ │ ├── cve.py latest / search / check / scan / affected
|
|
414
|
+
│ │ ├── intel.py kev / sbom / diff
|
|
415
|
+
│ │ └── tools.py watch / report / completions / version
|
|
416
|
+
│ ├── triage.py priority scoring (P0-P4), EPSS trend
|
|
417
|
+
│ ├── sarif.py SARIF 2.1.0 output
|
|
418
|
+
│ ├── notify.py webhook notifications (Discord/Slack/Teams)
|
|
419
|
+
│ ├── config.py URLs, constants, user-config loading
|
|
420
|
+
│ ├── colors.py ANSI colors, tags/banner (stderr)
|
|
421
|
+
│ ├── utils.py HTTP client, validation, CVSS v3, CPE
|
|
422
|
+
│ ├── cvss4.py CVSS v4.0 scorer (official lookup embedded)
|
|
423
|
+
│ ├── cache.py TTL caches (JSON default, sqlite optional)
|
|
424
|
+
│ ├── sources.py NVD / OSV / MITRE / KEV / EPSS / GHSA fetchers
|
|
425
|
+
│ ├── exploits.py exploit checker (KEV, refs, GitHub PoC, EDB)
|
|
426
|
+
│ ├── downloader.py exploit file downloads, PoC repo cloning
|
|
427
|
+
│ └── report.py HTML/Markdown report rendering
|
|
428
|
+
└── tests/ unittest suite (mocked, zero network)
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
## 🐳 Other install methods
|
|
432
|
+
|
|
433
|
+
```bash
|
|
434
|
+
# Docker
|
|
435
|
+
docker run --rm ghcr.io/pwnedbytes0x1/cveye latest -l 5
|
|
436
|
+
|
|
437
|
+
# Termux
|
|
438
|
+
git clone https://github.com/PwnedBytes0x1/cveye.git
|
|
439
|
+
cd cveye && bash termux-install.sh
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
## 🧪 Development
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
python3 -m unittest discover -s tests # fully mocked test suite
|
|
446
|
+
python3 main.py -h # run from source
|
|
447
|
+
```
|
|
448
|
+
|
|
449
|
+
CI runs the suite on Python 3.7–3.13 via GitHub Actions on every push/PR.
|
|
450
|
+
Releases are published to PyPI automatically via Trusted Publishing.
|
|
451
|
+
|
|
452
|
+
Design notes:
|
|
453
|
+
|
|
454
|
+
- **CVSS v3.x** requires every mandatory metric — partial vectors are never
|
|
455
|
+
guessed, so computed scores are never silently inflated.
|
|
456
|
+
- **CVSS v4.0** embeds FIRST's official MacroVector lookup + interpolation;
|
|
457
|
+
validated against the **31,694-vector reference corpus (100% pass)**.
|
|
458
|
+
- **HTTP**: permanent 4xx errors are never retried; 429/5xx/network retry
|
|
459
|
+
with backoff. Unknown CVEs fail fast instead of stalling.
|
|
460
|
+
- **Downloads**: filenames resolved from Content-Disposition / URL / content
|
|
461
|
+
sniffing; oversized payloads refused; repo names sanitized before clone.
|
|
462
|
+
|
|
463
|
+
## ❓ FAQ
|
|
464
|
+
|
|
465
|
+
### Does this need API keys?
|
|
466
|
+
|
|
467
|
+
No. Every data source used by default is public. A GitHub token is optional
|
|
468
|
+
and only raises search rate limits.
|
|
469
|
+
|
|
470
|
+
### Why single-dash flags?
|
|
471
|
+
|
|
472
|
+
Short, consistent, and easy to type across every command.
|
|
473
|
+
`--json` is rejected on purpose — use `-json`.
|
|
474
|
+
|
|
475
|
+
### Is this a scanner?
|
|
476
|
+
|
|
477
|
+
No — CVEye performs **OSINT** about published vulnerabilities. It never
|
|
478
|
+
touches target systems.
|
|
479
|
+
|
|
480
|
+
### Windows support?
|
|
481
|
+
|
|
482
|
+
Yes. ANSI colors are enabled best-effort on legacy consoles; everything else
|
|
483
|
+
is pure stdlib.
|
|
484
|
+
|
|
485
|
+
## 🤝 Contributing
|
|
486
|
+
|
|
487
|
+
PRs welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for setup, test and style
|
|
488
|
+
guidelines, and [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) for community
|
|
489
|
+
standards.
|
|
490
|
+
|
|
491
|
+
Please keep the zero-runtime-dependency promise: stdlib only, Python 3.7+
|
|
492
|
+
compatible, and add tests for new logic.
|
|
493
|
+
|
|
494
|
+
## 🙏 Acknowledgments
|
|
495
|
+
|
|
496
|
+
- [FIRST](https://www.first.org/cvss/) — CVSS v4.0 specification & reference calculator (BSD-2-Clause, ported in `cvss4.py`)
|
|
497
|
+
- [NVD](https://nvd.nist.gov), [OSV.dev](https://osv.dev), [MITRE](https://cve.org), [CISA](https://www.cisa.gov/known-exploited-vulnerabilities-catalog), [FIRST EPSS](https://www.first.org/epss/), [ExploitDB](https://www.exploit-db.com) — the open data making this possible
|
|
498
|
+
|
|
499
|
+
## 📄 License
|
|
500
|
+
|
|
501
|
+
[MIT](LICENSE) © PwnedBytes0x1
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
<div align="center">
|
|
506
|
+
|
|
507
|
+
**If CVEye saved you time, consider leaving a ⭐**
|
|
508
|
+
|
|
509
|
+
Made with ☕ and Python stdlib by [PwnedBytes0x1](https://github.com/PwnedBytes0x1)
|
|
510
|
+
|
|
511
|
+
</div>
|