source: server/common/patches/httpd-2.2.x-mod_status-security.patch @ 1119

Last change on this file since 1119 was 795, checked in by geofft, 16 years ago
httpd: Commit quentin's mod_status patch, which disallows server-status in .htaccess files
File size: 2.3 KB
RevLine 
[795]1Prevents mod_status from taking effect in .htaccess files, by requiring
2a directive that's only permitted in directory context.
3
4Signed-off-by: Quentin Smith <quentin@mit.edu>
5Signed-off-by: Geoffrey Thomas <geofft@mit.edu>
6--- a/modules/generators/mod_status.c   2008-01-02 04:43:52.000000000 -0500
7+++ b/modules/generators/mod_status.c   2008-08-06 01:31:26.000000000 -0400
8@@ -115,6 +115,10 @@
9 static pid_t child_pid;
10 #endif
11 
12+typedef struct {
13+  int permit_status_handler;
14+} status_config_rec;
15+
16 /*
17  * command-related code. This is here to prevent use of ExtendedStatus
18  * without status_module included.
19@@ -139,6 +143,13 @@
20     return NULL;
21 }
22 
23+static void *create_status_dir_config(apr_pool_t *p, char *d)
24+{
25+  status_config_rec *conf = apr_pcalloc(p, sizeof(*conf));
26+  conf->permit_status_handler = 0;
27+  return conf;
28+}
29+
30 
31 static const command_rec status_module_cmds[] =
32 {
33@@ -147,6 +158,11 @@
34     AP_INIT_FLAG("SeeRequestTail", set_reqtail, NULL, RSRC_CONF,
35       "For verbose requests, \"On\" to see the last 63 chars of the request, "
36       "\"Off\" (default) to see the first 63 in extended status display"),
37+    AP_INIT_FLAG("PermitStatusHandler", ap_set_flag_slot,
38+                (void *)APR_OFFSETOF(status_config_rec, permit_status_handler),
39+                ACCESS_CONF,
40+      "As a security measure, only permit status handlers where this flag "
41+      "is set. Only legal in directory context, not .htaccess."),
42     {NULL}
43 };
44 
45@@ -247,9 +263,13 @@
46     pid_t *pid_buffer, worker_pid;
47     clock_t tu, ts, tcu, tcs;
48     ap_generation_t worker_generation;
49-
50-    if (strcmp(r->handler, STATUS_MAGIC_TYPE) &&
51-        strcmp(r->handler, "server-status")) {
52+   
53+    status_config_rec *conf = ap_get_module_config(r->per_dir_config,
54+                                                      &status_module);
55+
56+    if ((strcmp(r->handler, STATUS_MAGIC_TYPE) &&
57+         strcmp(r->handler, "server-status")) ||
58+       !conf->permit_status_handler) {
59         return DECLINED;
60     }
61 
62@@ -871,7 +891,7 @@
63 module AP_MODULE_DECLARE_DATA status_module =
64 {
65     STANDARD20_MODULE_STUFF,
66-    NULL,                       /* dir config creater */
67+    create_status_dir_config,   /* dir config creater */
68     NULL,                       /* dir merger --- default is to override */
69     NULL,                       /* server config */
70     NULL,                       /* merge server config */
Note: See TracBrowser for help on using the repository browser.