Commit Graph
3107 Commits
Author SHA1 Message Date
0xMarcio 4ec2802cf5 Drop inherited links to repositories that are not proofs of concept
The corpus was assembled by a workflow that, in its own words, output every
search result without trying to filter them. Re-checking every link whose
repository does not name its CVE against the current classifier found
27,026 of 32,675 failing it: Shodan cheat sheets under Heartbleed, FTC
robotics team repositories under the jQuery prototype pollution CVE, Docker
images matched through their dependency manifests, and a repository called
"test".

16,613 links whose repository names the CVE were never examined, a
repository that could not be fetched kept all of its links, and one that
calls itself a PoC and names the CVE is kept even where the classifier
says otherwise — deleting a real PoC costs more than leaving a doubtful
one in place.

7,223 entries lighter, and repo_meta.json drops to the 26,755
repositories still referenced.
2026-08-30 23:24:18 +02:00
0xMarcio 58c70b93ab Recognise a proof of concept written in another language
The PoC vocabulary was English-only, so a repository describing itself as
"漏洞利用" — an exploit — read as evidence that it was not one. Chinese is
the second language of this corpus by a wide margin, and the same gap
covered Spanish, Portuguese, French, Russian, Japanese and Korean.

NON_POC_RE also vetoed "prueba", which is the proof in "prueba de
concepto", inverting the signal for Spanish repositories entirely.

On the 600-repository discovery sample this admits two more genuine PoCs
and nothing else.
2026-08-30 23:24:11 +02:00
0xMarcio 368a784fe1 Rank PoC links by what they are about, not by how big they are
Sorting a CVE's links on stars alone handed the top of Log4Shell to
ThreatMapper, Viper, afrog and Awesome-OSINT-For-Everything: large tools
that mention the CVE somewhere. Rank repositories named after the CVE
first and only order those by stars, which puts CVE-2025-32463_chwoot
above a 2.5k-star general sudo toolkit.

A term no advisory text uses leaves every match tied at the weakest tier,
where newest-first is meaningless; searching log4shell led with text4shell
and then a CVE holding a single incidental link. Break those ties on how
many of the linked PoCs carry the term instead, which is only consulted
when nothing matched a description, so product searches are unchanged.

Also drop two controls that could not do anything: an expander on a
description already short enough to fit, and a footer offering to expand
a list of one.
2026-08-30 22:18:49 +02:00
CVE-BOT 77e14ec7db Trending CVEs update 2026-08-30 20:14 🤖 2026-08-30 20:14:59 +00:00
0xMarcio 066ddf4400 Rebuild the frontend to the refit design
Space Grotesk for prose, IBM Plex Mono for every identifier, and the flat
hairline-bordered surfaces from the handoff. Green marks what you can act
on and amber only ever means a star count; nothing else is coloured.

Three changes to how the same data reads. Descriptions clamp to three lines
behind an expander, so a kernel CVE no longer pushes the links people came
for below the fold. Raw URLs become owner / repo rows carrying stars and
last-commit age, ranked best first, five at a time. And an empty search box
now keeps the trending PoCs on screen with a TRENDING / RECENT toggle
rather than showing an empty page.

The search grammar, ranking and negation are unchanged.
2026-08-30 21:53:31 +02:00
0xMarcio 576b0e4735 Collect stars and last push during the weekly audit
The audit already asks GitHub about every linked repository, so the same
query can carry back a star count and a last-push date for free. Results go
to repo_meta.json, which lets a search result say which of two hundred
linked PoCs is worth opening.

2.1 MB for 45,008 repositories, refreshed weekly.
2026-08-30 21:53:20 +02:00
0xMarcio 5452bc8353 Report when a PoC repository last shipped code
The trending table sorted and displayed updated_at, which also moves when a
repository merely gains a star, so a four-month-old exploit was claiming it
had been updated three hours ago. Record pushed_at and created_at and let
the page decide: last commit for the age it shows, repository age for the
trending rank.

The job now writes trending.json alongside the README table, so the site
reads the data instead of regex-parsing markdown the same job generated.
2026-08-30 21:53:19 +02:00
0xMarcio 31c691e44f Purge dead PoC links and blank version badges
The audit found 8,404 of the 47,210 linked repositories gone from GitHub,
so 10,065 links across 5,495 entries pointed at 404s. 1,940 entries held
nothing but dead links and now carry no PoCs at all, which drops them from
the search index rather than offering a reader broken results.

The 4,733 entries whose advisory lists no affected version still rendered
an empty shields.io chip; they now read n/a like the product and
vulnerability badges beside them.
2026-08-30 21:09:52 +02:00
0xMarcio 85fe2b3ad4 Retire the abandoned second pipeline
Ten modules totalling 2,206 lines, reachable from no workflow and no live
script, alongside 18 MB of github-all.txt and references-all.txt that
nothing reads and 400 KB of stale api/v1 output that shipped in every
Pages artifact. scripts/README.md documented this as the build process.

utils.py existed for one caller and duplicated functions build_site.py
already had, so it folds into it. Nothing imports a third-party package
any more, and requirements.txt goes with it.
2026-08-30 21:09:37 +02:00
0xMarcio 6d65ae36bb Audit PoC links against GitHub weekly
Sampling the corpus put 17% of the repositories it links to behind a 404,
so readers were following links to repositories that no longer exist. The
previous audit script was 630 lines, never wired to anything, and kept its
state under a gitignored directory.

Replace it with a check that batches repository lookups through GraphQL
and removes a link only when GitHub answers NOT_FOUND for it, so a
throttle or a network error can never drop one. A quarter of the corpus
runs each week, which stays inside the token's hourly budget and sweeps
everything within the month.
2026-08-30 21:09:35 +02:00
CVE-BOT b979ae5624 Trending CVEs update 2026-08-30 15:40 🤖 2026-08-30 15:40:37 +00:00
0xMarcio 78ad23cf78 Say the CVE list is still loading instead of finding nothing
Typing before the payload arrives searched an empty dataset and reported
no results, then the loader hid the table and left a blank page, so the
query had to be typed a second time. Show that data is loading and run
the pending query once it lands.
2026-08-30 17:39:01 +02:00
0xMarcio 8dcf23b0b5 Drop PoC links filed under a truncated CVE id
Nineteen links across sixteen entries, each pointing at a repository for
an advisory whose number merely starts with the entry's own — CVE-2019-1144
holding CVE-2019-11447-POC, CVE-2023-3883 holding the WinRAR CVE-2023-38831
generator. Every one was re-checked against the classifier and none of
them survives it.
2026-08-30 17:39:00 +02:00
0xMarcio 0aa40a5f49 Reject CVE ids that are a truncation of the one a repo is about
A README caption in maniakh/CVE-2026-31431---Copy-Fail-PoC reads
"Copy Fail (CVE-2026-3143)", one digit short. That still parses as a
valid identifier, and the guard meant to catch it was satisfied by the
repo's generic exploit.py, so the PoC was filed against an unrelated
WordPress advisory. CVE-2026-8222 (Open5GS) collected a GiveWP lab the
same way. Drop an id from the same year that a longer mentioned id
extends, unless the repository name deliberately carries both.

Underscores are word characters, so the id regex matched neither half of
a name like CVE-2022-4174_CVE-2022-41742; read the separator-normalised
name too. Over 600 live candidates that recovers two real PoCs the gap
was hiding, Keycloak_CVE-2026-18963_PoC and CVE-2026-42945_NginxRift.
2026-08-30 17:38:58 +02:00
0xMarcio 56a945f9bb Rank on how well the query matches, not just whether it does
Unquoted words were scored independently, so "active directory" matched a
description holding "active session" and "working directory" as strongly
as a real AD advisory, and the newest-first tie-break then put the wrong
one on top. Reward the words appearing together.

Plain substring matching also meant "rce" hit "open source" and "sudo"
hit "pseudo"; require a term to start a word, while still allowing it to
match into one so "word" finds "wordpress". Weight matches near the start
of a description, in coarse buckets so a few characters never outweigh
recency: "log4j rce" now leads with Log4j2 rather than GeoTools.
2026-08-30 17:15:58 +02:00
CVE-BOT 9d49abebff Update CVE PoCs 2026-08-30 2026-08-30 15:06:01 +00:00
0xMarcio 68d5c9b8f4 Replay bot commits when a push is rejected
The two scheduled jobs write disjoint paths but pin their checkout when
they are queued, so a commit landing in between throws away a completed
run. Rebase onto the current main and retry instead, deepening the clone
only on the rare occasion it is needed.
2026-08-30 17:04:04 +02:00
CVE-BOT ed86403e2d Trending CVEs update 2026-08-30 15:00 🤖 2026-08-30 15:00:54 +00:00
0xMarcio 28ca54289c Untrack the generated trending file
It is rebuilt from README.md during the Pages build like CVE_list.json,
so the committed copy only ever added churn.
2026-08-30 17:00:09 +02:00
0xMarcio 7e8c22ad5f Rank search results by recency and cut page load cost
Scores were boosted by how many PoC links matched, which promoted old
CVEs with large link piles above recent findings; searching WordPress led
with 2015-2018. Rank on match quality alone and break ties by CVE year
and number, newest first.

Only the id and description are needed for every comparison, so PoC text
is derived on demand: preparing 108934 entries drops from 2.9s to 0.6s.
Dropping no-store lets the browser revalidate the 53 MB payload instead
of refetching it on every visit; the 5 KB trending file stays uncached.
Build result rows directly, since String.replace reads $& in the
replacement as a pattern, and escape link text like every other cell.
2026-08-30 16:59:43 +02:00
0xMarcio f937e5595c Authenticate the trending search and keep the token out of git
The search API was called anonymously on a 10 requests/minute limit while
the workflow already had a token; send it as an Authorization header,
never in the URL, and never print it. Dropping the token from the origin
remote also stops it being written into .git/config on the runner, since
actions/checkout already provides push credentials.

Rewrite on urllib so the job installs nothing, retry rate limits and 5xx,
and fail loudly instead of silently publishing a README with a year
missing. Repository text is flattened so a pipe cannot break the table.
2026-08-30 16:59:42 +02:00
0xMarcio f9fc5ae28d Stop tracking generated site data
Pages builds from the workflow artifact, so the committed CVE_list.json
was never served while adding a fresh 53 MB blob to history every day.
Generate it during the Pages build instead and drop the duplicate
generator; scripts/build_site.py is now the only thing that writes it.

The jinja2 templates re-rendered a trending table that logic.js replaces
on load, so the page shell goes back to being a plain static file and the
Pages build no longer installs anything. Shallow-clone the sync job too:
it never reads git history, and the three-day lookback already recovers
a skipped day.
2026-08-30 16:59:31 +02:00
0xMarcio b1ac17daf9 Widen PoC discovery and fix the empty version badge
A repository dedicated to one CVE that calls itself a PoC and ships code
was still vetoed when its description happened to contain a generic word
like writeup, patched or detector. Check the description alongside the
name for PoC intent; pure scanners that never claim to be a PoC stay out.
Measured on 600 live candidates: 15 repositories gained, none lost.

Fall back to n/a for missing versions, matching the product and
vulnerability badges instead of rendering an empty shields.io chip.
2026-08-30 16:59:13 +02:00
CVE-BOT 0c938ab939 Trending CVEs update 2026-08-30 10:52 🤖 2026-08-30 10:52:54 +00:00
CVE-BOT b1ae59882e Update CVE PoCs 2026-08-30 2026-08-30 08:21:21 +00:00
CVE-BOT 8733c5e2ae Trending CVEs update 2026-08-30 02:17 🤖 2026-08-30 02:17:03 +00:00
CVE-BOT fee3a3ee91 Trending CVEs update 2026-08-29 20:08 🤖 2026-08-29 20:08:02 +00:00
CVE-BOT f0511bf984 Trending CVEs update 2026-08-29 15:56 🤖 2026-08-29 15:56:31 +00:00
CVE-BOT 113f67cb64 Trending CVEs update 2026-08-29 11:55 🤖 2026-08-29 11:55:57 +00:00
CVE-BOT 0d71150385 Update CVE PoCs 2026-08-29 2026-08-29 09:06:17 +00:00
0xMarcio c8fbbc40b2 Clean and verify CVE PoC sources 2026-08-29 04:29:03 +02:00
CVE-BOT 643d11d32e Trending CVEs update 2026-08-29 01:17 🤖 2026-08-29 01:17:18 +00:00
0xMarcio 189a0f24df Update Pages actions 2026-08-29 00:32:01 +02:00
0xMarcio d2dc891620 Deploy site after CVE sync 2026-08-29 00:27:01 +02:00
CVE-BOT 877e5369d3 Update CVE PoCs 2026-08-28 2026-08-28 22:25:15 +00:00
0xMarcio a62cda8ec8 Automate CVE PoC ingestion 2026-08-29 00:21:06 +02:00
CVE-BOT ac970d10ac Trending CVEs update 2026-08-28 17:51 🤖 2026-08-28 17:51:26 +00:00
CVE-BOT 55ddc624df Trending CVEs update 2026-08-28 01:52 🤖 2026-08-28 01:52:52 +00:00
CVE-BOT 3e57a42a60 Trending CVEs update 2026-08-26 19:29 🤖 2026-08-26 19:29:17 +00:00
CVE-BOT 8c7c8c4d40 Trending CVEs update 2026-08-26 12:27 🤖 2026-08-26 12:27:45 +00:00
CVE-BOT b59f25b4ed Trending CVEs update 2026-08-26 06:28 🤖 2026-08-26 06:28:01 +00:00
CVE-BOT c2ea4c1be3 Trending CVEs update 2026-08-25 18:22 🤖 2026-08-25 18:22:25 +00:00
CVE-BOT aad2735729 Trending CVEs update 2026-08-25 12:25 🤖 2026-08-25 12:25:06 +00:00
CVE-BOT 8bb38e216e Trending CVEs update 2026-08-25 06:26 🤖 2026-08-25 06:26:21 +00:00
CVE-BOT 03c618cd78 Trending CVEs update 2026-08-24 18:23 🤖 2026-08-24 18:23:14 +00:00
CVE-BOT 36a640cadf Trending CVEs update 2026-08-24 12:24 🤖 2026-08-24 12:24:22 +00:00
CVE-BOT 98e4389274 Trending CVEs update 2026-08-24 06:34 🤖 2026-08-24 06:34:36 +00:00
CVE-BOT 3b4d98ad4c Trending CVEs update 2026-08-24 00:38 🤖 2026-08-24 00:38:03 +00:00
CVE-BOT 449c04b54f Trending CVEs update 2026-08-23 18:13 🤖 2026-08-23 18:13:45 +00:00
CVE-BOT 18155eb1ed Trending CVEs update 2026-08-23 12:17 🤖 2026-08-23 12:17:12 +00:00