Эксплойт Python raw_input() для удаленного выполнения кода

Я ищу способ использовать приглашение raw_input() для выполнения кода другого объекта, чтобы убедиться, что я делаю это безопасным способом.

У меня есть два класса, у первого есть метод, который я не должен вызывать ни снаружи, ни изнутри; у второго есть метод анализа запроса пользователя, построенный таким образом: «метод вызова arg1 arg2 ...». Например: «добавь 5 3». А метод "do_add" должен вызываться с 5 и 3 в качестве аргументов.

class Obj1 :

    # ...

    def do_forbidden(self) :
        # Not supposed to execute

    # ...

class Obj2 :

    # ...

    def process_cmd(self, cmd) :
        words = cmd.split()
        if len(words) > 0 :
            mthdname = 'do_' + words[ 0 ]
            args = words[1:]

            if hasattr(self, mthdname):
                mthd = getattr(self, mthdname)
                mthd(*args)

    # ...

Затем :

obj1 = Obj1()
obj2 = Obj2()
# ...
cmd = raw_input("Command : ")
obj2.process_cmd(cmd)

Здесь есть способ ввести что-то, что может выполнить "do_forbidden()" из obj1? И имеет ли значение input() вместо raw_input()?

Если эксплойт действительно возможен, злоумышленник может «угадать» имя одного из методов для его выполнения, то является ли префикс «do_» хорошей защитой?


person flzr86    schedule 28.06.2012    source источник
comment
Я использую Python 2.6, если это может быть полезно.   -  person flzr86    schedule 28.06.2012


Ответы (1)


Это невозможно использовать. Если, конечно, один из do_ методов не имеет какой-либо другой уязвимости. Вы не можете выполнить метод, не определенный для того же объекта, из которого вызывается process_cmd.

input было бы совершенно другим, что позволяет вам выполнять все, что вы хотите.

person mata    schedule 28.06.2012
comment
Спасибо. Вы уверены, что нет странного способа выполнить что-то вроде переполнения буфера или любой другой странной вещи? - person flzr86; 28.06.2012
comment
Для input() я думаю, что сохранение raw_input() - хорошая идея! - person flzr86; 28.06.2012
comment
Переполнение буфера обычно является результатом неправильного распределения памяти. Поскольку вы не делаете это вручную в Python, очень маловероятно, что он будет создан (возможно, в расширении C, да, или через модуль ctypes...) - person mata; 28.06.2012