2014-01-24 5 views
4

제 리눅스 데몬 프로그램에 문제가 있습니다. 루트 권한으로 시작하여 일부 구성을 수행 한 다음 일부 사용자 및 그룹으로 전환하여 권한을 영구적으로 삭제하고 계속 작업합니다. 비 특권 사용자로의 전환은 다음과 같이 수행됩니다setuid 이후 ptrace가 프로세스에 연결되지 않는 이유는 무엇입니까?

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에서이 프로세스에 연결할 수 없다는 것입니다. 출력은 : 나도 같은 사용자로 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. 

프로세스가로 전환, 나는 처음에 그 사용자 아래에서 시작된 다른 프로세스에 첨부 할 수 있어요. 나는 쿠분투 13.10 (YAMA는 사용 불가), 데비안 6과 7에서 같은 결과를 보았습니다.

그래서 제 질문은 다음과 같습니다

  1. 이유는 GDB와 같은 효과적이고 실제 UID가있는 프로세스에 연결 ptrace 할 수없는 이유는 무엇입니까?
  2. 권한이없는 gdb에서 내 프로그램에 첨부 할 수 있도록 내 프로그램의 권한을 삭제할 수 있습니까? 방법?

감사합니다.

답변

5

나는 해결책을 스스로 찾았습니다.

모든 프로세스에 대해 커널에 '덤프 가능'플래그가 있습니다. 프로세스가 setuid 또는 setgid를 실행할 때 (적어도 제 경우에는 프로세스가 권한을 삭제할 때)이 플래그가 지워지고 일반 사용자는 디버거와 함께이 프로세스에 연결할 수 없으며 프로세스가 충돌해도 크래시 덤프가 생성되지 않습니다 . 이는 보안상의 이유로 프로세스 메모리에있을 수있는 상승 된 권한으로 얻은 중요한 데이터를 보호하기 위해 수행됩니다.

1.

prctl(PR_SET_DUMPABLE, 1); 

이것은 setgid를/setuid를 호출 한 후 수행해야합니다으로 프로세스가 명시 적으로 'dumpable'플래그를 설정하여 디버깅을 허용 할 수 있습니다 문제를 해결합니다.