السماح /sbin /init يكون sigstoped؟
سؤال
أنا أعرف /sbin /init لديه حماية خاصة ضد Sigkill و Sigstop من kernel لأسباب واضحة.
لقد حاولت إخبار kernel أنني أريد أن أتلقى sigstop مع IOCTL () (على غرار SIGABRT و SIGSEGV REQS في MAIN ()):
if (ioctl (0, KDSIGACCEPT, SIGSTOP) == 0) {
nih_signal_set_handler (SIGSTOP, stop_handler);
ولكن لا تصل الإيقاف إلى Stop_Handler () (من كل ما أعرفه ، حيث أن NiH_Error () لم يتم طباعته في سجلات).
في stop_handler () ، أقوم بإعادة تعيين توقف التنهد إلى sig_dfl (وإلا فإنه سيعود إلى معالجنا على أي حال) ، ولكن هذا ربما يؤدي إلى تجاهله من قبل kernel مرة أخرى.
كيف أخبر kernel أريد أن توقف؟
المحلول
ستحتاج إلى إخراج علامة Signal_unkillable من أعلام Signal_Struct الخاصة ببنيتها المهمة.
افتراضيًا (أي دائمًا على أنظمة Linux غير المعدلة) تم تعيين علامة Signal_unkillable على أعلام Signal_struct الخاصة بـ Inist.
يمكنك كتابة وحدة kernel التي من شأنها أن تكسب هيكل مهمة init لتغييرها ، ثم يمكنك إرسال إشارة توقف إلى init.
يعد إرسال إشارة توقف إلى init فكرة سيئة للغاية ، حيث أن الزومبي سوف يتكاثر بسرعة إذا لم يعد init يجنيهم بعد الآن.
التوضيح: هذا هو بنية in-kernel وليست جزءًا من مصدر init ، كما أنه لا يمكن الوصول إليه أو مرئيه من UsserPace. لتغييره ، ستحتاج إلى كتابة بعض رمز kernel أو تصحيح kernel. سيكون من التافهة إلى حد ما ، كما أتصور ، كتابة وحدة نواة تخترقها فقط.