Commit Graph
3193 Commits
Author SHA1 Message Date
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
0xMarcio 74a9e53c2c Prefer named CVEs during discovery 2026-09-01 19:33:38 +02:00
CVE-BOT 4bf4d58446 Update CVE PoCs 2026-09-01 2026-09-01 17:31:21 +00:00
0xMarcio 3f72a21d2d Refine GitHub PoC classification 2026-09-01 19:24:05 +02:00
CVE-BOT f45e320a38 Update CVE PoCs 2026-09-01 2026-09-01 17:16:04 +00:00
0xMarcio 796d813803 Persist CVE discovery state 2026-09-01 19:08:30 +02:00
0xMarcio 81017c9871 Expand CVE PoC coverage and metadata 2026-09-01 19:01:07 +02:00
CVE-BOT d006786a98 Trending CVEs update 2026-09-01 14:07 🤖 2026-09-01 14:07:19 +00:00
CVE-BOT 3f4626884b Trending CVEs update 2026-09-01 13:52 🤖 2026-09-01 13:52:06 +00:00
0xMarcio f140e13160 Repair the README pipeline after the move
Moving the data files into index/ left three references behind in .github,
and the hourly job has been failing to stage its own output since. The
README has been advertising 104,016 CVEs with PoCs while the site served
89,125, and every KEV marker had dropped out of its table because the
catalogue was being read from a path that no longer exists.

Figures come from the same count build_site publishes, so the badges, the
hero card and the site cannot disagree again.
2026-09-01 15:50:08 +02:00
0xMarcio 2821985dd9 Reach the PoCs published before the search window opens
Discovery asks GitHub for repositories pushed in the last three days, so a
proof of concept written for a 2019 CVE in 2021 is unreachable however long
the job runs. nomi-sec/PoC-in-GitHub has collected them daily since 1999.

It collects without filtering, which is how this index inherited its junk
the first time, so nothing arrives trusted: every candidate goes through
qualifying_repo_cves, the same gate a repository found by search must pass.
Of 6,945 candidates the gate rejected 4,110 and accepted 2,835, adding
links to 1,528 entries that had none or had fewer.

Vulhub joins the curated archives beside ExploitDB and Metasploit. It is
241 entries, and each one is a docker-compose file and reproduction steps
rather than a description of a flaw.

Candidates are judged again every week rather than remembered as rejected:
an empty shell in March is often a working exploit by June.
2026-09-01 15:21:53 +02:00
0xMarcio bafbb8d4d6 Scan five years of CVEs for new PoCs, not two
Discovery only looked at the current year and the one before it, so a PoC
published this week for a 2023 CVE was never found. Exploits for older
vulnerabilities keep appearing, and the daily run has budget to spare: the
window is still three days, so the cost is five sets of search terms instead
of two against the same short window.
2026-09-01 14:43:39 +02:00