Linux'ta bir işlemi devam ettirme


14

Bir şifre yöneticisi uygulaması üzerinde çalışıyorum ve güvenlik nedenlerinden dolayı kaldırılamayan bir işlem başlatmak istiyorum.

Üstelik standart programdan okumaya ve yazmam gerektiğinden bu programın daemon olmasını istemiyorum.

Bunu yapmanın bir yolu var mı?


11
"Güvenlik nedenlerinden dolayı sürdürülemez bir süreç başlatmak istiyorum." Sadece bir not - buna izin verildiyse, insanlar hain nedenlerden ötürü kolayca sömürülebilir - örneğin durdurulamaz bir çatal bombası fırlatın.
VLAZ

32
Bu bir XY sorunu gibi geliyor . Gerçekten başarmaya çalıştığınız ne olursa olsun, sürdürülemez bir sürecin bunu yapmanın yolu olmadığını düşünüyorum. "Güvenlik nedeniyle" çok belirsiz. Kullanıcının tam olarak ne yapmasını önlemek istiyorsunuz? Ne gibi erişimleri var?
Nate Eldredge

4
Tüm niyet ve amaçlar için kullanılamayan herhangi bir süreç bir virüstür.
Naftuli Kay

3
@NateEldredge: Aksine, programın sinyalleri yoksaymasını sağlayın. Bunu yapmanın tipik yolu budur; aksi takdirde birisi terminali atlayarak doğrudan işleme SIGINT veya SIGTSTP gönderebilir.
Noah Spurrier

2
@NoahSpurrier: Konsolda bir şeyler yazabilen, ancak başka türlü bilgisayarda (kiosk gibi) kod yürütemeyen bir kullanıcının olduğu bir durum hayal ediyorum. Bunu, yazabilecekleri hiçbir tuşun beklenmedik bir etkisi olmayacak şekilde ayarladınız. Başka kod yürütebilirlerse, SIGINT ve SIGTSTP ve SIGQUIT dikkate alınmazsa yardımcı olmaz; bu sinyalleri doğrudan sürece gönderebilen herkes de görmezden gelemeyeceğiniz SIGKILL veya SIGSTOP gönderebilir.
Nate Eldredge

Yanıtlar:


41

Ayrı bir kullanıcı ve sap altında şifre yöneticisi çalıştırmak yapmak / göz ardı / blok terminali tarafından üretilen sinyalleri ( SIGINT, SIGQUIT, SIGHUP, SIGTSTP, SIGTTIN, ve SIGTTOU).

Etkili kimliğiniz 0 (kök) olmadığı sürece farklı bir kullanıcı (hem gerçek kullanıcı kimliği hem de kayıtlı kullanıcı kimliği etkin kullanıcı kimliğinizden farklı olan) altında çalışan (= kill) işlemlere sinyal gönderemezsiniz.

Tüm işlemler yine de kök tarafından yapılabilir.

Daha ayrıntılı bilgi için bkz. Öldür (2) .


15

Bir işlemi unkillable yapmanın tek yolu , önemsiz bir şey olmayan bir çekirdek iş parçacığı olarak uygulamaktır .

Yine de öldürebilirsiniz, ancak bu bir işletim sistemi kapatma teminat hasarı olacaktır.

Ayrıca, SIGNAL_UNKILLABLEbayrağı işleminize ayarlayacak özel bir çekirdek modülü de geliştirebilirsiniz . Bu bayrak, koşulsuz bir öldürmeye karşı korunan tek kullanıcı alanı işlemleri olan init(veya systemdçekirdek başlatma işleminin ilk işlemi ne olursa olsun) için ayarlanacak şekilde tasarlanmıştır, ancak hiçbir şey bu bayrağın düzenli bir işlem için mevcut olmasını yasaklıyor gibi görünmemektedir.


1
init süreci olabilir
muhmuhten

@muhmuhten Haklısın, init, koşulsuz bir öldürmeye karşı korunan bir kullanıcı alanı sürecidir. Ancak, çekirdek modülleri ve iş parçacıkları için kesinlikle bir API varken özelleştirilecek şekilde tasarlanmamıştır.
jlliagre

Kendi cevabımı detaylandırmak için, bir root hesabına erişiminizin olmadığını varsayıyorum (bu arada, bunun bir oyuncak örneği, bir ders projesi veya kötü amaçlı yazılım olduğunu ima ediyor). Bu amaç için bir çekirdek modülünü bağlayabileceğiniz fikrini engeller. Ayrıca, SIGNAL_UNKILLABLE bayrağının normal işlemler için mevcut olmadığını ve bazı önemli normal işlemleri (vforking gibi) engellediğini ve bu yüzden normalde pratik olmayan bir kenar durumu olarak kabul edeceğimi unutmayın.
GregD

@jlliagre gerçekten de değil.
muhmuhten

@dudek Durağan olmayan bir süreç zaten normalde pratik olmayan bir uç durumdur.
jlliagre

11

Teknik olarak, bir süreci kilsiz hale getirmenin bir yolu yoktur.

Tabii ki, kök olmayan kullanıcılar için yalnızca aynı kullanıcı kimliğine sahip işlemleri öldürebilirler, bu nedenle farklı hesaplar yapabiliyorsanız, işlem için "benzersiz" bir kullanıcı kimliği kullanabilirsiniz ve daha sonra yalnızca kök onu öldürebilir.

Basit, ancak daha az sağlam bir çözüm, işleminizin mümkün olduğunca fazla sinyal yakalamasıdır (belki de onları görmezden gelmek). Bu sadece oyuncak örnekleri veya rakip olmayan ortamlar için uygundur, çünkü KILL sinyalini (sinyal 9) yakalamanın bir yolu yoktur, ancak aksi takdirde onlar tarafından öldürülmekten kaçınabilirsiniz.

Son olarak, eğer öldürülürse sürecinizin yeniden doğmasını sağlayabilirsiniz. Bu da kırılgan (çok kırılgan), ancak silmeyi biraz zorlaştıracak. Bu, kendi izleme işleminiz veya inittab kullanılarak yapılabilir. Ne yaptıklarını bilen bir düşman için, bu aynı anda birden fazla işlemi öldürerek kolayca atlatılabilir.


1
Ancak (başka inittab) izleme sürecinin de öldürülmesi mümkün değil mi?
roaima

Hayır, aygıt sürücüleri (çekirdek modülleri) kök tarafından öldürülemeyen işlemler oluşturabilir.
Noah Spurrier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.