#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
. Это не единственный способ обойти ваши проверки. Есть и другие.
На самом деле не существует способа проверить код, чтобы автоматически проверить его безопасность. Мне было бы трудно представить себе подобный сценарий, в котором я бы вообще разрешил пользователям запускать код в среде с повышенными требованиями.