ReDoS
A regular expression denial of service (ReDoS) is an algorithmic complexity attack that produces a denial-of-service by providing a regular expression and/or an input that takes a long time to evaluate. The attack exploits the fact that many regular expression implementations have super-linear worst-case complexity; on certain regex-input pairs, the time taken can grow polynomially or exponentially in relation to the input size. An attacker can thus cause a program to spend substantial time by providing a specially crafted regular expression and/or input. The program will then slow down or becoming unresponsive. Description. Regular  expression ("regex") matching can be done by building a finite-state automaton. Regex can be easily converted to nondeterministic automata (NFAs), in which for each state and input symbol, there may be several possible next states. After building the automaton, several possibilities exist: Of the above algorithms, the first two are problematic. The first is problematic because a deterministic automaton could have up to formula_1 states where formula_2 is the number of states in the nondeterministic automaton; thus, the conversion from NFA to DFA may take exponential time. The second is problematic because a nondeterministic automaton could have an exponential  number of paths of length formula_3, so that walking through an input of length formula_3 will also take exponential time. The last two algorithms, however, do not exhibit pathological behavior. Note that for non-pathological regular expressions, the problematic algorithms are usually fast, and in practice, one can expect them to "compile" a regex in O(m) time and match it in O(n) time; instead, simulation of an NFA and lazy computation of the DFA have O(mn) worst-case complexity. Regex denial of service occurs when these expectations are applied to a regex provided by the user, and malicious regular expressions  provided by the user trigger the worst-case complexity of the regex matcher. While regex algorithms can be written in an efficient way, most regex engines in existence extend the regex languages with additional constructs that cannot always be solved efficiently. Such extended patterns essentially force the implementation of regex in most programming languages to use backtracking. Examples. Exponential backtracking. The most severe type of problem happens with backtracking regular expression matches, where some patterns have a runtime that is exponential in the length of the input string. For strings of formula_3 characters, the runtime is formula_6. This happens  when a regular expression has three properties: The second condition is best explained with two examples: In both of these examples we used codice_10 to match the end of the string, satisfying the third condition, but it is also possible to use another character for this. For example codice_11 has the same problematic structure. All three of the above regular expressions will exhibit exponential runtime when applied to strings of the form formula_7. For example, if you try to match them against codice_12 on a backtracking expression engine, it will take a significantly long time to complete, and the runtime  will approximately double for each extra codice_5 before the codice_14. It is also possible to have backtracking which is polynomial time formula_8, instead of exponential. This can also cause problems for long enough inputs, though less attention has been paid to this problem as malicious input must be much longer to have a significant effect. An example of such a pattern is "codice_15", when the input is an arbitrarily long sequence of "codice_5"s. Vulnerable regexes in online repositories. So-called "evil" or vulnerable regexes have been found in online regular expression repositories. Note that it is enough to find a  vulnerable "sub"expression in order to attack the full regex: These two examples are also susceptible to the input codice_12. Attacks. If the regex itself is affected by user input, such as a web service permitting clients to provide a search pattern, then an attacker can inject a malicious regex to consume the server's resources. Therefore, in most cases, regular expression denial of service can be avoided by removing the possibility for the user to execute arbitrary patterns on the server. In this case, web applications and databases are the main vulnerable applications. Alternatively, a malicious page could hang the  user's web browser or cause it to use arbitrary amounts of memory. However, if a vulnerable regex exists on the server-side already, then an attacker may instead be able to provide an input that triggers its worst-case behavior. In this case, e-mail scanners and intrusion detection systems could also be vulnerable. Fortunately, in most cases, the problematic regular expressions can be rewritten as "non-evil" patterns. For example, codice_20 can be rewritten to codice_21. In the case of a web application, the programmer may use the same regular expression to validate input on both the client  and the server side of the system. An attacker could inspect the client code, looking for evil regular expressions, and send crafted input directly to the web server in order to hang it.