@@ -241,4 +241,71 @@ pub const PATTERNS: &[Pattern] = &[
241241 category : PatternCategory :: InsecureConfig ,
242242 confidence : Confidence :: High ,
243243 } ,
244+ // ── Tier A: TLS verification disabled ─────────────────────────────
245+ Pattern {
246+ id : "js.config.reject_unauthorized" ,
247+ description : "TLS certificate verification disabled via rejectUnauthorized: false" ,
248+ query : r#"(pair
249+ key: (property_identifier) @key (#eq? @key "rejectUnauthorized")
250+ value: (false) @val)
251+ @vuln"# ,
252+ severity : Severity :: Medium ,
253+ tier : PatternTier :: A ,
254+ category : PatternCategory :: InsecureConfig ,
255+ confidence : Confidence :: High ,
256+ } ,
257+ // ── Tier A: Hardcoded fallback secret ──────────────────────────────
258+ Pattern {
259+ id : "js.secrets.fallback_secret" ,
260+ description : "Environment variable with secret-like name has hardcoded fallback value" ,
261+ query : r#"(binary_expression
262+ left: (member_expression
263+ object: (member_expression
264+ object: (identifier) @proc (#eq? @proc "process")
265+ property: (property_identifier) @env (#eq? @env "env"))
266+ property: (property_identifier) @key
267+ (#match? @key "(?i)(secret|password|key|token)"))
268+ operator: "||"
269+ right: (string) @fallback)
270+ @vuln"# ,
271+ severity : Severity :: Medium ,
272+ tier : PatternTier :: A ,
273+ category : PatternCategory :: Secrets ,
274+ confidence : Confidence :: Medium ,
275+ } ,
276+ // ── Tier A: Verbose error response ────────────────────────────────
277+ Pattern {
278+ id : "js.config.verbose_error_response" ,
279+ description : "Error object passed to response renderer — may leak stack traces to users" ,
280+ query : r#"(call_expression
281+ function: (member_expression
282+ property: (property_identifier) @method
283+ (#match? @method "^(render|send|json)$"))
284+ arguments: (arguments
285+ (_)
286+ (object
287+ (shorthand_property_identifier) @prop
288+ (#eq? @prop "error"))))
289+ @vuln"# ,
290+ severity : Severity :: Medium ,
291+ tier : PatternTier :: A ,
292+ category : PatternCategory :: InsecureConfig ,
293+ confidence : Confidence :: Medium ,
294+ } ,
295+ // ── Tier B: CORS dynamic origin reflection ────────────────────────
296+ Pattern {
297+ id : "js.config.cors_dynamic_origin" ,
298+ description : "CORS Access-Control-Allow-Origin set to dynamic value — may reflect arbitrary origins" ,
299+ query : r#"(call_expression
300+ function: (member_expression
301+ property: (property_identifier) @method (#eq? @method "setHeader"))
302+ arguments: (arguments
303+ (string) @header_name (#match? @header_name "Access-Control-Allow-Origin")
304+ . (identifier) @value))
305+ @vuln"# ,
306+ severity : Severity :: High ,
307+ tier : PatternTier :: A ,
308+ category : PatternCategory :: InsecureConfig ,
309+ confidence : Confidence :: Medium ,
310+ } ,
244311] ;
0 commit comments