Есть ли способ предотвратить замену команд sh / bash? - PullRequest
4 голосов
/ 27 октября 2010

Из программы на C я хочу вызвать скрипт оболочки с именем файла в качестве параметра. Пользователи могут контролировать имя файла. C что-то вроде (инициализация / проверка ошибок опущена):

sprintf(buf, "/bin/sh script.sh \"%s\"", filename);
system(buf);

Целевое устройство на самом деле является встроенной системой, поэтому мне не нужно беспокоиться о злонамеренных пользователях. Очевидно, это будет вектор атаки в веб-среде. Тем не менее, если в системе есть имя файла, которое, например, содержит в своем имени обратные кавычки, команда не выполнится, поскольку оболочка выполнит раскрытие имени. Есть ли какие-либо, чтобы предотвратить подстановку команд?

Ответы [ 4 ]

3 голосов
/ 27 октября 2010

Ну, вы всегда можете переопределить system (), используя вызов fork () и затем execv ().

http://www.opengroup.org/onlinepubs/000095399/functions/system.html

0 голосов
/ 27 октября 2010

Как сказал Шарт, вы не должны использовать system, но fork и execv самостоятельно. Но чтобы ответить на вопрос о том, как сделать строки безопасными для передачи в оболочку (если вы настаиваете на использовании system), вам нужно экранировать строку. Самый простой способ сделать это - сначала заменить каждое вхождение ' (одинарная кавычка) на '\'' (одинарная кавычка, обратная косая черта, одинарная кавычка, одинарная кавычка), а затем добавить ' (одинарная кавычка) в начале и конце строки. Другой довольно простой (но обычно менее эффективный) метод заключается в том, чтобы ставить обратную косую черту перед каждым отдельным символом, но тогда вам все равно нужно выполнить некоторые специальные приемы кавычек для обработки встроенных символов новой строки, поэтому я предпочитаю первый метод.

0 голосов
/ 27 октября 2010

Поскольку вы пометили это как C, я предоставлю вам ответ C. Вам нужно будет экранировать имя файла - создайте новую строку, которая будет правильно обрабатываться оболочкой, чтобы такие вещи, как This is a file name, производили This\ is\ a\ file\ name или bad;rm *;filename, становились bad\;rm\ \*\;filename. Затем вы можете передать это оболочке.

Другим способом было бы запустить оболочку напрямую с fork и одной из функций exec. Передача аргументов непосредственно в программы не приводит к расширению или интерпретации командной строки оболочки.

0 голосов
/ 27 октября 2010

Попробуйте вызвать "unalias" в системной функции.

...