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