1637
Potential Mitigations
Phase: Implementation
Be sure to understand both what will be matched and what will not be matched by a regular
expression. Anchoring the ends of the expression will allow the programmer to define an
allowlist strictly limited to what is matched by the text in the regular expression. If you are using
a package that only matches one line by default, ensure that you can match multi-line inputs if
necessary.
Demonstrative Examples
Example 1:
Consider a web application that supports multiple languages. It selects messages for an
appropriate language by using the lang parameter.
Example Language: PHP (Bad)
$dir = "/home/cwe/languages";
$lang = $_GET['lang'];
if (preg_match("/[A-Za-z0-9]+/", $lang)) {
include("$dir/$lang");
}
else {
echo "You shall not pass!\n";
}
The previous code attempts to match only alphanumeric values so that language values such as
"english" and "french" are valid while also protecting against path traversal, CWE-22. However,
the regular expression anchors are omitted, so any text containing at least one alphanumeric
character will now pass the validation step. For example, the attack string below will match the
regular expression.
Example Language: (Attack)
../../etc/passwd
If the attacker can inject code sequences into a file, such as the web server's HTTP request log,
then the attacker may be able to redirect the lang parameter to the log file and execute arbitrary
code.
Example 2:
This code uses a regular expression to validate an IP string prior to using it in a call to the "ping"
command.
Example Language: Python (Bad)
import subprocess
import re
def validate_ip_regex(ip: str):
ip_validator = re.compile(r"((25[0-5]|(2[0-4]|1\d|[1-9]|)\d)\.?\b){4}")
if ip_validator.match(ip):
return ip
else:
raise ValueError("IP address does not match valid pattern.")
def run_ping_regex(ip: str):
validated = validate_ip_regex(ip)
# The ping command treats zero-prepended IP addresses as octal
result = subprocess.call(["ping", validated])
print(result)
CWE Version 4.14
CWE-778: Insufficient Logging
CWE-778: Insufficient Logging