SIGABRT
디버깅 정보를 얻기 위해 문서를 보낼 수 있는 프로세스가 있습니다 . 그런데 보내려고 하면 SIGABRT
"작업이 허용되지 않습니다"라는 메시지가 나타납니다.
또한 내가 소유한 다른 프로세스에 동일한 신호를 보내어 신호를 완전히 보내는 것을 방해하는 기본 블록이 없는지 확인했지만 SIGABRT
적절한 방식으로 응답하는지 확인했습니다. 그것은 단지 하나의 프로그램이지만 해당 프로그램의 모든 인스턴스입니다. 프로세스의 시스템 호출 추적은 신호를 수신하지 않는다는 것을 보여줍니다.
/bin/kill
쉘 내장의 이상한 점을 배제하기 위해 명시적으로 실행 해 보았지만 kill
약간의 출력 차이를 제외하면 동작에는 변화가 없었습니다.
SIGABRT
루트는 프로세스로 전송될 수 있으며 예상대로 작동합니다.
나는 한동안 이 게임을 해왔지만 사용자가 자신이 소유한 프로세스에 신호를 보낼 수 없는 경우나 사용자가 하나의 신호만 보낼 수 있고 다른 신호는 보낼 수 없는 경우를 본 적이 없습니다.
운영 체제는 FreeBSD 9.0이며 프로세스는 Apache에서 실행되는 Phusion Passenger Ruby-on-Rails 애플리케이션의 일부인 Ruby 프로세스입니다.
나는 지금 완전히 헤매고 있다. 무슨 일인지 아는 사람 있나요?
고쳐 쓰다:매뉴얼 페이지에 따르면 security.bsd.conservative_signals
sysctl이 1로 설정되어 많은 신호가 setuid 프로세스로 전달되는 것을 방지하는 것으로 나타났습니다. 0으로 설정하면 문제가 해결됩니다.
프로세스 체인 어딘가에 setuid 호출이 있지만 프로세스는 Apache httpd의 하위 프로세스이고 Apache는 루트 권한을 포기하기 위해 uid를 변경합니다. 프로세스 자체는 setuid가 아니며 해당 EUID, RUID 및 SVUID는 사용자와 동일합니다. 신호를 보낸 사람. setuid가 발생했음을 나타내는 유일한 프로세스 검사는 P_SUGID
"플래그" 필드의 플래그입니다. ps
("마지막 실행 이후 ID 권한이 설정되었습니다.") 그러면 안되는 것 같지만 Apache 모듈에서 처리되며 정확한 방식을 모르겠습니다.
명확히 말하면 mod_passenger(mod_rails라고도 함)에 의해 처리되는 Ruby on Rails 애플리케이션의 일부로 실행되는 Ruby 프로세스입니다.
답변1
프로세스가 pid로 지정된 프로세스에 신호를 보낼 수 있는 권한을 가지려면 사용자가 수퍼유저이거나 수신 프로세스의 실제 또는 저장된 사용자 ID가 전송 프로세스의 실제 또는 유효 사용자 ID와 일치해야 합니다. 한 가지 예외는 신호 SIGCONT입니다. 이 신호는 항상 보낸 사람과 동일한 세션 ID를 가진 모든 프로세스로 전송될 수 있습니다. 또한,security.bsd.conservative_signals sysctl이 1로 설정된 경우 사용자는 수퍼유저가 아니며 수신자는 set-uid입니다., 그러면 작업 제어 및 터미널 제어 신호만 보낼 수 있습니다(특히 SIGKILL, SIGINT, SIGTERM, SIGALRM, SIGSTOP, SIGTTIN, SIGTTOU, SIGTSTP, SIGHUP, SIGUSR1, SIGUSR2 만 보낼 수 있습니다).
어떤 의미에서 프로세스를 소유하고 있나요? 실제 uid, 유효 uid, 실행 중인 바이너리, 해당 바이너리의 소유자, setid 비트 등과 관련된 프로세스 상태는 정확히 무엇입니까?