43.22 Соображения по безопасности

Как и любое приложение, Emacs может работать в безопасной среде, где операционная система обеспечивает соблюдение правил доступа и тому подобного. При соблюдении некоторых мер предосторожности приложения на базе Emacs также могут быть частью периметра безопасности, проверяющего такие правила. Хотя настройки по умолчанию для Emacs хорошо подходят для типичной среды разработки программного обеспечения, их может потребоваться настроить в средах, содержащих недоверенных пользователей, которые могут включать злоумышленников. Ниже представлен сборник проблем безопасности, который может быть полезен, если вы разрабатываете такие приложения. Он ни в коем случае не является полным; он призван дать вам представление о проблемах безопасности, а не служить контрольным списком безопасности.

Локальные переменные файлов

Файл, который Emacs посещает, может содержать настройки переменных, влияющие на буфер, посещающий этот файл; см. Локальные переменные файлов. Аналогично, каталог может указывать значения локальных переменных, общие для всех файлов в этом каталоге; см. Локальные переменные каталогов. Хотя Emacs прилагает некоторые усилия для защиты от неправильного использования этих переменных, уязвимость может возникнуть просто из-за слишком оптимистичной настройки пакета safe-local-variable, что является слишком распространенной проблемой. Чтобы отключить эту функцию как для файлов, так и для каталогов, установите enable-local-variables в nil.

Контроль доступа

Хотя Emacs обычно уважает права доступа базовой операционной системы, в некоторых случаях он обрабатывает доступы по-особому. Например, имена файлов могут иметь обработчики, которые обрабатывают файлы по-особому, с собственной проверкой доступа. См. Обеспечение «магических» имен файлов. Кроме того, буфер может быть только для чтения, даже если соответствующий файл доступен для записи, и наоборот, что может привести к таким сообщениям, как «Файл passwd защищен от записи; хотите сохранить все равно? (да или нет)». См. Буферы только для чтения.

Аутентификация

Emacs имеет несколько функций, работающих с паролями, например, read-passwd. См. Чтение пароля. Хотя эти функции не пытаются транслировать пароли в мир, их реализации не являются доказательством против целеустремленных злоумышленников с доступом к внутренним компонентам Emacs. Например, даже если код Elisp использует clear-string для очистки пароля из памяти после его использования, остатки пароля могут все еще оставаться в списке свободной памяти, собираемой сборщиком мусора. См. Изменение строк.

Внедрение кода

Emacs может отправлять команды многим другим приложениям, и приложения должны следить за тем, чтобы строки, отправленные в качестве операндов этих команд, не интерпретировались как директивы. Например, при использовании команды оболочки для переименования файла a в b не используйте просто строку mv a b, потому что имя файла может начинаться с «-», или может содержать метасимволы оболочки, такие как «;». Хотя такие функции, как shell-quote-argument, могут помочь избежать этой проблемы, они не являются панацеей; например, на платформе POSIX shell-quote-argument заключает в кавычки метасимволы оболочки, но не начинающиеся с «-». В MS-Windows кавычки для «%» предполагают, что ни одна из переменных среды не содержит «^» в своем имени. См. Аргументы оболочки. Обычно безопаснее использовать call-process, чем подоболочку. См. Создание синхронного процесса. И еще безопаснее использовать встроенные функции Emacs; например, используйте (rename-file "a" "b" t) вместо вызова mv. См. Изменение имен и атрибутов файлов.

Кодировочные системы

Emacs пытается выводить кодировочные системы файлов и сетевых соединений, к которым он обращается. См. Кодировочные системы. Если Emacs выводит неверно, или если другие стороны сетевого соединения не согласны с выводами Emacs, полученная система может быть ненадежной. Кроме того, даже когда он выводит правильно, Emacs часто может использовать байты, которые другие программы не могут. Например, хотя для Emacs нулевой байт — это просто символ, как и любой другой, многие другие приложения рассматривают его как терминатор строки и некорректно обрабатывают строки или файлы, содержащие нулевые байты.

Переменные окружения и конфигурации

POSIX определяет несколько переменных окружения, которые могут влиять на поведение Emacs. Любая переменная окружения, имя которой состоит исключительно из заглавных латинских букв, цифр и подчеркивания, может влиять на внутреннее поведение Emacs. Emacs использует несколько таких переменных, например, EMACSLOADPATH. См. Поиск библиотек. На некоторых платформах некоторые переменные окружения (например, PATH, POSIXLY_CORRECT, SHELL, TMPDIR) должны иметь правильно настроенные значения, чтобы обеспечить стандартное поведение для любой утилиты, которую может вызвать Emacs. Даже кажущиеся безобидными переменные, такие как TZ, могут иметь последствия для безопасности. См. Среда операционной системы.

Emacs имеет настраиваемые переменные и другие переменные с аналогичными соображениями. Например, если переменная shell-file-name указывает на оболочку с нестандартным поведением, приложение на базе Emacs может работать некорректно.

Установка

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

Сетевой доступ

Emacs часто обращается к сети, и вы можете настроить его, чтобы избежать сетевых обращений, которые он обычно выполняет. Например, если вы не установите tramp-mode в nil, имена файлов, использующие определенный синтаксис, интерпретируются как сетевые файлы и извлекаются через сеть. См. Руководство Tramp в Руководство Tramp.

Состояние гонки

Приложения Emacs имеют те же проблемы состояния гонки, что и другие приложения. Например, даже когда (file-readable-p "foo.txt") возвращает t, возможно, что foo.txt недоступен для чтения, потому что какая-то другая программа изменила разрешения файла между вызовом file-readable-p и сейчас. См. Проверка доступности.

Ограничения ресурсов

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