Linuxová hardcore otázka na víkend :-)
Pavel Troller
patrol na sinus.cz
Sobota Březen 25 06:38:02 CET 2017
Zdravím,
dovolím si malou otázku z prostředí Linuxu, třeba někdo bude vědět.
Týká se shellu bash. Včera jsem upgradoval na jednom systému na verzi 4.4.
Tato je nově zkompilována pod glibc-2.25. Dříve jsem používal 4.1,
kompilovanou pod glibc-2.20.
Od té doby nechodí KDE3.5 (instalace z roku 2009). Tento mi vyhovuje, jsem
na něj zvyklý a nechci ho upgradovat. Musí zůstat běžet :-).
Zjistil jsem, že důvodem je, že proces kdeinit nedostane řadu proměnných,
mezi jinými ani $PATH, které potřebuje, aby sám sebe a zbytek KDE našel.
Při hledání příčiny jsem zjistil, že výpis stromu procesů pod starým
a novým bashem vypadá jinak.
Nový bash (nefunkční):
root 28971 0.0 0.0 3736 2320 ? Ss Mar24 0:00 /opt/kde3.5/bin/kdm -nodaemon
root 28973 1.6 3.8 220068 150616 tty10 Ss+ Mar24 9:09 \_ /opt64/X11/bin/X :0 vt10 -auth /opt64/X11/lib/X11/xdm/authdir/A:0-3KmYhO
root 8230 0.0 0.0 3828 2620 ? S 05:59 0:00 \_ -:0
patrol 8361 0.0 0.0 169112 3376 ? Ss 06:01 0:00 \_ /bin/sh /opt/kde3.5/bin/startkde
patrol 8464 0.0 0.0 2164 544 ? S 06:01 0:00 \_ kwrapper ksmserver
root 8451 0.0 0.0 2028 60 ? S 06:01 0:00 start_kdeinit --new-startup +kcminit_startup
patrol 8452 0.0 0.3 26136 13056 ? Ss 06:01 0:00 kdeinit Running...
(procesu 8452 chybí spousta environmentu, 8451 ho ještě má)
Starý bash (funkční):
root 28971 0.0 0.0 3736 2320 ? Ss Mar24 0:00 /opt/kde3.5/bin/kdm -nodaemon
root 28973 1.6 3.8 220068 150616 tty10 Ss+ Mar24 9:07 \_ /opt64/X11/bin/X :0 vt10 -auth /opt64/X11/lib/X11/xdm/authdir/A:0-3KmYhO
root 4758 0.0 0.0 3828 2620 ? S 05:49 0:00 \_ -:0
patrol 4784 0.0 0.0 169304 3392 ? Ss 05:49 0:00 \_ /opt/kde3.5/bash/bash /opt/kde3.5/bin/startkde
patrol 4876 0.0 0.4 23068 16428 ? S 05:49 0:00 \_ ksmserver
patrol 4878 0.0 0.3 25528 12980 ? Ss 05:49 0:00 kdeinit Running...
(proces 4878 má kompletní environment)
Nerozumím hlavně tomu, proč pod novým bashem je vidět proces start_kdeinit,
který při spuštění starým bashem vidět není a zřejmě tam opravdu není, neboť
PID s nižším číslem než kdeinit je opravdu přeskočen - byl tam a již zemřel.
Spouštěcí bash script (startkde) se přitom vůbec nemění, až na "magický
řádek", kde jsem přepsal původní #!/bin/sh (kde je teď nový bash) na
#!/opt/kde3.5/bash/bash, kde je pro funkcionalitu KDE udržován starý bash.
Ten start_kdeinit už není script, ale poctivý ELF. Přesto vidím, že on
ještě má environment kompletní (ten shell mu ho při volání tedy předá),
ale jím spuštěný kdeinit (opět ELF) už ho nemá. Divné, že ? Jak to, že ten
shell způsobí odlišné chování toho bináru?
Samozřejmě i ten starý bash se teď dynamicky linkuje ke glibc-2.25 a funguje,
z čehož soudím, že změna není v glibc, ale v bashi samotném.
Vzpomínám na SHELLSHOCK a řadu dalších vulnerabilit souvisícím s environmentem
a přemýšlím, zda toto není nějaká bezpečnostní featura, která v tomto případě
spíše škodí než pomáhá, a zda by se nedala pro tento účel nějak zablokovat.
Přeci jen mít tam starý bash jen kvůli startu KDE se mi nelíbí :-). Zdrojáky
od té 3.5 dosud mám, v případě potřeby mohu klidně rekompilovat ten
start_kdeinit (kde se to podle mne rozbije), ale nevím, co v něm změnit...
Mimochodem když si pak KDE volá další věci v shellu, používá se už ten nový
bash a ten perfektně chodí.
Zdraví Pavel
Další informace o konferenci Hw-list