fix(deps): build the updater without its zip feature to clear RUSTSEC-2026-0367 to -0369 #459
No reviewers
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#459
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-455-updater-without-zip"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Refs #455
Retire
zip4.6.1 du graphe, et avec lui RUSTSEC-2026-0367 (7.3), -0368 et -0369 (9.1), qui rougissentaudit.ymldepuis le run 558 (2026-10-17 06:00 UTC) sans que le lock ait bougé.zipn'était compilé que pour Windows, par la feature par défautzipdetauri-plugin-updater. Il n'est corrigé qu'en>= 9.0.0, ettauri-plugin-updater2.14.0 exige toujourszip ^4: aucuncargo updaten'atteint le correctif. Analyse et décisions de Max (correctif, preuve Windows parcargo-xwin) dans #455.Le changement
src-tauri/Cargo.toml:tauri-plugin-updater = { version = "2", default-features = false, features = ["rustls-tls"] }, avec un commentaire qui dit pourquoi, et quand rétablir la feature (createUpdaterArtifacts: "v1Compatible").src-tauri/Cargo.lock: 33 lignes retirées. Paquets retirés :zip4.6.1,arbitrary1.4.2 etderive_arbitrary1.4.2 (666 → 663), aucun ajouté ; la seule autre strophe touchée est celle detauri-plugin-updater, qui perd"zip".tarreste dans le lock (dépendance macOS de l'updater) mais quitte les graphes Linux et Windows ;flate2reste, tiré partauri-codegen.check-rust.yml: nouveau canari de la garde des suppressions (ci-dessous).architecture.md(table des plugins, sectioncheck-rust),qa-update-cycle.md(liste des dépendances, paragraphe « Non prouvé » réécrit sur ce que fait vraiment l'updater sans la feature), skill/release(même liste de dépendances), CHANGELOG (Security / Sécurité).La feature
zipne sert qu'à décompresser des paquets de mise à jour archivés (.nsis.zip,.msi.zip,.AppImage.tar.gz), que seulcreateUpdaterArtifacts: "v1Compatible"produit. L'app est encreateUpdaterArtifacts: true: l'installeur NSIS (.exe), le.debet le.rpmsont servis tels quels, et la v0.17.1 ne publie rien d'autre.Écart avec l'issue : le canari est
webkit2gtk, pastauritarétait le canari de la garde, et il quitte le graphe Linux. L'analyse proposaittauri. Le contrôle du plan a relevé quetarétait une dépendance conditionnelle de l'updater (cfg(target_os = "linux")) : le trouver prouvait aussi quecargo tree --target x86_64-unknown-linux-gnurésout les arêtes conditionnelles, propriété sur laquelle repose la règle 1 de l'ADR 0018.tauriest inconditionnel et ne prouverait que l'affichage decargo tree.webkit2gtk, la webview Linux de Tauri (wry), garde la propriété : paquet unique dans le lock, présent sous Linux (arbre de 29 lignes) et absent sous Windows, et un build Linux de Tauri v2 ne peut pas le perdre.Vérifications locales
Sur la branche, depuis la racine du dépôt,
CARGO_TERM_COLOR=never. La CI ne rejoue ni les mutations du canari ni la vérification Windows.origin/main)cargo-audit audit --file <copie de l'ancien lock>(0.22.2, binaire de la CI)cargo-audit audit --file src-tauri/Cargo.lock12 allowed warnings found, mêmes IDs qu'avanttauri-plugin-updatermodifiée (- "zip")check-rust.ymlok: canary 'webkit2gtk' found,2 checks, exit 0tar(dans le lock, hors du graphe Linux : rc 0, sortie vide)exit 1zip(hors du lock : rc 101)exit 1windows-syscheck-rust.yml9 checks, exit 0cargo check --manifest-path src-tauri/Cargo.toml --locked --all-targetscargo test --manifest-path src-tauri/Cargo.toml --locked --all-targetsorigin/maincargo xwin check --manifest-path src-tauri/Cargo.toml --locked --target x86_64-pc-windows-msvc(cargo-xwin 0.23.1)Compiling tauri-plugin-updater v2.10.0,Checking zip v4.6.1,Compiling simpl-resultCompiling tauri-plugin-updater v2.10.0,Compiling simpl-result, aucunzipPour les deux runs Windows, le dossier
targetétait chaud, mais les artefacts Windows detauri-plugin-updater(et dezippour le témoin) ont été purgés avant chaque run : la recompilation de l'updater avec le nouveau jeu de features est visible dans le log.check-rustdoit tourner sur cette PR (src-tauri/**et le workflow) ;check-frontenddoit être sauté (src-tauri/**, ce workflow,docs/**,.claude/**et les*.mdde la racine sont dans sa liste d'exclusion).Prochaine release
Pas de release corrective : aucun des trois avis n'est atteignable. Le cycle réel de mise à jour Windows de la prochaine release (
docs/qa-update-cycle.md, §1), déjà dû pour #376 et #447, part de la v0.17.1 installée : téléchargement, vérification de signature et installation y sont faits par l'updater de la v0.17.1, encore compilé aveczip, et la nouvelle version n'exécute que lecheck()final. Le chemin d'installation sanszipne tournera qu'à la mise à jour depuis la première release qui contient #455 vers la suivante. Ce cycle-là, dû même si cette release ne touche pas l'updater, sera la première preuve de bout en bout (revue 24757, suivi #463).Post-merge checklist (hence
Refs, not a closing keyword)POST /api/v1/repos/maximus/simpl-resultat/actions/workflows/audit.yml/dispatchesavec{"ref":"main"}, réponse 204 attendue.workflow_dispatchsur le commit de merge, ou sur un commit ultérieur demainqui en descend sisrc-tauri/Cargo.locket.cargo/audit.tomly sont identiques. Statutsuccessexigé, puis lecture du log, codes ANSI retirés : version de cargo-audit installée,(663 crate dependencies),18 allowed warnings found, aucune ligneerror: N vulnerabilit…. 18 et non 12 : le run planifié 561 (2026-10-18, cargo-audit 0.22.2, 1338 avis chargés contre 1334 la veille) ajoute six avertissementsunmaintained, RUSTSEC-2026-0370 à -0372 (zvariant,zbus_names,zvariant_derive, deux versions chacun), non bloquants. Si la version de cargo-audit ou la base d'avis a changé depuis, comparer les IDs des warnings à ceux du dernier run planifié plutôt que leur nombre.audit.yml).STATE.md: retrait du blockerzip. Dans « Vérifications dues à la prochaine release », le cycle Windows reste dû pour #376 et #447, sans valeur de preuve pour l'updater sanszip. Ajout, pour la release d'après, du cycle depuis la première version qui embarque #455 : c'est la première preuve de bout en bout de l'updater sanszip, due même si cette release ne touche pas l'updater.🤖 Generated with Claude Code
CI lue ligne à ligne :
PR Check — Rust, run 560, sur85b7ef9(pull/459/head), succès en 9 min 55, à froid (No cache found, rustc 1.99.1 en attendant la chauffe du lundi).ok: canary 'webkit2gtk' found for x86_64-unknown-linux-gnuSuppression guard: 2 checks, exit 0windows-sys pinning: 9 checks, exit 0test result: ok. 267 passed; 0 failed; 1 ignoredcargo-audit-audit 0.22.2Scanning src-tauri/Cargo.lock for vulnerabilities (663 crate dependencies)warning: 12 allowed warnings foundZéro ligne
error: N vulnerabilit…,vulnerabilit(y|ies) found,FAIL:ouFAILED, et aucune compilation dezip, recherches faites sur le log débarrassé des codes ANSI.check-frontendn'a pas tourné, comme prévu.Checklist d'après merge corrigée (corps de la PR, point 2) : le run planifié 561 d'
audit.yml(2026-10-18 06:00 UTC) compte 18 avertissements autorisés au lieu de 12. Six avertissementsunmaintainedsont parus entre-temps : RUSTSEC-2026-0370 à -0372, surzvariant,zbus_namesetzvariant_derive. Le run reste rouge sur les trois seules vulnérabilités, RUSTSEC-2026-0367 à -0369 (zip), que retire cette PR. Le code de la PR ne change pas.Niveau : haut —
src-tauri/Cargo.tomletsrc-tauri/Cargo.lock(Dépendances),.forgejo/workflows/check-rust.yml(CI et gardes : étape de verdict modifiée),.claude/skills/release/SKILL.md(Release et mise à jour)Verdict : REQUEST_CHANGES
Revue de
85b7ef9. Le correctif est correct, et la revue l'a rejoué de bout en bout : la featurezipdetauri-plugin-updater2.10.0 est la seule chose qui change dans le graphe résolu, l'audit passe de 3 vulnérabilités à 0, le nouveau canari sait échouer, et l'app compile pour Windows sanszip. Un seul point bloque, hors du diff : le corps de la PR présente le cycle Windows de la prochaine release comme la première preuve de bout en bout de l'updater sanszip, ce qu'il n'est pas, et sa checklist ferait écrire cette preuve dansSTATE.md. La correction se fait dans le corps, sans commit.Point bloquant
Corps de la PR, section « Prochaine release » et point 5 de la checklist d'après merge. Le cycle de la prochaine release part de la v0.17.1 installée (prérequis de
docs/qa-update-cycle.md: « La version précédente installée sur chaque machine »). Téléchargement, vérification de signature et installation y sont faits par l'updater de la v0.17.1, compilé aveczip. De l'updater compilé sanszip, ce cycle n'exécute que lecheck()final (« Re-cliquer →upToDate»), que la feature ne touche pas. Le chemin d'installation sanszip(extract,updater.rs:882-889de la 2.10.0, qui passe alors directement àextract_exe) tourne pour la première fois lors d'une mise à jour depuis la première release qui contient #455 vers la suivante.Le risque pour le produit est faible :
extract_exe(updater.rs:920-930) est la fonction qu'a prise chaque mise à jour Windows jusqu'ici, un.exen'étant jamais un zip, et la compilation Windows est prouvée. Mais le point 5 consignerait une preuve qui n'en est pas une, et la vraie première exécution aurait lieu chez les utilisateurs sans cycle dédié : l'étape 10 de/releasen'est exigée à la release d'après que si celle-ci touche elle-même l'updater.Correction attendue, dans le corps seulement : retirer l'affirmation de « Prochaine release », et réécrire le point 5 pour que
STATE.mdporte (a) le cycle de la prochaine release, déjà dû pour #376 et #447, sans cette preuve, et (b) pour la release d'après, le cycle depuis la première version qui embarque #455, première preuve de bout en bout de l'updater sanszip, dû même si cette release ne touche pas l'updater. La même phrase est à corriger dans « Travail à faire » de #455 (« le cycle réel de mise à jour Windows, déjà dû, couvre aussi le changement de features de l'updater »).Suggestions (non bloquantes)
/releaseet l'en-tête dedocs/qa-update-cycle.md, que cette PR retouche, rattachent le cycle à la release qui livre le changement, alors que ce cycle exécute l'updater de la version précédente (pour lerustlsde #447, seul lecheck()final de la nouvelle version passe par la nouvelle couche TLS). Une issue de suivi qui distingue les deux cas (artefacts,release.yml,latest.json: cycle N-1 → N ; code ou features de l'updater : cycle N → N+1 en plus) évitera de reposer la question.Cargo.toml(passer en"v1Compatible"sans rétablir la feature) est déjà bloqué avant publication :scripts/build-latest-json.sh:92exige un seul-setup.exeavec son.sig, etscripts/check-latest-json.jq:26refuse une URLwindows-x86_64qui ne finit pas par.exe. Aucune archive ne peut atteindre l'updater sanszipparlatest.json; le citer dans le commentaire ou dansqa-update-cycle.mdmettrait la garde à côté de la règle.589aee0etmainest à54c48f4(trois commits surCLAUDE.md,REVIEW.md,STATE.mdetscripts/review-levels.py, aucun fichier commun). Une avance rapide demandera un rebase, qui relanceracheck-rustsur la nouvelle tête.Ce que la revue a rejoué
Copie hors dépôt (clone dans
/tmp) de la tête85b7ef9et de589aee0(mêmesrc-tauri/quemain),CARGO_TERM_COLOR=never.tauri-plugin-updater2.10.0default = ["rustls-tls", "zip"],zip = ["dep:zip", "dep:tar", "dep:flate2"]: la déclaration ne retire quezip. Sans la feature, Windows passe àextract_exe(.exe→ NSIS,.msi, sinonInvalidUpdaterFormatavant tout lancement), Linux gardeinstall_deb/install_rpm(pkexec dpkg -i,pkexec rpm -U) et la branche « rewriting AppImage » (l. 1030). La signature est vérifiée dansdownload()(l. 712) avantinstall(). Les affirmations deqa-update-cycle.md, du CHANGELOG et du commentaire deCargo.tomltiennent.zip4.6.1,arbitrary1.4.2,derive_arbitrary1.4.2 ; ajouté : rien ; modifiée :tauri-plugin-updaterseule (- "zip") ; 666 → 663 paquets.cargo tree -e all -f '{p} [{f}]'), avant et aprèszipet les features de l'updater changent. Linux : sortenttar,filetime,xattret la copie runtime deminiz_oxide/simd-adler32;flate2reste parpng→ico→tauri-codegen. Aucune feature dereqwestni derustlsne bouge.cargo tree -i --lockedpar cible589aee0:zipprésent sous Windows,tarsous Linux. Tête :ziphors du lock (rc 101),tarabsent des deux cibles,webkit2gtkprésent sous Linux (29 lignes), absent sous Windows, unique dans le lock.cargo-audit0.22.2 depuis la racine (.cargo/audit.tomllu), 1338 avis589aee0: exit 1,error: 3 vulnerabilities found!(RUSTSEC-2026-0367, -0368, -0369), 666 crates. Tête : exit 0, 663 crates,18 allowed warnings found, mêmes ID d'avertissements des deux côtés (dont RUSTSEC-2026-0370 à -0372, deux fois chacun).audit.yml(log, ANSI retirés)zip,18 allowed warnings found: les comptes du point 2 de la checklist sont exacts.run:extrait,bash --noprofile --norc -e -o pipefail2 checks, exit 0, aussi sur le lock de589aee0. Garde demain(canaritar) sur le nouveau lock :exit 1, le changement de canari est nécessaire.tar: exit 1. M2zip: exit 1. M3webkit2gtkinterrogé pour Windows : exit 1. M4tauriinterrogé pour Windows : exit 0. M3 contre M4 confirme l'écart avec l'analyse : un canari conditionnel détecte une cible mal résolue,taurinon.zipremise dansCargo.tomlcargo tree --locked: rc 101, le lock commité refuse. Sans--locked(forme ducargo checkde la CI, #449) : cargo rajoute les trois paquets sans rien demander etziprevient sous Windows. Copie restaurée, arbre propre.windows-sys9 checks, exit 0.cargo-xwin0.23.1 déjà installé, dossiertargetneufCompiling tauri-plugin-updater v2.10.0,Compiling simpl-result, nizipnitar. Témoin589aee0ensuite : exit 0,Checking zip v4.6.1.cargo checkvert,ok: canary 'webkit2gtk' found,Suppression guard: 2 checks, exit 0,windows-sys pinning: 9 checks, exit 0,267 passed; 0 failed; 1 ignored, audit informatif à 663 crates sans ligne de vulnérabilité, aucune ligneLockingniRemoving(lock non réécrit).check-frontendsauté à bon droit : chaque fichier est dans sonpaths-ignore.cargo checketcargo testLinux non rejoués en local.tauri-plugin-updater2.14.0, dernière stable, exige toujourszip ^4;zipest en 9.0.5 : aucuncargo updaten'atteint le correctif.Passe sécurité
cargo auditci-dessus ; aucun paquet ajouté, aucune version montée, aucunesourcenichecksummodifiée.|| truesur la ligne du canari, déjà surmain, qui fait tomber un échec decargo treedans la brancheFAIL.pull_request_target, ni action ajoutée..cargo/audit.tomlintact, les avis sont retirés et non supprimés (règle 1 de l'ADR 0018) ; chaque ligne qui bouge dans le lock s'explique ; la garde affiche toujours chaque vérification et lit un canari ; aucun fait deREVIEW.mdrendu faux. Zone Release : le point bloquant ci-dessus.Autres vérifications
fix(deps): …conventionnel,Refs #455sans mot-clé de fermeture, corps de la PR idem ; timeline de #455 :commit_refetpull_refenref_action: none, le merge ne fermera pas #455.### Security/### Sécuritéet disent la même chose ; RUSTSEC-2026-0367 (bits SUID/SGID) et -0369 (permissions appliquées à travers les liens) portent sur des permissions Unix.architecture.md.Actions faites
Label de #455 :
status:review→status:needs-fix. Copies hors dépôt supprimées avant ce commentaire (/tmp/pr459-reviewavec son worktree, le dossiertargetWindows de 2,5 Go, les fichiers/tmp/pr459-*). Le dépôt local n'a pas été touché (mainpropre, aucun worktree ajouté).85b7ef94c6toc5efc38e96Point bloquant de la revue 24757 corrigé dans le texte, sans commit (choix de Max : corriger et merger, sans second tour).
zip. Ce cycle part de la v0.17.1, dont l'updater est encore compilé aveczip. Le point 5 de la checklist d'après merge garde ce cycle (dû pour #376 et #447) et ajoute, pour la release d'après, le cycle depuis la première version qui embarque #455, vraie première preuve./releaseet dedocs/qa-update-cycle.md(un changement de l'updater ne se prouve qu'au cycle N → N+1), avec la garde existante debuild-latest-json.shetcheck-latest-json.jq.main(54c48f4), nouvelle têtec5efc38, poussée avec--force-with-leasesur85b7ef9. Les neuf fichiers de la PR sont identiques à l'octet à la tête relue85b7ef9(git diff 85b7ef9 c5efc38 -- <fichiers de la PR>vide).check-rusttourne surc5efc38; merge ff épinglé une fois ce run vert.