feat(android): un coffre telecharge n'est plus lisible sans rien demander

Sans biometrie utilisable et sans code pose, le cache s'ouvrait sans rien
demander - or il CONTIENT le mot de passe de sync. Qui tenait le
telephone deverrouille obtenait donc le coffre ET le secret du depot.

Il est desormais scelle sous le mot de passe qui vient de le rapporter :
celui-ci est deja dans ce fichier, donc rien de neuf n'est expose, et
l'utilisateur le connait puisqu'il vient de le taper. C'est aussi la
seule forme de cache qui survive a une reinitialisation du verrouillage
d'ecran.

Pas quand l'appareil sait authentifier : VER_PIN et VER_WRAP s'excluent,
et imposer une frappe a qui a une empreinte serait un recul.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-28 17:25:16 +01:00
parent 5cc80727d6
commit d428a6fc7f
+22 -1
View File
@@ -2604,11 +2604,32 @@ begin
// Ecrit APRES un dechiffrement reussi seulement, et avec son ETag : // Ecrit APRES un dechiffrement reussi seulement, et avec son ETag :
// les deux doivent rester coherents. // les deux doivent rester coherents.
// AUCUNE PROTECTION ICI VEUT DIRE AUCUNE, ET C'EST TROP.
//
// Sans biometrie utilisable et sans code pose, le cache s'ouvrait sans
// rien demander - or il CONTIENT le mot de passe de sync. Qui tient le
// telephone deverrouille obtenait donc le coffre ET le secret du depot.
//
// On le scelle sous le mot de passe qui vient de rapporter le coffre :
// il est deja dans ce fichier, donc cela n'expose rien de neuf, et
// l'utilisateur le connait puisqu'il vient de le taper. C'est aussi la
// seule forme de cache qui survive a une reinitialisation du
// verrouillage d'ecran.
//
// PAS quand l'appareil sait authentifier : VER_PIN et VER_WRAP
// s'excluent, et imposer une frappe a qui a une empreinte serait un
// recul. Retirable en deux appuis depuis les reglages.
var LSeal := FPinSealed;
if (not LCanAuth) and (LSeal = '') then LSeal := APwd;
try try
// Le mot de passe part avec le coffre : c'est lui qui permettra au // Le mot de passe part avec le coffre : c'est lui qui permettra au
// prochain lancement de rafraichir sans rien demander. // prochain lancement de rafraichir sans rien demander.
SaveVault(LPlain, FETag, APwd, LCanAuth, False, FPinSealed, SaveVault(LPlain, FETag, APwd, LCanAuth and (LSeal = ''), False, LSeal,
FKey, FKeySalt, FKeyIters); FKey, FKeySalt, FKeyIters);
// SANS CETTE LIGNE LES ECRITURES SUIVANTES SERAIENT REFUSEES : le
// garde de SaveVault interdit de resceller un cache a code sans le
// code, et il le lirait ici comme absent.
if VaultNeedsPin then FPinSealed := LSeal;
Log(' cache now holds sha: ' + FETag); Log(' cache now holds sha: ' + FETag);
if VaultNeedsAuth then if VaultNeedsAuth then
Log(' cache written - protected by biometrics/PIN') Log(' cache written - protected by biometrics/PIN')