RUS-CERT Advisory 2001-08:01 – Vulnerabilities in several Apache authentication modulesRUS-CERT has discovered that several Apache authentication modules which use SQL databases to store authentication information are vulnerable to a remote SQL code injection attack.
Any Apache server using database-based authentication with the following modules:
AuthPG1.2b2 by Min S. Kim (also known as
mod_auth_mysql1.9 by Vivek Khera
mod_auth_oracle0.5.1 by Serg Oskin
mod_auth_pgsql0.9.5 and 0.9.6 by Guiseppe Tanzilli and Matthias Eckermann
mod_auth_pgsql_sys0.9.4 (by the same authors, modifications by Victor Glushchenko)
It is possible that other authentication modules not listed above are affected.
Systems Not Affected
RUS-CERT has examined the following authentication modules and verified that an Apache server using these modules is not vulnerable to the problem described in this document:
mod_auth_mysql2.20 by Zeev Suraski
mod_auth_ora71.0 by Ben Reser
mod_auth_ora81.0 by Ben Reser
HTTP requests sent to the Apache server using the vulnerable authentication modules.
In the case of the PostgreSQL modules, an attack can execute arbitrary SQL statements or cause the database query for the password to return arbitrary data. As a result, unauthorized access to the web server is possible.
With the Oracle module, the attacker can call stored procedures and cause the database query for the password to return arbitrary data. The impact with MySQL is currently unclear, but with the advent of stored procedures, harmful side effects might become possible as well.
SQL code insertion attack
During the authentication process, the password hash has to be looked up in the database, so a SQL
SELECT statement has to be built. In the vulnerable modules, this is done using code equivalent to the following pseudocode:
Query := Sprintf ("SELECT %s FROM %s WHERE %s = '%s'", Password_Column, User_Table, User_Column, User);
Later on, the retrieved password hash is compared with the one supplied by the user trying to authenticate.
However, the value of
User has been received over the network. Suppose an attacker choses the string (note the single quotation mark at the beginning):
'; SELECT 'wA8aGH92dPQnIDD
Now the resulting string contains two SQL statements:
SELECT password_column FROM user_table WHERE user_column = ''; SELECT 'wA8aGH92dPQnIDD'
libpq client library will transmit both statements to the PostgreSQL server. The server will execute both statements and return the result of the second to the client. This way, an attacker can make it appear to the authentication code that the database contains the proper hash for the password it just has provided.
Other forms of attacks are possible by issuing
DELETE statements in essentially the same manner, of course.
In the MySQL and Oracle cases, the impact of the vulnerability is different. Oracle does not seem to allow multiple SQL statements per query, but using a
UNION clause to add additional data seems to be possible, so the attack given above can be duplicated. In addition, stored procedures can be called, with a potential for harmful side effects. We were unable to obtain a definite answer if the vulnerability is exploitable if a MySQL database is used, since MySQL neither supports
UNION clauses nor stored procedures.
We believe that the fact that the essentially the same vulnerability is present in many PostgreSQL applications (see also RUS-CERT Advisory 2001-09:01) is related to the lack of a suitable string quoting function in the PostgreSQL client library (and not just to code reuse and overlap among the authors).
Therefore, we propose to include a function into the PostgreSQL client library
libpq which escapes characters treated specially by PostgreSQL, replacing them with safe character sequences.
Some of the fixed versions below already implement this suggestion.
libpq now provides a suitable function for quoting too.
MySQL and Oracle
Both the MySQL and Oracle client libraries provide a suitable function for quoting strings in SQL queries. The authentication modules which are not vulnerable (see above) use them, so we propose to use these modules, or the fixed versions below.
Several authors have already reacted and released new versions:
AuthPG1.3 by Min S. Kim
mod_auth_mysql1.10 by Vivek Khera
mod_auth_pgsql0.9.9 by Guiseppe Tanzilli
Serg Oskin has announced a fixed version as well.
RUS-CERT contacted the authors of the vulnerable authentication modules on 2001-08-23.
RUS-CERT is the Computer Emergency Response Team located at the Computing Center (RUS) of the University of Stuttgart, Germany.
2001-09-04: Patch for PostgreSQL’s libpq updated.
mod_auth_pgsql 0.9.6 is still vulnerable.