Linux, как исправить этот код - PullRequest
0 голосов
/ 24 марта 2011
#include <WhatHere?>
#include <WhatHere?>
#include <WhatHere?>
int main(int argc, char **argv) {
    char command[50] = "echo ";
    strcat(command,argv[1]); // concatenate the input so that the final command is "echo <input>"
    system(command); // call the system() function to print the input
    return 0; // denote that the program has finished executing successfully
}

Можем ли мы получить удаленный доступ, запустив этот код?Я знаю, что это возможно, но, пожалуйста, помогите мне исправить это.

Ответы [ 2 ]

6 голосов
/ 24 марта 2011

Предполагая, что вы беспокоитесь о возможном переполнении буфера, вы можете исправить это следующим образом:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (int argc, char **argv) {
    char *command;
    if (argc != 2) {
        fprintf (stderr, "Wrong number of arguments\n");
        return 1;
    }
    if ((command = malloc (strlen (argv[1]) + 6)) == NULL) {
        fprintf (stderr, "Could not allocate memory\n");
        return 1;
    }
    strcpy (command, "echo ");
    strcat(command,argv[1]);
    system(command);
    free (command);
    return 0;
}

Это оставляет достаточно места для "echo " (5), argv[1] (длина строки)и нулевой терминатор (1).

По-прежнему потенциально опасно разрешать запуск определенных пользователем вещей, но, по крайней мере, вы больше не получите переполнения буфера.

3 голосов
/ 24 марта 2011

Paxdiablo дал хорошее решение вашей проблемы переполнения буфера, но это действительно наименьшая из ваших проблем здесь.Ваша большая проблема заключается в том, что вы слепо используете ввод от пользователя без предварительной проверки.

Например, выполнение вашей программы, например:

./your_app "\"goodbye data\" && rm -rf /"

, приведет к катастрофе, даже если вы запрограммируетене было проблем с переполнением буфера.Злоумышленник может с такой же легкостью передать весь сценарий оболочки, который сделал все виды неприятных вещей, все, что ему нужно было бы сделать, это переписать его, чтобы он поместился в одну строку.

Вам необходимо проверить входящего пользователя.перед тем, как передать его system(), убедитесь, что он выглядит так, как вы ожидаете.А еще лучше избегайте использования system() для пользовательского ввода целиком и вместо этого используйте более безопасные методы, чтобы делать то, что вам нужно (в вашем примере вы можете заменить свой вызов на system("echo ...") на printf()).Если вы абсолютно должны передать пользовательский ввод system(), рассмотрите возможность запуска вашего приложения в ограниченной среде, такой как chroot тюрьма, чтобы, по крайней мере, сделать более трудным что-либо неприятное.

...