summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/mpm_common.h4
-rw-r--r--modules/arch/unix/mod_unixd.c7
-rw-r--r--server/core.c17
-rw-r--r--server/mpm/experimental/event/event.c2
-rw-r--r--server/mpm/prefork/prefork.c2
-rw-r--r--server/mpm/simple/simple_api.c8
-rw-r--r--server/mpm/simple/simple_api.h43
-rw-r--r--server/mpm/simple/simple_run.c8
-rw-r--r--server/mpm/worker/worker.c2
-rw-r--r--server/mpm_common.c6
10 files changed, 35 insertions, 64 deletions
diff --git a/include/mpm_common.h b/include/mpm_common.h
index 27bca5da7b..91bb1902e7 100644
--- a/include/mpm_common.h
+++ b/include/mpm_common.h
@@ -364,6 +364,10 @@ extern const char *ap_mpm_set_exception_hook(cmd_parms *cmd, void *dummy,
AP_DECLARE_HOOK(int,monitor,(apr_pool_t *p))
+/* register modules that undertake to manage system security */
+extern int sys_privileges;
+AP_DECLARE_HOOK(int, drop_privileges, (apr_pool_t * pchild, server_rec * s))
+
#ifdef __cplusplus
}
#endif
diff --git a/modules/arch/unix/mod_unixd.c b/modules/arch/unix/mod_unixd.c
index 5d9ee5e054..1a443f023f 100644
--- a/modules/arch/unix/mod_unixd.c
+++ b/modules/arch/unix/mod_unixd.c
@@ -49,8 +49,6 @@
#include <sys/prctl.h>
#endif
-#include "simple_api.h"
-
#ifndef DEFAULT_USER
#define DEFAULT_USER "#-1"
#endif
@@ -281,6 +279,7 @@ unixd_pre_config(apr_pool_t *pconf, apr_pool_t *plog,
unixd_config.chroot_dir = NULL; /* none */
+ ++sys_privileges;
return OK;
}
@@ -289,8 +288,8 @@ static void unixd_hooks(apr_pool_t *pool)
ap_hook_pre_config(unixd_pre_config,
NULL, NULL, APR_HOOK_FIRST);
- ap_hook_simple_drop_privileges(unixd_drop_privileges,
- NULL, NULL, APR_HOOK_FIRST);
+ ap_hook_drop_privileges(unixd_drop_privileges,
+ NULL, NULL, APR_HOOK_FIRST);
}
static const command_rec unixd_cmds[] = {
diff --git a/server/core.c b/server/core.c
index 79067fedbd..c47fa5b534 100644
--- a/server/core.c
+++ b/server/core.c
@@ -3884,6 +3884,22 @@ static int core_pre_connection(conn_rec *c, void *csd)
return DONE;
}
+/* Insist that at least one module will undertake to provide system
+ * security by dropping startup privileges.
+ */
+AP_DECLARE(int) sys_privileges = 0;
+static int core_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp)
+{
+ if (!sys_privileges) {
+ ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL,
+ "Server MUST relinquish startup privileges before "
+ "accepting connections. Please ensure mod_unixd "
+ "or other system security module is loaded.");
+ return !OK;
+ }
+ return OK;
+}
+
static void register_hooks(apr_pool_t *p)
{
/* create_connection and install_transport_filters are
@@ -3896,6 +3912,7 @@ static void register_hooks(apr_pool_t *p)
ap_hook_pre_connection(core_pre_connection, NULL, NULL,
APR_HOOK_REALLY_LAST);
+ ap_hook_pre_config(core_pre_config,NULL,NULL,APR_HOOK_LAST);
ap_hook_post_config(core_post_config,NULL,NULL,APR_HOOK_REALLY_FIRST);
ap_hook_translate_name(ap_core_translate,NULL,NULL,APR_HOOK_REALLY_LAST);
ap_hook_map_to_storage(core_map_to_storage,NULL,NULL,APR_HOOK_REALLY_LAST);
diff --git a/server/mpm/experimental/event/event.c b/server/mpm/experimental/event/event.c
index 3aa10e686a..bef7b85e39 100644
--- a/server/mpm/experimental/event/event.c
+++ b/server/mpm/experimental/event/event.c
@@ -1575,7 +1575,7 @@ static void child_main(int child_num_arg)
/*stuff to do before we switch id's, so we have permissions. */
ap_reopen_scoreboard(pchild, NULL, 0);
- if (unixd_setup_child()) {
+ if (ap_run_drop_privileges(pchild, ap_server_conf)) {
clean_child_exit(APEXIT_CHILDFATAL);
}
diff --git a/server/mpm/prefork/prefork.c b/server/mpm/prefork/prefork.c
index df2c689ffe..28cfcfdca9 100644
--- a/server/mpm/prefork/prefork.c
+++ b/server/mpm/prefork/prefork.c
@@ -473,7 +473,7 @@ static void child_main(int child_num_arg)
clean_child_exit(APEXIT_CHILDFATAL);
}
- if (unixd_setup_child()) {
+ if (ap_run_drop_privileges(pchild, ap_server_conf)) {
clean_child_exit(APEXIT_CHILDFATAL);
}
diff --git a/server/mpm/simple/simple_api.c b/server/mpm/simple/simple_api.c
index 05a0d475d4..07cd9f0d0f 100644
--- a/server/mpm/simple/simple_api.c
+++ b/server/mpm/simple/simple_api.c
@@ -25,7 +25,6 @@
#include "simple_types.h"
#include "simple_run.h"
#include "http_core.h"
-#include "simple_api.h"
/* Thie file contains the absolute minimal MPM API, to interface with httpd. */
@@ -33,13 +32,6 @@ ap_generation_t volatile ap_my_generation = 0;
server_rec *ap_server_conf = NULL;
-APR_HOOK_STRUCT(APR_HOOK_LINK(simple_drop_privileges)
- )
-
-AP_IMPLEMENT_HOOK_RUN_ALL(int, simple_drop_privileges,
- (apr_pool_t * pchild, server_rec * s),
- (pchild, s), OK, DECLINED)
-
int ap_mpm_run(apr_pool_t * pconf, apr_pool_t * plog, server_rec * s)
{
simple_core_t *sc = simple_core_get();
diff --git a/server/mpm/simple/simple_api.h b/server/mpm/simple/simple_api.h
deleted file mode 100644
index 4ef4d80a21..0000000000
--- a/server/mpm/simple/simple_api.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "apr.h"
-#include "apr_pools.h"
-#include "apr_poll.h"
-#include "apr_hash.h"
-#include "apr_ring.h"
-#include "apr_thread_pool.h"
-#include "apr_buckets.h"
-#include "httpd.h"
-
-#ifndef APACHE_MPM_SIMPLE_API_H
-#define APACHE_MPM_SIMPLE_API_H
-
-#ifdef __cplusplus
-extern "C"
-{
-#endif
-
-/* Called after child as forked, before child_init, to be used by modules that
- * wish to chroot or change the processes running UserID before we begin serving requests.
- */
- AP_DECLARE_HOOK(int, simple_drop_privileges,
- (apr_pool_t * pchild, server_rec * s))
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* APACHE_MPM_SIMPLE_API_H */
diff --git a/server/mpm/simple/simple_run.c b/server/mpm/simple/simple_run.c
index b6982af523..b9febc70c0 100644
--- a/server/mpm/simple/simple_run.c
+++ b/server/mpm/simple/simple_run.c
@@ -27,7 +27,6 @@
#include "scoreboard.h"
#include "ap_listen.h"
-#include "simple_api.h"
#include "mpm.h"
/**
@@ -240,11 +239,11 @@ void simple_single_process_hack(simple_core_t * sc)
static int simple_setup_privs(simple_core_t * sc)
{
- int rv = ap_run_simple_drop_privileges(sc->pool, ap_server_conf);
+ int rv = ap_run_drop_privileges(sc->pool, ap_server_conf);
if (rv) {
ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL,
- "simple_setup_privs: ap_run_simple_drop_privileges failed");
+ "simple_setup_privs: ap_run_drop_privileges failed");
return rv;
}
@@ -296,8 +295,7 @@ int simple_child_loop(simple_core_t * sc)
rv = simple_setup_privs(sc);
if (rv) {
- ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL,
- "simple_child_loop: simple_drop_privs failed");
+ /* simple_setup_privs already logged error */
return !OK;
}
diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c
index ed032df763..16ade8fcac 100644
--- a/server/mpm/worker/worker.c
+++ b/server/mpm/worker/worker.c
@@ -1143,7 +1143,7 @@ static void child_main(int child_num_arg)
clean_child_exit(APEXIT_CHILDFATAL);
}
- if (unixd_setup_child()) {
+ if (ap_run_drop_privileges(pchild, ap_server_conf)) {
clean_child_exit(APEXIT_CHILDFATAL);
}
diff --git a/server/mpm_common.c b/server/mpm_common.c
index 3c04350496..1b292814f4 100644
--- a/server/mpm_common.c
+++ b/server/mpm_common.c
@@ -64,16 +64,21 @@
APR_HOOK_STRUCT(
APR_HOOK_LINK(fatal_exception)
APR_HOOK_LINK(monitor)
+ APR_HOOK_LINK(drop_privileges)
)
AP_IMPLEMENT_HOOK_RUN_ALL(int, fatal_exception,
(ap_exception_info_t *ei), (ei), OK, DECLINED)
#else
APR_HOOK_STRUCT(
APR_HOOK_LINK(monitor)
+ APR_HOOK_LINK(drop_privileges)
)
#endif
AP_IMPLEMENT_HOOK_RUN_ALL(int, monitor,
(apr_pool_t *p), (p), OK, DECLINED)
+AP_IMPLEMENT_HOOK_RUN_ALL(int, drop_privileges,
+ (apr_pool_t * pchild, server_rec * s),
+ (pchild, s), OK, DECLINED)
#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES
@@ -1299,4 +1304,3 @@ AP_DECLARE(void) ap_mpm_register_timed_callback(apr_time_t t,
}
#endif /* AP_MPM_HAS_USER_CALLBACKS */
-