Есть ли у GDB идентификатор пользователя?
Да. Каждый запущенный процесс, включая процессы GDB, имеет как эффективный UID, так и реальный UID. Часто это одно и то же. Но у тебя, кажется, есть недоразумение. Они не описывают сам процесс. Скорее они описывают пользователя , от имени которого выполняется процесс.
Как возможно, что GDB имеет ИД пользователя 1000? поскольку нет записи gdb в / etc / passwd. 1000 - это идентификатор пользователя masterdungeon.
Поскольку вы используете gdb
как пользователь "masterdungeon" или как другой пользователь с тем же номером UID.
Хорошо, так это работает, когда GDB запускается с использованием sudo GDB. Но почему я должен запустить его как root, чтобы он нормально работал в GDB ?
Ваш файл данных доступен только для root:
-rw------- 1 root masterdungeon 240 Apr 19 13:54 gameofchance.data
. При непосредственном запуске программа учитывает это, будучи root -обладателем и имея установленный бит SUID:
-rwsrwxr-x 1 root root 29064 Jan 4 19:45 GameOfChance
(обратите внимание на «s» в первой триаде битов разрешений) ). Это приводит к тому, что программа при прямом запуске запускается с эффективным UID root, хотя root фактически не запускал ее. Это один из случаев, когда эффективные и реальные идентификаторы отличаются. Это также очень плохой вариант использования SUID, потому что программы SUID root представляют собой существенный риск безопасности для хост-системы, и этот риск не оправдан для игры.
Риск будет намного хуже, если бит SUID учитывался при запуске программы под управлением отладчика. Отладчик может вносить произвольные изменения в программные данные и даже двоичный код во время работы программы, и это обеспечило бы простой вектор для повышения привилегий, если в таких контекстах учитывается SUID. Соответственно, бит SUID в исполняемом файле не действует, когда программа запускается в отладчике . (См. Также Может ли gdb отлаживать suid root программы? )
Таким образом, если вы отлаживаете программу как пользователь, отличный от root, она не сможет открыть данные файл, но если вы используете sudo
для запуска отладчика, тогда вы получаете необходимую привилегию для доступа к файлу данных через sudo
, и тот факт, что бит SUID в исполняемом файле не учитывается, * не имеет значения.
Лучший способ отладки программы в ее среде сборки перед установкой, такой, что она принадлежит вам и не требует (или не имеет) установленного для нее бита SUID . Это может потребовать некоторых манипуляций с тем, где и как он ищет свой файл данных, который также должен принадлежать вам.
Что касается того, как установлена программа, у вас есть противоречие между приоритетами:
Программы, доступные для запуска всем пользователям, должны принадлежать root и доступны для записи только root, чтобы другим пользователям было сложно их изменять или заменять другими программами, оба из которых может привести к нарушению данных и (дальнейшему) повышению привилегий.
Вы, очевидно, требуете, чтобы пользователи, запускающие игровую программу, могли выполнять запись в общий файл данных. Неясно, что содержит этот файл, но общий список рекордов может быть примером.
Но вы (предположительно) не хотите разрешать пользователям произвольно манипулировать файлом данных под их собственные полномочия, чтобы они не обманывали каким-либо образом, или еще хуже.
Самый простой подход - предоставить каждому пользователю собственный файл данных общего доступа, созданный программой по необходимости в рамках пользователя. домашний каталог, и доступный для этого пользователя. Тогда вам не нужно связываться с SUID / SGID, а также не нужно беспокоиться о том, что пользователи мешают друг другу. Конечно, они могут обманывать, но это повлияет только на них. И вы сможете отлаживать программу с помощью GDB.
Если важно, чтобы файл данных был как общим для пользователей программы, так и доступным для записи (через программу) для всех них, то лучшим подходом, чем создание программы SUID- root, было бы сделать его SGID-some_group_not_ root и сделать файл данных доступным для записи этой группой. Более того, избегайте бита SGID и просто требуйте, чтобы пользователи были членами выбранной группы, чтобы использовать программу. Обратите внимание, что SGID также не учитывается при отладке.