В Linux программа командной строки mktemp менее безопасна, чем C-функция mkstemp?

Обе операции создают пустой файл и возвращают имя файла, но mkstemp оставляет файл открытым в монопольном режиме и дает вам дескриптор. Есть ли преимущество для безопасности у C-функции? Означает ли это, что в версии для командной строки есть брешь в безопасности?

В стороне, интересно, что в C api Linux есть несколько связанных функций, и большинство из них говорят «Не используйте эту функцию» (или аналогичные) на своей странице руководства.


person Community    schedule 31.01.2009    source источник
comment
Актуально ?: На уровне файловой системы POSIX-совместимые системы предоставляют системные вызовы, такие как open (2) и flock (2), которые позволяют приложениям атомарно открывать или блокировать файл. На уровне процесса потоки POSIX обеспечивают адекватные примитивы синхронизации. - Википедия: атомарность (системы баз данных) < / а>   -  person Brent Bradburn    schedule 25.10.2015


Ответы (3)


Как вы легко можете увидеть из исходного кода mktemp(1), по сути, он не делает ничего, кроме вызова mkstemp(3).

Эксклюзивный режим в Linux означает, что функция не сработает, если файл уже существует, это не гарантирует блокировку. Другой процесс может удалить этот файл, создать его снова и заполнить данными, несмотря на то, что дескриптор файла open(3) вашим процессом.

В функции C нет дополнительной безопасности по сравнению с утилитой командной строки.

person Quassnoi    schedule 31.01.2009
comment
mktemp (1) вызывает mkstemp (3), но также закрывает полученный дескриптор файла. Но, как вы отметили, очевидно, нет смысла держать открытую ручку. Казалось бы, ни один из подходов не безопасен от злонамеренных атак. - person ; 01.02.2009

Уловка с временными файлами в Unix-подобных операционных системах (включая Linux и Mac OS) заключается в том, что как только вы открываете файл, удаляйте его. Вы по-прежнему можете получить доступ к файлу, но никто другой не сможет его увидеть или что-либо с ним сделать, и он исчезнет, ​​как только вы закроете файл, даже если ваша программа умрет ужасной смертью.

person Paul Tomblin    schedule 31.01.2009
comment
Другими словами, после разрыва связи файл теряет свое имя, но не данные, пока вы его не закроете. - person strager; 31.01.2009
comment
Это отличный совет! Я смотрел tmpfile (3), который делает то, что вы здесь описываете, но я не понимал, как это работает, пока не прочитал ваш пост. - person ; 01.02.2009
comment
отличная идея! Я подозреваю, что еще один вариант использования - для PID-файлов? я часто вижу устаревшие pid-файлы после сбоя программ. Разве описанная вами методика не решит и эту проблему? - person Johannes Schaub - litb; 01.02.2009
comment
Что ж, очевидно, что вы можете использовать эту технику в любое время, когда вам понадобится временный файл для вашей собственной программы, и это решит проблему очистки. Но, конечно, вы не можете использовать его для блокировки файлов. - person Paul Tomblin; 01.02.2009

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

Было бы довольно сложно передать человеку дескриптор файла.

Что касается «безопасности», вам следует подумать об условиях гонки: несколько экземпляров одной программы вызывают mkstemp одновременно, но каждый из них гарантированно имеет уникальный временный файл. Если бы программа закрылась и вызвала версию для командной строки, гарантировать это было бы практически невозможно.

person innaM    schedule 31.01.2009