Hlavní navigace

Jak funguje Spectre a Meltdown, Linux na Orange Pi a změna algoritmu DNSSEC

Petr Krčmář

Zápisky z prvního dne desátého ročníku konference InstallFest. Jak fungují chyby Spectre a Meltdown, jak se instaluje Linux na jednodeskový počítač Orange Pi a jak se mění algoritmus DNSSEC podpisů.

Doba čtení: 14 minut

Vojtěch Pavlík: Spectre a Meltdown – jak fungují a co s nimi

Všechno začalo v roce 1967, kdy Robert Marco Tomasulo vymyslel převratný algoritmus, který dnes známe jako Tomasulův algoritmus. Moderní procesory dokáží provádět více věcí najednou a zefektivnit svůj běh. Při zpracování instrukcí je tak možné mít rozpracovaných několik instrukcí v různých fázích. Problémem jsou ale skoky, protože nechceme zastavit plnění fronty, čekat na dokončení všech instrukcí a poté se podle výsledku rozhodnout.

V procesoru je tak implementována „křišťálová koule“, která zkouší hádat, jakou instrukcí se bude pokračovat. Pokud se trefím, můžu velmi rychle pokračovat v práci. Když se netrefím, musím připravený výpočet zahodit, ale nikdy na tom nebudu hůř než bez orákula. I náhodným výběrem bychom tak dosáhli navýšení výkonu, ale dnes se používají poměrně komplexní systémy schopné se učit a mají velmi vysokou efektivitu.

Velmi podobně se předvídají například nepřímé skoky nebo návraty pomocí return. Ty už nejsou omezeny jen na dva stavy, ale výsledkem je adresa skoku. Je tam tedy další prediktor, který podle adresy instrukce odhaduje adresu dalšího skoku. Takových prediktorů je procesor plný a umožňuje mu to dramaticky zvyšovat výkon.

Dalším důležitým prvkem je cache, která umožňuje eliminovat problémy s velmi pomalou systémovou paměti. Máme několik úrovní cache, která ví, zda danou položku v paměti má nebo ne. Tato paměť je malá, takže je potřeba v ní udržovat jen relevantní data a ta už nepoužívaná postupně zahazovat.

Pro pochopení Spectre a Meltdown je také potřeba vědět o tabulce stránek, která vytváří pro jednotlivé procesy virtuální paměťový prostor začínající vždy od nuly a pokračující lineárně až tam, kam daný proces potřebuje. Pokud tedy procesor potřebuje sáhnout do nějaké paměťové stránky, musí se podívat do tabulky stránek a najít si správnou adresu ve fyzické paměti. Při přepínání procesů se tak musí přepínat také tabulky stránek a kompletně toto mapování měnit. Aby se všechny tyto kroky urychlily, mají i tabulky stránek vlastní cache zvanou TLB. Tuto tabulku je ale potřeba vyprázdnit, pokud přepínáme kontexty a tedy i tabulky pamětí.

Toto vymazání cache je ale velmi pomalé, proto se tomu chceme vyhnout. Kdybychom to dělali milionkrát za sekundu při každém přepnutí mezi procesem nebo jádrem, nedělali bychom nic jiného. Proto byl vymyšlen takzvaný supervisor bit, který říká, že daná stránka paměti je platná pouze při přístupu z jádra (ring 0). Do paměti každé úlohy tak může být namapována také paměť jádra, protože je pro běžný proces stejně nepřístupná, ale po přepnutí do režimu jádra je možné v ní pracovat.

Po nutném úvodu už se přednáška věnovala chybě Spectre v1. Domnělý padouch nejprve zavolá mnohokrát jeden konkrétní syscall, kterým natrénuje procesorové „orákulum“. To se naučí, že daný syscall dopadne většinou dobře. Poté padouch vyprázdní cache a zavolá stejnou funkci s hodnotou, která by způsobila neprovedení funkce. Spekulativně se ovšem funkce znovu na pozadí provede a data se načtou do keše. Poté pomocí měření rychlosti přístupu do paměti zjistí, která stránka byla načtena. Problém je, že při zahazování výsledku spekulativního vykonávání se procesor nezbavuje všech získaných vedlejších informací. Linuxové jádro je proti tomuto útoku chráněno, protože odstranilo všechny funkce, na kterých je možné takto prediktor trénovat.

Spectre v2 zneužívá prediktor nepřímých skoků, který je opět možné natrénovat na skok do vlastní funkce. Tohle už není možné jednoduše opravit tím, že přepíšeme některé funkce v jádře. Tady je totiž možné zneužít jakékoliv nepřímé volání. Proto bylo nutné v Intelu připravit úpravu mikrokódu, aby se procesor choval jinak – omezil svou predikci. První takovou úpravou je IBRS, díky kterému začne procesor ignorovat záznamy prediktoru z ringu 3, tedy běžných procesů. V jádře se pak tato funkce zapne, čímž se omezí dopad predikce z uživatelského prostoru. To ale snižuje efektivitu predikcí v jaderném prostoru a v závislosti na aplikaci dojde ke ztrátě výkonu až o 20 %.

Navíc IBRS řeší problém Spectre v2 jen směrem od procesu k jádru. Pro ochranu mezi procesy je nutné kompletně výsledky prediktoru vymazat, k čemuž slouží funkce IBPB. To trvá také věčnost, ale naštěstí se mezi procesy přepíná ještě méně než mezi procesy a jádrem.

Protože se výsledný dopad na výkon programátorům nelíbí, byly vymyšleny retpolíny (return trampoline). Každý nepřímý skok je pomocí kompilátoru nahrazen pomocí return. Navíc zblbneme spekulaci tak, že ji chytíme do nekonečné smyčky. Tím se bráníme Spectre v2 a vykonávají se jen skutečné instrukce. Co se nám to ale stalo s instrukční sadou X86? Aby nebylo nutné překompilovat veškerý software, používá se kombinace všech těchto postupů. Navíc se tyto problémy týkají prakticky všech procesorů na světě, Intel, AMD, ARM a dalších.

Další problémy přicházejí s Hyper-threadingem, kdy jednotlivá vlákna sdílejí společný prediktor, takže je možné, aby se vzájemně otrávila. Intel proto v mikrokódu implementoval STIBP, což sice prediktory oddělí, ale zase to stojí hodně výkonu. Linuxové jádro proto bude tyhle věci řešit raději v plánovači, prostě nepustíme ve dvou vláknech vedle sebe dva procesy, které se mohou vzájemně otrávit.

Další legrace přichází s JIT, kdy je možné Spectre v1 i v2 využít k prolomení ven z interpreteru. Donutíme interpreter k vytvoření speciální sady instrukcí, můžeme donutit procesor ke spekulacím a poté si přečíst data z prohlížeče. Tenhle boj ještě není vyhraný, tvůrci prohlížečů se to snaží řešit například znepřesněním časovačů, ale ještě není konec. Možná se to někomu podaří obejít.

Tohle všechno je poměrně složité, mnohem jednodušší je využít útok typu Meltdown. Ten staví na tom, že procesory Intel řeší oprávnění, až když se spekulace ukáže jako oprávněná. Mělo se za to, že když se spekulativní kód nakonec nevyužije, vše se vrátí do původního stavu bez následků. Opět je ale možné měřit, zda se paměť během spekulativního provádění dostala do keše. U AMD tohle nehrozí, protože procesor kontroluje nastavení supervisor bitu včas.

Jediným řešením je se vzdát supervisor bitu a opět se vrátit k přepínání paměťových tabulek při každém syscallu. To znamená, že uživatelský proces vůbec nevidí jaderná data a nemůže do nich ani spekulativně. Je tedy potřeba zavolat INVLPG a vymazat keše. Měřili jsme to, jen samotné zavolání syscallu trvá čtyřikrát déle. Když jsme KPTI implementovali, lidi se ptali, proč tam máme něco tak pomalého. Až pak byly uvolněny informace o Meltdown.

Meltdown navíc funguje i ve virtualizaci, kontejnerech či v paravirtualizaci v Xenu. V KVM je to podobné, jednotlivé virtuály jsou v hostitelském systému jako procesy, takže se mohou ovlivňovat. Tam to ale řeší běžný patch s KPTI. Je potřeba ale záplatovat jádro jak na hostiteli, tak i uvnitř virtuálu, protože tam by se také mohly ovlivňovat jednotlivé procesy.

Lukáš Bařinka: Bash a strukturované programování

Lukáš Bařinka začal tím, proč vlastně programuje v Bashi. Jedním důvodem je stockholmský syndrom, prostě k něčemu přivyknete. Druhým důvodem je lenost, nechuť se učit něco dalšího. Jak program postupně roste, vzniká takzvaný špagetový kód. Tomu se chcete vyhnout, ukážeme si tedy, jak programovat strukturovaně, abychom se v tom v budoucnu vyznali.

Prvním tématem byly bloky příkazů, které je možné obalit pomocí kulatých či složených závorek. Kulaté spouští příkazy v subshellu, složené naopak příkazy provádí ve stejném shellu. Bloky příkazů je předstupeň pro funkce, také se jim někdy říká ‚nepojmenované funkce‘. Existuje několik způsobů, jak funkci definovat, jsou ale vlastně všechny ekvivalentní. Ksh přišel s vlastním zápisem, Bash přidal další. Ale je to vlastně jedno, nemusíte nad tím příliš přemýšlet. Důležité je, že funkce umožňují zjednodušit a zpřehlednit kód.

Funkce může končit prostě tím, že jdou příkazy. V tom případně funkce vrací návratový kód posledního příkazu. Pokud máme více výstupních bodů, můžeme použít trap a ošetřit vše pomocí jednoho příkazu return. Ať pak funkce končí kdykoliv a jakkoliv, skončí zavoláním vaší funkce.

Dále je možné funkcemi nahradit aliasy, pak je možné expandovat příkazy také uvnitř funkcí. Je to možné, ale není to vždycky elegantní. Můžete tím ale výrazně vylepšit například vestavěné funkce v shellu tím, že z nich uděláte funkci, ve které voláte původní příkaz.

Uvnitř funkcí se často používají řetězce příkazů, což přináší problémy s předáváním návratové hodnoty některého z příkazů uvnitř řetězce. Můžeme pak použít nastavení set -o pipefail, díky které bude návratovou hodnotou celé funkce hodnota vrácená posledním příkazem, který dopadl neúspěšně. Z návratové hodnoty funkce se tak nedozvíme jen výsledek posledního příkazu, který nemusí být pro funkci podstatný, ale dozvíme se o problému v průběhu provádění funkce.

Při ladění funkcí se hodí změnit nastavení debugovacích režimů. Pomocí set -o functrace se zařídí, že se nastavení režimu dědí i v dalších funkcích. Pokud to nechceme nastavovat globálně, můžeme použít declare -tf f_name, kdy můžeme vyjmenovat jen funkce, u kterých chceme volat debugovací funkce. Na příkladu pak bylo ukázáno použití trasovacích funkcí pomocí vlastní knihovny.

Petr Stehlík: Instalace Linuxu na Orange Pi

Všichni znají Raspberry Pi, ale to není ani nejlevnější ani nejvýkonnější počítač do dlaně. Číňané ale začali velmi rychle vytvářet různé klony jako Banana, Orange, Neo, Odroid a další. Uvnitř se velmi liší, používají nejrůznější čipsety od různých výrobců. Protože nad tím ale běží Linux, je to pro uživatelé překryté jednotnou vrstvou. Petr Stehlík preferuje počítače Orange Pi a přivezl tři různé varianty: Zero, One a PC Plus.

Hardware Orange Pi je velmi výkonný a má 1 GB RAM. Srdcem je AllWinner H3, který dokáže přehrávat video ve 4K UHD rozlišení. Disponuje Ethernetem, mikrofonem, IR senzorem a dalšími rozhraními.

Pokud jsme si vybrali hardware, je na řadě operační systém. Základem je samozřejmě linuxové jádro, nad ním ale můžeme spustit Android nebo GNU. Když chcete Android, chcete ten z H3droid.com, na stránky výrobce vůbec nechoďte. Pokud budete chtít klasický linuxový systém, chcete Armbian. Ve skutečnosti je to Debian, stejně jako Raspbian. Takže všechny návody pro Raspberry Pi jsou platné i tady.

Petr Stehlík rozhodně doporučuje začít tím, že použijete silný zdroj 5V napětí, který zajistí stabilitu počítače. To je nejčastější problém, který lidé mají. Ono to totiž svádí použít napájení po USB z počítače. Orange Pi má i klasický napájecí konektor, do kterého je možné připojit originální napájecí zdroj.

Dalším krokem je koupě kvalitní a rychlé microSD karty, na kterou zapíšeme instalační obraz Armbianu. Poté stačí už jen připojit monitor pomocí HDMI, připojit klávesnici a myš a nabootovat. Vybrat si můžeme ze dvou různých linuxových jader, staré jádro 3.4 dodávané výrobcem podporuje všechny vlastnosti desky včetně akcelerace, naopak nejnovější jádro 4.14 podporuje více připojeného hardware, ale nefunguje na něm grafika Mali. Pokud chcete desktop, použijte určitě staré jádro, na serveru vám ale grafika chybět nebude a oceníte naopak nejnovější jádro.

Před prvním startem systému je možné vstoupit do takzvané „nouzové počáteční konfigurace“. To se hodí v případě, že potřebujete například zadat heslo Wi-Fi sítě. Kartu po zapsání vložíte do funkčního počítače a tam v adresáři /boot upravit soubor armbian_first_run.txt a přidat do něj vlastní volby.

Po prvním startu má root heslo 1234 a systém si ihned vynutí změnu hesla. Poté si založíte nového uživatele a systém se rozšíří na celý volný prostor paměťové karty. Pak se začnou automaticky instalovat aktualizace. To je důležité, většinu lidí vyleká, že je po startu jejich nový počítač tak pomalý. Další konfigurace se pak provádí pomocí příkazů armbian-config  – klávesnice, prostředí, časová zóna, rozlišení, konfigurace GPIO a mnoho dalšího. Pokud je potřeba změnu udělat ve vypnutém systému, je možné editovat soubor  /boot/armbianEnv.txt.

V provozu pak uživatele často trápí to, že jim odchází paměťové karty. Obvykle se radí změnit výrobce, koupit kvalitnější kartu a podobně. Není to ale tím. Problém je, že karty jsou stavěné na provoz ve fotoaparátu, kde se zapisuje poměrně málo, velké soubory a neustále za sebou. V Linuxu se ale zapisuje často a velmi intenzivně mnoho malých souborů. Existují dvě řešení: omezit počet zápisů pomocí overlayroot nebo systém nainstalovat do vestavěné eMMC nebo na externí pevný disk. Kartu ale ani v tomto případě nevytahujte, používá se stále pro boot.

Tomáš Hála: Jak jsme měnili DNSSEC algoritmus u 150 000 domén

Tomáš Hála už o DNSSEC přednášel na InstallFestu v roce 2010, kdy už Active 24 bylo v této oblasti pionýrem a mělo podepsaných všech 90 tisíc spravovaných domén. V té době jsme už jako Česká republika byli na špici, předběhli jsme i Švédsko a měli jsme podepsaných 15 % domén. Je to hodně nebo málo? Už v té době měl DNSSEC řadu problémů, například používal starý algoritmus RSASHA1 a umožňoval takzvaný zone walking, kdy pomocí NSEC záznamu bylo možné přečíst celý obsah zóny.

Firma se proto později rozhodovala, jak přejít na moderní algoritmus ECDSA. Chtěla přitom používat co nejmenší klíče, tím zmenšit velikost zón a zároveň DNS odpovědi. Dalším důvodem je i rychlost podepisování, u moderních algoritmů můžete používat kratší klíče a zachovat přitom stejnou bezpečnost. Otázkou ovšem je, jestli nové algoritmy podporují také validátory, které musí podpisy na straně uživatelů ověřovat. Podle APNIC Labs se v České republice počet validujících resolverů pohybuje okolo 50 % bez výrazných rozdílů u použitých algoritmů.

Firma se samozřejmě obávala, aby při změně algoritmu nedošlo k problémům a nepřestaly se resolvovat některé domény. Konzultovali jsme proto s CZ.NIC a dozvěděli jsme se, že máme dát pozor hlavně na starší verze Unbound a dnsmasq. Ty ale neovlivníme, protože je neprovozujeme. Můžeme se na ně ale připravit. Výsledkem konzultací byl postup o více než deseti krocích, které bylo potřeba všechny projít: vygenerovat klíče, podepsat, počkat na TTL, zveřejnit nové klíče, opět počkat na TTL a tak dále. Na našich serverech je povolené TTL až na jeden měsíc, takže jsme museli opravdu dlouho čekat.

Přechod byl postupně prováděn na konci roku a mezi svátky byly všechny domény znovu podepsány, po přelomu roku pak byl klíč skutečně vyměněn. Tím se algoritmus ECDSA stal nejpoužívanějším v doméně .CZ. Na našich autoritativních serverech tím klesl datový tok přibližně na polovinu, protože se nám významně zmenšila velikost přenášených podpisů. Celý proces se podařil udělat tak dobře, že si nikdo nestěžoval, ale ani nikdo neděkoval. Nic jsme nerozbili, takže si toho vlastně nikdo ani nevšiml.

Tomáš Vondra: Jak se zabydlet na virtuálním serveru

Virtuální Privátní Server (VPS) je obvykle pod správou uživatele a je na něm, aby se o něj starat. Když si server objednáte, dostanete obvykle jen holou instalaci linuxové distribuce a musíte se postarat o všechno ostatní. Uživatel se pak stává správcem serveru, musí ho aktualizovat, monitorovat a provozovat na něm kýžené služby.

VPS je z obchodního hlediska služba pronájmu výpočetních prostředků, nabízí jednoduché účtování a cenově je to služba dnes dostupná všem. Ne každý dnes potřebuje plný výkon celého serveru, výrobci se snaží stále svůj hardware prodávat za stejnou cenu a zvyšuje se výkon. Potřeby uživatelů jsou ale stále přibližně stejné. Pokud uživatel potřebuje provozovat jen nějakou malou běžnou službu, nepotřebuje kupovat a živit celý server.

Alternativou k privátnímu serveru je server sdílený, o který se stará někdo jiný. Typickým příkladem je webhosting, kde jste ale omezeni tím, co je vám schopen a ochoten provozovatel ve sdíleném prostředí nabídnout. V privátním serveru vás neomezuje předem dané prostředí a máte lepší kontrolu nad výkonem. Nakonec tak vlastně i víte, že dostanete to, za co zaplatíte. Na druhou stranu u webhostingu je výhodou to, že se o bezpečnost stará někdo jiný. Ovšem i u webu musíte zařídit zabezpečení webové aplikace samotné. Když už se o to staráte, proč se rovnou nestarat o svůj virtuál a nenaučit se něco nového?

Na běžné VPS je například možné provozovat web server, mail server, souborové úložiště, telefonní ústřednu, VPN koncentrátor nebo třeba virtuální desktopy. Desktopy obvykle používají uživatelé Windows, ne že by to na Linuxu nešlo, ale kdo chce desktop, chce obvykle Windows.

Po objednání VPS obvykle dostaneme informace o novém serveru: IP adresu, uživatelské jméno a heslo. Neděste se toho, když nedostanete heslo k uživateli root. Obvykle se z bezpečnostních důvodů doporučuje vypnout možnost přihlášení roota a musíte se na něj dodatečně přepnout. Doporučuje se proto přihlásit jako běžný uživatel a poté přepnout dočasně roli pomocí  sudo.

Nejčastějším bezpečnostním incidentem je podle Vondry útok na slabé heslo. My posíláme klientům krásné náhodné heslo a oni si ho často změní na něco triviálního, co se dobře pamatuje. Do druhého dne pak server nepatří jim. Je proto potřeba heslo volit obezřetně a bezpečně, aby nebylo možné heslo snadno automatizovaně uhádnout. Ještě lepší variantou je ale používat přihlašování pomocí klíčů, které zamezují prostému hádání hesla. Používá se tu asymetrická kryptografie, privátní klíč má klient u sebe, na serveru je jen veřejná část. Podle ní se ověří, že má uživatel právo se k danému serveru připojit.

Pokud už máme server ve správě, nesmíme zapomínat na pravidelné aktualizace. V každém software jsou postupem času objevovány bezpečnostní chyby a vývojáři je opravují. Vy musíte dbát na aktualizaci, abyste na server dostali aktuální verze software.

Našli jste v článku chybu?