Skocz do zawartości

Cannot Restore Segment Prot After Reloc


gajownik

Rekomendowane odpowiedzi

Jeśli podczas uruchamiania aplikacji widzisz podobny komunikat do tego:

[y4kk0@X ~]$ /usr/local/seamonkey/seamonkey
LoadPlugin: failed to initialize shared library /usr/local/seamonkey/plugins/libflashplayer.so [/usr/local/seamonkey/plugins/libflashplayer.so: nie można odtworzyć ochrony segmentu po relokacji: Brak dostępu]
[y4kk0@X ~]$ LANG=en_US.UTF-8 /usr/local/seamonkey/seamonkey
LoadPlugin: failed to initialize shared library /usr/local/seamonkey/plugins/libflashplayer.so [/usr/local/seamonkey/plugins/libflashplayer.so: cannot restore segment prot after reloc: Permission denied]
[y4kk0@X ~]$

to oznacza to, iż SELinux blokuje dostęp do danej biblioteki.

 

Dana biblioteka zawiera relokacje w segmencie programu [1]. Wyczerpujące wytłumaczenie tego zagadnienia można znaleźć w poniższych linkach:

http://thread.gmane.org/gmane.linux.gentoo.devel/33992 (szczególnie ten post → http://article.gmane.org/gmane.linux.gento...too.devel/34037 )

http://people.redhat.com/drepper/dsohowto.pdf

 

By przekonać się czy program naprawdę posiada owe relokacje, należy wydać komendę podobną do tej:

[y4kk0@X ~]$ eu-readelf -d /usr/local/seamonkey/plugins/libflashplayer.so | grep TEXTREL
 TEXTREL
[y4kk0@X ~]$

W przypadku poprawnie skompilowanej/napisanej biblioteki nie otrzymamy żadnego wyniku. Zawsze też można skorzystać z polecenia eu-findtextrel.

 

W wielkim skrócie TEXTREL powodują większe zużycie RAMu oraz zmniejszają bezpieczeństwo systemu (możliwość zmiany kodu programu przez włamywacza wykorzystującego lukę w programie).

 

Standardowo SELinux blokuje możliwość użycia tak błędnie skompilowanych/napisanych obiektów. W logach (/var/log/messages albo /var/log/audit/audit.log) pojawia się wtedy takie zgłoszenie AVC informujące o blokowaniu execmod:

Mar 31 20:33:11 X kernel: audit(1143829991.881:101): avc:  denied  { execmod } for  pid=16258 comm="seamonkey-bin" name="libflashplayer.so" dev=hda5 ino=842302 scontext=user_u:system_r:unconfined_t:s0 tcontext=user_u:object_r:usr_t:s0 tclass=file

Jeśli chcemy pozwolić na relokacje w segmencie programu danej biblioteki, należy wydać polecenie:

chcon -t textrel_shlib_t nazwa_pliku

Nadaje to plikowi odpowiedni kontekst bezpieczeństwa. W przypadku linków symbolicznych trzeba podać jako parametr plik, na który ten symlink wskazuje.

 

Można też pozwolić na relokacje w segmencie programu we wszystkich bibliotekach (stanowczo odradzane!):

setsebool -P allow_execmod=1

 

Jeśli ktoś czuje się na siłach, to może poprawić taki program. Warto zapoznać się z tymi dokumentami:

http://people.redhat.com/drepper/selinux-mem.html

http://www.gentoo.org/proj/en/hardened/pic-guide.xml

http://www.gentoo.org/proj/en/hardened/pic...c-internals.xml

http://www.gentoo.org/proj/en/hardened/pic...c-fix-guide.xml

 

Mała uwaga: gcc posiada pewien błąd, który powoduje textrels w niektórych programach napisanych w C++ → https://bugzilla.redhat.com/bugzilla/show_b...g.cgi?id=175442

 

W przypadku zamkniętych programów należy problem zgłosić producentowi.

 

[1] Ze zrozumienem czym są segmenty może pomóc również ta strona → http://www.theparticle.com/cs/bc/os/elfpecoff.html

Odnośnik do komentarza
Udostępnij na innych stronach

Gość
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
×
×
  • Dodaj nową pozycję...