Commit Graph
41 Commits
Author SHA1 Message Date
Andre ba3cb0473f Correct the phpunit rule origin 2026-11-08 22:25:28 +00:00
Andre 4895320697 Correct the phpunit rule origin 2026-11-08 17:10:01 +00:00
Andre a27f575b1d Publish CVE channel 2026-11-08 16:50:55 +00:00
AndreandClaude Opus 5 ff9d215c3f Where to rehearse a patch before anybody reads it
ruleset_feeds.cve_url points an installation at its own channel document, from
engine 3.2.7. It replaces the published channel rather than adding to it: the
channel owns its ruleset source, a fetch clears that source before rebuilding
it, and two feeds claiming it would delete each other's rules on alternating
ticks.

So a new patch can be published to your own document, run as log against your
own traffic for as long as it takes to trust, and only then proposed here.
Until now there was nowhere to do that.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5fpE6Gu4W6JoFMXyb7t7r
2026-11-04 15:08:58 +00:00
Andre 121042ac89 Publish CVE channel (2026-11-04T15:00:48Z)
Validated against the engine's TestPublishedFeedDoesNotDuplicateACompiledRule guard.
Entries carrying an id: 2
2026-11-04 15:00:59 +00:00
Andre 03d3a519bd Publish CVE channel (2026-11-04T14:58:23Z)
Validated against the engine's TestPublishedFeedDoesNotDuplicateACompiledRule guard.
Entries carrying an id: 3
2026-11-04 14:58:38 +00:00
AndreandClaude Opus 5 56d9e22d1e Entry and exit discipline for the channel
This document reaches every customer's agents from one hardcoded URL, so a
publish is a decision taken on their behalf. Records what earns that — an
actively exploited vulnerability, recognisable in one request, in software
customers run, in the days before a fix — and the three steps out: in as log,
promoted only with a reason, then into the engine or deleted.

Also records that customers do not need this channel for their own rules.
Create Custom Ruleset takes the same fields and reaches their own agents; the
config pull and this feed are each forbidden from touching the other's
sources.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5fpE6Gu4W6JoFMXyb7t7r
2026-11-04 13:22:20 +00:00
AndreandClaude Opus 5 d8426a1d6c Document importing from a Nuclei template, and what the importer refuses
A CVE record describes a vulnerability, not a request, which is why this
channel is written by hand. A Nuclei template contains the request — path,
query, headers, body — because that is what it sends, so for thousands of CVEs
the shape a virtual patch needs is already written down.

What cannot come across is the template's matchers: they read the RESPONSE to
decide whether the target was actually vulnerable, and a WAF decides before a
response exists. So an imported rule is strictly weaker than the template it
came from — it recognises the attempt, not the exploitation. That is why they
land as action "log", which the engine now honours: observed, recorded as an
event, scoring nothing.

Also records what the importer skips rather than guesses: a CVE already
patched in compiled code, a request that is entirely template variables, a
literal under twelve characters, the site root. And what it corrects: one
leading path segment, because a template is written against a laboratory where
the application is mounted somewhere — /laravel52/vendor/phpunit/... would
have been published unable to match a real attack at /vendor/phpunit/...

Documentation only. cve.json is untouched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5fpE6Gu4W6JoFMXyb7t7r
2026-11-04 02:34:54 +00:00
Andre 1e0ad6cd7b Update OWASP CRS rules to v4.30.0
Automated update via update-feed.sh
CRS version: v4.30.0
Rules extracted: 270
2026-11-04 02:29:51 +00:00
Andre 20a94d246b Publish CVE channel (2026-11-04T01:02:01Z)
Validated against the engine's TestPublishedFeedDoesNotDuplicateACompiledRule guard.
Entries carrying an id: 2
2026-11-04 01:02:08 +00:00
Andre 1cab4c9b60 Update OWASP CRS rules to v4.30.0
Automated update via update-feed.sh
CRS version: v4.30.0
Rules extracted: 272
2026-11-04 01:02:02 +00:00
Andre 8417dbfcb4 Publish CVE channel (2026-11-04T00:54:59Z)
Validated against the engine's TestPublishedFeedDoesNotDuplicateACompiledRule guard.
Entries carrying an id: 3
2026-11-04 00:55:16 +00:00
AndreandClaude Opus 5 c0633f11e7 The example was the one rule this channel refuses to publish
CVE-CHANNEL.md showed the PHP upload-progress rule as its worked example, and
that CVE is patched in compiled code. The guard forty lines below the example
exists to refuse exactly that — both rules would fire, the scores would add,
and one attack would be reported as two. So the example a reader was most
likely to copy was the only example that could not be published:

  published rule CVE-2026-109618-01 patches CVE-2026-109618, which the
  compiled rule "php_upload_progress" already patches

The example is now a CVE that is not patched in code, extracted from this file
and run through the engine's own guard to prove it validates. A sentence beside
the example says why it is not the PHP one, instead of leaving the reader to
find the warning at the bottom after the refusal.

cve.json is untouched and its build_datetime is unchanged, so nothing an edge
node enforces changes with this commit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5fpE6Gu4W6JoFMXyb7t7r
2026-11-04 00:22:49 +00:00
AndreandClaude Opus 5 d6e0c144f2 Withdraw the self-test rule, which is the other half of the proof
The channel delivered in 30 seconds: the nonce path went from 404 to 403 at
the edge, a near-miss path stayed 404 so the rule had not over-matched, and
the site root stayed 200 so nothing else had changed.

Withdrawal is a first-class operation here precisely because a patch written
in the hours after a disclosure is written against an advisory and not against
traffic. An empty rulesets array withdraws everything the channel owns, and
this exercises that path while nothing depends on it - which is the only
comfortable time to find out whether it works.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5fpE6Gu4W6JoFMXyb7t7r
2026-11-03 01:04:53 +00:00
AndreandClaude Opus 5 33646eb96c Prove the CVE channel end to end, with a rule that cannot match real traffic
The channel shipped in engine 3.0.47 and has never carried anything: every
agent fetches cve.json hourly and skips it unread, because the build stamp has
not moved since 23/10. A mechanism that has never delivered a payload is not
known to work, and the day to find that out is not the day after a disclosure.

So: one rule for a path carrying a random nonce. No real client requests it,
nothing legitimate can match it, and it is anchored at both ends — checked
against the path itself and against three near misses before publishing.

This is deliberately NOT the five PHP patterns from engine 3.2.0. Every agent
in the fleet is already on 3.2.0, so those rules would add no protection, and
this document says why that matters: a feed rule and a compiled rule both add
to the same anomaly score, so one attack would be scored twice and reported as
two rules. Verified rather than taken on trust - rules.go accumulates in
eighteen places and ruleset.go:1354 adds to the same total.

Withdrawn as soon as it is confirmed enforced, which also exercises the
withdrawal path this channel treats as a first-class operation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5fpE6Gu4W6JoFMXyb7t7r
2026-11-03 01:03:37 +00:00
Andre 6ff3140e43 Publish CVE channel (2026-10-23T12:33:23Z)
Validated against the engine's TestPublishedFeedDoesNotDuplicateACompiledRule guard.
Entries carrying an id: 0
2026-10-23 13:33:41 +01:00
Andre 04b9ba1cbe Publish CVE channel (2026-10-23T12:18:54Z)
Validated against the engine's TestPublishedFeedDoesNotDuplicateACompiledRule guard.
Entries carrying an id: 2
2026-10-23 13:19:02 +01:00
Andre 11c36906d8 Publish CVE channel (2026-10-23T11:20:19Z)
Validated against the engine's TestPublishedFeedDoesNotDuplicateACompiledRule guard.
Entries carrying an id: 0
2026-10-23 12:20:25 +01:00
AndreandClaude Opus 5 388ee67585 Publish CVE channel self-test (2026-10-23T11:13:20Z)
A deliberately temporary rule, to prove that a rule published through this
channel reaches every edge node and is enforced, and that withdrawing it
stops the enforcement. It matches a parameter name no real request carries.
To be withdrawn as soon as the test is recorded.

Validated against the engine's TestPublishedFeedDoesNotDuplicateACompiledRule
guard.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5fpE6Gu4W6JoFMXyb7t7r
2026-10-23 12:13:42 +01:00
Andre c44ea2e648 Update OWASP CRS rules to v4.30.0
Automated update via update-feed.sh
CRS version: v4.30.0
Rules extracted: 272
2026-10-23 01:35:31 +01:00
AndreandClaude Opus 5 6ca0cd5d20 Add the CVE channel document
cve.json carries virtual patches: rules written against a named
vulnerability, published as data so that every edge node enforces them
within the hour instead of waiting for an engine release. Engine 3.0.47 and
later fetch it hourly.

It starts empty, which is a valid state and says "no virtual patches at the
moment" — the engine accepts an empty rulesets list as of 3.0.47, and
publishing one is also how the whole channel stands down.

Separate from rulesets.json rather than part of it: each has its own
build_datetime, so each is applied or skipped on its own, and a mistake in
one cannot take out the other. Publishing a patch should not mean
republishing a 357KB mirror of the Core Rule Set.

CVE-CHANNEL.md documents the format, the param_names target, how severity
becomes the anomaly score, and the two mistakes worth avoiding: publishing a
rule for a CVE the engine already patches in code (both fire and the scores
add), and forgetting that there is no backtest for a patch written in the
hours after a disclosure — which is why withdrawal is a first-class
operation here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N5fpE6Gu4W6JoFMXyb7t7r
2026-10-22 14:45:39 +01:00
Andre d6ab346bd3 Update OWASP CRS rules to v4.29.0
Automated update via update-feed.sh
CRS version: v4.29.0
Rules extracted: 271
2026-09-07 18:14:53 +01:00
Andre a0496d7fec Update OWASP CRS rules to v4.29.0
Automated update via update-feed.sh
CRS version: v4.29.0
Rules extracted: 282
2026-09-07 18:08:38 +01:00
Andre efb7ee8f9a Update OWASP CRS rules to v4.29.0
Automated update via update-feed.sh
CRS version: v4.29.0
Rules extracted: 282
2026-09-07 17:55:59 +01:00
Andre c93f04239a Update OWASP CRS rules to v4.29.0
Automated update via update-feed.sh
CRS version: v4.29.0
Rules extracted: 282
2026-09-07 17:34:35 +01:00
Andre 2bb7268107 Update OWASP CRS rules to v4.29.0
Automated update via update-feed.sh
CRS version: v4.29.0
Rules extracted: 282
2026-08-29 19:15:07 +01:00
Andre 93c5d69c53 Update OWASP CRS rules to v4.27.0
Automated update via update-feed.sh
CRS version: v4.27.0
Rules extracted: 279
2026-06-25 00:09:11 +01:00
Andre d3acde3d67 Update OWASP CRS rules to v4.25.0
Automated update via update-feed.sh
CRS version: v4.25.0
Rules extracted: 279
2026-04-23 23:04:50 +01:00
Andre f4bc7b5ed3 Update OWASP CRS rules to v4.25.0
Automated update via update-feed.sh
CRS version: v4.25.0
Rules extracted: 279
2026-04-16 21:44:37 +01:00
Andre 63db619a86 Update OWASP CRS rules to v4.25.0
Automated update via update-feed.sh
CRS version: v4.25.0
Rules extracted: 279
2026-04-02 17:42:20 +01:00
Andre 5488b147a5 Update OWASP CRS rules to v4.24.1
Automated update via update-feed.sh
CRS version: v4.24.1
Rules extracted: 277
2026-03-17 00:18:07 +00:00
Andre 4316bad41e Update OWASP CRS rules to v4.24.1
Automated update via update-feed.sh
CRS version: v4.24.1
Rules extracted: 180
2026-03-10 11:55:26 +00:00
Andre 613e32ae94 Update OWASP CRS rules to v4.24.1
Automated update via update-feed.sh
CRS version: v4.24.1
Rules extracted: 180
2026-03-09 23:05:56 +00:00
Andre 09a7c79e17 Update OWASP CRS rules to v4.24.1
Automated update via update-feed.sh
CRS version: v4.24.1
Rules extracted: 180
2026-03-09 22:45:01 +00:00
Andre 4e6fe3a7fb Update OWASP CRS rules to v4.24.0
Automated update via update-feed.sh
CRS version: v4.24.0
Rules extracted: 180
2026-03-08 16:29:54 +00:00
Andre f1ccfb22ee Update OWASP CRS rules to v4.24.0
Automated update via update-feed.sh
CRS version: v4.24.0
Rules extracted: 180
2026-03-08 16:12:12 +00:00
Andre 4a68d2c9be Update OWASP CRS rules to v4.24.0
Automated update via update-feed.sh
CRS version: v4.24.0
Rules extracted: 180
2026-03-08 15:47:17 +00:00
Andre d5f1a7fd28 Update OWASP CRS rules to v4.24.0
Automated update via update-feed.sh
CRS version: v4.24.0
Rules extracted: 184
2026-03-08 15:35:07 +00:00
Andre f1bf0e1c70 Update OWASP CRS rules to v4.24.0
Automated update via update-feed.sh
CRS version: v4.24.0
Rules extracted: 281
2026-03-08 15:29:02 +00:00
Andre 6b9b1ceba3 Update OWASP CRS rules to v4.24.0
Automated update via update-feed.sh
CRS version: v4.24.0
Rules extracted: 310
2026-03-08 14:18:10 +00:00
Andre 7d5e68a691 Update OWASP CRS rules to v4.24.0
Automated update via update-feed.sh
CRS version: v4.24.0
Rules extracted: 310
2026-03-08 11:58:31 +00:00