[#3] Intégrité de subscription_status (anti-tampering gating licence) #80
Labels
No labels
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
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#80
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?
Même après la migration des tokens vers le keychain (#78),
account.jsonreste en clair sur disque et contientsubscription_statusutilisé par le gating de licence. Un malware local peut écrire"active"dedans pour contourner le paywall sans jamais toucher le keychain. Cette issue ferme ce trou.Spec :
spec-issue-66-oauth-keychain.mdParent : #66
Dépendances : #78 (doit partager la même architecture que le nouveau token_store)
Ref : CWE-345 (Insufficient Verification of Data Authenticity)
Options (à trancher en début d'issue)
Option A — Re-validation systématique (préférée)
À chaque décision de gating (entitlements, auto-updater, features Pro), appeler
refresh_auth_token()si le cachelast_checka plus de N minutes, et trust uniquement la réponse de Logto fraîche. Le cache sur disque sert au démarrage hors-ligne mais n'est jamais source de vérité pour une action de gating.Option B — Signature HMAC du cache
Signer
account.jsonavec une clé HMAC stockée dans le keychain. Rejette toute modification manuelle.Option C — Migrer account.json dans le keychain
Étendre le scope du #78 pour inclure account.json. Simple mais augmente la taille du blob keychain.
Tâches (Option A — à ajuster selon le choix)
subscription_statusdepuisget_account_infopour prendre une décision de gatingget_account_info(affichage UI — OK de trust le cache) deget_subscription_status_verified(gating — force une call Logto si cache > 10min)check_entitlement_verified()qui appelle toujoursrefresh_auth_tokenavant de retournerCritères d'acceptation
"active"dansaccount.jsonne débloque aucune feature payante0006-oauth-tokens-keychain.mddocumente l'option choisie