Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: colorizing code

...

Java's

...

regular

...

expression

...

facilities

...

are

...

wide

...

ranging

...

and

...

powerful

...

which

...

can

...

lead

...

to

...

unwanted

...

modification

...

of

...

the

...

original

...

regular

...

expression

...

string

...

to

...

form

...

a

...

pattern

...

that

...

matches

...

too

...

widely,

...

possibly

...

resulting

...

in

...

far

...

too

...

much

...

information

...

being

...

matched.

...

The

...

primary

...

means

...

of

...

preventing

...

this

...

vulnerability

...

is

...

to

...

sanitize

...

a

...

regular

...

expression

...

string

...

coming

...

from

...

untrusted

...

input.

...

Additionally,

...

the

...

programmer

...

should

...

look

...

into

...

ways

...

of

...

avoiding

...

using

...

regular

...

expressions

...

from

...

untrusted

...

input,

...

or

...

perhaps

...

provide

...

only

...

a

...

very

...

limited

...

subset

...

of

...

regular

...

expression

...

functionality

...

to

...

the

...

user

...

Constructs

...

and

...

properties

...

of

...

Java

...

regular

...

expressions

...

to

...

watch

...

out

...

for

...

include:

...

  • match

...

  • flags

...

  • used

...

  • in

...

  • non-capturing

...

  • groups

...

  • (These

...

  • override

...

  • matching

...

  • options

...

  • that

...

  • may

...

  • or

...

  • may

...

  • not

...

  • have

...

  • been

...

  • passed

...

  • into

...

  • the

...

  • compile()

...

  • method.
  • Greediness

Since Java regular expressions are similar to Perl, it is a good idea to apply lessons learned from Perl regex.

Noncompliant Code Example

This class does not sanitize the incoming regular expression, and as a result, exposes too much information to the user.

This program searches a database of users for usernames that match a regular expression.

No Format

* Greediness

Since Java regular expressions are similar to Perl, it is a good idea to apply lessons learned from Perl regex.


h2. Noncompliant Code Example

This class does not sanitize the incoming regular expression, and as a result, exposes too much information to the user.

This program searches a database of users for usernames that match a regular expression.

{noformat}
A non-malicious example would be to search for 'John.*'. A malicious example would be to search for '(?s)John.*'
{noformat}


{code:bgColor=#FFCCCC}
{code}
Code Block
bgColor#FFCCCC

import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Set;
import java.util.HashSet;

public class ForumUserMan
{
       private final String userCSV = "JohnPaul,HearsGodsVoice\nJohnJackson,OlympicBobsleder\nJohnMayer,MakesBadMusic\n";

   &nbsp;&nbsp;&nbsp; public Set<String> searchUser(String name)
   &nbsp;&nbsp;&nbsp; {
        Set<String> matchedUsers = new HashSet<String>();

        String regex = name + ","; //supposedly this forces the regex to only match names
        Pattern p = Pattern.compile(regex, 0);
        Matcher m = p.matcher(userCSV);

        while (m.find())
            matchedUsers.add(m.group());

        return matchedUsers;
    }
}
{code}

When

...

searching

...

using

...

the

...

regex

...

'(?s)John.*',

...

the

...

program

...

returns

...

all

...

the

...

users'

...

passwords.

...

The

...

(?s)

...

turns

...

on

...

single-line

...

matching

...

support,

...

which

...

means

...

new

...

lines

...

are

...

ignored.

...

Compliant

...

Solution

...

It

...

is

...

very

...

difficult

...

to

...

filter

...

out

...

overly

...

permissive

...

regular

...

expressions.

...

It

...

might

...

be

...

easier

...

and

...

more

...

secure

...

to

...

rewrite

...

the

...

application

...

to

...

limit

...

the

...

usage

...

of

...

regular

...

expressions.

...

For

...

the

...

above

...

code

...

sample,

...

the

...

easy

...

solution

...

is

...

to

...

parse

...

the

...

CSV

...

into

...

a

...

class

...

and

...

limit

...

the

...

regular

...

expression

...

over

...

the

...

name

...

field

...

of

...

the

...

User

...

class.

{:=
Code Block
bgColor
#ccccff
}
{code}
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.HashMap;

/\* Usage Test2 <regex>
 &nbsp;\* Regex is used directly without santization causing sensitive data to be exposed
 &nbsp;\*
 &nbsp;\* Imagine this program searches a database of users for usernames that match a regex
 &nbsp;\* Non malicious usage: Test1 John.\*
 &nbsp;\* Malicious usage: (?s)John.\*
 &nbsp;*/
public class Test2
{
    public&nbsp;&nbsp; &nbsp;public static class User
    {
        String&nbsp;&nbsp; &nbsp;{
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String name, password;
        public&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public User(String name, String password)
        &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;{
            setName(name);
            setPassword(password);
        }
        private&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;private void setName(String n) { name = n; }
        private&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;private void setPassword(String pw) { password = pw; }
        public&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;public String getName() { return name; }
    &nbsp;&nbsp; &nbsp;}

    public&nbsp;&nbsp; &nbsp;public static void main(String\[\] args)
    {
        if&nbsp;&nbsp; &nbsp;{
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (args.length < 1) {
            System.err.println("Failed to specify a regex");
            return;
        }

        String&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String sensitiveData; //represents sensitive data from a file or something
        int&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;int flags;
        String&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String regex;
        Pattern&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Pattern p;
        Matcher&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Matcher m;
        HashMap<String&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;HashMap<String, User> userMap = new HashMap<String, User>();

        &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;//imagine a CSV style database: user,password
        sensitiveData&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;sensitiveData = "JohnPaul,HearsGodsVoice\nJohnJackson,OlympicBobsleder\nJohnMayer,MakesBadMusic\n";
        String[&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;String\[\] csvUsers = sensitiveData.split("\n");
        for&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (String csvUser : csvUsers) {
            String[] csvUserSplit = csvUser.split(",");
            String name = csvUserSplit[0];
            String pw = csvUserSplit[1];
            User u = new User(name, pw);
            userMap.put(name, u);
        }


        regex&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;regex = args[0];
        flags&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;flags = 0;

        System&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.out.println("Pattern: \'" + regex + "\'");
        p&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;p = Pattern.compile(regex, flags);


        for&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;for (String u : userMap.keySet()) {
            m = p.matcher(u);
            while (m.find())
                System.out.println("Found \'" + m.group() + "\'");
        }
        System&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;System.err.println("DONE");
    &nbsp;&nbsp; &nbsp;}
}
{code}


h2. Risk Assessment

|| Rule || Severity \\ || Liklihood \\ || Remediation Cost \\ || Priority \\ || Level \\ ||
| IDS18-J \\ | medium \\ | unlikely \\ | high \\ | | |


h2. References

[CWE ID 625|http://cwe.mitre.org/data/definitions/625.html] Permissive Regular Expressions

Code Block

Risk Assessment

Rule

Severity

Liklihood

Remediation Cost

Priority

Level

IDS18-J

medium

unlikely

high

 

 

References

CWE ID 625 Permissive Regular Expressions

Wiki Markup
\[CVE-2005-1949\|[http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2005-1949|http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2005-1949]\] Arbitrary command execution in ePing plugin for e107 portal due to an overly permissive regular expression parsing an IP