Commit Graph
3204 Commits
Author SHA1 Message Date
CVE-BOT 69eeea3e15 Trending CVEs update 2026-09-03 22:08 🤖 2026-09-03 22:08:37 +00:00
0xMarcio e039cf8b62 Name the repository when the pacemaker dispatches
The pacemaker never checks the repository out, so gh had no git context to
infer the repository from and the first link failed after its sleep.
2026-09-03 23:05:44 +02:00
0xMarcio 82936168a5 Keep the hourly refresh on GitHub with a pacemaker chain
GitHub's cron scheduler creates this repository's scheduled runs four to
five hours late and drops the slots in between, so the hourly Hot CVEs
refresh cannot come from a cron. A workflow_dispatch call creates a run
within seconds, so a pacemaker workflow now sleeps until the next :05,
fires the refresh and its own successor, and keeps time by itself. Its
cron only restarts the chain if a link fails.

Hot CVEs loses its cron and the gate that was there to coexist with an
external trigger; nothing outside GitHub is involved any more.
2026-09-03 23:02:52 +02:00
CVE-BOT 8848875256 Trending CVEs update 2026-09-03 20:59 🤖 2026-09-03 20:59:10 +00:00
0xMarcio c15ee7212c Make the hourly Hot CVEs trigger permanent
GitHub's cron scheduler created the hourly run about five times a day,
four to five hours late. A systemd timer on the VPS now dispatches it every
hour. The cron stays as fallback and watchdog: a gate job skips it while
the trigger is alive, lets it run when the trending table is over 55
minutes old, and fails the run once it is over three hours old so the
failure email names the cause.

Also stage docs/kev.svg in every writer that redraws it, verify the index
in the link audit before committing like the other writers do, and refresh
the apt index before installing librsvg.
2026-09-03 22:55:32 +02:00
CVE-BOT 4b24793b6f Trending CVEs update 2026-09-03 20:25 🤖 2026-09-03 20:25:58 +00:00
0xMarcio 3041d9b90e Dispatch the site build after every bot commit
Commits pushed with the workflow token raise no push event, so site.yml
only ran on its 06:20 schedule and the site trailed the index by up to a
day. workflow_dispatch is exempt from that rule, so each writer now
triggers it after a successful push.

The push retry rebased onto the fetched main and, on a conflict, left HEAD
there; the next push then succeeded as a no-op and the run went green with
its changes discarded. Abort the rebase and fail instead.
2026-09-03 22:21:48 +02:00
CVE-BOT fc1595d0af Trending CVEs update 2026-09-03 18:34 🤖 2026-09-03 18:34:03 +00:00
CVE-BOT be86175d9f Trending CVEs update 2026-09-03 14:26 🤖 2026-09-03 14:26:19 +00:00
CVE-BOT b7b5bf71e3 Sync path-level PoC collections 2026-09-03 2026-09-03 10:05:40 +00:00
CVE-BOT 32b6d4c714 Trending CVEs update 2026-09-03 09:40 🤖 2026-09-03 09:40:06 +00:00
CVE-BOT 14388d3ffa Sync exploit archives 2026-09-03 🤖 2026-09-03 09:16:13 +00:00
CVE-BOT b3fbb55e5c Sync nuclei templates 2026-09-03 🤖 2026-09-03 09:02:28 +00:00
CVE-BOT 968d7e94f0 Sync CVE metadata 2026-09-03 2026-09-03 08:00:09 +00:00
CVE-BOT 7ace47c9fc Update CVE PoCs 2026-09-03 2026-09-03 07:19:02 +00:00
CVE-BOT 0238fcc4a3 Trending CVEs update 2026-09-03 04:12 🤖 2026-09-03 04:12:54 +00:00
CVE-BOT 9315bfe860 Trending CVEs update 2026-09-03 00:04 🤖 2026-09-03 00:04:19 +00:00
CVE-BOT 0b50bcb00a Trending CVEs update 2026-09-02 21:47 🤖 2026-09-02 21:47:14 +00:00
CVE-BOT 2746dfe2b2 Trending CVEs update 2026-09-02 18:36 🤖 2026-09-02 18:36:50 +00:00
0xMarcio 0e5e8d7e8c Fix correctness, security and consistency bugs across the generated site
The per-CVE pages read as a different site and disagreed with search about
their own contents. Both traced to the page generator having grown its own
copy of rules the browser already had.

Security:
- JSON-LD was serialised with json.dumps alone, which leaves < > and & raw. A
  description containing "</script>" ended the element and turned the rest into
  live markup. 78 descriptions in the corpus already carry that sequence; only
  the 155-character meta trim kept them out of the payload. Escape to \u00XX.

Correctness:
- The PoC count summed only the repository column, so 19,940 pages announced
  "0 public PoC exploits" directly above the ExploitDB and Metasploit entries
  they were listing, in the title and meta description too. Count every source
  the page renders, matching POC_FIELDS in logic.js.
- The severity chip took the highest score while search took the first, so
  18,434 CVEs showed one severity in the results and another on the page. Both
  now take the primary assessment, with the same Nuclei fallback search uses.
- Identical CVSS rows printed two and three times on 13,340 pages. Dedupe on
  (version, score, vector) and label each survivor with its assessor from
  row[4]; row[5] is the assessment type and left 129 pages showing two rows
  both marked "Secondary".
- repo_from_url accepted any host containing "github" and kept .git suffixes,
  so a clone URL and its plain form counted as two sources on the page and one
  in search. 273 CVEs disagreed. Match repoFromUrl in logic.js exactly.
- 41 CVEs nobody has scored were unreachable by search, including by exact ID:
  the severity filter tested membership of a list naming only the four scored
  bands, so ALL excluded them. ALL now means all.
- EPSS percentiles printed a hard-coded "th": 51th, 62th, 93th on 21,100 pages.
- Search reported "1 PoCs", and the empty-results branch returned before
  updating the live region, leaving it reading "loading index..." forever.

Deploy safety:
- A failed EPSS fetch returned {} and published it, silently erasing every
  score from 82,000 pages. It now raises, as does a feed covering under 90%
  of the index.

Presentation:
- CVE pages never loaded the webfonts the homepage loads, so all 82,468 fell
  back to system fonts. This is why they looked unlike the rest of the site.
- 404.html referenced four CSS classes that no longer existed and rendered
  unstyled, and its meta refresh threw a reader out of a search after two
  seconds. It is now generated from the same constants and header as every
  other page, and offers the search box instead.
- The homepage and the generated footer credited different sources. Both now
  come from brand.SOURCES_LINE, and the build refuses to publish a homepage
  that has drifted from it.
- Three aria-labels sat on div elements with no role, where they are ignored.

SEO:
- 61,936 pages filled "Related" with numerically adjacent CVEs, which are not
  related to anything. Keep only shared-author relations; 20,532 pages have one.
- Sitemap lastmod described the CVE record, so a CVE that gained forty PoCs
  still advertised a date from 2021. It now reflects the page, and each shard
  carries its newest page's date rather than today's.
- TechArticle is not a type Google draws a rich result from, and its dates
  claimed the CVE record's publication as the page's. Use WebPage with the
  vulnerability as mainEntity.
- Curated sources and the CVE and NVD records no longer carry nofollow; the
  crowd-sourced repository list still does.
2026-09-02 17:17:28 +02:00
CVE-BOT e6e56d32e7 Trending CVEs update 2026-09-02 14:23 🤖 2026-09-02 14:23:45 +00:00
CVE-BOT 8502153b8b Add PoC repositories from upstream collection 2026-09-02 2026-09-02 09:38:13 +00:00
CVE-BOT d65df632cf Trending CVEs update 2026-09-02 09:30 🤖 2026-09-02 09:30:44 +00:00
CVE-BOT b0cdab855d Sync exploit archives 2026-09-02 🤖 2026-09-02 09:08:52 +00:00
CVE-BOT 0f46f3180a Sync nuclei templates 2026-09-02 🤖 2026-09-02 08:52:55 +00:00
CVE-BOT 6bc8b8ba6c Sync CVE metadata 2026-09-02 2026-09-02 07:53:18 +00:00
CVE-BOT a124d64067 Update CVE PoCs 2026-09-02 2026-09-02 07:14:07 +00:00
CVE-BOT 438f5d533c Trending CVEs update 2026-09-02 04:17 🤖 2026-09-02 04:17:54 +00:00
0xMarcio 8e0a85a050 Cut the trailing feature lists out of every description
The About box, the meta description, the og and twitter tags and the JSON-LD all
ended in a tacked-on list of features: "Updated hourly", "Free JSON API, no
signup", "Plain JSON, no key". None of it describes what the thing is, and the
meta description ran past where a result gets truncated anyway.

Four strings collapse to two so they cannot drift apart again. SUBTITLE is the
line under the wordmark and the social description; DESCRIPTION is the meta
description, the JSON-LD description and the GitHub About box. Both say what the
site is and stop.
2026-09-02 04:28:23 +02:00
0xMarcio 9b9957ea7f Give every CVE its own page at the site root
82,000 CVEs sat behind one URL. Each of them is a query somebody types, and the
pages answering those queries belonged to other people: searching
"CVE-2026-72898 poc" returns SentinelOne, Horizon3, Wiz and BishopFox, all of
them serving one page per CVE.

Pages are flat files at /CVE-2026-72898. No /cve/ prefix, no extension, no
trailing slash. GitHub Pages resolves an extensionless request to the .html
beside it, checked against the live site rather than assumed.

Each page carries what the index already knows and nothing invented: every CVSS
assessment with its vector, EPSS with percentile, KEV date and ransomware flag,
Nuclei severity and CWE, and the PoC links grouped by source with stars and last
push. 94% of them carry three or more of those signals.

Discovery works two ways. sitemap.xml is now an index over one shard per year,
which fits the 50,000 URL cap on the split the data already has and lets a
crawler refetch only the year that moved. Search results link to the CVE page
instead of straight out to NVD, which moves to a chip beside CVE.ORG, and each
page links six related CVEs picked by shared PoC author.

Rendering all of them takes 20s and adds nothing to the repository: the payloads
they read are already gitignored and built in CI, so the pages go into the Pages
artifact and git never sees them.
2026-09-02 04:00:28 +02:00
0xMarcio 3e9e0a40e0 Follow the repository rename and drop two bits of padding
The slug moved to 0xMarcio/pocindex, so the raw.githubusercontent URLs in the
README banner were riding a redirect. SLUG now lives in brand.py with the rest
of the identity and getTrending imports it.

The About description lost "with CVSS, KEV and EPSS. Free JSON API, no signup."
GitHub truncates listings near 150 characters, so that tail rarely rendered and
read as a feature list rather than a description. 142 characters now.

The MITRE disclaimer comes out of the footer. The brand carries no MITRE mark,
which was the reason for picking it, and referring to CVE identifiers by name is
ordinary descriptive use. NVD, Tenable and Rapid7 all do it without a notice.

_urltest.html is temporary and comes out in the next commit.
2026-09-02 03:54:25 +02:00
CVE-BOT 3c420d723b Trending CVEs update 2026-09-02 01:41 🤖 2026-09-02 01:41:49 +00:00
0xMarcio 31da22381c Rebrand to PoC Index and move to pocindex.io
The site called itself three different things: CVE PoC Hub in the title, CVE
Radar in the h1 and the social metadata, and cve on GitHub. Google had no
consistent site name to settle on, so none of the mentions compounded. CVE
Radar was taken anyway, by SOCRadar's free tool and by cveradar.com.

Every user-facing name and URL now comes from scripts/brand.py, so the next
move is one edit rather than a sweep through the tree.

Also repairs the parts of the site a crawler could not use:

- robots.txt and sitemap.xml were both 404. scripts/build_seo.py writes them,
  wired into the Pages job. trending_poc.json, kev.json and stats.json stay
  crawlable because the first paint needs them; the five bulk payloads are
  disallowed, which is 13.2 MB per crawl spent on data no crawler queries.
- Search state lives in ?q= now. Results were unlinkable, so nobody could cite
  one and there was no route for a SearchAction to declare. replaceState
  rather than pushState, so typing does not bury the back button.
- A WebSite JSON-LD block carries the name Google prints as the site name.
- The footer carries the MITRE trademark notice.
2026-09-02 03:36:22 +02:00
CVE-BOT e58a5a26cc Trending CVEs update 2026-09-01 23:17 🤖 2026-09-01 23:17:01 +00:00
0xMarcio fb2029b3ea Pin README search asset 2026-09-02 01:09:22 +02:00
0xMarcio 8dec6181e8 Refine README search strip 2026-09-02 01:07:28 +02:00
0xMarcio 0748d77eee Add README search call to action 2026-09-02 01:05:49 +02:00
0xMarcio aad1789a71 Keep published counts synchronized 2026-09-02 00:54:09 +02:00
0xMarcio 55279dcfe5 Improve trending year coverage 2026-09-02 00:44:21 +02:00
0xMarcio 7a33d182ac Prefer positive CVSS assessments 2026-09-01 23:56:04 +02:00
0xMarcio 95b818930a Remove unscored severity filter 2026-09-01 23:26:48 +02:00
CVE-BOT 0f3caaa80c Sync CVE metadata 2026-09-01 2026-09-01 21:21:30 +00:00
0xMarcio 8fe2bf2d04 Index verified advisory PoCs and expand CVSS sources 2026-09-01 23:17:04 +02:00
CVE-BOT 597a0da838 Trending CVEs update 2026-09-01 20:58 🤖 2026-09-01 20:58:48 +00:00
0xMarcio dcf4068b7a Deduplicate published sources and improve filters 2026-09-01 22:08:20 +02:00
0xMarcio e534a2d0d9 Avoid duplicate Pages deployments 2026-09-01 20:01:14 +02:00
CVE-BOT d6221a7081 Add PoC repositories from upstream collection 2026-09-01 2026-09-01 17:58:11 +00:00
CVE-BOT 768ffb1c40 Trending CVEs update 2026-09-01 17:49 🤖 2026-09-01 17:49:58 +00:00
CVE-BOT ec0fae9788 Trending CVEs update 2026-09-01 17:43 🤖 2026-09-01 17:43:44 +00:00
CVE-BOT d992851f33 Update CVE PoCs 2026-09-01 2026-09-01 17:41:09 +00:00