Bug#26585560 - MYSQL DAEMON SHOULD CREATE ITS PID FILE AS
ROOT DESCRIPTION =========== If the .pid file is created at a world-writable location, it can be compromised by replacing the server's pid with another running server's (or some other non-mysql process) PID causing abnormal behaviour. ANALYSIS ======== In such a case, user should be warned that .pid file is being created at a world-writable location. FIX === A new function is_file_or_dir_world_writable() is defined and it is called in create_pid_file() before .pid file creation. If the location is world-writable, a relevant warning is thrown. NOTE ==== 1. PID file is always created with permission bit 0664, so for outside world its read-only. 2. Ignoring the case when permission is denied to get the dir stats since the .pid file creation would fail anyway in such a case.
This commit is contained in:
parent
8bc828b982
commit
ecc5a07874
@ -107,6 +107,7 @@ void mysql_client_plugin_deinit();
|
|||||||
struct st_mysql_client_plugin;
|
struct st_mysql_client_plugin;
|
||||||
extern struct st_mysql_client_plugin *mysql_client_builtins[];
|
extern struct st_mysql_client_plugin *mysql_client_builtins[];
|
||||||
extern my_bool libmysql_cleartext_plugin_enabled;
|
extern my_bool libmysql_cleartext_plugin_enabled;
|
||||||
|
int is_file_or_dir_world_writable(const char *filepath);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
-- Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved.
|
-- Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
--
|
--
|
||||||
-- This program is free software; you can redistribute it and/or modify
|
-- This program is free software; you can redistribute it and/or modify
|
||||||
-- it under the terms of the GNU General Public License as published by
|
-- it under the terms of the GNU General Public License as published by
|
||||||
@ -209,6 +209,12 @@ INSERT INTO global_suppressions VALUES
|
|||||||
*/
|
*/
|
||||||
("Insecure configuration for --secure-file-priv:*"),
|
("Insecure configuration for --secure-file-priv:*"),
|
||||||
|
|
||||||
|
/*
|
||||||
|
Bug#26585560, warning related to --pid-file
|
||||||
|
*/
|
||||||
|
("Insecure configuration for --pid-file:*"),
|
||||||
|
("Few location(s) are inaccessible while checking PID filepath"),
|
||||||
|
|
||||||
("THE_LAST_SUPPRESSION")||
|
("THE_LAST_SUPPRESSION")||
|
||||||
|
|
||||||
|
|
||||||
|
54
sql-common/my_path_permissions.cc
Normal file
54
sql-common/my_path_permissions.cc
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/* Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; version 2 of the License.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful, but
|
||||||
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
02110-1301, USA */
|
||||||
|
|
||||||
|
#include "my_dir.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
Check if a file/dir is world-writable (only on non-Windows platforms)
|
||||||
|
|
||||||
|
@param [in] Path of the file/dir to be checked
|
||||||
|
|
||||||
|
@returns Status of the file/dir check
|
||||||
|
@retval -2 Permission denied to check attributes of file/dir
|
||||||
|
@retval -1 Error in reading file/dir
|
||||||
|
@retval 0 File/dir is not world-writable
|
||||||
|
@retval 1 File/dir is world-writable
|
||||||
|
*/
|
||||||
|
|
||||||
|
int is_file_or_dir_world_writable(const char *path)
|
||||||
|
{
|
||||||
|
MY_STAT stat_info;
|
||||||
|
(void)path; // avoid unused param warning when built on Windows
|
||||||
|
#ifndef _WIN32
|
||||||
|
if (!my_stat(path, &stat_info, MYF(0)))
|
||||||
|
{
|
||||||
|
return (errno == EACCES) ? -2 : -1;
|
||||||
|
}
|
||||||
|
if ((stat_info.st_mode & S_IWOTH) &&
|
||||||
|
((stat_info.st_mode & S_IFMT) == S_IFREG || /* file */
|
||||||
|
(stat_info.st_mode & S_IFMT) == S_IFDIR)) /* or dir */
|
||||||
|
return 1;
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
@ -78,7 +78,7 @@ SET (SQL_SOURCE
|
|||||||
sql_profile.cc event_parse_data.cc sql_alter.cc
|
sql_profile.cc event_parse_data.cc sql_alter.cc
|
||||||
sql_signal.cc rpl_handler.cc mdl.cc sql_admin.cc
|
sql_signal.cc rpl_handler.cc mdl.cc sql_admin.cc
|
||||||
transaction.cc sys_vars.cc sql_truncate.cc datadict.cc
|
transaction.cc sys_vars.cc sql_truncate.cc datadict.cc
|
||||||
sql_reload.cc
|
sql_reload.cc ../sql-common/my_path_permissions.cc
|
||||||
${GEN_SOURCES}
|
${GEN_SOURCES}
|
||||||
${CONF_SOURCES}
|
${CONF_SOURCES}
|
||||||
${MYSYS_LIBWRAP_SOURCE})
|
${MYSYS_LIBWRAP_SOURCE})
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights
|
/* Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights
|
||||||
reserved.
|
reserved.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
@ -7996,6 +7996,40 @@ static int test_if_case_insensitive(const char *dir_name)
|
|||||||
static void create_pid_file()
|
static void create_pid_file()
|
||||||
{
|
{
|
||||||
File file;
|
File file;
|
||||||
|
bool check_parent_path= 1, is_path_accessible= 1;
|
||||||
|
char pid_filepath[FN_REFLEN], *pos= NULL;
|
||||||
|
/* Copy pid file name to get pid file path */
|
||||||
|
strcpy(pid_filepath, pidfile_name);
|
||||||
|
|
||||||
|
/* Iterate through the entire path to check if even one of the sub-dirs
|
||||||
|
is world-writable */
|
||||||
|
while (check_parent_path && (pos= strrchr(pid_filepath, FN_LIBCHAR))
|
||||||
|
&& (pos != pid_filepath)) /* shouldn't check root */
|
||||||
|
{
|
||||||
|
*pos= '\0'; /* Trim the inner-most dir */
|
||||||
|
switch (is_file_or_dir_world_writable(pid_filepath))
|
||||||
|
{
|
||||||
|
case -2:
|
||||||
|
is_path_accessible= 0;
|
||||||
|
break;
|
||||||
|
case -1:
|
||||||
|
sql_perror("Can't start server: can't check PID filepath");
|
||||||
|
exit(1);
|
||||||
|
case 1:
|
||||||
|
sql_print_warning("Insecure configuration for --pid-file: Location "
|
||||||
|
"'%s' in the path is accessible to all OS users. "
|
||||||
|
"Consider choosing a different directory.",
|
||||||
|
pid_filepath);
|
||||||
|
check_parent_path= 0;
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
continue; /* Keep checking the parent dir */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!is_path_accessible)
|
||||||
|
{
|
||||||
|
sql_print_warning("Few location(s) are inaccessible while checking PID filepath.");
|
||||||
|
}
|
||||||
if ((file= mysql_file_create(key_file_pid, pidfile_name, 0664,
|
if ((file= mysql_file_create(key_file_pid, pidfile_name, 0664,
|
||||||
O_WRONLY | O_TRUNC, MYF(MY_WME))) >= 0)
|
O_WRONLY | O_TRUNC, MYF(MY_WME))) >= 0)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user