gul_tech (gul_tech) wrote,
gul_tech
gul_tech

Category:

Про паранойю при создании файлов в 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)" сначала создаёт/открывает временный файл с именем, а потом удаляет его, без всякой атомарности.
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 7 comments