У меня проблема с моей программой-демоном Linux. Он запускается с привилегиями root, выполняет некоторую настройку, а затем постоянно снижает привилегии, переключаясь на некоторых пользователей и группу и продолжает работать. Переход на непривилегированных пользователей делается так:Почему ptrace не привязывается к процессу после setuid?
void switch_to_user_group(std::string const& username, std::string const& groupname)
{
// Switch to user/group
gid_t gid = getgid();
if (!groupname.empty())
{
gid = get_group_id(groupname);
if (0 != setgid(gid))
{
std::cout << "Failed to switch to group " << gid << std::endl;
std::abort();
}
}
if (!username.empty())
{
uid_t uid = get_user_id(username);
if (initgroups(username.c_str(), gid) != 0)
{
std::cout << "initgroups failed" << std::endl;
std::abort();
}
if (0 != setuid(uid))
{
std::cout << "Failed to switch to user " << uid << std::endl;
std::abort();
}
}
}
коммутатор выполняет правильно, я могу видеть процесс в пс и верхней работающем под моим пользователем. Проблема в том, что я не могу подключиться к этому процессу из gdb даже после того, как он сбросил привилегии. Выход:
Attaching to process 15716
Could not attach to process. If your uid matches the uid of the target
process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try
again as the root user. For more details, see /etc/sysctl.d/10-ptrace.conf
ptrace: Operation not permitted.
Я бегу GDB под тем же пользователем процесс перешел на, и я могу прикрепить к другим процессам, которые были изначально начали под под этим пользователем. Я пробовал это на Kubuntu 13.10 (YAMA отключен), Debian 6 и 7 с тем же результатом.
Так что мои вопросы:
- Почему нельзя ptrace присоединить к процессу, который имеет такой же эффективный и реальный UID как GDB?
- Можно ли отказаться от привилегий моей программы таким образом, чтобы я мог прикрепить к ней из непривилегированного gdb? Как?
Спасибо.