1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

Reject CR and LF characters in FTP pathnames.

This commit is contained in:
Kalle Olavi Niemitalo 2007-03-18 08:53:56 +02:00 committed by Kalle Olavi Niemitalo
parent 3f4de99f16
commit adfde652b9

View File

@ -638,6 +638,26 @@ get_ftp_data_socket(struct connection *conn, struct string *command)
return 1;
}
/* Check if the file or directory name @s can be safely sent to the
* FTP server. To prevent command injection attacks, this function
* must reject CR LF sequences. */
static int
is_ftp_pathname_safe(const struct string *s)
{
int i;
/* RFC 959 says the argument of CWD and RETR is a <pathname>,
* which consists of <char>s, "any of the 128 ASCII characters
* except <CR> and <LF>". So other control characters, such
* as 0x00 and 0x7F, are allowed here. Bytes 0x80...0xFF
* should not be allowed, but if we reject them, users will
* probably complain. */
for (i = 0; i < s->length; i++) {
if (s->source[i] == 0x0A || s->source[i] == 0x0D)
return 0;
}
return 1;
}
/* Create passive socket and add appropriate announcing commands to str. Then
* go and retrieve appropriate object from server.
@ -704,6 +724,13 @@ add_file_cmd_to_str(struct connection *conn)
add_to_string(&command, "CWD ");
add_uri_to_string(&uri_string, conn->uri, URI_PATH);
decode_uri_string(&uri_string);
if (!is_ftp_pathname_safe(&uri_string)) {
done_string(&uri_string);
done_string(&command);
done_string(&ftp_data_command);
abort_connection(conn, S_BAD_URL);
return NULL;
}
add_string_to_string(&command, &uri_string);
add_crlf_to_string(&command);
@ -746,6 +773,13 @@ add_file_cmd_to_str(struct connection *conn)
add_to_string(&command, "RETR ");
add_uri_to_string(&uri_string, conn->uri, URI_PATH);
decode_uri_string(&uri_string);
if (!is_ftp_pathname_safe(&uri_string)) {
done_string(&uri_string);
done_string(&command);
done_string(&ftp_data_command);
abort_connection(conn, S_BAD_URL);
return NULL;
}
add_string_to_string(&command, &uri_string);
add_crlf_to_string(&command);
done_string(&uri_string);