Like a cashier's calculator that reads Arabic-Indic numerals on the price tag and rings up the wrong total
Date::Manip is a venerable Perl date-parsing library (versions through 6.99 affected). Its parse regexes use Perl's \d shorthand, which matches not just [0-9] but the entire Unicode \p{Nd} property — over 660 decimal-digit codepoints from scripts like Arabic-Indic, Devanagari, Thai, etc. When a date string contains these non-ASCII digits, the regex happily captures them, and Date::Manip::Base::check validates the fields with numeric comparisons. Perl's numification silently truncates at the first non-ASCII byte, so a year field like 202٤ (three ASCII digits followed by U+0664) becomes 202, yielding the year 0202. The result is silently corrupted date objects — no error, no exception, just wrong data.
The vendor scored this HIGH 7.5 with an Availability impact vector (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H). This overstates the real-world risk substantially. First, the CVSS vector claims unauthenticated network access, but Date::Manip is a *library* — it has no listening port. Exploitability depends entirely on whether the consuming application passes unsanitized Unicode date strings from network input into Date::Manip, which is a narrow subset of deployments. Second, the impact is data corruption (an integrity problem), not a crash or resource exhaustion that would constitute a true availability impact. Third, Date::Manip is a niche Perl library in a language whose enterprise footprint has been declining for over a decade. The vendor HIGH feels like a reflexive CVSS score that ignores how few real attack paths exist.
4 steps from start to impact.
Identify a Perl application using Date::Manip for user-supplied input
- Target application written in Perl
- Application uses Date::Manip (not DateTime, Time::Piece, or POSIX)
- Application accepts free-text date input from users or API callers
- Perl web applications are a small and shrinking fraction of enterprise deployments
- Many applications use date pickers or constrained input formats that never emit non-ASCII digits
- Applications that do accept free-text dates often validate format upstream of the library
Craft a date string with non-ASCII Unicode decimal digits
\d regex matches it as a valid date pattern, and the leading ASCII prefix of each field numifies to an in-range value. For example, 202٤-0٧-3٠ would parse with year=202, month=0, day=3.- Ability to submit arbitrary Unicode strings to the target application's date field
- The application's transport layer (HTTP, API) must preserve the Unicode codepoints faithfully
- Many web frameworks normalize or reject non-ASCII input in numeric/date fields
- WAFs with Unicode normalization rules may strip or reject these characters
- Content-Type and charset handling may mangle the codepoints before they reach Perl
Date::Manip silently returns corrupted date object
_parse_check stores the numified fields. The application receives a Date::Manip object representing a wildly incorrect date (e.g., year 0202 instead of 2024). Depending on how the application uses this date, outcomes range from incorrect display, wrong scheduling, invalid database records, to application errors if downstream code rejects impossible dates.- Date::Manip version ≤ 6.99
- Applications with downstream date validation (e.g., 'year must be between 2000 and 2100') will catch the corruption
- Database constraints (NOT NULL, CHECK constraints on date columns) may reject the bad data
- The corruption is often visible in output, leading to quick bug reports rather than silent exploitation
Attacker achieves application-level data corruption
- No downstream date validation catches the corrupted value
- The corrupted date is persisted or acted upon by the application
- The blast radius is limited to the single application instance processing the malformed input
- No lateral movement, no privilege escalation, no persistence mechanism
- An attacker who can submit arbitrary Unicode to a web app likely has simpler ways to cause disruption
The supporting signals.
| In-the-wild exploitation | None observed. Not listed in CISA KEV. No reports of active exploitation in any threat intelligence feed. |
|---|---|
| Proof-of-concept | No public PoC. The vulnerability is trivially reproducible by anyone who reads the advisory (just pass a Unicode digit to Date::Manip::Date->new), but no weaponized exploit exists because the impact ceiling is data corruption, not RCE. |
| EPSS score | 0.00387 — bottom ~15th percentile. FIRST's model correctly identifies this as very unlikely to be exploited. |
| KEV status | Not listed. No CISA KEV entry as of 2026-08-03. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H — The AV:N is misleading for a library with no network listener. The A:H is debatable; the real impact is integrity corruption, not service unavailability. |
| Affected versions | Date::Manip all versions through 6.99 (latest release as of 2026-08-03). The bug has existed since the module first used \d in parse regexes. |
| Fixed version | No fix available yet. Version 6.99 (released 2026-03-02) is the latest on CPAN. A fix would require changing \d to [0-9] in all parse regexes. |
| Exposure data | Date::Manip is a CPAN library, not a network service. No Shodan/Censys/GreyNoise footprint. CPAN reverse dependency count is modest — the module is popular in legacy Perl but rare in modern deployments. |
| Disclosure date | 2026-07-30 — disclosed 4 days ago. |
| Reporter | Not publicly attributed in available advisories. Likely found via static analysis of Perl's Unicode handling semantics. |
noisgate verdict.
The single most decisive factor is that Date::Manip is a user-space library with no network listener — the CVSS AV:N is inherited from the consuming application, and the actual exploitable population is limited to the small subset of Perl web applications that pass unsanitized Unicode date strings to this specific library. The impact ceiling is application-level data corruption with no path to code execution, privilege escalation, or lateral movement.
Why this verdict
- Library, not a service: Date::Manip has no network socket. The AV:N in the CVSS vector is aspirational — it assumes a consuming application blindly proxies Unicode input to the library. This alone invalidates the 7.5 base score.
- Impact ceiling is data corruption: The worst outcome is wrong dates in application output or storage. There is no path from corrupted dates to shell access, credential theft, or privilege escalation. The vendor's A:H (Availability:High) is a stretch — this is really I:L (Integrity:Low).
- Tiny exploitable population: Perl's share of enterprise web applications is small and shrinking. Within that set, only applications that (a) use Date::Manip specifically and (b) accept free-text Unicode date input from untrusted sources are vulnerable. This is a fraction of a fraction.
- Role multiplier: Date::Manip is a date-parsing utility library. It does not run on domain controllers, hypervisors, identity providers, backup servers, or network edge devices in any role-defining capacity. Even where Perl scripts run on high-value infrastructure (e.g., monitoring scripts on a DC), the Date::Manip bug yields bad date output, not host compromise. Blast radius: application-local. No floor override applies.
- No exploitation activity: Zero KEV listing, zero in-the-wild reports, EPSS at 0.00387, no public PoC that weaponizes the bug beyond trivial demonstration. The security community has correctly assessed this as uninteresting for attackers.
Why not higher?
The bug is real and the root cause is legitimate (Unicode equivalence bypass in input validation). If Date::Manip were used in a security-critical date comparison — say, certificate expiry validation or access token lifetime checks — corrupted dates could have higher impact. However, no such deployment pattern has been documented, and the library is overwhelmingly used for display formatting and scheduling, not security enforcement.
Why not lower?
The vulnerability does exist, is confirmed, and could cause silent data corruption in applications that hit the specific input conditions. An IGNORE verdict would be inappropriate because a Perl shop that does use Date::Manip for processing external input should still fix it — the corruption is silent and could cause subtle business logic errors that are hard to diagnose.
What to do — in priority order.
- Sanitize date input to ASCII before passing to Date::Manip — Add a one-liner like
$input =~ s/[^\x00-\x7F]//gor validate with/^[0-9\-\/\s:]+$/before calling any Date::Manip parse function. This eliminates the attack surface entirely and takes minutes to deploy. As a LOW-severity finding, there is no noisgate mitigation SLA — treat as backlog hygiene. - Pin or patch Date::Manip locally — If your applications depend on Date::Manip, apply a local patch replacing
\dwith[0-9]in the parse regexes inDate::Manip::Base. This is a ~10-line change. Monitor CPAN for an upstream fix. - Audit Perl applications for Date::Manip usage with external input — Run
grep -r 'Date::Manip' /path/to/appsand identify which applications pass user-controlled strings to parse functions. Prioritize those for the input sanitization fix above.
- WAF rules for Unicode normalization — While some WAFs can normalize Unicode, most don't specifically target Unicode decimal digits in date fields, and the attack payload looks like legitimate multilingual input, not a traditional injection pattern.
- Upgrading Date::Manip — As of 2026-08-03, version 6.99 is the latest release and it is still vulnerable. There is no fixed version to upgrade to yet.
Crowdsourced verification payload.
Run this on any host where Perl and Date::Manip are installed. No special privileges required. Invoke with: bash check_datemanip_cve2026_60074.sh
#!/usr/bin/env bash
# CVE-2026-60074 — Date::Manip Unicode digit corruption check
# Run on any host with Perl installed. No privileges required.
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
# Check if Date::Manip is installed
if ! perl -MDate::Manip -e '1' 2>/dev/null; then
echo "UNKNOWN — Date::Manip is not installed on this host."
exit 2
fi
# Get installed version
VERSION=$(perl -MDate::Manip -e 'print $Date::Manip::VERSION')
echo "Date::Manip version: $VERSION"
# Functional test: feed a Unicode digit and see if it corrupts
RESULT=$(perl -MDate::Manip::Date -e '
use utf8;
my $d = new Date::Manip::Date;
# U+0664 is ARABIC-INDIC DIGIT FOUR
my $err = $d->parse("2026-07-3\x{0664}");
if ($err) {
print "REJECTED";
} else {
my $day = $d->printf("%d");
if ($day eq "34" || $day ne "34" && $day ne "3\x{0664}") {
# Parsed but gave wrong day — vulnerable
print "CORRUPTED:$day";
} else {
print "OK";
}
}
' 2>/dev/null || echo "ERROR")
case "$RESULT" in
REJECTED)
echo "PATCHED — Date::Manip $VERSION rejects non-ASCII decimal digits."
exit 0
;;
CORRUPTED*)
echo "VULNERABLE — Date::Manip $VERSION silently accepted non-ASCII digit and produced corrupted date (day=$RESULT)."
exit 1
;;
OK)
echo "PATCHED — Date::Manip $VERSION handled Unicode digit correctly."
exit 0
;;
ERROR)
echo "UNKNOWN — Could not run the functional test. Check Perl and Date::Manip installation."
exit 2
;;
*)
echo "UNKNOWN — Unexpected result: $RESULT"
exit 2
;;
esacIf you remember one thing.
grep -r 'Date::Manip' across your codebase to identify consumers, then check whether any of them parse user-supplied date strings. For those that do, add ASCII input validation as a one-liner fix. Per the noisgate remediation SLA for LOW findings, there is no mitigation SLA — treat this as backlog hygiene and apply the upstream fix when one ships. Do not let this compete for patching cycles against your actual CRITICAL and HIGH queue. There is no active exploitation and the EPSS confirms near-zero likelihood of weaponization.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.