fix(deps): update h2 to 0.4.19 to clear RUSTSEC-2026-0258 #344
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#344
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-343-h2-rustsec-2026-0258"
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?
Resolves #343
audit.ymléchouait tous les matins depuis le 2026-08-19 — 17 runs consécutifs (375 → 391), dernier vert le 08-18. Aucun push surmaindans l'intervalle : RUSTSEC-2026-0258 a été publiée le 08-17 et a atteint l'advisory-db deux jours plus tard. Les frames HTTP/2DATAvides sont mises en file sans limite ; sur un flux non drainé la mémoire croît sans borne et la longueur peut déborder en panique. Déni de service, sévérité faible, corrigé en 0.4.16.Ce que fait la PR
h20.4.13 → 0.4.19 dans le fichier de verrouillage.Cargo.tomlintouché, 666 paquets avant et après,.cargo/audit.tomlet le garde-fou decheck-rust.ymlinchangés.Pourquoi corriger plutôt que supprimer
h2est atteignable sur les deux cibles livrées — vérifié par triple explicite, jamais--target all, selon l'ADR 0018 :Le premier chemin est celui de la mise à jour automatique, le second celui des appels de licence, d'authentification, de cours et de rétroaction. Correctif publié + crate atteignable = règle 1 de
.cargo/audit.toml, donc on corrige.Pourquoi le diff du lock ne fait que 2 lignes
cargo update -p h2réaiguille au passage 7 pointeurswindows-sysde0.61.2vers 0.48/0.52/0.59 —colored,dirs-sys,errno,rustix,rustls-platform-verifier,tempfile,winapi-util.C'est précisément ce que #321 a défait délibérément le 2026-08-15, après avoir vérifié crate par crate que
0.61.2est l'état du tagv0.14.0, donc la seule configurationwindows-sysqui ait réellement compilé sous Windows. Laisser la re-résolution s'appliquer régresserait cette décision en silence, trois semaines après l'avoir prise.La strophe
h2est donc appliquée seule.cargo metadata --lockedaccepte le résultat sans le réécrire, ce qui prouve que le lock reste cohérent —h2 0.4.19n'a pas changé son propre jeu de dépendances.À revérifier en revue si vous voulez :
git diff main -- src-tauri/Cargo.lockdoit montrer exactement 2 lignes modifiées, toutes deux dans la stropheh2.Vérifications
cargo metadata --lockedcargo check --locked --all-targetscargo test --locked --all-targetscargo-audit 0.22.2sur le lock corrigéerror: 1 vulnerability found!rsaabsent des 2 cibles, canaritartrouvéLe contrôle sur l'ancien lock compte : il montre que l'outil local reproduit le rouge de la CI, donc que le vert obtenu est un vrai changement d'état et pas un outil configuré autrement.
Suites
v0.15.0peut suivre. Ce correctif touche le chemin de l'updater, il a sa place dans la release plutôt qu'après — au même titre querustls-webpkiettarau cycle précédent.rsa) et #317 (react-routerv8) restent ouvertes, sans lien avec celle-ci.CI verte — run 392, étapes vérifiées dans le log
L'étape
cargo auditdecheck-rust.ymlestcontinue-on-error: true, donc un job vert ne prouve rien à lui seul sur l'audit. Trace lue dans le log plutôt que déduite :Aucune ligne
error:dans tout le log, et la seule occurrence de « vulnerabilities » est celle du scan. Les 22 warnings autorisés sont le même compte qu'avant — rien d'autre n'a bougé.Garde-fou des suppressions, exécuté et tracé :
Compilation et tests :
cargo checkterminé en 3m16,cargo testen 3m44, 111 passed, 0 failed.h2 v0.4.19bien compilé (Downloaded/Checking/Compiling).check-frontendne s'est pas déclenché, ce qui est le comportement attendu : les trois fichiers modifiés sontsrc-tauri/**et*.md, tous deux dans sapaths-ignore.Vérification indépendante de la décision
windows-sysLe choix de n'appliquer que la strophe
h2repose sur le fait que0.61.2est l'état du tagv0.14.0. Retracé depuis la source plutôt que repris de la note de #321, crate par crate contregit show v0.14.0:src-tauri/Cargo.lock:coloreddirs-syserrnorustixrustls-platform-verifiertempfilewinapi-utilLes sept concordent. La branche préserve donc exactement la configuration
windows-sysqui a compilé sous Windows pour la v0.14.0, et le seul écart avecmainreste les deux lignes deh2.Revue adversariale — APPROVE
Correctif de dépendance à 4 lignes, dont 2 dans le fichier de verrouillage. J'ai retracé chaque affirmation depuis la source plutôt que de la relayer. Tout tient.
Ce qu'un lock édité à la main peut casser en silence — vérifié
Appliquer une strophe seule plutôt que laisser
cargo updatere-résoudre est le bon arbitrage ici, mais il déplace le risque : la strophe est écrite à la main, donc le checksum et la liste de dépendances ne sont plus garantis par l'outil. Les deux sont bons.sha256sumdu.crateen cacheef8e5e5a…bc16— identique à la strophediffdes tables[dependencies.*]0.4.13 vs 0.4.19diffdesversion =déclaréeshttp^1→^1.1cargo metadata --locked+git statusLe seul écart réel est la borne
http, qui se resserre de^1à^1.1en 0.4.19. C'est précisément le genre de changement qui invalide un lock épinglé à la main — ici il est satisfait, le lock portehttp 1.4.0(l. 1954-1955). MSRV et edition inchangés (1.63/2021).À noter :
cargo metadata --lockedprouve la cohérence du graphe, pas le checksum — celui-ci n'est vérifié qu'au téléchargement. La preuve du checksum vient donc d'ailleurs : le log du run 392 montreDownloaded h2 v0.4.19puisCheckingpuisCompiling, ce qui n'arrive pas si la somme ne correspond pas.Le contrôle « avant/après » est réel, pas déclaratif
La règle vaut pour un correctif comme pour un test : un vert ne prouve rien sans le rouge correspondant. J'ai récupéré les deux logs.
Crate: h2 / Version: 0.4.13 / ID: RUSTSEC-2026-0258 / Solution: Upgrade to >=0.4.16, sur 666 crates.Warnings identiques des deux côtés (les
atk,gdk,fxhashunmaintained) : le delta est donc exactementh2, rien d'autre n'a bougé dans le périmètre d'audit. Les 17 rouges consécutifs sont confirmés côté API (runs 380-391 tous enfailure, eventschedule).L'advisory locale tranche la borne sans ambiguïté —
patched = [">= 0.4.16"], aucune autre plage affectée, une seule stropheh2dans le lock. 0.4.19 satisfait.Atteignabilité — les deux chemins annoncés existent bien
Vérifié par triple explicite conformément à l'ADR 0018, sur les deux cibles livrées :
Identique sur
x86_64-unknown-linux-gnuetx86_64-pc-windows-msvc. Correctif publié + crate atteignable = règle 1, donc corriger et non supprimer :.cargo/audit.tomlet le garde-fou sont bien intouchés (CRATES="rsa",Suppression guard: 2 checks, exit 0tracé au run 392).La claim user-facing du changelog est elle aussi exacte :
reqwestest déclaré en dépendance directe (Cargo.toml:43) et consommé par exactement quatre modules —license_commands,auth_commands,balance_commands(/v1/prices) etfeedback_commands. Soit « licence, authentification, cours et rétroaction », mot pour mot.La dérive
windows-sysest bien évitéegit diffne montre aucun mouvementwindows-sys: la décision de #321 (remontée à0.61.2, seul état ayant réellement compilé sous Windows au tagv0.14.0) est préservée. C'est le bon choix, et c'est ce qui justifie la strophe appliquée seule.Effet de bord utile : le glob
src-tauri/**est enfin prouvéSTATE.md porte depuis #232 un point ouvert — « Reste non prouvé — le glob
src-tauri/**lui-même », avec un mode d'échec silencieux (job de test jamais déclenché, rien pour le dire). Cette PR est le cas test isolé attendu : elle ne touche quesrc-tauri/Cargo.locket deux*.md.check-rusta bien tourné (run 392,cargo check+cargo test111 passed), etcheck-frontenda été correctement sauté — ses trois fichiers matchent tous lepaths-ignore(src-tauri/**et*.md). Le point de suivi peut être fermé.Reste de la checklist
Resolves #343présent dans le message de commit (vérifié engit log main..head, pas dans le corps de la PR), format conventionnelfix(deps):.[Unreleased]→Security, à la suite des deux entrées d'advisories existantes. Les copiespublic/sont gitignorées (.gitignore:49-51) et régénérées parsyncChangelogs()— aucune péremption possible..env. Pas de test ajouté, ce qui est correct : un bump de dépendance sans logique nouvelle n'a rien à tester au-delà de la suite existante.Suggestion non bloquante — la contrainte
windows-sysn'a pas de domicile durableC'est la troisième fois que cette dérive se pose : #310 l'introduit, #321 la défait après vérification crate par crate, #344 l'évite à la main. Or
grep -rn "windows-sys"horsCargo.lockne trouve la contrainte nulle part de durable — ni ADR, ni commentaire dansCargo.toml, ni garde CI. Elle vit uniquement dans des messages de commit et la prose de STATE.md.Le prochain
cargo update -p <n'importe quoi>la régressera silencieusement, et le prochain à passer devra la redécouvrir — exactement la trajectoire des trois derniers cycles. Un commentaire dansCargo.toml, une note dans l'ADR 0018, ou un garde CI comparant les stropheswindows-sysau tag de référence donnerait à la décision un endroit où survivre. Hors périmètre de cette PR, à traiter comme un suivi.Revue faite depuis la boucle principale, séquentiellement, sans fichier de travail partagé.