Co to znamená
curl … | sh je tak dobrý, jak dobré je to, co skript dělá s tím, co stahuje. Tento, v pořadí: určí stroj a nepodporovaný odmítne jménem; čte metadata releasu přes HTTPS a každou hodnotu, kterou z nich vezme, porovná s tvarem, který musí mít; zkontroluje URL artefaktu proti hostiteli releasů tohoto projektu; před rozbalením čehokoli ověří SHA-256 a velikost proti metadatům; odmítne archiv obsahující absolutní cestu, průchod .., symbolický či pevný odkaz, zařízení nebo jakoukoli položku mimo vlastní adresář archivu; rozbalený nástroj jednou spustí z dočasného umístění a vyžaduje, aby ohlásil verzi, která byla určena.
Teprve potom se launcher nahradí přejmenováním. Každé selhání před tímto bodem nechá předchozí instalaci přesně tak, jak byla, a řekne to.
Princip
Chování je share/install/install.sh.in; platformní fakta, která potřebuje, jsou generovaná oblast uvnitř. sudo se nevyskytuje nikde: cíl, do kterého nelze zapisovat, je pojmenován, nikoli povýšen. Neexistuje cesta varuj-a-pokračuj — nesoulad otisku zahodí stažení a zastaví se.
Jak to vidět
curl -fsSL https://majordomus.dev/install.sh | sh -s -- --dry-run
bash test/run.sh 85_installer
Případ sestaví skutečný archiv ze stromu, v němž jste, servíruje skutečná metadata přes skutečné spojení, nainstaluje je a pak je napadne: poškozený digest, zkrácené stahování, archiv, který se rozbalí mimo vlastní adresář, archiv nesoucí symlink na /etc/passwd, spustitelný soubor hlásící jinou verzi, nezapisovatelný cíl a release, který neexistuje. Po každém vyžaduje, aby dříve nainstalovaný nástroj stále běžel a hlásil vlastní verzi.
Co nepokrývá
Kontrolní součty vážou artefakt na jeho metadata; neprokazují, kdo metadata napsal. Důvěryhodné zůstává, že GitHub Pages poskytují tato metadata, GitHub Releases poskytují artefakty a pipeline vytvořila obojí. Každý archiv je navíc atestován release workflow a instalátor tuto atestaci ověří, když je GitHub CLI nainstalováno a přihlášeno — jinak řekne, že ověřil jen kontrolní součet. Odmítnutá atestace není fatální, pokud o to nepožádá MAJORDOMUS_REQUIRE_PROVENANCE=1, protože GitHub odpoví stejně na archiv starší než atestace i na podvržený; docs/DISTRIBUTION.md uvádí, co každá cesta ověřuje.
Proč existuje
Způsob selhání instalátoru není, že selže. Je to, že napůl uspěje: částečně zapsaná binárka tam, kde byla funkční, nebo archiv, který cosi rozbalil do adresáře, na který se nikdo nepodíval. Obojímu zabrání stejná disciplína — nejdřív ověřit, připravit vedle, vyměnit atomicky — a obojí se testuje tím, že se to dělá.