* Florian Weimer [2006-01-24 21:51:00+0100] > * Stefan Ritt: > >> Is this list complete as far as fixes past r1202 are concerned? What > >> about r1487, is it a significant DoS condition? > > > > Yes. > > Okay, this patch shouldn't be too hard to extract. Recai, could you > backport that one and the fixes from r1635 to stable?
OK. I'm sending three separate patches attached for your review:
* 0007-r1635-Fix-CVE-2005-4439.txt
Backport r1635: targets to fix CVE-2005-4439
* 0008-r1487-Fix-DoS-condition.txt
Backport r1487: fixes infinite redirection
* 0009-r1636-Add-IP-address-to-logfile.txt [optional]
Backport r1636: adds IP address to log file
All three patches + your previous six patches were applied and compiled
successfully. I've also tested the fixed package in my system without any
glitches. Now, I'm going to build and test it in a Sarge chroot jail.
Hope I haven't missed anything.
Regards,
--
roktas
Subject: [PATCH] r1635: Fixes CVE-2005-4439: buffer overflow through long URL
parameters
--- a/debian/changelog 2006-01-25 08:24:44.000000000 +0200
+++ b/debian/changelog 2006-01-25 08:24:50.000000000 +0200
@@ -11,6 +11,10 @@ elog (2.5.7+r1558-4+sarge1) unstable; ur
* Backport r1529 from upstream's Subversion repository:
"Fixed bug with fprintf and buffer containing "%""
(Our patch just eliminates the format string vulnerability.)
+ * Backport r1635 from upstream's Subversion repository:
+ "Fixed potential buffer overflows"
+ This backport addresses CVE-2005-4439: buffer overflow through long
+ URL parameters <http://marc.theaimsgroup.com/?m=113498708213563>
-- Florian Weimer <[EMAIL PROTECTED]> Mon, 23 Jan 2006 15:56:37 +0100
--- a/src/elogd.c 2006-01-25 08:21:00.000000000 +0200
+++ b/src/elogd.c 2006-01-25 08:21:48.000000000 +0200
@@ -1839,13 +1839,15 @@ void base64_decode(char *s, char *d)
*d = 0;
}
-void base64_encode(char *s, char *d)
+void base64_encode(unsigned char *s, unsigned char *d, int size)
{
unsigned int t, pad;
+ unsigned char *p;
pad = 3 - strlen(s) % 3;
if (pad == 3)
pad = 0;
+ p = d;
while (*s) {
t = (*s++) << 16;
if (*s)
@@ -1862,6 +1864,8 @@ void base64_encode(char *s, char *d)
*(d + 0) = map[t & 63];
d += 4;
+ if (d-p >= size-3)
+ return;
}
*d = 0;
while (pad--)
@@ -1898,12 +1902,12 @@ void base64_bufenc(unsigned char *s, int
*(--d) = '=';
}
-void do_crypt(char *s, char *d)
+void do_crypt(char *s, char *d, int size)
{
#ifdef HAVE_CRYPT
- strcpy(d, crypt(s, "el"));
+ strlcpy(d, crypt(s, "el"), size);
#else
- base64_encode(s, d);
+ base64_encode((unsigned char *) s, (unsigned char *) d, size);
#endif
}
@@ -2652,7 +2656,7 @@ int retrieve_url(char *url, char **buffe
{
struct sockaddr_in bind_addr;
struct hostent *phe;
- char str[256], host[256], subdir[256], param[256], auth[256], pwd_enc[256];
+ char str[1000], unm[256], upwd[256], host[256], subdir[256], param[256],
auth[256], pwd_enc[256];
int port, bufsize;
INT i, n;
fd_set readfds;
@@ -2704,12 +2708,15 @@ int retrieve_url(char *url, char **buffe
sprintf(str, "GET %s%s HTTP/1.0\r\nConnection: Close\r\n", subdir, param);
/* add local username/password */
- if (isparam("unm"))
+ if (isparam("unm") && isparam("upwd")) {
+ strlcpy(unm, getparam("unm"), sizeof(unm));
+ strlcpy(upwd, getparam("upwd"), sizeof(upwd));
sprintf(str + strlen(str), "Cookie: unm=%s; upwd=%s\r\n",
getparam("unm"), getparam("upwd"));
+ }
if (rpwd && rpwd[0]) {
sprintf(auth, "anybody:%s", rpwd);
- base64_encode(auth, pwd_enc);
+ base64_encode((unsigned char *) auth, (unsigned char *) pwd_enc,
sizeof(pwd_enc));
sprintf(str + strlen(str), "Authorization: Basic %s\r\n", pwd_enc);
}
@@ -3523,13 +3530,13 @@ void check_config()
void retrieve_email_from(LOGBOOK * lbs, char *ret, char
attrib[MAX_N_ATTR][NAME_LENGTH])
{
- char str[256], *p, login_name[256];
+ char email_from[256], str[256], *p, login_name[256];
char slist[MAX_N_ATTR + 10][NAME_LENGTH], svalue[MAX_N_ATTR +
10][NAME_LENGTH];
int i;
if (!getcfg(lbs->name, "Use Email from", str, sizeof(str))) {
if (isparam("user_email") && *getparam("user_email"))
- strcpy(str, getparam("user_email"));
+ strlcpy(str, getparam("user_email"), sizeof(email_from));
else
sprintf(str, "[EMAIL PROTECTED]", host_name);
}
@@ -5254,7 +5261,7 @@ void write_logfile(LOGBOOK * lbs, const
{
char file_name[2000];
va_list argptr;
- char str[10000];
+ char str[10000], unm[256];
FILE *f;
time_t now;
char buf[10000];
@@ -5284,9 +5291,10 @@ void write_logfile(LOGBOOK * lbs, const
strftime(buf, sizeof(buf), "%d-%b-%Y %H:%M:%S", localtime(&now));
strcat(buf, " ");
- if (*getparam("unm") && rem_host[0])
- sprintf(buf + strlen(buf), "[EMAIL PROTECTED] ", getparam("unm"),
rem_host);
- else if (rem_host[0])
+ if (isparam("unm") && rem_host[0]) {
+ strlcpy(unm, getparam("unm"), sizeof(unm));
+ sprintf(buf + strlen(buf), "[EMAIL PROTECTED] ", unm, rem_host);
+ } else if (rem_host[0])
sprintf(buf + strlen(buf), "[%s] ", rem_host);
if (lbs)
@@ -5960,7 +5968,7 @@ void set_redir(LOGBOOK * lbs, char *redi
/* prepare relative path */
if (redir[0])
- strcpy(str, redir);
+ strlcpy(str, redir, sizeof(str));
else {
if (lbs)
sprintf(str, "../%s/", lbs->name_enc);
@@ -7149,7 +7157,7 @@ int build_subst_list(LOGBOOK * lbs, char
} else
strcpy(value[i], attrib[i]);
} else
- strcpy(value[i], getparam(attr_list[i]));
+ strlcpy(value[i], isparam(attr_list[i]) ? getparam(attr_list[i]) :
"", NAME_LENGTH);
}
/* add remote host */
@@ -7320,21 +7328,21 @@ BOOL change_pwd(LOGBOOK * lbs, char *use
void show_change_pwd_page(LOGBOOK * lbs)
{
- char str[256], old_pwd[32], new_pwd[32], new_pwd2[32], act_pwd[32],
user[80];
+ char str[256], config[80], old_pwd[32], new_pwd[32], new_pwd2[32],
act_pwd[32], user[80];
int wrong_pwd;
old_pwd[0] = new_pwd[0] = new_pwd2[0] = 0;
if (isparam("oldpwd"))
- do_crypt(getparam("oldpwd"), old_pwd);
+ do_crypt(getparam("oldpwd"), old_pwd, sizeof(old_pwd));
if (isparam("newpwd"))
- do_crypt(getparam("newpwd"), new_pwd);
+ do_crypt(getparam("newpwd"), new_pwd, sizeof(new_pwd));
if (isparam("newpwd2"))
- do_crypt(getparam("newpwd2"), new_pwd2);
+ do_crypt(getparam("newpwd2"), new_pwd2, sizeof(new_pwd2));
- strcpy(user, getparam("unm"));
+ strlcpy(user, isparam("unm") ? getparam("unm") : "", sizeof(user));
if (isparam("config"))
- strcpy(user, getparam("config"));
+ strlcpy(user, getparam("config"), sizeof(user));
wrong_pwd = FALSE;
@@ -7367,7 +7375,11 @@ void show_change_pwd_page(LOGBOOK * lbs)
if (!wrong_pwd) {
/* redirect back to configuration page */
- sprintf(str, "?cmd=%s&cfg_user=%s", loc("Config"),
getparam("config"));
+ if (isparam("config")) {
+ strlcpy(config, getparam("config"), sizeof(config));
+ sprintf(str, "?cmd=%s&cfg_user=%s", loc("Config"), config);
+ } else
+ sprintf(str, "?cmd=%s", loc("Config"));
redirect(lbs, str);
return;
}
@@ -7642,7 +7654,7 @@ void show_edit_form(LOGBOOK * lbs, int m
if (breedit || bupload) {
/* get date from parameter */
if (*getparam("entry_date"))
- strcpy(date, getparam("entry_date"));
+ strlcpy(date, getparam("entry_date"), sizeof(date));
/* get attributes from parameters */
attrib_from_param(lbs->n_attr, attrib);
@@ -7656,7 +7668,7 @@ void show_edit_form(LOGBOOK * lbs, int m
}
/* get encoding */
- strcpy(encoding, atoi(getparam("html")) == 1 ? "HTML" : "plain");
+ strlcpy(encoding, isparam("encoding") ? getparam("encoding") : "",
sizeof(encoding));
} else {
if (message_id) {
/* get message for reply/edit */
@@ -7668,9 +7680,9 @@ void show_edit_form(LOGBOOK * lbs, int m
if (bedit) {
if (getcfg(lbs->name, "Use Lock", str, sizeof(str)) && atoi(str)
== 1) {
if (*getparam("full_name"))
- strcpy(str, getparam("full_name"));
+ strlcpy(str, getparam("full_name"), sizeof(str));
else
- strcpy(str, loc("user"));
+ strlcpy(str, loc("user"), sizeof(str));
strcat(str, " ");
strcat(str, loc("on"));
@@ -9876,11 +9888,11 @@ int save_user_config(LOGBOOK * lbs, char
if (!activate) {
/* check for hidden password */
if (isparam("hpwd")) {
- strcpy(new_pwd, getparam("hpwd"));
+ strlcpy(new_pwd, getparam("hpwd"), sizeof(new_pwd));
} else {
/* check if passwords match */
- do_crypt(getparam("newpwd"), new_pwd);
- do_crypt(getparam("newpwd2"), new_pwd2);
+ do_crypt(getparam("newpwd"), new_pwd, sizeof(new_pwd));
+ do_crypt(getparam("newpwd2"), new_pwd2, sizeof(new_pwd2));
if (strcmp(new_pwd, new_pwd2) != 0) {
show_error(loc("New passwords do not match, please retype"));
@@ -10082,7 +10094,7 @@ int save_user_config(LOGBOOK * lbs, char
strcpy(str, getparam("new_full_name"));
url_encode(str, sizeof(str));
- do_crypt(getparam("newpwd"), enc_pwd);
+ do_crypt(getparam("newpwd"), enc_pwd, sizeof(enc_pwd));
url_encode(enc_pwd, sizeof(enc_pwd));
sprintf(mail_text + strlen(mail_text),
"?cmd=Activate&new_user_name=%s&new_full_name=%s&new_user_email=%s&email_notify=%s&encpwd=%s&unm=%s\r\n",
@@ -10370,8 +10382,8 @@ void show_forgot_pwd_page(LOGBOOK * lbs)
for (i = 0; i < 6; i++)
str[i] = rand() & 0x7F;
str[i] = 0;
- base64_encode(str, pwd);
- do_crypt(pwd, pwd_encrypted);
+ base64_encode((unsigned char *) str, (unsigned char *) pwd,
sizeof(pwd));
+ do_crypt(pwd, pwd_encrypted, sizeof(pwd_encrypted));
/* send email with new password */
if (!getcfg("global", "SMTP host", smtp_host, sizeof(smtp_host))) {
@@ -12353,7 +12365,7 @@ void receive_pwdfile(LOGBOOK * lbs, char
eprintf("\n");
while (str[strlen(str) - 1] == '\r' || str[strlen(str) - 1] == '\n')
str[strlen(str) - 1] = 0;
- do_crypt(str, pwd);
+ do_crypt(str, pwd, sizeof(pwd));
setparam("upwd", pwd);
status = 0;
}
@@ -12597,7 +12609,7 @@ void synchronize_logbook(LOGBOOK * lbs,
eprintf("\n");
while (str[strlen(str) - 1] == '\r' || str[strlen(str) - 1] ==
'\n')
str[strlen(str) - 1] = 0;
- do_crypt(str, pwd);
+ do_crypt(str, pwd, sizeof(pwd));
setparam("upwd", pwd);
} else {
@@ -14969,20 +14981,21 @@ void show_elog_list(LOGBOOK * lbs, INT p
}
/* default mode */
- strcpy(mode, "Summary");
+ strlcpy(mode, "Summary", sizeof(mode));
show_attachments = FALSE;
/* for page display, get mode from config file */
if (past_n || last_n || page_n) {
if (getcfg(lbs->name, "Display Mode", str, sizeof(str)))
- strcpy(mode, str);
+ strlcpy(mode, str, sizeof(mode));
if (*getparam("mode"))
- strcpy(mode, getparam("mode"));
+ strlcpy(mode, getparam("mode"), sizeof(mode));
} else {
/* for find result, get mode from find form */
- strcpy(mode, getparam("mode"));
+ strlcpy(mode, getparam("mode"), sizeof(mode));
if (mode[0] == 0)
strcpy(mode, "Full");
+ strlcpy(mode, "Full", sizeof(mode));
}
threaded = strieq(mode, "threaded");
@@ -15205,7 +15218,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
/* compile regex for subtext */
if (*getparam("subtext")) {
- strcpy(str, getparam("subtext"));
+ strlcpy(str, getparam("subtext"), sizeof(str));
flags = REG_EXTENDED;
if (!isparam("casesensitive"))
flags |= REG_ICASE;
@@ -15215,7 +15228,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
/* compile regex for attributes */
for (i = 0; i < lbs->n_attr; i++) {
if (*getparam(attr_list[i])) {
- strcpy(str, getparam(attr_list[i]));
+ strlcpy(str, getparam(attr_list[i]), sizeof(str));
/* if value starts with '$', substitute it */
if (str[0] == '$') {
@@ -15313,7 +15326,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
} else {
- strcpy(str, getparam(attr_list[i]));
+ strlcpy(str, isparam(attr_list[i]) ? getparam(attr_list[i]) :
"", sizeof(str));
/* if value starts with '$', substitute it */
if (str[0] == '$') {
@@ -15397,7 +15410,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
if (j < index) {
/* set date from current message, if later */
if (strcmp(msg_list[j].string, msg_list[index].string) < 0)
- strcpy(msg_list[j].string, msg_list[index].string);
+ strlcpy(msg_list[j].string, msg_list[index].string, 256);
msg_list[index].lbs = NULL; // delete current message
continue;
@@ -15558,7 +15571,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
/*---- title ----*/
- strcpy(str, ", ");
+ strlcpy(str, ", ", sizeof(str));
if (past_n == 1)
strcat(str, loc("Last day"));
else if (past_n > 1)
@@ -15583,7 +15596,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
rsprintf("<tr><td class=\"menuframe\"><span class=\"menu1\">\n");
/* current command line for select command */
- strcpy(str, getparam("cmdline"));
+ strlcpy(str, isparam("cmdline") ? getparam("cmdline") : "",
sizeof(str));
/* remove select switch */
if (strstr(str, "select=1")) {
@@ -15603,18 +15616,18 @@ void show_elog_list(LOGBOOK * lbs, INT p
/* default menu commands */
if (menu_str[0] == 0) {
- strcpy(menu_str, "New, Find, Select, CSV Import, ");
+ strlcpy(menu_str, "New, Find, Select, CSV Import, ",
sizeof(menu_str));
if (getcfg(lbs->name, "Password file", str, sizeof(str)))
- strcat(menu_str, "Config, Logout, ");
+ strlcat(menu_str, "Config, Logout, ", sizeof(menu_str));
else
- strcat(menu_str, "Config, ");
+ strlcat(menu_str, "Config, ", sizeof(menu_str));
if (getcfg(lbs->name, "Mirror server", str, sizeof(str)))
- strcat(menu_str, "Synchronize, ");
+ strlcat(menu_str, "Synchronize, ", sizeof(menu_str));
- strcpy(str, loc("Last x"));
- strcat(menu_str, "Last x, Help");
+ strlcpy(str, loc("Last x"), sizeof(str));
+ strlcat(menu_str, "Last x, Help, ", sizeof(menu_str));
}
n = strbreak(menu_str, menu_item, MAX_N_LIST, ",");
@@ -15632,7 +15645,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
rsprintf(" <a
href=\"last%d?mode=%s\">%s</a> |\n", last_n * 2, mode, str);
}
} else if (strieq(menu_item[i], "Select")) {
- strcpy(str, getparam("cmdline"));
+ strlcpy(str, isparam("cmdline") ? getparam("cmdline") : "",
sizeof(str));
if (atoi(getparam("select")) == 1) {
/* remove select switch */
if (strstr(str, "select=1")) {
@@ -15649,7 +15662,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
}
rsprintf(" <a href=\"%s\">%s</a> |\n", str,
loc("Select"));
} else {
- strcpy(str, loc(menu_item[i]));
+ strlcpy(str, loc(menu_item[i]), sizeof(str));
url_encode(str, sizeof(str));
if (i < n - 1)
@@ -15673,7 +15686,7 @@ void show_elog_list(LOGBOOK * lbs, INT p
/* check if file starts with an absolute directory */
if (str[0] == DIR_SEPARATOR || str[1] == ':')
- strcpy(file_name, str);
+ strlcpy(file_name, str, sizeof(file_name));
else {
strlcpy(file_name, resource_dir, sizeof(file_name));
strlcat(file_name, str, sizeof(file_name));
@@ -19145,10 +19158,10 @@ void interprete(char *lbook, char *path)
\********************************************************************/
{
int status, i, j, n, index, lb_index, message_id;
- char exp[80], list[1000], section[256], str[NAME_LENGTH], str2[NAME_LENGTH],
- enc_pwd[80], file_name[256], command[80], ref[256], enc_path[256],
dec_path[256],
+ char exp[80], list[1000], section[256], str[NAME_LENGTH],
str2[NAME_LENGTH], edit_id[80],
+ enc_pwd[80], file_name[256], command[80], ref[256], enc_path[256],
dec_path[256], uname[80],
logbook[256], logbook_enc[256], *experiment, *value, *group, css[256],
*pfile,
- attachment[MAX_PATH_LENGTH];
+ attachment[MAX_PATH_LENGTH], full_name[256];
BOOL global;
LOGBOOK *lbs;
FILE *f;
@@ -19158,7 +19171,7 @@ void interprete(char *lbook, char *path)
url_decode(dec_path);
strcpy(enc_path, dec_path);
url_encode(enc_path, sizeof(enc_path));
- strcpy(command, getparam("cmd"));
+ strlcpy(command, isparam("cmd") ? getparam("cmd") : "", sizeof(command));
experiment = getparam("exp");
value = getparam("value");
group = getparam("group");
@@ -19171,7 +19184,7 @@ void interprete(char *lbook, char *path)
/* evaluate "jcmd" */
if (isparam("jcmd") && *getparam("jcmd"))
- strcpy(command, getparam("jcmd"));
+ strlcpy(command, getparam("jcmd"), sizeof(command));
/* if experiment given, use it as logbook (for elog!) */
if (experiment && experiment[0]) {
@@ -19267,20 +19280,23 @@ void interprete(char *lbook, char *path)
}
/* if data from login screen, evaluate it and set cookies */
- if (*getparam("uname") && getparam("upassword")) {
+ if (isparam("uname") && isparam("upassword")) {
/* check if password correct */
- do_crypt(getparam("upassword"), enc_pwd);
+ do_crypt(getparam("upassword"), enc_pwd, sizeof(enc_pwd));
/* log logins */
- write_logfile(NULL, "LOGIN user \"%s\" (attempt) for logbook
selection page", getparam("uname"));
+ strlcpy(uname, getparam("uname"), sizeof(uname));
+ sprintf(str, "LOGIN user \"%s\" (attempt) for logbook selection
page", uname);
+ write_logfile(NULL, str);
if (isparam("redir"))
- strcpy(str, getparam("redir"));
+ strlcpy(str, getparam("redir"), sizeof(str));
else
- strcpy(str, getparam("cmdline"));
+ strlcpy(str, isparam("cmdline") ? getparam("cmdline") : "",
sizeof(str));
if (!check_user_password(NULL, getparam("uname"), enc_pwd, str))
return;
- write_logfile(NULL, "LOGIN user \"%s\" (success)", getparam("uname"));
+ sprintf(str, "LOGIN user \"%s\" (success)", uname);
+ write_logfile(NULL, str);
/* set cookies */
- set_login_cookies(NULL, getparam("uname"), enc_pwd);
+ set_login_cookies(NULL, uname, enc_pwd);
return;
}
@@ -19345,7 +19361,7 @@ void interprete(char *lbook, char *path)
lbs->n_attr = scan_attributes(lbs->name);
if (*getparam("wpassword")) {
/* check if password correct */
- do_crypt(getparam("wpassword"), enc_pwd);
+ do_crypt(getparam("wpassword"), enc_pwd, sizeof(enc_pwd));
if (!check_password(lbs, "Write password", enc_pwd, getparam("redir")))
return;
rsprintf("HTTP/1.1 302 Found\r\n");
@@ -19369,7 +19385,7 @@ void interprete(char *lbook, char *path)
if (*getparam("apassword")) {
/* check if password correct */
- do_crypt(getparam("apassword"), enc_pwd);
+ do_crypt(getparam("apassword"), enc_pwd, sizeof(enc_pwd));
if (!check_password(lbs, "Admin password", enc_pwd, getparam("redir")))
return;
rsprintf("HTTP/1.1 302 Found\r\n");
@@ -19393,18 +19409,21 @@ void interprete(char *lbook, char *path)
if (*getparam("uname") && getparam("upassword")) {
/* check if password correct */
- do_crypt(getparam("upassword"), enc_pwd);
+ do_crypt(getparam("upassword"), enc_pwd, sizeof(enc_pwd));
/* log logins */
- write_logfile(lbs, "LOGIN user \"%s\" (attempt)", getparam("uname"));
+ strlcpy(uname, getparam("uname"), sizeof(uname));
+ sprintf(str, "LOGIN user \"%s\" (attempt)", uname);
+ write_logfile(lbs, str);
if (isparam("redir"))
- strcpy(str, getparam("redir"));
+ strlcpy(str, getparam("redir"), sizeof(str));
else
- strcpy(str, getparam("cmdline"));
- if (!check_user_password(lbs, getparam("uname"), enc_pwd, str))
+ strlcpy(str, isparam("cmdline") ? getparam("cmdline") : "",
sizeof(str));
+ if (!check_user_password(lbs, uname, enc_pwd, str))
return;
- write_logfile(lbs, "LOGIN user \"%s\" (success)", getparam("uname"));
+ sprintf(str, "LOGIN user \"%s\" (success)", uname);
+ write_logfile(lbs, str);
/* set cookies */
- set_login_cookies(lbs, getparam("uname"), enc_pwd);
+ set_login_cookies(lbs, uname, enc_pwd);
return;
}
@@ -19461,7 +19480,8 @@ void interprete(char *lbook, char *path)
/* unlock message */
el_lock_message(lbs, atoi(getparam("edit_id")), NULL);
/* redirect to message */
- sprintf(str, "../%s/%s", logbook_enc, getparam("edit_id"));
+ strlcpy(edit_id, getparam("edit_id"), sizeof(edit_id));
+ sprintf(str, "../%s/%s", logbook_enc, edit_id);
} else
sprintf(str, "../%s/", logbook_enc);
@@ -19488,17 +19508,20 @@ void interprete(char *lbook, char *path)
}
/* check for "Last n*2 Entries" */
- strcpy(str, getparam("last"));
+ strlcpy(str, isparam("last") ? getparam("last") : "", sizeof(str));
if (strchr(str, ' ')) {
i = atoi(strchr(str, ' '));
sprintf(str, "last%d", i);
- if (isparam("mode"))
- sprintf(str + strlen(str), "?mode=%s", getparam("mode"));
+ if (isparam("mode")) {
+ sprintf(str + strlen(str), "?mode=");
+ strlcat(str, getparam("mode"), sizeof(str));
+ }
redirect(lbs, str);
return;
}
strcpy(str, getparam("past"));
+ strlcpy(str, isparam("past") ? getparam("past") : "", sizeof(str));
if (strchr(str, ' ')) {
i = atoi(strchr(str, ' '));
sprintf(str, "past%d", i);
@@ -19618,10 +19641,14 @@ void interprete(char *lbook, char *path)
strcpy(command, loc("Last"));
/* check if command allowed for current user */
if (command[0] && !is_user_allowed(lbs, command)) {
+ if (isparam("full_name"))
+ strlcpy(full_name, getparam("full_name"), sizeof(full_name));
+ else
+ full_name[0] = 0;
sprintf(str,
loc
("Error: Command \"<b>%s</b>\" is not allowed for user
\"<b>%s</b>\""),
- command, getparam("full_name"));
+ command, full_name);
show_error(str);
return;
}
@@ -19859,8 +19886,10 @@ void interprete(char *lbook, char *path)
if (isparam("global")) {
if (strieq(getparam("global"), "global"))
strcpy(section, "global");
- else
- sprintf(section, "global %s", getparam("global"));
+ else {
+ sprintf(section, "global ");
+ strlcat(section, getparam("global"), sizeof(section));
+ }
} else
strlcpy(section, lbs->name, sizeof(section));
@@ -19873,11 +19902,13 @@ void interprete(char *lbook, char *path)
sprintf(str, "../%s/", lbs->name_enc);
else
sprintf(str, ".");
- if (isparam("new_user_name"))
- sprintf(str + strlen(str), "?cmd=%s&cfg_user=%s", loc("Config"),
getparam("new_user_name"));
- else if (isparam("cfg_user"))
- sprintf(str + strlen(str), "?cmd=%s&cfg_user=%s", loc("Config"),
getparam("cfg_user"));
- else if (getcfg(lbs->name, "password file", str2, sizeof(str2)))
+ if (isparam("new_user_name")) {
+ sprintf(str + strlen(str), "?cmd=%s&cfg_user=", loc("Config"));
+ strlcat(str, getparam("new_user_name"), sizeof(str));
+ } else if (isparam("cfg_user")) {
+ sprintf(str + strlen(str), "?cmd=%s&cfg_user=", loc("Config"));
+ strlcat(str, getparam("cfg_user"), sizeof(str));
+ } else if (getcfg(lbs->name, "password file", str2, sizeof(str2)))
sprintf(str + strlen(str), "?cmd=%s", loc("Config"));
redirect(lbs, str);
@@ -21119,7 +21150,7 @@ void server_loop(void)
base64_decode(str, cl_pwd);
if (strchr(cl_pwd, ':')) {
p = strchr(cl_pwd, ':') + 1;
- do_crypt(p, str);
+ do_crypt(p, str, sizeof(str));
strcpy(cl_pwd, str);
/* check authorization */
if (strcmp(str, pwd) == 0)
@@ -22182,19 +22213,19 @@ int main(int argc, char *argv[])
}
if (read_pwd[0]) {
- do_crypt(read_pwd, str);
+ do_crypt(read_pwd, str, sizeof(str));
create_password(logbook, "Read Password", str);
exit(EXIT_SUCCESS);
}
if (write_pwd[0]) {
- do_crypt(write_pwd, str);
+ do_crypt(write_pwd, str, sizeof(str));
create_password(logbook, "Write Password", str);
exit(EXIT_SUCCESS);
}
if (admin_pwd[0]) {
- do_crypt(admin_pwd, str);
+ do_crypt(admin_pwd, str, sizeof(str));
create_password(logbook, "Admin Password", str);
exit(EXIT_SUCCESS);
}
Subject: [PATCH] r1487: Fixed infinite redirection
--- a/debian/changelog 2006-01-25 08:21:48.000000000 +0200
+++ b/debian/changelog 2006-01-25 08:32:25.000000000 +0200
@@ -8,6 +8,8 @@ elog (2.5.7+r1558-4+sarge1) unstable; ur
* Backport r1472 from upstream's Subversion repository:
"Do not distinguish between invalid user name and invalid password for
security reasons"
+ * Backport r1487 from upstream's Subversion repository:
+ "Fixed infinite redirection with ?fail=1"
* Backport r1529 from upstream's Subversion repository:
"Fixed bug with fprintf and buffer containing "%""
(Our patch just eliminates the format string vulnerability.)
--- a/src/elogd.c 2006-01-25 08:21:48.000000000 +0200
+++ b/src/elogd.c 2006-01-25 08:32:25.000000000 +0200
@@ -6932,6 +6932,30 @@ void set_login_cookies(LOGBOOK * lbs, ch
/*------------------------------------------------------------------*/
+void remove_all_login_cookies(LOGBOOK * lbs)
+{
+ int i;
+
+ rsprintf("HTTP/1.1 302 Found\r\n");
+ rsprintf("Server: ELOG HTTP %s-%d\r\n", VERSION, atoi(cvs_revision + 13));
+ if (use_keepalive) {
+ rsprintf("Connection: Keep-Alive\r\n");
+ rsprintf("Keep-Alive: timeout=60, max=10\r\n");
+ }
+
+ /* remove global cookies */
+ set_cookie(NULL, "unm", "", TRUE, "");
+ set_cookie(NULL, "upwd", "", TRUE, "");
+
+ for (i = 0; lb_list[i].name[0]; i++) {
+ set_cookie(&lb_list[i], "unm", "", 0, "");
+ set_cookie(&lb_list[i], "upwd", "", 0, "");
+ }
+
+ set_redir(lbs, isparam("redir") ? getparam("redir") : "");
+}
+
+/*------------------------------------------------------------------*/
int exist_file(char *file_name)
{
int fh;
@@ -18522,7 +18522,11 @@ BOOL check_user_password(LOGBOOK * lbs,
}
if (!check_login_user(lbs, user)) {
- sprintf(str, "?fail=%s", user);
+ if (isparam("fail")) {
+ /* remove remaining cookies */
+ remove_all_login_cookies(lbs);
+ return FALSE;
+ }
redirect(lbs, str);
return FALSE;
Subject: [PATCH] r1636: Add IP address to log file
--- a/debian/changelog 2006-01-25 08:53:07.000000000 +0200
+++ b/debian/changelog 2006-01-25 09:08:49.000000000 +0200
@@ -17,6 +17,8 @@ elog (2.5.7+r1558-4+sarge1) unstable; ur
"Fixed potential buffer overflows"
This backport addresses CVE-2005-4439: buffer overflow through long
URL parameters <http://marc.theaimsgroup.com/?m=113498708213563>
+ * Backport r1636 from upstream's Subversion repository:
+ "Added IP address to log file"
-- Florian Weimer <[EMAIL PROTECTED]> Mon, 23 Jan 2006 15:56:37 +0100
--- a/src/elogd.c 2006-01-25 09:00:51.000000000 +0200
+++ b/src/elogd.c 2006-01-25 09:04:18.000000000 +0200
@@ -975,6 +975,7 @@ INT _attachment_size;
INT _max_content_length = MAX_CONTENT_LENGTH;
struct in_addr rem_addr;
char rem_host[256];
+char rem_host_ip[256];
INT _sock;
BOOL verbose, use_keepalive, enable_execute = FALSE;
INT _current_message_id;
@@ -5293,9 +5294,17 @@ void write_logfile(LOGBOOK * lbs, const
if (isparam("unm") && rem_host[0]) {
strlcpy(unm, getparam("unm"), sizeof(unm));
- sprintf(buf + strlen(buf), "[EMAIL PROTECTED] ", unm, rem_host);
- } else if (rem_host[0])
- sprintf(buf + strlen(buf), "[%s] ", rem_host);
+ if (rem_host_ip[0])
+ sprintf(buf + strlen(buf), "[EMAIL PROTECTED](%s)] ", unm, rem_host,
rem_host_ip);
+ else
+ sprintf(buf + strlen(buf), "[EMAIL PROTECTED] ", unm, rem_host);
+ } else if (rem_host[0]) {
+ if (rem_host_ip[0])
+ sprintf(buf + strlen(buf), "[%s(%s)] ", rem_host, rem_host_ip);
+ else
+ sprintf(buf + strlen(buf), "[%s] ", rem_host);
+ } else
+ sprintf(buf + strlen(buf), "[%s] ", rem_host_ip);
if (lbs)
sprintf(buf + strlen(buf), "{%s} ", lbs->name);
@@ -20403,7 +20412,7 @@ void server_loop(void)
struct sockaddr_in serv_addr, acc_addr;
char pwd[256], str[1000], url[256], cl_pwd[256], *p, *pd;
char cookie[256], boundary[256], list[1000], theme[256],
- host_list[MAX_N_LIST][NAME_LENGTH], rem_host_ip[256], logbook[256],
logbook_enc[256], global_cmd[256];
+ host_list[MAX_N_LIST][NAME_LENGTH], logbook[256], logbook_enc[256],
global_cmd[256];
int lsock, len, flag, content_length, header_length;
struct hostent *phe;
fd_set readfds;
signature.asc
Description: Digital signature

