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.
| Package | Affected versions | Patched versions |
|---|---|---|
is-my-json-validnpm | < 2.12.4 | 2.12.4 |
Affected products
1- cpe:2.3:a:is_my_json_valid_project:is_my_json_valid:*:*:*:*:*:node.js:*:*Range: <=2.12.3
Patches
2b3051b277f7cMerge pull request #159 from mafintosh/safe-regex
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() +})
eca4beb21e61fix utc-millisec regex to avoid a ddos attack
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- github.com/mafintosh/is-my-json-valid/commit/eca4beb21e61877d76fdf6bea771f72f39544d9bnvdPatchWEB
- github.com/advisories/GHSA-f522-ffg8-j8r6ghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2016-2537ghsaADVISORY
- github.com/github/advisory-database/pull/4850ghsaWEB
- github.com/mafintosh/is-my-json-valid/commit/b3051b277f7caa08cd2edc6f74f50aeda65d2976ghsaWEB
- github.com/mafintosh/is-my-json-valid/pull/159ghsaWEB
- hackerone.com/reports/317548ghsaWEB
- www.npmjs.com/advisories/572ghsaWEB
- www.npmjs.com/advisories/76ghsaWEB
- nodesecurity.io/advisories/76nvd
News mentions
0No linked articles in our index yet.