Это все еще неконтролируемая командная строка, в которой может выполняться вредоносный код?

import os

command = "conda run -n python3.5 python generate_handwriting.py -text '{}' -style {} -bias {} -stroke_color '{}' -stroke_width {} -output '{}'".format(text, style, bias, stroke_color, stroke_width, output_filename)


os.system(command)

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

import subprocess

cmd = ["conda", "run", "-n", "python3.5", "python", "generate_handwriting.py"]
args = ["-text", str(text), "-style", str(style), "-bias", str(bias), "-stroke_color", str(stroke_color), "-stroke_width", str(stroke_width), "-output", output_filename]

process = subprocess.run(cmd + args, check=True)

Исправлена ​​ли проблема сейчас?

Полный код можно найти здесь.

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

Anentropic 23.05.2024 16:22

Чтобы сделать это безопасным, вам нужно будет проверить значения каждой переменной, например, что stroke_color было шестнадцатеричной цветовой строкой (?) и ничем больше. Если какая-либо из переменных не имеет ограниченного набора допустимых значений, это будет невозможно (например, если text var может быть «любым текстом»... это затрудняет ее защиту)

Anentropic 23.05.2024 16:24

@Anentropic Не уверен, что это уже редактировалось, но в нынешнем виде вы ошибаетесь. subprocess.run ограничивает выполнение одной командой и по умолчанию запрещает перенаправления. Это также позволяет использовать форму списка, где каждый элемент списка соответствует ровно одному аргументу, поэтому вызов, скорее всего, просто завершится неудачно из-за вредоносного ввода. Однако есть и другие потенциальные проблемы безопасности.

Fynn 23.05.2024 18:13
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Инъекция оболочки

Команда subprocess.run , в отличие от os.system, по умолчанию не допускает произвольного выполнения оболочки, например перенаправления или нескольких команд в одной строке. Для этого вам придется явно установить shell=True.

Кроме того, вы помещаете аргументы в список, который во многом является эквивалентом подготовленных операторов SQL в Python.

Поэтому гораздо лучше сделать это так.

Тем не менее, я бы все равно посоветовал вам избежать ввода данных пользователем с помощью shlex.quote, просто из общего принципа. Например, представьте, что вы должны передать для запуска одну строковую команду вместо списка команд, тогда злонамеренный пользователь может передать что-то вроде -c "my arbitrary command".

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

Другие вопросы

Если этот процесс выполняется с более высокими правами, чем у пользователя, вам необходимо также закрыть другие пути атаки. Некоторые очевидные из них:

  • Проверка наличия у пользователя разрешений на редактирование места назначения вывода.
  • Ограничиваем доступ для записи на generate_handwriting.py.
  • Отравление PATH, когда исполняемый файл conda предоставляется пользователем.

Но это мои мысли, и их вполне может быть больше.

Другие вопросы по теме