dect
/
asterisk
Archived
13
0
Fork 0

Merged revisions 119742 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r119742 | russell | 2008-06-02 09:39:45 -0500 (Mon, 02 Jun 2008) | 5 lines

Improve CLI command blacklist checking for the command manager action.  Previously,
it did not handle case or whitespace properly.  This made it possible for blacklisted
commands to get executed anyway.
(closes issue #12765)

........


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@119744 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
russell 2008-06-02 14:41:55 +00:00
parent 00235849a0
commit 999c5b4af6
1 changed files with 50 additions and 9 deletions

View File

@ -139,9 +139,12 @@ static int manager_debug; /*!< enable some debugging code in the manager */
* HTTP sessions have managerid != 0, the value is used as a search key
* to lookup sessions (using the mansession_id cookie).
*/
static const char *command_blacklist[] = {
"module load",
"module unload",
#define MAX_BLACKLIST_CMD_LEN 2
static struct {
char *words[AST_MAX_CMD_LEN];
} command_blacklist[] = {
{{ "module", "load", NULL }},
{{ "module", "unload", NULL }},
};
struct mansession {
@ -2083,6 +2086,41 @@ static int action_atxfer(struct mansession *s, const struct message *m)
return 0;
}
static int check_blacklist(const char *cmd)
{
char *cmd_copy, *cur_cmd;
char *cmd_words[MAX_BLACKLIST_CMD_LEN] = { NULL, };
int i;
cmd_copy = ast_strdupa(cmd);
for (i = 0; i < MAX_BLACKLIST_CMD_LEN && (cur_cmd = strsep(&cmd_copy, " ")); i++) {
cur_cmd = ast_strip(cur_cmd);
if (ast_strlen_zero(cur_cmd)) {
i--;
continue;
}
cmd_words[i] = cur_cmd;
}
for (i = 0; i < ARRAY_LEN(command_blacklist); i++) {
int j, match = 1;
for (j = 0; command_blacklist[i].words[j]; j++) {
if (ast_strlen_zero(cmd_words[j]) || strcasecmp(cmd_words[j], command_blacklist[i].words[j])) {
match = 0;
break;
}
}
if (match) {
return 1;
}
}
return 0;
}
static char mandescr_command[] =
"Description: Run a CLI command.\n"
"Variables: (Names marked with * are required)\n"
@ -2096,14 +2134,17 @@ static int action_command(struct mansession *s, const struct message *m)
const char *id = astman_get_header(m, "ActionID");
char *buf, *final_buf;
char template[] = "/tmp/ast-ami-XXXXXX"; /* template for temporary file */
int fd = mkstemp(template), i = 0;
int fd = mkstemp(template);
off_t l;
for (i = 0; i < sizeof(command_blacklist) / sizeof(command_blacklist[0]); i++) {
if (!strncmp(cmd, command_blacklist[i], strlen(command_blacklist[i]))) {
astman_send_error(s, m, "Command blacklisted");
return 0;
}
if (ast_strlen_zero(cmd)) {
astman_send_error(s, m, "No command provided");
return 0;
}
if (check_blacklist(cmd)) {
astman_send_error(s, m, "Command blacklisted");
return 0;
}
astman_append(s, "Response: Follows\r\nPrivilege: Command\r\n");