Base · Medium

CWE-625: Permissive Regular Expression

The product uses a regular expression that does not sufficiently restrict the set of allowed values.

CWE-625 · Base Level ·8 CVEs ·1 Mitigations

Description

The product uses a regular expression that does not sufficiently restrict the set of allowed values.

This effectively causes the regexp to accept substrings that match the pattern, which produces a partial comparison to the target. In some cases, this can lead to other weaknesses. Common errors include:

Potential Impact

Access Control

Bypass Protection Mechanism

Demonstrative Examples

The following code takes phone numbers as input, and uses a regular expression to reject invalid phone numbers.
Bad
$phone = GetPhoneNumber();if ($phone =~ /\d+-\d+/) {
                           # looks like it only has hyphens and digits
                           system("lookup-phone $phone");}
                     else {error("malformed number!");}
An attacker could provide an argument such as: "; ls -l ; echo 123-456" This would pass the check, since "123-456" is sufficient to match the "\d+-\d+" portion of the regular expression.
This code uses a regular expression to validate an IP string prior to using it in a call to the "ping" command.
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)
Since the regular expression does not have anchors (CWE-777), i.e. is unbounded without ^ or $ characters, then prepending a 0 or 0x to the beginning of the IP address will still result in a matched regex pattern. Since the ping command supports octal and hex prepended IP addresses, it will use the unexpectedly valid IP address (CWE-1389). For example, "0x63.63.63.63" would be considered equivalent to "99.63.63.63". As a result, the attacker could potentially ping systems that the attacker cannot reach directly.

Mitigations & Prevention

Implementation

When applicable, ensure that the regular expression marks beginning and ending string patterns, such as "/^string$/" for Perl.

Detection Methods

  • Automated Static Analysis High — Automated static analysis, commonly referred to as Static Application Security Testing (SAST), can find some instances of this weakness by analyzing source code (or binary/compiled code) without having to execute it. Typically, this is done by building a model of data flow and control flow, then sea

Real-World CVE Examples

CVE IDDescription
CVE-2021-22204Chain: regex in EXIF processor code does not correctly determine where a string ends (CWE-625), enabling eval injection (CWE-95), as exploited in the wild per CISA KEV.
CVE-2006-1895".*" regexp leads to static code injection
CVE-2002-2175insertion of username into regexp results in partial comparison, causing wrong database entry to be updated when one username is a substring of another.
CVE-2006-4527regexp intended to verify that all characters are legal, only checks that at least one is legal, enabling file inclusion.
CVE-2005-1949Regexp for IP address isn't anchored at the end, allowing appending of shell metacharacters.
CVE-2002-2109Regexp isn't "anchored" to the beginning or end, which allows spoofed values that have trusted values as substrings.
CVE-2006-6511regexp in .htaccess file allows access of files whose names contain certain substrings
CVE-2006-6629allow load of macro files whose names contain certain substrings.

Taxonomy Mappings

  • The CERT Oracle Secure Coding Standard for Java (2011): IDS08-J — Sanitize untrusted data passed to a regex

Frequently Asked Questions

What is CWE-625?

CWE-625 (Permissive Regular Expression) is a software weakness identified by MITRE's Common Weakness Enumeration. It is classified as a Base-level weakness. The product uses a regular expression that does not sufficiently restrict the set of allowed values.

How can CWE-625 be exploited?

Attackers can exploit CWE-625 (Permissive Regular Expression) to bypass protection mechanism. This weakness is typically introduced during the Implementation phase of software development.

How do I prevent CWE-625?

Key mitigations include: When applicable, ensure that the regular expression marks beginning and ending string patterns, such as "/^string$/" for Perl.

What is the severity of CWE-625?

CWE-625 is classified as a Base-level weakness (Medium abstraction). It has been observed in 8 real-world CVEs.