javascript.lang.security.audit.unsafe-formatstring.unsafe-formatstring

Author
unknown
Download Count*
License
Detected string concatenation with a non-literal variable in a util.format / console.log function. If an attacker injects a format specifier in the string, it will forge the log message. Try to use constant values for the format string.
Run Locally
Run in CI
Defintion
rules:
- id: unsafe-formatstring
message: Detected string concatenation with a non-literal variable in a
util.format / console.log function. If an attacker injects a format
specifier in the string, it will forge the log message. Try to use
constant values for the format string.
metadata:
cwe:
- "CWE-134: Use of Externally-Controlled Format String"
owasp:
- A01:2021 - Broken Access Control
category: security
technology:
- javascript
subcategory:
- audit
likelihood: MEDIUM
impact: LOW
confidence: LOW
references:
- https://cwe.mitre.org/data/definitions/134.html
license: Commons Clause License Condition v1.0[LGPL-2.1-only]
languages:
- javascript
- typescript
severity: INFO
mode: taint
pattern-sources:
- patterns:
- pattern-either:
- pattern: $X + $Y
- pattern: $X.concat($Y)
- pattern: |
`...${...}...`
- pattern-not: |
"..." + "..."
- pattern-not: |
$X.concat("...")
pattern-sinks:
- patterns:
- pattern: $STR
- pattern-either:
- pattern-inside: |
console.$LOG($STR,$PARAM,...)
- patterns:
- pattern-inside: |
$UTIL = require('util')
...
- pattern-inside: |
$UTIL.format($STR,$PARAM,...)
Examples
unsafe-formatstring.js
const util = require('util')
function test1(data) {
const {user, ip} = data
foobar(user)
// ruleid: unsafe-formatstring
console.log("Unauthorized access attempt by " + user, ip);
}
function test2(data) {
const {user, ip} = data
foobar(user)
const logs = `Unauthorized access attempt by ${user}`
// ruleid: unsafe-formatstring
console.log(logs, ip);
}
function test3(data) {
const {user, ip} = data
foobar(user)
const logs = `Unauthorized access attempt by ${user} %d`
// ruleid: unsafe-formatstring
return util.format(logs, ip);
}
function okTest1(data) {
const {user, ip} = data
foobar(user)
const logs = `Unauthorized access attempt by user`
// ok: unsafe-formatstring
console.log(logs, ip);
}
function okTest2(data) {
const {user, ip} = data
foobar(user)
// ok: unsafe-formatstring
console.log("Unauthorized access attempt by " + user);
}
function okTest3(data) {
const {user, ip} = data
foobar(user)
// ok: unsafe-formatstring
return util.format("Unauthorized access attempt by %d", ip);
}
Short Link: https://sg.run/7Y5R