Назад | Перейти на главную страницу

Есть ли какие-либо риски при использовании cat для чтения значения из ненадежного файла?

Мне нужно получить значение переменной, прочитав текстовый файл, загруженный пользователем.

Я делаю из системного скрипта:

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...