Hlavní navigace

Hackování portů v OpenBSD aneb porušujeme pravidla

22. 3. 2016
Doba čtení: 11 minut

Sdílet

Porty jsou geniální systém pro kompilaci software, téměř nepřekonatelný. Co ale dělat, když potřebujeme funkci, kterou nenabízejí? Opravdu ji nenabízejí? Možná, kdybychom trochu…

Co to jsou porty

OpenBSD stejně jako ostatní deriváty Berkeley Software Distribution používá porty. Je to vlastně stromový adresář plný odkazů, informací o závislostech a speciálních záplat, které umožňují stáhnout a zkompilovat bez problému software třetích stran. Ačkoli vývojáři OpenBSD doporučují použití balíčků, porty jsou plně funkční.

Trocha teorie nikoho nezabije

Než se pustíme do hackování, dovolím si popsat, jak to vše funguje standardně. Porty, jako systém se ve větvi „current“, neustále vyvíjí a mění. Několik týdnů před vydáním nové verze OpenBSD se vyhlásí stav „freeze“ a už se jen opravují chyby. Potom se z verze current vezme snapshot odladěný pro verzi základního systému nejbližšího vydání a ten se už nebude měnit. V důsledku toho získáváte extrémně stabilní vydání, ovšem se zastarávajícím software.

Oficiálně je pro určité vydání určité verze OpenBSD použitelný pouze a jedině systém portů pro dané vydání určený. Lidsky řečeno, k verzi 5.8 pasují jenom porty z instalačního adresáře 5.8. Všimněte si, že o architektuře nebyla řeč. Je to proto, že porty obsahují zdrojový kód, a zkompilují se pro danou architekturu až na stroji, kde sestavení spustíte.

Kde je vzít

Porty jsou vlastně jen adresář plný adresářů a souborů. Můžete si ho stáhnout přes ftp/http jako tar balík a rozbalit do adresáře /usr, kam patří, anebo použít cvs.

1. Instalace z tarového balíku:

ftp ftp://ftp.openbsd.org/pub/OpenBSD/5.8/ports.tar.gz
sudo tar -xzf ports.tar.gz -C /usr

2. Druhá varianta je pomalejší, ale funguje skvěle a případný update stable verze portů je pak jednodušší, protože netřeba exportovat znovu název serveru. Pozor, pochopitelně, název za přepínačem „-r“ tzn. OPENBSD_5_8 je pro vydání 5.8, až vyjde 5.9, bude to OPENBSD_5_9, a až vyjde 6.0, bude to OPENBSD_6_0  atd.

# cd /usr
# cvs -qd anoncvs@anoncvs.ca.openbsd.org:/cvs get -rOPENBSD_5_8 -P ports

Řekni „make“ a vejdi!

Spíše než tahle parafráze slavného nápisu z Morie by se mělo říci: Vejdi a řekni „make“. Když chcete nainstalovat určitý software vstoupíte do „portu“ daného programu a jako root spustíte make, případně rovnou make install. Celý proces se rozběhne automaticky a pojede tak dlouho, dokud nezkompiluje vše, co je třeba pro běh daného programu, a nakonec vlastní program, který jste zvolili. Vypadá to takto:

# cd /usr/ports/editors/libreoffice
# make install

Pokud nechcete, aby se vám rychle zaplnil diskový oddíl se stromem portů, je dobré po instalaci spustit také (a nejlépe přímo v nejvyšší adresářové úrovni portů) příkaz

# make clean

Příklad, který jsem uvedl, byl pochopitelně žert – kompilace LibreOffice by byla na dva dny a chtělo by to asi dvacet gigabytů prostoru, porty se uplatní spíše v jiném případě. Nejtypičtější použití je software, který se v binární podobě nesmí distribuovat, anebo neladí s licencí OpenBSD. Pokud budeme mluvit o populárním software, tak dříve pomocí emulace Linuxu bylo možno například zkompilovat flash-plugin, nebo operu. Ale i dnes najdete případy, které se jako balíčky nedistribuují, například truetype fonty Microsoftu.

Hledání správného software

Abyste v portech našli správný software doporučuji stránky www.openports.se, které nabízejí vyhledávání i velmi přehlednou strukturu dostupného software pro OpenBSD. Pokud webový prohlížeč v dané chvíli nemáte k ruce, anebo stránky mají výpadek, můžete si poradit ještě i jinak. Řekněme, že chceme vědět, kde se nachází Firefox.

$ cd /usr/ports
$ grep "^firefox" INDEX | awk -F\| '{print $2}'
.
.
www/firefox-i18n/sr
www/firefox-i18n/sv-SE
www/firefox-i18n/ta
www/firefox-i18n/te
www/firefox-i18n/th
www/firefox-i18n/tr
www/firefox-i18n/uk
www/firefox-i18n/vi
www/firefox-i18n/zh-CN
www/firefox-i18n/zh-TW
www/mozilla-firefox

Pokud chceme podrobnosti, zkusíme to takhle:

$ make search key=firefox
.
.
.
Port:   firefox-42.0
Path:   www/mozilla-firefox
Info:   Mozilla web browser
Maint:  Landry Breuil <landry@openbsd.org>
Index:  www lang/python
L-deps: STEM->=0.10.38:devel/gettext STEM->=3.20.1:security/nss STEM->=4.10.10:devel/nspr converters/libiconv textproc/hunspell textproc/icu4c x11/gtk+2
B-deps: STEM->=0.10.38:devel/gettext STEM->=2.3:archivers/zip STEM->=3.5.20140228p27:devel/llvm archivers/gtar archivers/unzip archivers/xz devel/autoconf/2.13 devel/gettext-tools devel/gmake devel/metaauto devel/yasm lang/python/2.7 multimedia/gstreamer1/plugins-base
R-deps: STEM->=0.10.38:devel/gettext devel/desktop-file-utils
Archs:  amd64 arm i386 powerpc sparc64

Flavors – Volby pro kompilaci

Jedním z důvodů, proč použít porty a ne balíčky, je i volba při kompilaci. Tak například pokud chcete používat určitý software s podporou mysql, nainstalujete si normálně balíčkem muj_software-mysql-verze-X.Y.pkg, když chcete s podporou postgressql, nainstalujete si muj_software-pgsql-verze-X.Y.pkg, ovšem když z nějakého důvodu potřebujete zásuvku pro obě databáze, možná už danou verzi zabalíčkovanou nenajdete. A tak si sami nastavíte volby kompilace. Vstoupíte do adresáře, kde jsou soubory pro instalaci vašeho software /usr/ports/net/muj_software a nastavíte proměnnou FLAVORS. Následně spustíte kompilaci. Abyste zjistili, které volby kompilace jsou pro daný software k disposici, napíšete v daném adresáři pokyn make show=FLAVORS. Hezky je to vidět třeba u Postfixu.

# cd /usr/ports/mail/postfix/stable
# make show=FLAVORS
sasl2 ldap mysql pgsql db4

a s vybranou volbou instalujete takto

# env FLAVORS="mysql sasl2 pgsql" make install

V portech můžete kombinovat různé volby viz výše uvedený příklad (ačkoli uznávám, že zrovna toto není běžné), přičemž v balíčcích máte k dispozici jen omezený výběr:

# pkg_info -Q postfix
postfix-3.0.2
postfix-3.0.2-ldap
postfix-3.0.2-mysql
postfix-3.0.2-pgsql
postfix-3.0.2-sasl2
postfix-3.0.2-sasl2-ldap
postfix-3.0.2-sasl2-mysql
postfix-3.0.2-sasl2-pgsql

Zakázané ovoce

Všechno, co píšu dále, je v rozporu s bezpečnostní politikou OpenBSD a skutečně vám výrazně nedoporučuji nic z toho zkoušet na produkčních strojích. Můžete si tím způsobit nedozírné škody v systému.

Pokud vývojáři OpenBSD nedoporučují používat porty, ale balíčky, potom používání jiných verzí portů přímo vylučují. Mají pro to jistě své důvody, ale běžný uživatel může mít také své důvody pro to, aby si zkompiloval to, co potřebuje.

Když jsem poprvé nainstaloval OpenBSD na svůj stroj, už jsem měl několikaleté zkušenosti s NetBSD, a tudíž mi vrtalo hlavou, proč by nemělo jít sestavit balíček z verze 5.8 oproti kernelu a základnímu systému z 5.9 nebo 5.7. Pochopitelně moje zvědavost vedla k experimentům, které dopadly velmi různě.

V některých verzích takové opičárny provést jdou, v jiných nejdou. Nezávisí to ani tak na verzích programů, protože většinu software můžete zkompilovat proti jinému softwaru v různých verzích. Největší brzdou jsou nástroje pro kompilaci, a také měnící se syntax portů. Několikrát jsem zažil, že syntax portů se změnila tak, že se akce velmi zkomplikovala. A změna verze kompilačních nástrojů, to je už úplná stopka. Když byste totiž upgradovali kompilační sadu pomocí aktualizace zdrojáku base (což jde), nesestavíte už většinou ostatní balíčky z původní verze portů, obsahující pro změnu zastaralé volby nebo syntax. Navíc strom current je nestabilní, takže možná nesestavíte už vůbec nic…

Go M1k3y Go!

Dovolil jsem si vypůjčit hackerské jméno od Doctorowa, snad je to povolené, pokud ne, tak je to minimálně pwned. Nyní prosím skutečné hackery a všechny „céčkové“ programátory, aby byli tak hodní a dál nečetli. Jste stále se mnou? Dobře, ale připomínám, varoval jsem vás, to, co přijde, není košer. Existují minimálně dva způsoby, jak se dopracovat k vyšší verzi software, který potřebujete.

Varianta 1

Jeden způsob je, že si do vedlejšího adresáře rozbalíte například porty z novějšího vydání a z nich přesunete adresář vybraného programu do existujících portů. Čili například takto: Předpokládejme, že máte porty pro poslední oficiální vydání nainstalovány v / usr/ports.

$ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/ports.tar.gz
$ tar -xzvf ports.tar.gz -C /home/m1k3y
$ su -
# mv /usr/ports/www/minitube /usr/ports/www/minitube.orig
# cp -r /home/m1k3y/ports/www/minitube /usr/ports/www
# cd /usr/ports/www/minitube
# make

Potom si otevřete pivo a podíváte se na jednu epizodu Červeného trpaslíka, až to dokoukáte, prohlédnete si výsledek, (který nikdo nikdy nedokáže předpovědět). Když make doběhne úspěšně, přijde chvíle k odebrání stávající verze:

# pkg_delete minitube

a můžeme instalovat:

# make install

A je to, nová verze minitube perfektně ladící s vaším systémem vám vesele promítá oblíbené video a hudbu (bez reklam) z YouTube.

Varianta 2

Pak je tu druhá možnost, jak získat novější port a ta se mi zdá elegantnější. Netřeba toho tolik stahovat a přesouvat. Vtip je v tom, že přes cvs aktualizujete právě jeden vámi vybraný port. Pokud nemá moc závislostí, většinou se sestaví. S Firefoxem jsem úspěšný tak na 50 % (ten chce většinou zvednout ještě verzi libxml nebo nss a občas třeba i přidat nějaké další). Zatím 100% úspěšnost má update minitube, tam velmi často dochází pouze k malé změně kódu. Pro zábavu vám ale celý postup ilustruji na příhodě poměrně nedávné.

Ve verzi Qemu distribuované s OpenBSD 5.8 je ošklivý bug, který při nečinnosti anebo naopak vysoké IO zátěži vyplivne chybu a zasekne virtuální stroj. Ale já jsem potřeboval Qemu plně funkční, takže jsem se do toho pustil:

# cd /usr/ports/emulators/qemu
# cvs -qd anoncvs@anoncvs.ca.openbsd.org:/cvs  up -Pd
P Makefile
U patches/patch-hmp_c
U patches/patch-hw_acpi_core_c
P patches/patch-hw_net_e1000_c
P patches/patch-hw_net_ne2000_c
P patches/patch-hw_net_vmxnet3_c
U patches/patch-hw_net_vmxnet_tx_pkt_c
U patches/patch-hw_nvram_fw_cfg_c
U patches/patch-hw_scsi_megasas_c
P patches/patch-hw_usb_hcd-ehci_c
# make

V tu chvíli, kdy se rozběhlo ‚make‘ a já jsem viděl, že začíná instalovat nové závislosti, obzvláště věci okolo knihoven USB, bylo mi jasné, že změny proběhly značné a nebude to tentokrát asi bez ztráty kytičky. Kupodivu make doběhlo úspěšně. Zrada čekala až za rohem. Odebral jsem současnou zabugovanou verzi Qemu a s nepříjemným pocitem jsem napsal pokyn k instalaci a stiskl enter… předzvěst nezklamala.

# pkg_delete qemu
qemu-2.2.1p10: ok
Read shared items: ok
#
# make install
===>  Faking installation for qemu-2.2.1p18
install -d -m 755 /usr/ports/pobj/qemu-2.2.1/fake-i386
gmake  BUILD_DIR=/usr/ports/pobj/qemu-2.2.1/qemu-2.2.1 -C aarch64-softmmu V="1" TARGET_DIR="aarch64-softmmu/" all
.
.
.
 -W png.17.2
 -W pthread.19.0

*** Error 1 in . (/usr/ports/infrastructure/mk/bsd.port.mk:3247 'wantlib-args')
*** Error 1 in . (/usr/ports/infrastructure/mk/bsd.port.mk:1959 '/usr/ports/packages/i386/all/qemu-2.2.1p18.tgz')
*** Error 1 in . (/usr/ports/infrastructure/mk/bsd.port.mk:2511 '_internal-package')
*** Error 1 in . (/usr/ports/infrastructure/mk/bsd.port.mk:2491 'package')
*** Error 1 in . (/usr/ports/infrastructure/mk/bsd.port.mk:1972 '/var/db/pkg/qemu-2.2.1p18/+CONTENTS')
*** Error 1 in /usr/ports/emulators/qemu (/usr/ports/infrastructure/mk/bsd.port.mk:2491 'install')

Tak a konec…

M1k3y to nevzdává

Ne. Takhle hacking nekončí. Vzorný programátor by si nastudoval v cvs logu změny, prohlédl chybové hlášky, upravil by port a začal by znovu, ovšem ne každý se vyzná v kompilaci a ne každému se chce přepisovat port. Naštěstí, jak už se jednou software na OpenBSD úspěšně sestaví, většinou funguje. Instalátor v portech je velmi „přísný“ a kontroluje přesné názvy vygenerovaných souborů včetně dokumentace. Není vyloučeno, že se starší verzí portů vypadá výsledek malinko jinak, ale to neznamená, že je software nefunkční, nebo polofunkční.

Předtím, než porty nainstalují zkompilovaný software provedou test instalace a kontrolu do testovacího adresáře. V našem případě celý test instalace probíhá (jak je vidět i z chybové hlášky výše) do adresáře /usr/ports/pobj/qemu-2.2.1/fake-i386/. V tom adresáři se vygeneruje falešný strom se všemi knihovnami ba i dokumentací, a až když instalátor nalezne vše, jak předpokládal, překopíruje celý strom do /usr/local. Takže pokud ve chvíli neúspěšné instalace chceme zjistit, zda i tak program funguje správně, prostě ho spustíme z lokace  /usr/ports/pobj/qemu-2.2.1/fake-i386/usr/local/bin.

A voilá! Program běží jak má a nic už se nezasekává! V tom případě přichází nerudovské dilema kam s ním. Hacker typu „čuňas“ nakopíruje soubory do /usr/local k ostatním programům třetích stran a pokračuje, jako by se nechumelilo. To ovšem může přinést nepříjemnosti, pokud ne při běhu, tak při příštím upgrade systému, protože do /usr/local patří registrované balíčky. Proto lepší variantou je držet se posixových standardů. Čili nakopírovat software z /usr/ports/pobj/qemu-2.2.1/fake-i386/usr/local  do /opt/m1k3y/, čili qemu bude nyní jakožto /opt/m1k3y/usr/local/bin/qemu, a do proměnné PATH se přidá /opt/m1k3y/usr/local/bin.

# mkdir -p /opt/m1k3y
# mv /usr/ports/pobj/qemu-2.2.1/fake-i386/* /opt/m1k3y/
# export "PATH=$PATH:/opt/m1k3y/usr/local/bin"

a kontrola:

# env |grep PATH
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/sbin:/usr/local/bin:/opt/m1k3y/usr/local/bin
# which qemu-system-i386
/opt/m1k3y/usr/local/bin/qemu-system-i386

Nakonec přidáme řádku export "PATH=$PATH:/opt/m1k3y/usr/local/bin" do ~/.profile, případně do /etc/profile nebo do jiného umístění ve formě odpovídající shellu, který používáte, abychom zajistili, že cesta bude permanentně načítána. Pochopitelně uděláte to samé s jakýmkoli jiným programem, qemu bylo použito jen jako zábavný příklad. (V případě qemu-system-i386 bude vždy nutné spouštět program s celou cestou, aby proběhlo správné načtení biosu a některých dalších souborů, u drtivé většiny jiných programů, jako třeba qemu-img samozřejmě stačí cesta relativní.)

Slovo závěrem

Používání portů, jak jsem ho popsal, za účelem získání aktuálního software tam, kde potřebujeme, je zcela proti principům OpenBSD a není v souladu s doporučenými postupy. Je stále třeba mít na mysli, že to není metoda stoprocentní ani zaručeně ověřená a že tím můžeme v systému za určitých podmínek udělat škody. V žádném případě ji nikomu nedoporučuji, ale mohu zodpovědně říci, že ji zcela nezodpovědně důsledně používám.

root_podpora

K O N E C

Nebo ještě ne konec?

Příště se chci věnovat tématu poměrně neznámému ve světě linuxovém, a to je bezpečnost ve stylu OpenBSD. Je to legenda anebo skutečnost?

Zdroje

Byl pro vás článek přínosný?

Autor článku

Petr Topiarz vystudoval angličtinu a pracuje jako systémový administrátor v jedné pražské IT firmě.