Проблема с получением пользовательского ввода через скрипт, вызванный pam_exec

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

Разрешение «выполнить» (= бит )в Linux и большинстве других Unix имеет одно значение для файлов и другое для каталогов.

Для каталогов, если у вас есть разрешение на выполнение, вы можете видеть их содержимое. Если вы этого не сделаете, вы не сможете перейти в каталог или просмотреть список файлов в нем, даже если у вас есть доступ как для чтения, так и для записи в каталог.

Для обычных файлов (, в отличие от файлов устройств и других специальных типов файлов Unix ), бит выполнения означает, что если вы используете имя файла в командной строке,ОС (или, точнее, :оболочка )попытается «выполнить» или запустить файл как команду. И наоборот, если у вас нет разрешения на выполнение файла, вы не сможете запустить его из командной строки.

Итак, если вы, например, удалите разрешение x для всех пользователей в файле /bin/cat (, который является командой Unix ), вы сами или кто-либо еще и любая программа, которая пытается использовать «кошку», команда не удастся.

Это команды ОС, такие как «cat» и «grep», исполняемые файлы которых обычно находятся в каталогах / */bin/ --/bin, /usr/bin, /sbin, /usr /sbin и т. д.

Кроме того, могут быть нескомпилированные, интерпретированные сценарии, которые либо написаны на каком-либо языке программирования, таком как Python, либо сценарии оболочки (, по сути, команды, которые вы пишете, как будто из командной строки при ssh-подключении к серверу ).

Теперь, когда вы устанавливаете бит выполнения в файле скрипта (, например, файле foobar ), и пытаетесь выполнить его вашей оболочкой :"./foobar", оболочка пытается проанализировать файл и найдите правильную программу для передачи сценария.

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

Итак, если ваш foobar был текстовым файлом с такой первой строкой:

#!/usr/bin/python

Затем оболочка попытается выполнить команду :/usr/bin/python foobar, в основном вызывая интерпретатор Python и передавая ему имя вашего файла foobar в виде скрипта Python.

Если оболочка не найдет такую ​​первую строку в вашем файле, она попытается выполнить сам foobar, как если бы он содержал команды оболочки.

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

Вот что произойдет, если у вас есть файлы TTF с установленным битом exec и вы попытаетесь запустить их из командной строки:

$./FreeMonoOblique.ttf
-bash:./FreeMonoOblique.ttf: cannot execute binary file: Exec format error
$

Итак, для шрифтовэто, вероятно, более аккуратно, если бит exec не установлен, но на самом деле ничего не меняет.

П.С. Просто какая-то посторонняя информация. Если вы удалите бит выполнения для какой-либо команды или скрипта, он все равно может быть передан любой другой программе в качестве аргумента. Если эта другая программа знает, как выполнить вашу команду, удаление вами бита exec не имеет большого значения. Например, скрипт foobar Python по-прежнему будет запускаться интерпретатором Python, если вы просто сделаете это из командной строки:

$python foobar

вместо

$./foobar

То же самое с примером системных команд, таких как «кошка». Если вы удалите бит exec из «cat», вы все равно можете передать его новому экземпляру оболочки для выполнения :

.

$sh -c 'cat myfile'

будет работать, даже если вы удалили бит exec из cat и

$cat myfile

нет.

0
07.11.2017, 07:49
1 ответ

Я не знаком с pam_exec.soреализацией, но я сделал небольшой PAM, и я думаю, что любому модулю сложно обрабатывать интерактивный сеанс со сторонним -скриптом из-за того, как работает диалог PAM(pam_conv_*функций )и необходимость знать, когда сторонний сценарий будет читать из stdinили нет (, поскольку сценарий не просто execмодулем на переднем плане ).

В зависимости от количества усилий, которые вы готовы приложить, создание PAM несложно, и у вас есть легко читаемые примеры на python или golang

.

Другой (возможно, более быстрый )вариант — использовать параметр stdinв pam_exec.so.
Помимо безопасности, и в зависимости от вашего варианта использования этого может быть достаточно, поскольку он отправляет пароль на стандартный ввод сценария.

Если вам подходит вариант объединения ввода скрипта с паролем (, как в некоторых реализациях двухфакторной аутентификации, где вы вводите пароль + OTP в поле пароля):

  • Добавьте опцию stdinв строку pam_exec.so
  • В вашем скрипте разделите пароль из второго ввода
  • Обработка самой аутентификации пароля (, так как pam_unixне сможет сделать это с дополнительным вводом)
  • Используйте дополнительный ввод
0
28.01.2020, 04:36

Теги

Похожие вопросы