diff options
Diffstat (limited to 'package/samba/samba-01CVE-2011-2522.patch')
-rw-r--r-- | package/samba/samba-01CVE-2011-2522.patch | 749 |
1 files changed, 749 insertions, 0 deletions
diff --git a/package/samba/samba-01CVE-2011-2522.patch b/package/samba/samba-01CVE-2011-2522.patch new file mode 100644 index 000000000..7d48b554c --- /dev/null +++ b/package/samba/samba-01CVE-2011-2522.patch @@ -0,0 +1,749 @@ +From b610e0cee563465c6b970647b215f8ae4d0c6599 Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 12:56:21 +0200 +Subject: [PATCH 01/12] s3 swat: Allow getting the user's HTTP auth password + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/cgi.c | 9 +++++++++ + source/web/swat_proto.h | 1 + + 2 files changed, 10 insertions(+), 0 deletions(-) + +diff --git a/source/web/cgi.c b/source/web/cgi.c +index 72aa11c..ccdc3a7 100644 +--- a/source/web/cgi.c ++++ b/source/web/cgi.c +@@ -42,6 +42,7 @@ static char *query_string; + static const char *baseurl; + static char *pathinfo; + static char *C_user; ++static char *C_pass; + static bool inetd_server; + static bool got_request; + +@@ -388,6 +389,7 @@ static bool cgi_handle_authorization(char *line) + + /* Save the users name */ + C_user = SMB_STRDUP(user); ++ C_pass = SMB_STRDUP(user_pass); + TALLOC_FREE(pass); + return True; + } +@@ -422,6 +424,13 @@ char *cgi_user_name(void) + return(C_user); + } + ++/*************************************************************************** ++return a ptr to the users password ++ ***************************************************************************/ ++char *cgi_user_pass(void) ++{ ++ return(C_pass); ++} + + /*************************************************************************** + handle a file download +diff --git a/source/web/swat_proto.h b/source/web/swat_proto.h +index 0f84e4f..76f9c3c 100644 +--- a/source/web/swat_proto.h ++++ b/source/web/swat_proto.h +@@ -31,6 +31,7 @@ const char *cgi_variable(const char *name); + const char *cgi_variable_nonull(const char *name); + bool am_root(void); + char *cgi_user_name(void); ++char *cgi_user_pass(void); + void cgi_setup(const char *rootdir, int auth_required); + const char *cgi_baseurl(void); + const char *cgi_pathinfo(void); +-- +1.7.1 + + +From 3806fec53dcf3b6e5c3fd71917f9d67d47c65e32 Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 12:57:43 +0200 +Subject: [PATCH 02/12] s3 swat: Add support for anti-XSRF token + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/swat.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++ + source/web/swat_proto.h | 5 ++++ + 2 files changed, 59 insertions(+), 0 deletions(-) + +diff --git a/source/web/swat.c b/source/web/swat.c +index 434b1ac..e7d84e5 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -29,6 +29,7 @@ + + #include "includes.h" + #include "web/swat_proto.h" ++#include "../lib/crypto/md5.h" + + static int demo_mode = False; + static int passwd_only = False; +@@ -50,6 +51,7 @@ static int iNumNonAutoPrintServices = 0; + #define DISABLE_USER_FLAG "disable_user_flag" + #define ENABLE_USER_FLAG "enable_user_flag" + #define RHOST "remote_host" ++#define XSRF_TOKEN "xsrf" + + #define _(x) lang_msg_rotate(talloc_tos(),x) + +@@ -138,6 +140,58 @@ static char *make_parm_name(const char *label) + return parmname; + } + ++void get_xsrf_token(const char *username, const char *pass, ++ const char *formname, char token_str[33]) ++{ ++ struct MD5Context md5_ctx; ++ uint8_t token[16]; ++ int i; ++ ++ token_str[0] = '\0'; ++ ZERO_STRUCT(md5_ctx); ++ MD5Init(&md5_ctx); ++ ++ MD5Update(&md5_ctx, (uint8_t *)formname, strlen(formname)); ++ if (username != NULL) { ++ MD5Update(&md5_ctx, (uint8_t *)username, strlen(username)); ++ } ++ if (pass != NULL) { ++ MD5Update(&md5_ctx, (uint8_t *)pass, strlen(pass)); ++ } ++ ++ MD5Final(token, &md5_ctx); ++ ++ for(i = 0; i < sizeof(token); i++) { ++ char tmp[3]; ++ ++ snprintf(tmp, sizeof(tmp), "%02x", token[i]); ++ strncat(token_str, tmp, sizeof(tmp)); ++ } ++} ++ ++void print_xsrf_token(const char *username, const char *pass, ++ const char *formname) ++{ ++ char token[33]; ++ ++ get_xsrf_token(username, pass, formname, token); ++ printf("<input type=\"hidden\" name=\"%s\" value=\"%s\">\n", ++ XSRF_TOKEN, token); ++ ++} ++ ++bool verify_xsrf_token(const char *formname) ++{ ++ char expected[33]; ++ const char *username = cgi_user_name(); ++ const char *pass = cgi_user_pass(); ++ const char *token = cgi_variable_nonull(XSRF_TOKEN); ++ ++ get_xsrf_token(username, pass, formname, expected); ++ return (strncmp(expected, token, sizeof(expected)) == 0); ++} ++ ++ + /**************************************************************************** + include a lump of html in a page + ****************************************************************************/ +diff --git a/source/web/swat_proto.h b/source/web/swat_proto.h +index 76f9c3c..e66c942 100644 +--- a/source/web/swat_proto.h ++++ b/source/web/swat_proto.h +@@ -67,5 +67,10 @@ void status_page(void); + /* The following definitions come from web/swat.c */ + + const char *lang_msg_rotate(TALLOC_CTX *ctx, const char *msgid); ++void get_xsrf_token(const char *username, const char *pass, ++ const char *formname, char token_str[33]); ++void print_xsrf_token(const char *username, const char *pass, ++ const char *formname); ++bool verify_xsrf_token(const char *formname); + + #endif /* _SWAT_PROTO_H_ */ +-- +1.7.1 + + +From 3f38cf42facc38c19e0448cbae3078b9606b08e4 Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 12:58:53 +0200 +Subject: [PATCH 03/12] s3 swat: Add XSRF protection to status page + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/statuspage.c | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +diff --git a/source/web/statuspage.c b/source/web/statuspage.c +index 8070ae7..fe545e4 100644 +--- a/source/web/statuspage.c ++++ b/source/web/statuspage.c +@@ -247,9 +247,14 @@ void status_page(void) + int nr_running=0; + bool waitup = False; + TALLOC_CTX *ctx = talloc_stackframe(); ++ const char form_name[] = "status"; + + smbd_pid = pid_to_procid(pidfile_pid("smbd")); + ++ if (!verify_xsrf_token(form_name)) { ++ goto output_page; ++ } ++ + if (cgi_variable("smbd_restart") || cgi_variable("all_restart")) { + stop_smbd(); + start_smbd(); +@@ -326,9 +331,11 @@ void status_page(void) + + initPid2Machine (); + ++output_page: + printf("<H2>%s</H2>\n", _("Server Status")); + + printf("<FORM method=post>\n"); ++ print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); + + if (!autorefresh) { + printf("<input type=submit value=\"%s\" name=\"autorefresh\">\n", _("Auto Refresh")); +-- +1.7.1 + + +From ba996f0ae87f6bf4f19a4918e44dbd6d44a96561 Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 15:02:53 +0200 +Subject: [PATCH 04/12] s3 swat: Add XSRF protection to viewconfig page + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/swat.c | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +diff --git a/source/web/swat.c b/source/web/swat.c +index e7d84e5..647126f 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -664,13 +664,20 @@ static void welcome_page(void) + static void viewconfig_page(void) + { + int full_view=0; ++ const char form_name[] = "viewconfig"; ++ ++ if (!verify_xsrf_token(form_name)) { ++ goto output_page; ++ } + + if (cgi_variable("full_view")) { + full_view = 1; + } + ++output_page: + printf("<H2>%s</H2>\n", _("Current Config")); + printf("<form method=post>\n"); ++ print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); + + if (full_view) { + printf("<input type=submit name=\"normal_view\" value=\"%s\">\n", _("Normal View")); +-- +1.7.1 + + +From 94f8482607a175c44436fae456fbda3624629982 Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 15:03:15 +0200 +Subject: [PATCH 05/12] s3 swat: Add XSRF protection to wizard_params page + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/swat.c | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +diff --git a/source/web/swat.c b/source/web/swat.c +index 647126f..b7eec4a 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -697,18 +697,25 @@ output_page: + static void wizard_params_page(void) + { + unsigned int parm_filter = FLAG_WIZARD; ++ const char form_name[] = "wizard_params"; + + /* Here we first set and commit all the parameters that were selected + in the previous screen. */ + + printf("<H2>%s</H2>\n", _("Wizard Parameter Edit Page")); + ++ if (!verify_xsrf_token(form_name)) { ++ goto output_page; ++ } ++ + if (cgi_variable("Commit")) { + commit_parameters(GLOBAL_SECTION_SNUM); + save_reload(0); + } + ++output_page: + printf("<form name=\"swatform\" method=post action=wizard_params>\n"); ++ print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); + + if (have_write_access) { + printf("<input type=submit name=\"Commit\" value=\"Commit Changes\">\n"); +-- +1.7.1 + + +From eb22fd73060534700d514ec295985549131c7569 Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 15:03:44 +0200 +Subject: [PATCH 06/12] s3 swat: Add XSRF protection to wizard page + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/swat.c | 9 ++++++++- + 1 files changed, 8 insertions(+), 1 deletions(-) + +diff --git a/source/web/swat.c b/source/web/swat.c +index b7eec4a..b6e0c0f 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -751,6 +751,11 @@ static void wizard_page(void) + int have_home = -1; + int HomeExpo = 0; + int SerType = 0; ++ const char form_name[] = "wizard"; ++ ++ if (!verify_xsrf_token(form_name)) { ++ goto output_page; ++ } + + if (cgi_variable("Rewrite")) { + (void) rewritecfg_file(); +@@ -841,10 +846,12 @@ static void wizard_page(void) + winstype = 3; + + role = lp_server_role(); +- ++ ++output_page: + /* Here we go ... */ + printf("<H2>%s</H2>\n", _("Samba Configuration Wizard")); + printf("<form method=post action=wizard>\n"); ++ print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); + + if (have_write_access) { + printf("%s\n", _("The \"Rewrite smb.conf file\" button will clear the smb.conf file of all default values and of comments.")); +-- +1.7.1 + + +From 8fb3064eeaa3640af6c8b91aa5859d8bfb6d0888 Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 15:04:12 +0200 +Subject: [PATCH 07/12] s3 swat: Add XSRF protection to globals page + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/swat.c | 7 +++++++ + 1 files changed, 7 insertions(+), 0 deletions(-) + +diff --git a/source/web/swat.c b/source/web/swat.c +index b6e0c0f..5d11685 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -920,9 +920,14 @@ static void globals_page(void) + { + unsigned int parm_filter = FLAG_BASIC; + int mode = 0; ++ const char form_name[] = "globals"; + + printf("<H2>%s</H2>\n", _("Global Parameters")); + ++ if (!verify_xsrf_token(form_name)) { ++ goto output_page; ++ } ++ + if (cgi_variable("Commit")) { + commit_parameters(GLOBAL_SECTION_SNUM); + save_reload(0); +@@ -935,7 +940,9 @@ static void globals_page(void) + if ( cgi_variable("AdvMode")) + mode = 1; + ++output_page: + printf("<form name=\"swatform\" method=post action=globals>\n"); ++ print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); + + ViewModeBoxes( mode ); + switch ( mode ) { +-- +1.7.1 + + +From ef457a20422cfa8231e25b539d2cd87f299686b9 Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 15:04:48 +0200 +Subject: [PATCH 08/12] s3 swat: Add XSRF protection to shares page + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/swat.c | 18 +++++++++++++----- + 1 files changed, 13 insertions(+), 5 deletions(-) + +diff --git a/source/web/swat.c b/source/web/swat.c +index 5d11685..4544c31 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -982,11 +982,17 @@ static void shares_page(void) + int mode = 0; + unsigned int parm_filter = FLAG_BASIC; + size_t converted_size; ++ const char form_name[] = "shares"; ++ ++ printf("<H2>%s</H2>\n", _("Share Parameters")); ++ ++ if (!verify_xsrf_token(form_name)) { ++ goto output_page; ++ } + + if (share) + snum = lp_servicenumber(share); + +- printf("<H2>%s</H2>\n", _("Share Parameters")); + + if (cgi_variable("Commit") && snum >= 0) { + commit_parameters(snum); +@@ -1012,10 +1018,6 @@ static void shares_page(void) + } + } + +- printf("<FORM name=\"swatform\" method=post>\n"); +- +- printf("<table>\n"); +- + if ( cgi_variable("ViewMode") ) + mode = atoi(cgi_variable_nonull("ViewMode")); + if ( cgi_variable("BasicMode")) +@@ -1023,6 +1025,12 @@ static void shares_page(void) + if ( cgi_variable("AdvMode")) + mode = 1; + ++output_page: ++ printf("<FORM name=\"swatform\" method=post>\n"); ++ print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); ++ ++ printf("<table>\n"); ++ + ViewModeBoxes( mode ); + switch ( mode ) { + case 0: +-- +1.7.1 + + +From 4850456845d2da5e3451716a5ad4ca0ef034e01f Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 15:05:38 +0200 +Subject: [PATCH 09/12] s3 swat: Add XSRF protection to password page + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/swat.c | 11 ++++++++--- + 1 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/source/web/swat.c b/source/web/swat.c +index 4544c31..5242484 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -1225,12 +1225,15 @@ static void chg_passwd(void) + static void passwd_page(void) + { + const char *new_name = cgi_user_name(); ++ const char passwd_form[] = "passwd"; ++ const char rpasswd_form[] = "rpasswd"; + + if (!new_name) new_name = ""; + + printf("<H2>%s</H2>\n", _("Server Password Management")); + + printf("<FORM name=\"swatform\" method=post>\n"); ++ print_xsrf_token(cgi_user_name(), cgi_user_pass(), passwd_form); + + printf("<table>\n"); + +@@ -1270,14 +1273,16 @@ static void passwd_page(void) + * Do some work if change, add, disable or enable was + * requested. It could be this is the first time through this + * code, so there isn't anything to do. */ +- if ((cgi_variable(CHG_S_PASSWD_FLAG)) || (cgi_variable(ADD_USER_FLAG)) || (cgi_variable(DELETE_USER_FLAG)) || +- (cgi_variable(DISABLE_USER_FLAG)) || (cgi_variable(ENABLE_USER_FLAG))) { ++ if (verify_xsrf_token(passwd_form) && ++ ((cgi_variable(CHG_S_PASSWD_FLAG)) || (cgi_variable(ADD_USER_FLAG)) || (cgi_variable(DELETE_USER_FLAG)) || ++ (cgi_variable(DISABLE_USER_FLAG)) || (cgi_variable(ENABLE_USER_FLAG)))) { + chg_passwd(); + } + + printf("<H2>%s</H2>\n", _("Client/Server Password Management")); + + printf("<FORM name=\"swatform\" method=post>\n"); ++ print_xsrf_token(cgi_user_name(), cgi_user_pass(), rpasswd_form); + + printf("<table>\n"); + +@@ -1310,7 +1315,7 @@ static void passwd_page(void) + * password somewhere other than the server. It could be this + * is the first time through this code, so there isn't + * anything to do. */ +- if (cgi_variable(CHG_R_PASSWD_FLAG)) { ++ if (verify_xsrf_token(passwd_form) && cgi_variable(CHG_R_PASSWD_FLAG)) { + chg_passwd(); + } + +-- +1.7.1 + + +From 407ae61fbfc8ee1643a4db8ea9b104f031b32e0f Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Fri, 8 Jul 2011 15:06:13 +0200 +Subject: [PATCH 10/12] s3 swat: Add XSRF protection to printer page + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/swat.c | 28 ++++++++++++++++++---------- + 1 files changed, 18 insertions(+), 10 deletions(-) + +diff --git a/source/web/swat.c b/source/web/swat.c +index 5242484..4582a63 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -1332,18 +1332,15 @@ static void printers_page(void) + int i; + int mode = 0; + unsigned int parm_filter = FLAG_BASIC; ++ const char form_name[] = "printers"; ++ ++ if (!verify_xsrf_token(form_name)) { ++ goto output_page; ++ } + + if (share) + snum = lp_servicenumber(share); + +- printf("<H2>%s</H2>\n", _("Printer Parameters")); +- +- printf("<H3>%s</H3>\n", _("Important Note:")); +- printf("%s",_("Printer names marked with [*] in the Choose Printer drop-down box ")); +- printf("%s",_("are autoloaded printers from ")); +- printf("<A HREF=\"/swat/help/smb.conf.5.html#printcapname\" target=\"docs\">%s</A>\n", _("Printcap Name")); +- printf("%s\n", _("Attempting to delete these printers from SWAT will have no effect.")); +- + if (cgi_variable("Commit") && snum >= 0) { + commit_parameters(snum); + if (snum >= iNumNonAutoPrintServices) +@@ -1372,8 +1369,6 @@ static void printers_page(void) + } + } + +- printf("<FORM name=\"swatform\" method=post>\n"); +- + if ( cgi_variable("ViewMode") ) + mode = atoi(cgi_variable_nonull("ViewMode")); + if ( cgi_variable("BasicMode")) +@@ -1381,6 +1376,19 @@ static void printers_page(void) + if ( cgi_variable("AdvMode")) + mode = 1; + ++output_page: ++ printf("<H2>%s</H2>\n", _("Printer Parameters")); ++ ++ printf("<H3>%s</H3>\n", _("Important Note:")); ++ printf("%s",_("Printer names marked with [*] in the Choose Printer drop-down box ")); ++ printf("%s",_("are autoloaded printers from ")); ++ printf("<A HREF=\"/swat/help/smb.conf.5.html#printcapname\" target=\"docs\">%s</A>\n", _("Printcap Name")); ++ printf("%s\n", _("Attempting to delete these printers from SWAT will have no effect.")); ++ ++ ++ printf("<FORM name=\"swatform\" method=post>\n"); ++ print_xsrf_token(cgi_user_name(), cgi_user_pass(), form_name); ++ + ViewModeBoxes( mode ); + switch ( mode ) { + case 0: +-- +1.7.1 + + +From 11e281228f334bf3d384df5655136f0b4b4068aa Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Sat, 9 Jul 2011 09:52:07 +0200 +Subject: [PATCH 11/12] s3 swat: Add time component to XSRF token + +Signed-off-by: Kai Blin <kai@samba.org> +--- + source/web/swat.c | 28 ++++++++++++++++++++++++---- + source/web/swat_proto.h | 2 +- + 2 files changed, 25 insertions(+), 5 deletions(-) + +diff --git a/source/web/swat.c b/source/web/swat.c +index 4582a63..50df66e 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -52,6 +52,8 @@ static int iNumNonAutoPrintServices = 0; + #define ENABLE_USER_FLAG "enable_user_flag" + #define RHOST "remote_host" + #define XSRF_TOKEN "xsrf" ++#define XSRF_TIME "xsrf_time" ++#define XSRF_TIMEOUT 300 + + #define _(x) lang_msg_rotate(talloc_tos(),x) + +@@ -141,7 +143,7 @@ static char *make_parm_name(const char *label) + } + + void get_xsrf_token(const char *username, const char *pass, +- const char *formname, char token_str[33]) ++ const char *formname, time_t xsrf_time, char token_str[33]) + { + struct MD5Context md5_ctx; + uint8_t token[16]; +@@ -152,6 +154,7 @@ void get_xsrf_token(const char *username, const char *pass, + MD5Init(&md5_ctx); + + MD5Update(&md5_ctx, (uint8_t *)formname, strlen(formname)); ++ MD5Update(&md5_ctx, (uint8_t *)&xsrf_time, sizeof(time_t)); + if (username != NULL) { + MD5Update(&md5_ctx, (uint8_t *)username, strlen(username)); + } +@@ -173,11 +176,13 @@ void print_xsrf_token(const char *username, const char *pass, + const char *formname) + { + char token[33]; ++ time_t xsrf_time = time(NULL); + +- get_xsrf_token(username, pass, formname, token); ++ get_xsrf_token(username, pass, formname, xsrf_time, token); + printf("<input type=\"hidden\" name=\"%s\" value=\"%s\">\n", + XSRF_TOKEN, token); +- ++ printf("<input type=\"hidden\" name=\"%s\" value=\"%lld\">\n", ++ XSRF_TIME, (long long int)xsrf_time); + } + + bool verify_xsrf_token(const char *formname) +@@ -186,8 +191,23 @@ bool verify_xsrf_token(const char *formname) + const char *username = cgi_user_name(); + const char *pass = cgi_user_pass(); + const char *token = cgi_variable_nonull(XSRF_TOKEN); ++ const char *time_str = cgi_variable_nonull(XSRF_TIME); ++ time_t xsrf_time = 0; ++ time_t now = time(NULL); ++ ++ if (sizeof(time_t) == sizeof(int)) { ++ xsrf_time = atoi(time_str); ++ } else if (sizeof(time_t) == sizeof(long)) { ++ xsrf_time = atol(time_str); ++ } else if (sizeof(time_t) == sizeof(long long)) { ++ xsrf_time = atoll(time_str); ++ } ++ ++ if (abs(now - xsrf_time) > XSRF_TIMEOUT) { ++ return false; ++ } + +- get_xsrf_token(username, pass, formname, expected); ++ get_xsrf_token(username, pass, formname, xsrf_time, expected); + return (strncmp(expected, token, sizeof(expected)) == 0); + } + +diff --git a/source/web/swat_proto.h b/source/web/swat_proto.h +index e66c942..424a3af 100644 +--- a/source/web/swat_proto.h ++++ b/source/web/swat_proto.h +@@ -68,7 +68,7 @@ void status_page(void); + + const char *lang_msg_rotate(TALLOC_CTX *ctx, const char *msgid); + void get_xsrf_token(const char *username, const char *pass, +- const char *formname, char token_str[33]); ++ const char *formname, time_t xsrf_time, char token_str[33]); + void print_xsrf_token(const char *username, const char *pass, + const char *formname); + bool verify_xsrf_token(const char *formname); +-- +1.7.1 + + +From 3973cfa50024983618a44ffdb9f756b642b85be7 Mon Sep 17 00:00:00 2001 +From: Kai Blin <kai@samba.org> +Date: Tue, 12 Jul 2011 08:08:24 +0200 +Subject: [PATCH 12/12] s3 swat: Create random nonce in CGI mode + +In CGI mode, we don't get access to the user's password, which would +reduce the hash used so far to parameters an attacker can easily guess. +To work around this, read the nonce from secrets.tdb or generate one if +it's not there. +Also populate the C_user field so we can use that for token creation. + +Signed-off-by: Kai Blin <kai@samba.org> + +The last 12 patches address bug #8290 (CSRF vulnerability in SWAT). +This addresses CVE-2011-2522 (Cross-Site Request Forgery in SWAT). +--- + source/web/cgi.c | 18 +++++++++++++++++- + source/web/swat.c | 1 - + 2 files changed, 17 insertions(+), 2 deletions(-) + +diff --git a/source/web/cgi.c b/source/web/cgi.c +index ccdc3a7..890ac8e 100644 +--- a/source/web/cgi.c ++++ b/source/web/cgi.c +@@ -19,6 +19,7 @@ + + #include "includes.h" + #include "web/swat_proto.h" ++#include "secrets.h" + + #define MAX_VARIABLES 10000 + +@@ -321,7 +322,22 @@ static void cgi_web_auth(void) + exit(0); + } + +- setuid(0); ++ C_user = SMB_STRDUP(user); ++ ++ if (!setuid(0)) { ++ C_pass = secrets_fetch_generic("root", "SWAT"); ++ if (C_pass == NULL) { ++ char *tmp_pass = NULL; ++ tmp_pass = generate_random_str(16); ++ if (tmp_pass == NULL) { ++ printf("%sFailed to create random nonce for " ++ "SWAT session\n<br>%s\n", head, tail); ++ exit(0); ++ } ++ secrets_store_generic("root", "SWAT", tmp_pass); ++ C_pass = SMB_STRDUP(tmp_pass); ++ } ++ } + setuid(pwd->pw_uid); + if (geteuid() != pwd->pw_uid || getuid() != pwd->pw_uid) { + printf("%sFailed to become user %s - uid=%d/%d<br>%s\n", +diff --git a/source/web/swat.c b/source/web/swat.c +index 50df66e..146f1cf 100644 +--- a/source/web/swat.c ++++ b/source/web/swat.c +@@ -29,7 +29,6 @@ + + #include "includes.h" + #include "web/swat_proto.h" +-#include "../lib/crypto/md5.h" + + static int demo_mode = False; + static int passwd_only = False; +-- +1.7.1 + |