Intereting Posts
Вставить текст по определенному номеру строки Самый безопасный способ запуска ext4 fsck на внешний диск Связать один процесс с несколькими портами? Сделать файлы доступными через локальный адрес Установите драйвер opengl на RHEL5.7 Автоматически разбивать LUKS-раздел при неудачных попытках дешифрования X? IBM AIX: Как настроить отправку SSH X на непривилегированного пользователя без дома? Захват ключевого ввода из устройства событий и его отображение (кнопка переключения сенсорной панели не отображается) isolcpus не работает на Ubuntu 14 Как программно определить установленную максимальную версию ядра RPM? Downprade PHP 5.4 -> 5.3 на CentOS 5.10 Как ускорить запуск сеанса wayland-gnome? Как исправить как слишком много, так и немного пробелов? Какова цель иметь две переменные ($ @, $ *) для передачи аргументов команды в скрипт? Точка доступа (с hostapd) на том же интерфейсе, что и сеть / шлюз?

Является ли подкаталог / tmp подходящим местом для сокетов Unix?

Я ищу безопасное место для размещения сокетов домена Unix, которые будут использоваться для управления REPL.

В Linux я бы использовал /run/user/$UID , который отвечает всем требованиям, за исключением переносимости. Мне нужна программа, которая обрабатывает их, чтобы они были переносимыми.

Один из вариантов заключается в использовании каталога с именем ~ но это сталкивается с другой проблемой: домашний каталог пользователя может находиться в слишком глубоком каталоге, чтобы иметь возможность связывать сокет домена Unix, из-за ограничения длины пути.

Размещение сокета в каталоге под /tmp переносимо, но я беспокоюсь о состоянии гонки при удалении каталога. Меня также беспокоит, можно ли полагаться на /tmp чтобы установить липкий бит на всех платформах (то есть, чтобы пользователи не могли удалять или переименовывать временные файлы другого пользователя). Я предполагаю, что /tmp IS липкий, однако, поскольку в противном случае многие приложения (каждый скрипт, который использует mkstemp ), небезопасны.

Мой текущий план заключается в том, чтобы сервер создал временный каталог в /tmp , а для клиентов – проверить принадлежность содержащего каталога перед использованием сокета. Насколько это безопасно?

Стандартное местоположение de jure для временных файлов указано в переменной среды TMPDIR .

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

На самом деле многие системы не определяют TMPDIR . Фактически стандартное расположение временных файлов – /tmp . Поэтому проверьте TMPDIR , и если он не установлен, используйте /tmp . В сценарии оболочки вы можете использовать ${TMPDIR:-/tmp} , или если вы считаете его более удобным,

 if [ -z "$TMPDIR" ]; then TMPDIR=/tmp; fi 

или справиться с set -u

 : "${TMPDIR:=/tmp}" 

Вы можете предположить, что это место доступно для записи, но оно может быть читаемым в мире и доступно для всего мира, поэтому:

  • Когда вы создаете обычный файл, всегда убедитесь, что вы не переписываете существующий файл, который может и не принадлежать вам. Не используйте для этого перенаправление оболочки. Нельзя проверять право собственности отдельно, поскольку противник может перемещать символические ссылки, пока ваша программа работает, чтобы обмануть проверки. Кроме того, вы не можете полагаться на определенное имя, которое не существует; чтобы предотвратить одновременное создание параллельной программы путем создания файла с тем же именем непосредственно перед вами, используйте случайное имя. Вы можете использовать утилиту mktemp (широко распространенную, присутствующую в GNU, BusyBox, BSD, но не POSIX) или mkstemp библиотеки mkstemp C. Под капотом open или creat следует вызывать с флагом O_EXCL .
  • Вы можете создать каталог с помощью mkdir . Это безопасно воровство владения, поскольку оно не будет повторно использовать существующий файл, но оно подвержено такому же отказу в обслуживании, что и обычные файлы, поэтому вы должны использовать случайное имя. mktemp -d – прекрасный способ сделать это.
  • Вы можете создать сокет (для этого нет стандартной утилиты оболочки). Как и в случае с каталогом, он защищен от обмана владельца, но не против отказа в обслуживании.
    Linux соблюдает разрешения на именованные сокеты, но есть варианты Unix, которые этого не делают. Вот почему сокеты в /tmp обычно создаются в подкаталогах.

Программы, которые создают подкаталог /tmp (или $TMPDIR если установлен) и создают именованный сокет, включают в себя серверы X11, ssh-agent, gpg-agent, KDE, emacs, … (это только те, которые существуют на машине, где я это сообщение). Как вы можете видеть, вы будете в хорошей компании.