리눅스에서 프로세스를 사용할 수 없게 만들기


14

암호 관리자 응용 프로그램을 작업 중이며 보안상의 이유로 처리 할 수없는 프로세스를 시작하려고합니다.

그리고 표준 입력에서 읽고 써야하기 때문에이 프로그램이 데몬이되는 것을 원하지 않습니다.

이것을 할 수있는 방법이 있습니까?


11
"보안상의 이유로 강제 프로세스를 시작하려고합니다." 참고 사항-이것이 허용되면 사람들은 악의적 인 이유로 쉽게 악용 할 수 있습니다-예를 들어 막을 수없는 포크 폭탄을 발사하십시오.
VLAZ

32
이것은 XY 문제 처럼 들린다 . 나는 당신이 실제로 달성하려고하는 것이 무엇이든 불가능한 프로세스가 그것을 할 수있는 방법이 아니라고 생각합니다. "보안상의 이유로"는 매우 모호합니다. 사용자가 무엇을하지 못하게 하시겠습니까? 그들은 어떤 액세스 권한을 가지고 있습니까?
Nate Eldredge

4
모든 의도와 목적에 적합하지 않은 프로세스는 바이러스입니다.
Naftuli Kay

3
@NateEldredge : 오히려, 프로그램이 신호를 무시하도록하십시오. 이것이 일반적인 방법입니다. 그렇지 않으면 누군가가 터미널을 우회하여 SIGINT 또는 SIGTSTP를 프로세스에 직접 보낼 수 있습니다.
Noah Spurrier

2
@ NoahSpurrier : 콘솔에 물건을 입력 할 수는 있지만 컴퓨터에서 키오스크와 같은 코드를 실행할 수없는 사용자가있는 상황을 상상하고 있습니다. 입력 할 수있는 키가 예기치 않은 영향을 미치지 않도록 설정했습니다. 다른 코드를 실행할 수 있다면 SIGINT와 SIGTSTP와 SIGQUIT를 무시해도 도움이되지 않습니다. 이러한 신호를 프로세스에 직접 보낼 수있는 사람은 누구나 무시할 수없는 SIGKILL 또는 SIGSTOP을 보낼 수 있습니다.
Nate Eldredge

답변:


41

개별 사용자와 핸들 아래 암호 관리자 실행되도록 / 무시 / 블록 단말에서 생성 된 신호 ( SIGINT, SIGQUIT, SIGHUP, SIGTSTP, SIGTTIN, 및 SIGTTOU).

유효 ID가 0 (루트)이 아닌 한 다른 사용자 (실제 uid 및 저장된 세트 uid가 유효 uid와 다른 사용자)에서 실행되는 (= kill) 프로세스로 신호를 보낼 수 없습니다.

모든 프로세스는 여전히 루트에 의해 종료 될 수 있습니다.

자세한 내용은 kill (2)를 참조하십시오 .


15

프로세스를 죽일 수 없게 만드는 유일한 방법은 프로세스를 커널 스레드 로 구현하는 것인데, 이는 사소한 것이 아닙니다.

당신은 여전히 ​​그것을 죽일 수 있지만 그것은 OS 종료 담보 손상이 될 것입니다.

SIGNAL_UNKILLABLE프로세스에 플래그를 설정하는 사용자 정의 커널 모듈을 개발할 수도 있습니다 . 이 플래그는 무조건 강제 종료로부터 보호되는 유일한 사용자 프로세스 인 정규 프로세스 init(또는 systemd커널 시작 프로세스)에 대해서만 설정되도록 설계 되었지만 해당 플래그가 정규 프로세스에 존재하는 것을 금지하지는 않습니다.


1
그것은 init 프로세스 일 수있다
muhmuhten

@muhmuhten 당신은 맞습니다, init는 무조건적인 죽임으로부터 보호되는 유저 랜드 프로세스입니다. 그러나 커널 모듈 및 스레드에 대한 API가 확실히있는 동안 사용자 정의하도록 설계되지 않았습니다.
jlliagre

내 자신의 답변을 자세히 설명하기 위해 루트 계정에 액세스 할 수 없다고 가정합니다 (실제로 이는 장난감 예제, 코스 프로젝트 또는 맬웨어임을 암시합니다). 그 목적으로 커널 모듈을 연결할 수 있다는 생각은 배제됩니다. 또한 SIGNAL_UNKILLABLE 플래그는 일반 프로세스에 사용할 수 없으며 vforking과 같은 중요한 일반 작업을 배제하므로 일반적으로 실용적이지 않은 것으로 간주합니다.
GregD

사실 @jlliagre는 그렇지 않습니다.
muhmuhten

@dudek 죽일 수없는 프로세스는 이미 일반적으로 비현실적인 경우입니다.
jlliagre

11

기술적으로는 프로세스를 불가능하게 만들 수있는 방법이 없습니다.

물론, 루트가 아닌 사용자의 경우 동일한 사용자 ID를 가진 프로세스 만 종료 할 수 있으므로 다른 계정을 만들 수있는 경우 프로세스에 "고유 한"사용자 ID를 사용하면 루트 만 프로세스를 종료 할 수 있습니다.

간단하지만 덜 강력한 솔루션은 프로세스가 가능한 많은 신호를 포착하도록하는 것입니다 (아마도 무시). KILL 신호 (신호 9)를 포착 할 수있는 방법이 없기 때문에 장난감 예제 또는 비 적대적인 환경에만 적합하지만 그렇지 않은 경우에는 킬 (kill)에 의한 살해를 피할 수 있습니다.

마지막으로, 프로세스가 종료되면 다시 생성되도록 준비 할 수 있습니다. 이것은 또한 깨지기 쉽지만 (매우 깨지기 쉽지만) 제거하기가 조금 더 어려워집니다. 이것은 자체 모니터 프로세스를 사용하거나 inittab을 사용하여 수행 할 수 있습니다. 자신이하는 일을 알고있는 적에게는 여러 프로세스를 한 번에 종료하여 쉽게 우회 할 수 있습니다.


1
그러나 (이외의 inittab) 모니터 프로세스가 종료 될 수도 있습니다.
roaima

아니요, 장치 드라이버 (커널 모듈)는 루트로 죽일 수없는 프로세스를 만들 수 있습니다.
Noah Spurrier
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.