?

Log in

No account? Create an account
 
 
13 December 2014 @ 10:24 am
Про паранойю при создании файлов в unix shell  
Если вам в shell command line нужно создать файл, к которому никто, кроме вас, не должен иметь доступ на чтение, как вы это делаете?
Я обычно делал так:
touch filename
chmod 600 filename
после чего писал туда всё, что мне было нужно.

И оказалось, что злоумышленник без рутовых прав вполне может прочитать мою секретную информацию, если успеет открыть этот файл на чтение между touch и chmod. Ведь права не проверяются на каждую операцию чтения открытого файла, и при chmod с уже открытыми дескрипторами ничего не происходит.

А как это делаете вы?
Я сейчас знаю несколько правильных способов.

Первый способ, самый очевидный и, наверное, самый правильный:
umask 077
после чего можно создавать и редактировать файл безопасно.

Второй способ подольше, но тоже вполне чистый:
touch filename.tmp
chmod 600 filename.tmp
cp -p filename.tmp filename
rm filename.tmp

Можно применить более полноценный интерпретируемый язык, чем /bin/sh:
perl -MFcntl -e 'sysopen($fh, shift, O_RDWR|O_CREAT|O_EXCL, 0600) or die $!' filename

Как ещё?

И, кстати, тут опять были бы полезны функции открытия временного файла (inode без имени) и придания имени безымянному открытому inode (что-то вроде "flink(int fd, const char *name)"). Я по-прежнему удивляюсь, почему их нет. Сишная функция tmpfile(), как и перловый "open($fh, '>+', undef)" сначала создаёт/открывает временный файл с именем, а потом удаляет его, без всякой атомарности.
 
 
 
click0: fractal freebsdclick0 on December 13th, 2014 02:04 pm (UTC)
Лучше уж
touch filename && chmod 600 filename

Для временных файлов есть еще mktemp
Pavel Gulchouck: gulgul_kiev on December 13th, 2014 02:10 pm (UTC)
О том и речь, что такой способ даёт возможность злоумышленнику прочитать содержимое файла.
click0click0 on December 13th, 2014 02:21 pm (UTC)
Какой именно?
Все зависит от типа файловой системы и группы легитимного пользователя и злоумышленника.
Потом еще можно присоединиться к процессу, созданного легитимным пользователем :)

ACL и security - очень больная тема для многих OS.
Pavel Gulchouck: gulgul_kiev on December 13th, 2014 02:56 pm (UTC)
Если пользователю хватило прав открыть файл на чтение после touch (до chmod), то он сможет прочитать всё то, что будет в этот файл записано уже после chmod.
click0click0 on December 13th, 2014 05:15 pm (UTC)
Тогда выставите права предварительно у текущей директории, а потом уже touch :)
Pavel Gulchouck: gulgul_kiev on December 13th, 2014 08:04 pm (UTC)
Да, это один из способов, но, кажется, не самый лучший, т.к. иногда доступ к директории должен быть открыт. Кроме того (наверное, вы знаете), запрет на чтение директории не запрещает читать файлы внутри этой директории.
click0click0 on December 13th, 2014 09:15 pm (UTC)
Да, но теперь тут требуется знать имя файла.