[rule]
id = "ts-jwt-verify-decode"
languages = ["typescript", "javascript"]
category = "middleware"
confidence = "medium"
description = "JWT token verification or decode (authz decision point)"
query = """
(call_expression
function: (member_expression
object: (identifier) @obj
property: (property_identifier) @method)
arguments: (arguments
(_) @arg)
) @match
"""
[rule.predicates.obj]
match = "(?i)^(jwt|jsonwebtoken|jose|token|auth)$"
[rule.predicates.method]
match = "^(verify|decode)$"
[[rule.tests]]
input = """
const decoded = jwt.verify(token, secret);
"""
expect_match = true
[[rule.tests]]
input = """
const claims = jsonwebtoken.decode(token);
"""
expect_match = true
[[rule.tests]]
input = """
const token = jwt.sign({ sub: userId }, secret);
"""
expect_match = false
[[rule.tests]]
input = """
signer.sign(httpRequest);
"""
expect_match = false
[[rule.tests]]
input = """
decoder.decode(value, { stream: true });
"""
expect_match = false