1. Who is acting?
What offensive activity reaching these sensors can defensibly be associated with AI crawlers, interactive AI agents, or LLM-assisted automation, as separate claims?
AI offense observatory
Mothlight passively watches decoy systems and asks whether AI crawlers, AI agents, or LLM-assisted automation behave differently from classic scanners around offensive requests and known vulnerabilities. This page publishes aggregates only, after a delay, and says plainly when the answer is not known yet.
Four questions guide this observatory. Each answer is graded by the strongest evidence behind it, because a self-declared name is not proof.
What offensive activity reaching these sensors can defensibly be associated with AI crawlers, interactive AI agents, or LLM-assisted automation, as separate claims?
Around critical CVEs, do those actors only discover and probe, or do they send exploit-specific requests? An exploit attempt is observed request intent. It is never shown here as a compromise.
Conditional on a relevant decoy being reachable, how long after CVE publication does each cohort first probe and first attempt exploitation?
Which sessions form coherent, stable clusters that may share an operator or tooling, and which must remain singletons? A cluster is not, by itself, an AI attribution.
| Tier | Meaning | What it can support |
|---|---|---|
E0 | Self-declared: a name or claim in the request itself. | Claimed only. It can start a verification check and proves nothing on its own. |
E1 | Published-network verified: the source matches a current provider-published range or confirmed reverse DNS. | Verified service identity, when the registry also documents an AI purpose. |
E2 | Cryptographically verified: a valid, fresh Web Bot Auth signature from an approved signer. | High-confidence service identity. Purpose still comes from the registry. |
E3 | Behaviorally inferred: a sequence shows response-dependent behavior that fixed automation is unlikely to produce. | Inferred AI, at medium confidence, with controls. Timing or wording alone is never enough. |
E4 | Canary-proven: the actor used decoy-only information in a same-origin follow-up. | The strongest behavioral evidence available to a passive sensor. |
Conditional on traffic reaching these sensors; verified, inferred, suspected, claimed, spoofed, unknown and legacy-unavailable rows are separate evidence claims and are never merged. Percentages use the web-request denominator for the delayed window. Web, all-surface, and non-web denominators are reported separately and never substituted for one another.
Conditional on traffic reaching these sensors; stages are observed request intent ("exploit attempt"), split by actor cohort with unknown shown separately. Stages describe observed request intent only. Nothing on this page labels an exploit attempt as a compromise, and no stage implies a successful intrusion.
| Cohort | Discovery | Probe | Exploit attempt | Credential access attempt | Post-exploit signal |
|---|---|---|---|---|---|
| Verified AI | 3 from 2 sources | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) |
| Inferred AI | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) |
| Classic automation | 63 from 12 sources | 4 from 4 sources | 8 from 3 sources | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) |
| Unknown cohort | 53,699 from 2,408 sources | 263 from 37 sources | 15 from 2 sources | 20 from 6 sources | 0 from 0 sources (observed zero) |
Read across a row as deepening observed intent, not as a conversion rate: different requests, not necessarily the same actors, appear at each stage. The unknown cohort is shown separately rather than allocated to AI or classic.
Conditional on traffic reaching these sensors; CVE rows come only from non-shadow passive matcher observations with labels frozen at observation time. CVSS is severity context, CISA KEV marks known exploitation in the wild, and EPSS estimates exploitation probability. None of them turns a probe into a compromise.
Exploratory| CVE | Cohort | Stage | Observations | CVSS | KEV | EPSS | Published |
|---|---|---|---|---|---|---|---|
CVE-2017-9841 | Classic automation | probe | Withheld: below publication threshold | 9.8 (v3.1) | Listed 2022-02-15 | 100.0% | 2017-06-28 |
CVE-2017-9841 | Unknown cohort | probe | Withheld: below publication threshold | 9.8 (v3.1) | Listed 2022-02-15 | 100.0% | 2017-06-28 |
CVE-2018-10561 | Unknown cohort | probe | Withheld: below publication threshold | 9.8 (v3.1) | Listed 2022-03-31 | 92.8% | 2018-05-04 |
CVE-2018-10562 | Unknown cohort | probe | Withheld: below publication threshold | 9.8 (v3.1) | Listed 2022-03-31 | 99.9% | 2018-05-04 |
CVE-2021-31207 | Unknown cohort | probe | Withheld: below publication threshold | Not in catalog | Listed 2021-11-03 | 99.8% | Not available |
CVE-2021-3129 | Unknown cohort | probe | Withheld: below publication threshold | Not in catalog | Listed 2023-09-18 | 99.9% | Not available |
CVE-2021-34473 | Unknown cohort | probe | Withheld: below publication threshold | Not in catalog | Listed 2021-11-03 | 100.0% | Not available |
CVE-2021-34523 |
Sessions are clustered every six hours by shared artifacts, payload and sequence similarity, transport, network, and timing. A consensus campaign passed stricter linkage checks; a candidate did not. Membership lists, artifact values, and request data are never published.
Latest run 2026-11-02 02:01 UTC, window 2026-11-01 to 2026-11-02. Algorithm campaigns-cpm-leiden-hdbscan-v1; feature version session-features-v1; configuration hash 9fa37332941b.
This run does contain AI-attributed sessions in clusters: 0 verified or inferred, 2 with any AI attribution claim. Bucket detail below is suppressed where a bucket holds fewer than 3 sessions.
We will not publish a speed comparison until the clock can start honestly. Exploratory
Kaplan-Meier style time-to-first-probe and time-to-first-exploit-attempt curves by cohort, with at-risk and censored counts, confidence bands, and "median not reached" where that is the truth. Gates:
Conditional on traffic reaching these sensors; coverage shows what evidence is missing — absence of a fact is not negative evidence. Coverage uses all 55,407 all-surface requests in the delayed window as its denominator.
| Evidence family | Covered requests | Why it matters |
|---|---|---|
| Evidence record present | 55,407 from 2,658 sources (100.0% of all-surface requests) | Without an evidence record a request stays legacy-unavailable, never silently non-AI. |
| Response timing or template facts | 1,068 from 275 sources (1.9% of all-surface requests) | Response timing supports the timing family and honest censoring. |
| Raw header order preserved | 0 from 0 sources (0.0% of all-surface requests) (observed zero) | Header order is a transport feature only when the ingress preserved it. |
| Fresh identity source | 245 from 16 sources (0.4% of all-surface requests) | Stale provider ranges cannot verify an identity. |
| Passive CVE matcher coverage | 14 from 8 sources (0.0% of all-surface requests) | Matcher hits are the only source of CVE stage labels. |
Classifier versions: classifier-evidence-v1. Matcher versions: apache-cve-2021-41773-cve-2021-41773@1, apache-cve-2021-41773-cve-2021-42013@1, bait-cve-2021-42013@1, bait-cve-2024-23897@1, exchange-proxyshell-cve-2021-31207@1, exchange-proxyshell-cve-2021-34473@1, exchange-proxyshell-cve-2021-34523@1, gpon-rce-cve-2018-10561@1, gpon-rce-cve-2018-10562@1, laravel-ignition-cve-2021-3129@1, phpunit-eval-stdin-cve-2017-9841@1.
Every published cell requires at least 3 events from at least 2 distinct sources and is delayed by at least 60 minutes. Suppressed values are withheld, never shown as zero. Full methodology and limitations
| Category | Count | Note |
|---|---|---|
| Verified AI | 28 | Share of 2,600 web requests |
| Inferred AI | 0 | Share of 2,600 web requests |
| Suspected AI | 0 | Share of 2,600 web requests |
| Claimed AI (self-declared) | 72 | Share of 2,600 web requests |
| Spoofed AI claim | 209 | Share of 2,600 web requests |
| Unknown | 2,165 | Share of 2,600 web requests |
| Legacy: evidence unavailable | 0 | Share of 2,600 web requests |
| No AI attribution | 126 | Share of 2,600 web requests |
| Attribution | Web requests | All surfaces (count) |
|---|---|---|
| Verified AI | 28 from 2 sources (1.1% of web requests) | See chart table |
| Inferred AI | 0 from 0 sources (0.0% of web requests) (observed zero) | See chart table |
| Suspected AI | 0 from 0 sources (0.0% of web requests) (observed zero) | See chart table |
| Claimed AI (self-declared) | 72 from 2 sources (2.8% of web requests) | See chart table |
| Spoofed AI claim | 209 from 7 sources (8.0% of web requests) | See chart table |
| Unknown | 2,165 from 721 sources (83.3% of web requests) | See chart table |
| Legacy: evidence unavailable | 0 from 0 sources (0.0% of web requests) (observed zero) | See chart table |
| No AI attribution | 126 from 23 sources (4.8% of web requests) | See chart table |
Recognized AI (verified, claimed, or inferred): 100 from 4 sources (3.8% of web requests). Evidenced AI (verified or inferred only): 28 from 2 sources (1.1% of web requests). Unknown stays visible on purpose: absence of evidence is not evidence of a classic actor.
| Unknown cohort |
| probe |
| Withheld: below publication threshold |
| Not in catalog |
| Listed 2021-11-03 |
| 100.0% |
| Not available |
CVE-2021-41773 | Unknown cohort | probe | 5 from 2 sources | Not in catalog | Listed 2021-11-03 | 100.0% | Not available |
CVE-2021-42013 | Unknown cohort | probe | 5 from 2 sources | Not in catalog | Listed 2021-11-03 | 100.0% | Not available |
CVE-2021-42013 | Unknown cohort | probe | 5 from 2 sources | Not in catalog | Listed 2021-11-03 | 100.0% | Not available |
CVE-2024-23897 | Unknown cohort | probe | 3 from 2 sources | Not in catalog | Listed 2024-08-19 | 100.0% | Not available |
| Cohort | Discovery | Probe | Exploit attempt | Credential access attempt | Post-exploit signal |
|---|---|---|---|---|---|
| Verified AI | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) |
| Inferred AI | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) |
| Classic automation | 0 from 0 sources (observed zero) | Withheld: below publication thresholdFewer than 3 events or fewer than 2 distinct sources. | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) |
| Unknown cohort | 0 from 0 sources (observed zero) | 30 from 8 sources | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) | 0 from 0 sources (observed zero) |
| Category | Count | Note |
|---|---|---|
| 2 sessions | 56 | Clusters |
| 3-5 sessions | 28 | Clusters |
| 6-10 sessions | 8 | Clusters |
| 11-25 sessions | 7 | Clusters |
| 26-50 sessions | 3 | Clusters |
| 51+ sessions | 3 | Clusters |
| Category | Count | Note |
|---|---|---|
| Request sequence | 57 | Clusters linked |
| Timing | 0 | Clusters linked |
| Payload similarity | 79 | Clusters linked |
| Transport | Withheld | Below publication threshold |
| Network | 0 | Clusters linked |
| Shared artifact | 0 | Clusters linked |
| Identity | 0 | Clusters linked |
| Bucket | Verified AI | Inferred AI | Suspected AI | Claimed AI (self-declared) | Spoofed AI claim | Unknown | No AI attribution |
|---|---|---|---|---|---|---|---|
| All sessions | 6 | 0 (observed zero) | Withheld: below publication thresholdFewer than 3 in this bucket. | Withheld: below publication thresholdFewer than 3 in this bucket. | 14 | 5,465 | 50 |
| In any cluster | 0 (observed zero) | 0 (observed zero) | 0 (observed zero) | 0 (observed zero) | Withheld: below publication thresholdFewer than 3 in this bucket. | 653 | 5 |
| In consensus campaigns | 0 (observed zero) | 0 (observed zero) | 0 (observed zero) | 0 (observed zero) | 0 (observed zero) | 58 | Withheld: below publication thresholdFewer than 3 in this bucket. |
| In candidates | 0 (observed zero) | 0 (observed zero) | 0 (observed zero) | 0 (observed zero) | Withheld: below publication thresholdFewer than 3 in this bucket. | 595 | 3 |
| Singletons / noise | 6 | 0 (observed zero) | Withheld: below publication thresholdFewer than 3 in this bucket. | Withheld: below publication thresholdFewer than 3 in this bucket. | 12 | 4,812 | 45 |
Stability is the share of bootstrap and adjacent-resolution runs that keep a cluster together: unknown: 0; 0-0.49: 0; 0.50-0.74: withheld; 0.75-0.89: 34; 0.90-1.00: 70. Low or unknown stability is a reason to keep a cluster a candidate, not to promote it.