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.
Files changed (40) hide show
  1. cveye-3.2.0/LICENSE +21 -0
  2. cveye-3.2.0/PKG-INFO +511 -0
  3. cveye-3.2.0/README.md +494 -0
  4. cveye-3.2.0/cveye/__init__.py +3 -0
  5. cveye-3.2.0/cveye/__main__.py +8 -0
  6. cveye-3.2.0/cveye/batch.py +204 -0
  7. cveye-3.2.0/cveye/cache.py +235 -0
  8. cveye-3.2.0/cveye/cli.py +129 -0
  9. cveye-3.2.0/cveye/colors.py +265 -0
  10. cveye-3.2.0/cveye/commands/__init__.py +1 -0
  11. cveye-3.2.0/cveye/commands/cve.py +339 -0
  12. cveye-3.2.0/cveye/commands/intel.py +323 -0
  13. cveye-3.2.0/cveye/commands/tools.py +200 -0
  14. cveye-3.2.0/cveye/config.py +139 -0
  15. cveye-3.2.0/cveye/cvss4.py +647 -0
  16. cveye-3.2.0/cveye/downloader.py +236 -0
  17. cveye-3.2.0/cveye/exploits.py +638 -0
  18. cveye-3.2.0/cveye/notify.py +119 -0
  19. cveye-3.2.0/cveye/output.py +213 -0
  20. cveye-3.2.0/cveye/parser.py +449 -0
  21. cveye-3.2.0/cveye/py.typed +0 -0
  22. cveye-3.2.0/cveye/report.py +263 -0
  23. cveye-3.2.0/cveye/sarif.py +129 -0
  24. cveye-3.2.0/cveye/sources.py +473 -0
  25. cveye-3.2.0/cveye/triage.py +162 -0
  26. cveye-3.2.0/cveye/utils.py +388 -0
  27. cveye-3.2.0/cveye.egg-info/PKG-INFO +511 -0
  28. cveye-3.2.0/cveye.egg-info/SOURCES.txt +38 -0
  29. cveye-3.2.0/cveye.egg-info/dependency_links.txt +1 -0
  30. cveye-3.2.0/cveye.egg-info/entry_points.txt +2 -0
  31. cveye-3.2.0/cveye.egg-info/top_level.txt +1 -0
  32. cveye-3.2.0/pyproject.toml +30 -0
  33. cveye-3.2.0/setup.cfg +4 -0
  34. cveye-3.2.0/tests/test_cvss4.py +52 -0
  35. cveye-3.2.0/tests/test_exploits.py +136 -0
  36. cveye-3.2.0/tests/test_intel.py +160 -0
  37. cveye-3.2.0/tests/test_platform.py +146 -0
  38. cveye-3.2.0/tests/test_sources.py +111 -0
  39. cveye-3.2.0/tests/test_triage.py +163 -0
  40. 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>