Package: phpmyadmin
Version: 4:2.6.2-3sarge5
Severity: critical
Justification: root security hole
Tags: security patch
Since, phpmyadmin is on apache, and apache can be accessed from remote
host, so remote host can access mysql's [EMAIL PROTECTED] via phpmyadmin.
This will break mysql security policy.
I would like to suggest the patch to set default mysql host, by
determining the network interface to which the client is connecting.
* If connecting by http://localhost/phpmyadmin, the mysql host will be
'localhost'.
* If connecting by http://hostname.hostdomain/phpmyadmin, the mysql host
will be 'hostname.hostdomain'.
* If php can't determine client information; for security reason,
'localhost.localdomain' will be set as mysql host. (By default,
'[EMAIL PROTECTED]' will get the same privileges as other
remote root access, '[EMAIL PROTECTED]', in mysql.)
This will make phpmyadmin to be able to serve remote access, while not
breaking security setting in mysql. One can still leave blank password
in mysql's [EMAIL PROTECTED], by not worrying about it can be remotely
accessed.
The attached file is the patch for version 2.6.2-3sarge5 and 2.9.1.1-4.
-- System Information:
Debian Release: testing/unstable
Architecture: i386 (i686)
Kernel: Linux 2.6.10-5-386
Locale: LANG=C, LC_CTYPE=thai
Versions of packages phpmyadmin depends on:
ii apache [httpd] 1.3.31-6ubuntu0.9 Versatile, high-performance HTTP s
ii debconf 1.4.29ubuntu4 Debian configuration management sy
ii php4 4:4.3.8-3ubuntu7.15 A server-side, HTML-embedded scrip
ii php4-cgi 4:4.3.10-10ubuntu4.8 server-side, HTML-embedded scripti
ii php4-mysql 4:4.3.8-3ubuntu7.15 MySQL module for php4
ii ucf 1.07 Update Configuration File: preserv
-- debconf information excluded
diff --exclude='.*.swp' -ur phpmyadmin-2.6.2-3sarge5.orig/config.inc.php phpmyadmin-2.6.2-3sarge5/config.inc.php
--- phpmyadmin-2.6.2-3sarge5.orig/config.inc.php 2007-10-16 11:40:28.613403000 +0700
+++ phpmyadmin-2.6.2-3sarge5/config.inc.php 2007-10-16 15:10:53.231170048 +0700
@@ -64,11 +64,32 @@
/**
* Server(s) configuration
*/
+function non_fake_server_name($server_name) {
+ if (!isset($_SERVER['SERVER_ADDR'])) return false;
+ // HTTP_HOST can be in the format, "host:port"
+ list($server_name) = explode(':', $server_name);
+ foreach (gethostbynamel($server_name) as $ip) {
+ if ($_SERVER['SERVER_ADDR'] == $ip) return true;
+ } return false;
+}
+// By default, '[EMAIL PROTECTED]' will get the same privileges as
+// other remote root access ('[EMAIL PROTECTED]') in mysql.
+// For security reason, assume remote access using 'localhost.localdomain',
+// when client information is missing.
+if (empty($_SERVER)) $client_dependent_localhost = 'localhost.localdomain';
+// Client may fake "Host:" header.
+elseif (isset($_SERVER['SERVER_NAME']) && non_fake_server_name($_SERVER['SERVER_NAME']))
+ $client_dependent_localhost = $_SERVER['SERVER_NAME'];
+elseif (isset($_SERVER['HTTP_HOST']) && non_fake_server_name($_SERVER['HTTP_HOST']))
+ list($client_dependent_localhost) = explode(':', $_SERVER['HTTP_HOST']);
+elseif (isset($_SERVER['SERVER_ADDR']))
+ $client_dependent_localhost = $_SERVER['SERVER_ADDR'];
+else $client_dependent_localhost = 'localhost.localdomain';
$i = 0;
// The $cfg['Servers'] array starts with $cfg['Servers'][1]. Do not use $cfg['Servers'][0].
// You can disable a server config entry by setting host to ''.
$i++;
-$cfg['Servers'][$i]['host'] = 'localhost'; // MySQL hostname or IP address
+$cfg['Servers'][$i]['host'] = $client_dependent_localhost; // MySQL hostname or IP address
$cfg['Servers'][$i]['port'] = ''; // MySQL port - leave blank for default port
$cfg['Servers'][$i]['socket'] = ''; // Path to the socket - leave blank for default socket
$cfg['Servers'][$i]['connect_type'] = 'socket'; // How to connect to MySQL server ('tcp' or 'socket')
diff --exclude='.*.swp' -ur phpmyadmin-2.9.1.1-4.orig/debian/src/config.inc.php phpmyadmin-2.9.1.1-4/debian/src/config.inc.php
--- phpmyadmin-2.9.1.1-4.orig/debian/src/config.inc.php 2007-10-16 10:28:42.024104000 +0700
+++ phpmyadmin-2.9.1.1-4/debian/src/config.inc.php 2007-10-16 15:17:54.682099768 +0700
@@ -7,6 +7,28 @@
// Load secret generated on postinst
include('/etc/phpmyadmin/blowfish_secret.inc.php');
+function non_fake_server_name($server_name) {
+ if (!isset($_SERVER['SERVER_ADDR'])) return false;
+ // HTTP_HOST can be in the format, "host:port"
+ list($server_name) = explode(':', $server_name);
+ foreach (gethostbynamel($server_name) as $ip) {
+ if ($_SERVER['SERVER_ADDR'] == $ip) return true;
+ } return false;
+}
+// By default, '[EMAIL PROTECTED]' will get the same privileges as
+// other remote root access ('[EMAIL PROTECTED]') in mysql.
+// For security reason, assume remote access using 'localhost.localdomain',
+// when client information is missing.
+if (empty($_SERVER)) $client_dependent_localhost = 'localhost.localdomain';
+// Client may fake "Host:" header.
+elseif (isset($_SERVER['SERVER_NAME']) && non_fake_server_name($_SERVER['SERVER_NAME']))
+ $client_dependent_localhost = $_SERVER['SERVER_NAME'];
+elseif (isset($_SERVER['HTTP_HOST']) && non_fake_server_name($_SERVER['HTTP_HOST']))
+ list($client_dependent_localhost) = explode(':', $_SERVER['HTTP_HOST']);
+elseif (isset($_SERVER['SERVER_ADDR']))
+ $client_dependent_localhost = $_SERVER['SERVER_ADDR'];
+else $client_dependent_localhost = 'localhost.localdomain';
+
// Load autoconf local config
include('config/config.inc.php');
@@ -15,7 +37,7 @@
// Set the default server if there is no defined
if (!isset($cfg['Servers'])) {
- $cfg['Servers'][1]['host'] = 'localhost';
+ $cfg['Servers'][1]['host'] = $client_dependent_localhost;
}
// Set the default values for $cfg['Servers'] entries
diff --exclude='.*.swp' -ur phpmyadmin-2.9.1.1-4.orig/debian/var/config.inc.php phpmyadmin-2.9.1.1-4/debian/var/config.inc.php
--- phpmyadmin-2.9.1.1-4.orig/debian/var/config.inc.php 2007-10-16 10:28:42.015106000 +0700
+++ phpmyadmin-2.9.1.1-4/debian/var/config.inc.php 2007-10-16 12:59:04.928414808 +0700
@@ -11,7 +11,7 @@
/* Server localhost (cookie) [1] */
$i++;
-$cfg['Servers'][$i]['host'] = 'localhost';
+$cfg['Servers'][$i]['host'] = $client_dependent_localhost;
$cfg['Servers'][$i]['connect_type'] = 'socket';
$cfg['Servers'][$i]['compress'] = false;
$cfg['Servers'][$i]['auth_type'] = 'cookie';