[Decision D4] Fixer la garantie anti-TOCTOU et le timing du garde #5
Labels
No labels
Agent/Autonomous OK
Agent/Demeter
Agent/Hermes
Agent/Human
Agent/Needs Review
Area/API
Area/Auth
Area/CLI
Area/Data
Area/Docs
Area/Infra
Area/UI
CI/Failing
CI/Flaky
CI/Green
CI/Needs Runner
CI/Needs Workflow
Compat/Backward Compatible
Compat/Breaking
Compat/Migration
Deploy/Ansible
Deploy/Blocked
Deploy/Homelab
Deploy/Needs Config
Deploy/Needs Secret
Deploy/Ready
Deploy/Rollback
Kind/Bug
Kind/Chore
Kind/Design
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Refactor
Kind/Security
Kind/Spike
Kind/Testing
Ops/Backup
Ops/Incident
Ops/Maintenance
Ops/Monitoring
Ops/Upgrade
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Priority
Someday
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Risk
Critical
Risk
High
Risk
Low
Risk
Medium
Security/Auth
Security/Disclosure
Security/Hardening
Security/Secret
Size
L
Size
M
Size
S
Size
XL
Size
XS
Stack/Ansible
Stack/Docker
Stack/Forgejo
Stack/Hermes
Stack/Node
Stack/Postgres
Stack/Python
Stack/Systemd
Status
Abandoned
Status
Blocked
Status
In Progress
Status
In Review
Status
Need More Info
Status
Ready
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
2027a/auroscope#5
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
MODE: DECISION
Statut
Proposé — amendement potentiel à la spécification. Ne pas fermer avant ton go explicite.
Question
La spécification dit que
PreBuildCommandvérifie « immédiatement avant chaque build ». Paru 2.1 ne fournit pas ce timing. Quelle garantie voulons-nous réellement contractualiser ?Fait vérifié
Paru télécharge les recettes, appelle tous les
PreBuildCommand, effectue ensuite d’autres opérations, puis lance les builds individuels. Avec--skipreview, aucune édition Paru de la recette n’a lieu après le garde, mais le hook n’est pas littéralement adjacent à chaque makepkg.Options
A — Amender la garantie au vrai périmètre de sécurité
Le hook est la dernière vérification complète des recettes avant toute exécution makepkg/PKGBUILD. Le manifeste est recalculé avant et après la réclamation atomique; Paru peut ensuite installer des dépendances officielles avant le build.
Pour : correspond exactement au comportement prouvé; aucun code hostile de recette ne tourne dans l’intervalle.
Contre : modifie explicitement la phrase actuelle; une course par autre processus du même UID reste possible.
B — Attendre/modifier Paru pour un hook par build
Pour : conserve la formulation littérale.
Contre : bloque la production sur un changement upstream; ne supprime pas la course same-UID après retour.
C — Interposer un proxy makepkg AURoscope
Pour : rehash juste avant chaque invocation makepkg.
Contre : beaucoup plus large : appels multiples,
pkgver()VCS, chroot, mutations légitimes/hostiles difficiles à distinguer.Recommandation
Option A, comme amendement assumé. Le modèle de menace exclut la compromission du compte utilisateur et documente la course same-UID.
Cache
Une approbation de recette n’authentifie pas un binaire déjà en cache. Rebuild par défaut; réutilisation seulement si le SHA-256 de l’artefact est lié à un build réussi de l’identité exacte.
Réponse attendue
Choisis A/B/C. Après ta réponse, je formule précisément la garantie; ADR et fermeture seulement après ton go.
Documentation
Protocole automatique de décision
GO DECISIONn’autorise ni code de production ni plan d’implémentation; ce travail doit avoir son propre ticketMODE: EXECUTION.A priori, A. Mais là encore, je ne suis pas certain de bien comprendre le problème et suspecte un manque de simplicité. Dans le hook z on a simplement besoin de valider l'identité du PKGBUILD entre l'audit et l'installation? Est-ce que quelque chose m'échappe?
Ticket classé comme décision humaine. La discussion continue ici, mais aucune implémentation ni ADR accepté ne sera produit tant que Mathieu n’aura pas publié exactement
GO DECISIONdans un commentaire distinct.Oui — l’objectif simple est bien de vérifier que la recette exécutée est exactement celle qui a été auditée. La nuance est double :
PKGBUILD, mais tout le manifeste de recette pertinent à l’audit (notamment les fichiers locaux sourcés ou utilisés par le build).makepkg: il vérifie toutes les recettes, puis Paru peut encore installer des dépendances officielles avant de lancer les builds. Dire « immédiatement avant chaque build » promet donc un timing que Paru ne fournit pas.La garantie simple que je recommande reste A :
Ainsi, les opérations internes de Paru entre le garde et
makepkgne sont pas un problème tant qu’elles n’exécutent ni ne modifient une recette. La seule limite résiduelle est qu’un autre processus du même utilisateur pourrait modifier les fichiers après le retour du hook; éliminer cette course exigerait une isolation ou une interposition beaucoup plus lourde, sans bénéfice proportionné dans le modèle de menace actuel.Donc non, il ne manque pas une mécanique complexe : il faut surtout corriger la formulation du contrat pour ne pas confondre « dernière validation avant toute exécution de recette » avec « validation adjacente à chaque build ». Ma recommandation courante est A avec cette formulation, et la décision reste en discussion tant qu’il n’y a pas de signal distinct
GO DECISION.GO DECISION
Convention de finalisation concurrente : utilise le numéro du ticket comme numéro ADR sur quatre chiffres (
#N→NNNN-*.md). Ne choisis pas « le prochain numéro libre » et ne renumérote aucun ADR; cette règle évite les collisions entre décisions validées en parallèle.Décision D4 consignée et vérifiée :
121ed01b3e/docs/decisions/0005-recipe-identity-guard-boundary.md121ed01b3eLa spécification décrit désormais le vrai contrat : dernière vérification complète de l’identité des recettes après la revue AURoscope et avant toute exécution de code de recette, avec
--skipreview; elle ne prétend plus que le hook est adjacent à chaque build. La course résiduelle après le garde pour un autre processus du même UID reste explicitement documentée.Validation :
git diff --check; commit local et tête distante du PR relus à121ed01b3ef9f11c895b2643b0ac6cb1bc82ddb3, signature SSH valide pourhephaistos@ecl.400iso.net. Aucun code de production ni plan d’implémentation ajouté.