Любая из распространенных утилит Linux позволяет изменить UID на произвольный при заданном CAP _SETUID?

Это потому, что :входит в список символов, которые readlineрассматривают как разделители слов для завершения слов (, которые bashотображаются в переменной оболочки $COMP_WORDBREAKS).

После:

COMP_WORDBREAKS=${COMP_WORDBREAKS/:}

(чтобы убрать :из $COMP_WORDBREAKS), Ctrl + X*должно работать.

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

PATH=~/bin:/usr/locTab

И этот механизм слишком грубый (вы заметите, что Ctrl + X*на 'a'*не работает, даже если вы удалите 'из $COMP_WORDBREAKS), чтобы приспособить оба, так что это компромисс. См. zsh, оболочку с гораздо более продвинутыми возможностями редактирования, которая здесь работает в обоих случаях.

0
11.01.2021, 12:03
1 ответ

Не совсем понятно, чего именно вы пытаетесь достичь. Судя по вашему вопросу, вы можете быть:

  • Попытка выполнить что-то под другим пользователем для тестирования без накладных расходов на создание этого пользователя каждый раз
  • Попытка запустить процесс от имени несуществующего пользователя (с несоответствующей записью в /etc/passwdили, точнее, сgetent passwd)
  • Попытка проверить поведениеCAP_SETUID

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

Как root:

mkdir test_dir
# Secure the directory to prevent tampering by other users
chmod go-rx test_dir 
cd test_dir

cp $(which bash).

# arbitrary user 1997  group 1998
chown 1997:1998./bash
chmod ug+s./bash
chmod go+rx./bash

# Run touch as an arbitrary user
./bash -p -c `touch /tmp/test_file`

# Check the result
ls -lh /tmp/test_file
-rw-r----- 1 1997 1998 0 Jan 11 08:22 /tmp/test_file

Кроме того, Python (скриптовый язык программирования )доступен на многих платформах. Вы можете написать очень короткий скрипт на Python для запуска чего-либо после вызова setuid и setgid :

.

например, uid.py:

import os
import sys
import subprocess

# Set uid and gid
os.setuid(int(sys.argv[1]))
os.setgid(int(sys.argv[2]))

# Run the given command, passing in remaining arguments.
subprocess.run(*sys.argv[3:])

Затем, с CAP_SETUIDданным python, вы можете:

python setuid.py 1997 1998 touch /tmp/test_file

Это будет иметь тот же эффект, что и запуск touchс uid 1997 и gid 1998.

Обратите внимание, что скрипты python не нужно создавать в виде файлов, их можно передавать в строке:https://stackoverflow.com/a/16938013/453851

0
18.03.2021, 22:37

Теги

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