2014-01-24 4 views
4

У меня проблема с моей программой-демоном 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 с тем же результатом.

Так что мои вопросы:

  1. Почему нельзя ptrace присоединить к процессу, который имеет такой же эффективный и реальный UID как GDB?
  2. Можно ли отказаться от привилегий моей программы таким образом, чтобы я мог прикрепить к ней из непривилегированного gdb? Как?

Спасибо.

ответ

5

Я нашел решение самостоятельно.

В ядре для каждого процесса есть флаг 'dumpable'. Когда процесс выполняет setuid или setgid (по крайней мере, в моем случае, когда процесс отменяет привилегии), этот флаг очищается, и обычные пользователи не могут присоединяться к этому процессу с помощью отладчика, а также сбой процесса также не создает аварийный сброс , Это делается по соображениям безопасности для защиты любых конфиденциальных данных, полученных с повышенными привилегиями, которые могут находиться в памяти процесса.

Для решения этой проблемы процесс может явно разрешить отладку, установив «dumpable» флаг 1.

prctl(PR_SET_DUMPABLE, 1); 

Это должно быть сделано после того, как setgid/Setuid вызовов.

Смежные вопросы