Přeskočit na obsah

Tato stránka byla automaticky přeložena z angličtiny, jediného jazyka, ve kterém se tento web píše. Číst originál.

Instalátor ověří digest artefaktu a zkontroluje jeho archiv dříve, než se cokoli rozbalí, a jakékoli selhání ponechá předchozí instalaci funkční

curl … | sh je jen tak dobré, jak dobré je to, co skript dělá s tím, co stáhne. Tento v

deklarovaný stavdeklarovaný stav: zaručeno Deklarováno jako deterministické a blokující, implementováno a s uvedeným behaviorálním testem, který to má dokázat. Zda to zaznamenaný běh podporuje, říká verdikt důkazů zobrazený vedle.

zaznamenané důkazyzaznamenané důkazy: nespuštěno Deklarováno jako zaručené, ale nepodložené zaznamenaným během: test je pojmenován, ale žádný úspěšný běh nad současnými vstupy zaznamenán není. jak se zaznamenávají důkazy

Špatný digest, useknuté stažení, archiv, který uniká ze svého adresáře nebo nese odkaz, a spustitelný soubor, který hlásí jinou verzi, se každé odmítnou pojmenovaně, ještě než se launcher nahradí. Neexistuje cesta varuj-a-pokračuj a sudo se nevyskytuje nikde.

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á.

Detail vykreslený z docs/claims/installer-verifies-before-installing.md.

Od tvrzení k důkazu

  1. 1 · veřejné tvrzení

    Instalátor ověří digest artefaktu a zkontroluje jeho archiv dříve, než se cokoli rozbalí, a jakékoli selhání ponechá předchozí instalaci funkční

    Provedeno na Install, Doctor.

  2. 2 · kanonické tvrzení

    installer-verifies-before-installingdeklarovaný stav: zaručeno v docs/CLAIMS.yaml

    Definováno v přečtěte si to na tomto webu · docs/INSTALL.md

  3. 3 · implementace

    share/install/install.sh.in

  4. 4 · test a scénáře

    Test: test/cases/85_installer.sh

    Provedeno v Install the tool in one command, on a machine with no toolchain.

  5. 5 · zaznamenané běhy

    zaznamenané důkazy: nespuštěno jak se zaznamenávají důkazy

Ověřte si to sami

Test běží v jednorázovém dočasném repozitáři a ověřuje chování, ne řetězec ve zdrojovém kódu.

z klonu repozitáře
bash test/run.sh 85_installer

Kde se toto tvrzení používá

pokryté odpovědnosti

Prohledává názvy a popisy všech stránek, které tento web publikuje.