CVE-2026-60074

Date::Manip versions through 7.00 for Perl return corrupted dates via non-ASCII decimal digits that pass the numeric range tests in check. The parse regexes capture year, month and day with the `\d` shorthand, which on a character string matches the whole Unicode decimal digit property `\p{Nd}` and not just `[0-9]`. Date::Manip::Base::check then validates the captured fields with numeric comparisons alone (`$y<1 || $y>9999`, `$m<1 || $m>12`, `$d<1 || $d>$days`), and _parse_check stores the numified fields (`$y+0`). Perl truncates a string at the first character that is not an ASCII digit, so a field whose leading characters are ASCII digits numifies to an in-range prefix and satisfies every test: a year field of three ASCII digits followed by U+0664 ARABIC-INDIC DIGIT FOUR numifies to 202, giving the year 0202, and one non-ASCII digit in the month or day field shifts those fields the same way. The hour, minute and second fields match explicit ASCII character classes (`0?[0-9]`, `[0-5][0-9]`) and do not shift, though a non-ASCII digit in a fractional hour or minute field truncates the fraction. Any caller that passes an untrusted character string to ParseDate() or Date::Manip::Date->parse() can get back a date that differs from the string it parsed, with no parse error. Where the parsed date gates logic such as an expiry check or a retention window, the shift goes unnoticed.
Configurations

No configuration.

History

23 Oct 2026, 22:10

Type Values Removed Values Added
Summary
  • (es) Las versiones de Date::Manip hasta la 6.99 para Perl devuelven fechas corruptas a través de dígitos decimales no ASCII que pasan las pruebas de rango numérico en la verificación. Las expresiones regulares de análisis capturan el año, el mes y el día con la abreviatura “\d”, que en una cadena de caracteres coincide con la propiedad completa de dígito decimal Unicode “\p{Nd}” y no solo “[0-9]”. Date::Manip::Base::check luego valida los campos capturados solo con comparaciones numéricas (“$y<1 || $y>9999”, “$m<1 || $m>12”, “$d<1 || $d>$days”), y _parse_check almacena los campos numificados (“$y+0”). Perl trunca una cadena en el primer carácter que no es un dígito ASCII, por lo que un campo cuyos caracteres iniciales son dígitos ASCII se numifica a un prefijo dentro del rango y satisface todas las pruebas: un campo de año de tres dígitos ASCII seguido de U+0664 DÍGITO ARÁBIGO-ÍNDICO CUATRO se numifica a 202, dando el año 0202, y un dígito no ASCII en el campo del mes o del día desplaza esos campos de la misma manera. Los campos de hora, minuto y segundo coinciden con clases de caracteres ASCII explícitas (“0?[0-9]”, “[0-5][0-9]”) y no se desplazan, aunque un dígito no ASCII en un campo de hora o minuto fraccional trunca la fracción. Cualquier llamador que pase una cadena de caracteres no confiable a ParseDate() o Date::Manip::Date -> parse() puede obtener una fecha que difiere de la cadena que analizó, sin error de análisis. Donde la fecha analizada controla la lógica, como una verificación de caducidad o una ventana de retención, el desplazamiento pasa desapercibido.

Information

Published : 2026-07-30 14:17

Updated : 2026-10-23 22:10


NVD link : CVE-2026-60074

Mitre link : CVE-2026-60074

CVE.ORG link : CVE-2026-60074


JSON object : View

Products Affected

No product.

CWE
CWE-1289

Improper Validation of Unsafe Equivalence in Input