Есть ли у моего кода Python какие-либо проблемы с безопасностью при новом внедренном подходе?

#python #code-injection

#питон #внедрение кода

Вопрос:

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

 #! /usr/bin/python3
#-*- coding:utf-8 -*-
def main():
    print("What command you want to do?")
    text = input('>>> ')
    for keyword in ['eval', 'exec', 'import', 'open', 'os', 'read', 'system', 'write']:
        if keyword in text:
            print("You are not allowed to do this")
            return;
    else:
        exec(text)
if __name__ == "__main__":
    main()
 

Хороший друг сказал мне не использовать метод занесения в черный список, но поскольку я не могу представить, как это преодолеть, я спрашиваю здесь. exec Функция выполняется с правами sudo в системе Ubuntu, но поскольку опасные команды типа import или os заблокированы, теперь это должно быть довольно безопасно. Если нет, пожалуйста, покажите мне пример, как его сломать. Поскольку у нас ограниченные ресурсы в нашей компании, я не хочу слишком усложнять ситуацию, если в этом нет необходимости. Заранее благодарю вас!

Комментарии:

1. @MZ — я не уверен, подходит ли это для codereview

2. Попробуйте ввести — "lave"[::-1] "(foo)"

3. Просто сказать, что это небезопасно, мне не помогает. Мне нужна веская причина, чтобы изменить мой подход. В противном случае было бы много усилий для написания нового кода. Спасибо

4. также работает: exec("EVAL".lower() "(foo)")

5. A) как говорили другие, это действительно больше похоже на запрос на проверку кода, поэтому здесь не по теме. Б) абсолютно забудьте о том, чтобы получить EVAL строк пользовательского ввода, чтобы быть в безопасности. Если вам нужна безопасность, реальным решением было бы отступить и поискать решение, которое не предоставляет что-то вроде PYTHON для строк, поступающих от пользователей.

Ответ №1:

хорошо… Я знаю, что это не полный ответ, но…

Вам действительно нужно позволять людям запускать код?

причина, по которой я спрашиваю, заключается в том, что довольно просто передать оператор import, даже если он занесен в черный список.

попробуйте запустить это:

 x = "im"; y="port"; print(str(x y " module"))
 

Ответ №2:

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

Например:

 __builtins__.__dict__['Exec'.lower()]("from subprocess i" "mport call;call('echo Evil code here'.split())")
 

Это позволяет обойти ваши проверки и позволяет пользователю вызывать exec и import . Это не единственный способ обойти ваши проверки. Есть и другие.

На самом деле не существует способа проверить код, чтобы автоматически проверить его безопасность. Мне было бы трудно представить себе подобный сценарий, в котором я бы вообще разрешил пользователям запускать код в среде с повышенными требованиями.