Если вам в 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)" сначала создаёт/открывает временный файл с именем, а потом удаляет его, без всякой атомарности.
Я обычно делал так:
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)" сначала создаёт/открывает временный файл с именем, а потом удаляет его, без всякой атомарности.
no subject
Date: 2014-12-13 02:04 pm (UTC)touch filename && chmod 600 filename
Для временных файлов есть еще mktemp
no subject
Date: 2014-12-13 02:10 pm (UTC)no subject
Date: 2014-12-13 02:21 pm (UTC)Все зависит от типа файловой системы и группы легитимного пользователя и злоумышленника.
Потом еще можно присоединиться к процессу, созданного легитимным пользователем :)
ACL и security - очень больная тема для многих OS.
no subject
Date: 2014-12-13 02:56 pm (UTC)no subject
Date: 2014-12-13 05:15 pm (UTC)no subject
Date: 2014-12-13 08:04 pm (UTC)no subject
Date: 2014-12-13 09:15 pm (UTC)как то так?
Date: 2016-05-05 01:26 pm (UTC)