Мне нужно получить значение переменной, прочитав текстовый файл, загруженный пользователем.
Я делаю из системного скрипта:
resourceVersion=`cat userFile.txt`
mkdir $resourceVersion
...
Может ли содержимое этого файла повредить системе каким-либо образом, когда я позже буду использовать $resourceVersion
переменная, как аргумент для других команд?
Правило 1 написания безопасного кода: Вы должны дезинфицировать свой пользовательский ввод.
По крайней мере, пройти --
в предложение mkdir, чтобы предотвратить манипулирование переключателями.
В настоящее время его можно использовать для создания каталогов в произвольных местах с произвольными разрешениями.
Само по себе это, вероятно, не приведет к нарушению правил, но вы можете передать такие вещи, как:
-m 0777 /var/lib/mysql/newdb
Чтобы создать новую базу данных mysql, в которую может писать любой.
Здесь также должна быть проведена атака отказа в обслуживании, потому что каждое пространство рассматривается как новый каталог. Поэтому вы можете передать 32760 новых путей для обработки.
Наконец, некоторые псевдофайловые системы чувствительны к новым каталогам неожиданным образом. Например, в Fedora такие каталоги, как /sys/fs/cgroup/newcgroup
может создать новую контрольную группу. Также в подсистеме LIO записи каталогов в /sys/kernel/config/target
может использоваться для экспорта блочного устройства по сети iscsi (тогда можно будет скопировать все содержимое вашего устройства).
Итак, не делайте этого.
На данный момент я могу добавить папку с доступом для записи, если файл userFile.txt содержит -m 777 /.secretstorage
На мой взгляд, это уже достаточно плохо, чтобы не использовать такую конструкцию.
Верно, что с текущим опубликованным вами скриптом невозможно ввести другую команду.
Но в зависимости от того, в каких других командах вы будете использовать эту переменную, может стать намного хуже.
Например, если вы планируете очистить в конце своей программы, используя эту переменную и rm
...