{"id":"CVE-2016-10555","aliases":["EUVD-2018-0779","GHSA-vgrx-w6rg-8fqf"],"status":"published","title":"Forgeable Public/Private Tokens in jwt-simple","description":"Since \"algorithm\" isn't enforced in jwt.decode()in jwt-simple 0.3.0 and earlier, a malicious user could choose what algorithm is sent sent to the server. If the server is expecting RSA but is sent HMAC-SHA with RSA's public key, the server will think the public key is actually an HMAC private key. This could be used to forge any data an attacker wants.","severity":{"version":"3.0","score":6.5,"vector":"CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N","level":"medium","assessor":"primary","from":"nvd"},"epss":{"day":"2026-11-07","score":0.04823,"percentile":0.92033,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":true,"fix_available":true},"cwes":["CWE-20","CWE-310"],"published":"2018-05-31T20:00:00Z","modified":"2026-10-20T10:47:13Z","exploits":[{"source":"pocgithub","id":"CircuitSoul/poc-cve-2016-10555","title":"CircuitSoul/poc-cve-2016-10555","date":"2021-06-14","url":"https://github.com/CircuitSoul/poc-cve-2016-10555"},{"source":"pocgithub","id":"scent2d/PoC-CVE-2016-10555","title":"scent2d/PoC-CVE-2016-10555","date":"2022-01-02","url":"https://github.com/scent2d/PoC-CVE-2016-10555"},{"source":"pocgithub","id":"z-bool/Venom-JWT","title":"z-bool/Venom-JWT","date":"2025-01-27","url":"https://github.com/z-bool/Venom-JWT"}],"fixes":[{"ecosystem":"npm","package":"jwt-simple","fixed_in":["0.3.1"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"npm","package":"jwt-simple","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"0.3.1"}]}]},{"source":"osv","ecosystem":"npm","package":"jwt-simple","ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"0.3.1"}]}]}],"products":[{"vendor":"hackerone","product":"jwt-simple node module"},{"vendor":"jwt-simple_project","product":"jwt-simple"}],"references":[{"url":"https://nodesecurity.io/advisories/87","tags":["x_refsource_MISC","x_transferred","Third Party Advisory","advisory"]},{"url":"https://github.com/hokaccha/node-jwt-simple/pull/14","tags":["x_refsource_MISC","x_transferred","Issue Tracking","Third Party Advisory","report","web"]},{"url":"https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/","tags":["x_refsource_MISC","x_transferred","Broken Link","Third Party Advisory","advisory"]},{"url":"https://github.com/hokaccha/node-jwt-simple/pull/16","tags":["x_refsource_MISC","x_transferred","Issue Tracking","Third Party Advisory","report","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2016-10555","tags":["advisory"]},{"url":"https://github.com/hokaccha/node-jwt-simple/commit/957957cfa44474049b4603b293569588ee9ffd97","tags":["web"]},{"url":"https://www.npmjs.com/advisories/87","tags":["web"]},{"url":"https://github.com/advisories/GHSA-vgrx-w6rg-8fqf"},{"url":"https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries","tags":["web"]}],"sources":{"cve":[{"id":"CVE-2016-10555","description":"Since \"algorithm\" isn't enforced in jwt.decode()in jwt-simple 0.3.0 and earlier, a malicious user could choose what algorithm is sent sent to the server. If the server is expecting RSA but is sent HMAC-SHA with RSA's public key, the server will think the public key is actually an HMAC private key. This could be used to forge any data an attacker wants.","status":"published","published":"2018-05-31T20:00:00Z","modified":"2024-09-16T16:38:09.923Z","cwes":["CWE-20"],"updated_at":"2026-11-02T14:33:31.117878Z"}],"euvd":[{"id":"EUVD-2018-0779","description":"Since \"algorithm\" isn't enforced in jwt.decode()in jwt-simple 0.3.0 and earlier, a malicious user could choose what algorithm is sent sent to the server. If the server is expecting RSA but is sent HMAC-SHA with RSA's public key, the server will think the public key is actually an HMAC private key. This could be used to forge any data an attacker wants.","status":"published","published":"2018-05-31T20:00:00Z","modified":"2024-09-16T16:38:09Z","updated_at":"2026-11-03T00:55:49.526752Z"}],"ghsa":[{"id":"GHSA-vgrx-w6rg-8fqf","title":"Forgeable Public/Private Tokens in jwt-simple","description":"Affected versions of the `jwt-simple` package allow users to select what algorithm the server will use to verify a provided JWT. A malicious actor can use this behaviour to arbitrarily modify the contents of a JWT while still passing verification. For the common use case of the JWT, the end result is a complete authentication bypass with minimal effort.\n\n\n\n## Recommendation\n\nUpdate to version 0.3.1 or later.\n\nAdditionally, be sure to always specify an algorithm in calls to `.decode()`.","status":"published","published":"2018-11-06T23:12:07Z","modified":"2023-01-09T05:03:37Z","cwes":["CWE-20"],"updated_at":"2026-11-02T14:36:05.705235Z"}],"nvd":[{"id":"CVE-2016-10555","description":"Since \"algorithm\" isn't enforced in jwt.decode()in jwt-simple 0.3.0 and earlier, a malicious user could choose what algorithm is sent sent to the server. If the server is expecting RSA but is sent HMAC-SHA with RSA's public key, the server will think the public key is actually an HMAC private key. This could be used to forge any data an attacker wants.","status":"published","published":"2018-05-31T20:29:02.067Z","modified":"2026-06-17T00:39:55.73Z","cvss":[{"version":"3.0","score":6.5,"vector":"CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N","level":"medium","assessor":"primary"},{"version":"2.0","score":4,"vector":"AV:N/AC:L/Au:S/C:N/I:P/A:N","level":"medium","assessor":"primary"}],"cwes":["CWE-20","CWE-310"],"updated_at":"2026-11-02T14:03:39.621168Z"}],"osv":[{"id":"CVE-2016-10555","description":"Since \"algorithm\" isn't enforced in jwt.decode()in jwt-simple 0.3.0 and earlier, a malicious user could choose what algorithm is sent sent to the server. If the server is expecting RSA but is sent HMAC-SHA with RSA's public key, the server will think the public key is actually an HMAC private key. This could be used to forge any data an attacker wants.","status":"published","published":"2018-05-31T20:29:02.067Z","modified":"2026-10-20T10:47:13.524361823Z","cvss":[{"version":"3.0","score":6.5,"vector":"CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N","level":"medium"}],"updated_at":"2026-11-02T15:44:01.531338Z"},{"id":"GHSA-vgrx-w6rg-8fqf","title":"Forgeable Public/Private Tokens in jwt-simple","description":"Affected versions of the `jwt-simple` package allow users to select what algorithm the server will use to verify a provided JWT. A malicious actor can use this behaviour to arbitrarily modify the contents of a JWT while still passing verification. For the common use case of the JWT, the end result is a complete authentication bypass with minimal effort.\n\n\n\n## Recommendation\n\nUpdate to version 0.3.1 or later.\n\nAdditionally, be sure to always specify an algorithm in calls to `.decode()`.","status":"published","published":"2018-11-06T23:12:07Z","modified":"2023-11-08T03:58:12.325695Z","cwes":["CWE-20"],"updated_at":"2026-11-02T15:46:57.348035Z"}]}}
