Вопросы о сохраненном идентификаторе пользователя

Этот вопрос напоминает мне о некоторых проблемах, которые могут вызвать это :

1 )видео вообще включено в vlc?

  • Инструменты -> Настройки -> вкладка Видео
  • Проверьте, установлен ли флажок «Включить видео», если он не включен.
  • Посмотрите, отмечен ли флажок Декорации окна, если нет, проверьте его.
  • Установите в раскрывающемся меню «Выход» -значение «Видео выход X11» (XCB ).

2 )В случае скачивания видеофайлов с торрента, в некоторых моментах может показываться ложная 100% загрузка, и файл поврежден и не может быть воспроизведен.

3 )Если mplayer также не может воспроизвести видео, проверьте его с другими видеофайлами.

4 )переустановка vlc иногда все портит, советую сделать:

sudo apt-get update
sudo apt-get remove --purge vlc
sudo apt-get install vlc

5 )Инструмент -> настройки -> Ввод / Кодеки в разделе Кодеки, если «Аппаратное -ускоренное декодирование» «отключено», измените его на «Автоматически».

1
27.10.2019, 19:53
2 ответа

Wouldn't saving the effective user ID in a variable at the beginning of the program would make the saved user ID unnecessary?

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

How can I retrieve the saved user ID in a C program ? I was not able to find any functions doing that.

Со стандартными функциями нельзя (есть только getuid()иgeteuid()). По крайней мере в Linux есть getresuid(), которые возвращают все три идентификатора пользователя.

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

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

In what way does the kernel use the saved user ID to check whether a process can or cannot change its user ID? Does this mean that when a process tries to change its effective user ID, the kernel checks the saved user ID to make sure, the process is allowed to do so?

Да. На справочной странице Linux для setuid()это упоминается, но это несколько скрыто :

.
ERRORS     
EPERM  The user is not privileged and uid does not match the real
       UID or saved set-user-ID of the calling process.

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

Справочная страница для setreuid()понятнее:

Unprivileged processes may only set the effective user ID to the real
user ID, the effective user ID, or the saved set-user-ID.
7
27.01.2020, 23:22

Если сохраненный uid является переменной.

Вы не можете использовать обычную переменную, потому что у вас не будет разрешения копировать ее в эффективный или реальный uid. Ядро не может позволить вам копировать из обычной переменной, так как это позволит вам стать кем угодно (Хорошо, но только если значение уже находится в одном из uidс ).

Вы правы в том, что эффективный uid используется для проверки разрешения системных вызовов. Исключение составляет setuid/setgid(также см. возможности ).

Разрешение для setuid: :вы можете перемещать идентификаторы вокруг (из одного uid в другой ), но не можете вводить новый (, если у вас нетCAP_SETUID:root будет иметь это ).

Таким образом, как обычный пользователь. Вы начнете с одного или двух uid (реальных и эффективных, но они оба могут быть одинаковыми ). Если они различаются, то вы можете скопировать реальное в эффективное. Если бы вы сделали это, то вы бы опустились до одного, и у вас не было бы возможности вернуть его. Ядро не позволит вам загрузить его из обычной переменной. Поэтому вы копируете действующее в сохраненное. Для остальной части исполнения у вас есть оригинал, действующий в сохраненном виде, и реальный в реальном. Теперь вы можете сделать их эффективными, скопировав их в эффективный -uid. Через некоторое время вы можете отказаться от одного из них. например. путем копирования реального в два других. Теперь нет пути назад. Единственный способ получить привилегию сейчас — это execдвоичный файл setuid. (или бинарный файл с новыми возможностями, но пока не беспокойтесь об этом ).

А чтобы получить suid, вы можете использоватьgetresuid--http://man7.org/linux/man-pages/man2/getresuid.2.html

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

/*setup UIDs*/
uid_t real_uid = getuid(void);
uid_t original_effective_uid = geteuid(void);
int err = setresuid(real_uid, original_effective_uid, original_effective_uid); /*this line not needed as done by kernel for setuid binary*/
#ifdef see_effect_of_no_suid
   int err = setresuid(real_uid, original_effective_uid, real_uid);     
#endif
while (true) {
   err=seteuid(original_effective_uid);
   /*do stuff as original_effective uid*/

   err=seteuid(real_uid);
   /*do stuff as real uid*/
}
1
27.01.2020, 23:22

Теги

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