Přeskočit na obsah

Verifikační skript chybu vypíše, ale vrátí exit 0 — fail-open kontrola

import { Aside } from ‘@astrojs/starlight/components’;

Operační runner (preflight → apply → verify) „prošel” i ve stavu, kdy cílová funkce nefungovala: lookup vracel prázdno, služba byla dál dostupná, kontrolní počty nesouhlasily. V logu byly ✗ řádky — ale exit 0, takže navazující krok pokračoval.

Čtyři nezávislé vady téhož vzoru:

Terminál
# 1. || true maskuje selhání nástroje, ne jen "nula nálezů"
POCET=$(remote "tool list | grep -c 'vzor' || true") # tool spadl → "0", rc 0
# 2. kontrola jen vypíše výsledek, nikdo ho neporovná
echo "souborů: $(remote "find $DIR -type f | wc -l")" # baseline nikam neuloží
# 3. chyba se vypíše, ale FAILED flag se nepromítne do exitu
[ "$LOOKUP" = "$EXPECTED" ] || echo "✗ lookup nesedí" # a jede se dál
# 4. nerozlišené návratové kódy: "cokoliv nenulového = OK"
if ! remote "check user"; then echo "účet blokován ✓"; fi # i výpadek ssh (255)!
  • Selhání nástroje oddělit od legitimní nuly sentinelem: out=$(tool 2>&1) || { echo SENTINEL_FAIL; exit 9; } a sentinel v callerovi kontrolovat.
  • Každý změřený údaj uložit (durable marker soubor) a v verify tvrdě porovnat; odchylka ⇒ nenulový exit.
  • Očekávaný návratový kód uvádět PŘESNĚ (např. „úspěch = rc 67”, nikoli „cokoli mimo 0”); transportní chyby (ssh 255) jsou vždy FAIL.
  • Adresář před find | wc -l ověřit test -d && test -r — jinak neexistující cesta tiše vrátí 0.
  • Teeth testy: mock transportu (fake ssh/binárka řízená env proměnnými) + scénáře selhání, každý musí skončit exit ≠ 0 a výstup nesmí obsahovat žádnou úspěšnou hlášku.

Jak se tomu vyvarovat v jiných systémech

Sekce “Jak se tomu vyvarovat v jiných systémech”
  • Detection: grep runbooků na || true, 2>/dev/null u kontrol, echo bez porovnání; spusť skript proti záměrně rozbitému prostředí — vrátí-li 0, je fail-open.
  • Anti-pattern: „kontrola” = vypsání hodnoty do logu; rc agregovaný přes pipeline bez pipefail; jeden if větvící úspěch i výpadek.
  • Lepší přístup: verifikace jako stavový stroj s durable markerem (preflight → applied → verified), každý přechod fail-closed.
Přidal aiarchitekt.cz · 14. 8. 2026 2:00
Provozuje aiarchitekt.cz