VYPR
High severity7.5NVD Advisory· Published Feb 23, 2016· Updated May 6, 2026

CVE-2016-2537

CVE-2016-2537

Description

The is-my-json-valid package before 2.12.4 for Node.js has an incorrect exports['utc-millisec'] regular expression, which allows remote attackers to cause a denial of service (blocked event loop) via a crafted string.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
is-my-json-validnpm
< 2.12.42.12.4

Affected products

1

Patches

2
b3051b277f7c

Merge pull request #159 from mafintosh/safe-regex

https://github.com/mafintosh/is-my-json-validLinus UnnebäckFeb 14, 2018via ghsa
3 files changed · +49 6
  • formats.js+32 6 modified
    @@ -1,14 +1,40 @@
    -exports['date-time'] = /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}[tT ]\d{2}:\d{2}:\d{2}(\.\d+)?([zZ]|[+-]\d{2}:\d{2})$/
    +var createIpValidator = require('is-my-ip-valid')
    +
    +var reEmailWhitespace = /\s/
    +var reHostnameFirstPass = /^[a-zA-Z0-9.-]+$/
    +var reHostnamePart = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])$/
    +var rePhoneFirstPass = /^\+[0-9][0-9 ]{5,27}[0-9]$/
    +var rePhoneDoubleSpace = / {2}/
    +var rePhoneGlobalSpace = / /g
    +
    +exports['date-time'] = /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}[tT ]\d{2}:\d{2}:\d{2}(?:\.\d+|)([zZ]|[+-]\d{2}:\d{2})$/
     exports['date'] = /^\d{4}-(?:0[0-9]{1}|1[0-2]{1})-[0-9]{2}$/
     exports['time'] = /^\d{2}:\d{2}:\d{2}$/
    -exports['email'] = /^\S+@\S+$/
    -exports['ip-address'] = exports['ipv4'] = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
    -exports['ipv6'] = /^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/
    +exports['email'] = function (input) { return (input.indexOf('@') !== -1) && (!reEmailWhitespace.test(input)) }
    +exports['ip-address'] = exports['ipv4'] = createIpValidator({ version: 4 })
    +exports['ipv6'] = createIpValidator({ version: 6 })
     exports['uri'] = /^[a-zA-Z][a-zA-Z0-9+-.]*:[^\s]*$/
     exports['color'] = /(#?([0-9A-Fa-f]{3,6})\b)|(aqua)|(black)|(blue)|(fuchsia)|(gray)|(green)|(lime)|(maroon)|(navy)|(olive)|(orange)|(purple)|(red)|(silver)|(teal)|(white)|(yellow)|(rgb\(\s*\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\s*,\s*\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\s*,\s*\b([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\b\s*\))|(rgb\(\s*(\d?\d%|100%)+\s*,\s*(\d?\d%|100%)+\s*,\s*(\d?\d%|100%)+\s*\))/
    -exports['hostname'] = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$/
    +exports['hostname'] = function (input) {
    +  if (!(reHostnameFirstPass.test(input))) return false
    +
    +  var parts = input.split('.')
    +
    +  for (var i = 0; i < parts.length; i++) {
    +    if (!(reHostnamePart.test(parts[i]))) return false
    +  }
    +
    +  return true
    +}
     exports['alpha'] = /^[a-zA-Z]+$/
     exports['alphanumeric'] = /^[a-zA-Z0-9]+$/
     exports['style'] = /\s*(.+?):\s*([^;]+);?/g
    -exports['phone'] = /^\+(?:[0-9] ?){6,14}[0-9]$/
    +exports['phone'] = function (input) {
    +  if (!(rePhoneFirstPass.test(input))) return false
    +  if (rePhoneDoubleSpace.test(input)) return false
    +
    +  var digits = input.substring(1).replace(rePhoneGlobalSpace, '').length
    +
    +  return (digits >= 7 && digits <= 15)
    +}
     exports['utc-millisec'] = /^[0-9]{1,15}\.?[0-9]{0,15}$/
    
  • package.json+2 0 modified
    @@ -6,10 +6,12 @@
       "dependencies": {
         "generate-function": "^2.0.0",
         "generate-object-property": "^1.1.0",
    +    "is-my-ip-valid": "^1.0.0",
         "jsonpointer": "^4.0.0",
         "xtend": "^4.0.0"
       },
       "devDependencies": {
    +    "safe-regex": "^1.1.0",
         "tape": "^2.13.4"
       },
       "scripts": {
    
  • test/safe-regex.js+15 0 added
    @@ -0,0 +1,15 @@
    +var tape = require('tape')
    +var safeRegex = require('safe-regex')
    +
    +var formats = require('../formats')
    +
    +tape('safe-regex', function (t) {
    +  var key
    +  for (key in formats) {
    +    if (formats[key] instanceof RegExp) {
    +      t.ok(safeRegex(formats[key]), key + ' should be a safe regex')
    +    }
    +  }
    +
    +  t.end()
    +})
    
eca4beb21e61

fix utc-millisec regex to avoid a ddos attack

https://github.com/mafintosh/is-my-json-validMathias BuusJan 17, 2016via ghsa
1 file changed · +1 1
  • formats.js+1 1 modified
    @@ -11,4 +11,4 @@ exports['alpha'] = /^[a-zA-Z]+$/
     exports['alphanumeric'] = /^[a-zA-Z0-9]+$/
     exports['style'] = /\s*(.+?):\s*([^;]+);?/g
     exports['phone'] = /^\+(?:[0-9] ?){6,14}[0-9]$/
    -exports['utc-millisec'] = /^[0-9]+(\.?[0-9]+)?$/
    +exports['utc-millisec'] = /^[0-9]{1,15}\.?[0-9]{0,15}$/
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

10

News mentions

0

No linked articles in our index yet.