---
id: "CVE-2026-112921"
kind: "vulnerability"
aliases: ["CVE-2026-112921"]
title: "Perl Robots::Validate: stale matcher state flags real visitors as fake robots"
severity: "unknown"
cvss: null
epss: 0.00229
exploited: false
status: "open"
category: "package"
products: []
ecosystems: []
tags: ["package", "perl", "robots-validate", "self-hosted"]
not_affected_if: ["module-not-used", "version-0.4.10-or-later"]
published_at: "2026-10-21T22:16:48+00:00"
first_seen_at: "2026-10-23T21:57:29+00:00"
updated_at: "2026-10-25T05:02:00+00:00"
sources: [{"source": "nvd", "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-112921", "first_seen_at": "2026-10-23T21:57:29+00:00"}, {"source": "epss", "url": "https://api.first.org/data/v1/epss?cve=CVE-2026-112921", "first_seen_at": "2026-10-24T13:15:54+00:00"}]
---

# Perl Robots::Validate: stale matcher state flags real visitors as fake robots

Robots::Validate for Perl keeps Aho-Corasick matcher state between User-Agent checks on the same object. A crafted User-Agent can leave that state half-matched so the next visitor's User-Agent is wrongly treated as an impostor robot and blocked.

_Summary, check and fix written by a model from the sources; labelled as such._

## How to check

- Check the installed version of the Perl Robots::Validate module, for example `perl -MRobots::Validate -e 'print $Robots::Validate::VERSION'`
- Check whether Algorithm::AhoCorasick::XS is installed, which the sources say does not avoid the flaw

## Fix

- Upgrade Robots::Validate to `0.4.10` or later
- The sources do not name another workaround

## Timeline

- 2026-10-23T21:57:29+00:00 nvd https://nvd.nist.gov/vuln/detail/CVE-2026-112921
- 2026-10-24T13:15:54+00:00 epss https://api.first.org/data/v1/epss?cve=CVE-2026-112921

## From the sources

Robots::Validate versions from 0.4.3 before 0.4.10 for Perl report clients as imposter robots when User-Agent matcher state carries over from a previous request.

Each Robots::Validate object holds one pure-Perl Aho-Corasick search machine and feeds every User-Agent into it without resetting its state. A User-Agent that ends part-way through a robot name leaves the machine mid-match, so the next User-Agent checked by the same object can complete that name. That client's address is then checked against the robot's DNS rule, which it fails.

A remote client can use this to make a site that blocks bad robots block other visitors where the prefix User-Agent string is a suffix of a robot being validated.

Note that deployments with Algorithm::AhoCorasick::XS are also affected, since it was unused due to a different bug.

---

_Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai_
