fix(licence): l'empreinte ne depend plus de l'ordre de demarrage

BoardUUID s'appuyait sur un COM initialise par quelqu'un d'autre. Appele
apres WebView2 il lisait le vrai UUID de carte mere, appele avant il
echouait et retombait sur MachineGuid : deux empreintes pour une seule
machine, et une licence liee a l'une que l'autre refuse. Il suffisait que
licence/status parte avant l'init du navigateur pour verrouiller
l'utilisateur hors de son coffre.

CoInitializeEx est desormais appele sur place. Pas de CoUninitialize
symetrique : essaye, il rend une violation d'acces — les mandataires WMI
et le cache de type-info de ComObj se liberent plus tard, dans un
appartement qu'on vient de fermer.

Verifie avec un harnais qui n'initialise PAS COM : il rend maintenant la
meme empreinte que l'application.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-09-05 16:00:50 +01:00
parent 988694b20d
commit 61ec5ff7a1
2 changed files with 25 additions and 1 deletions
+8 -1
View File
@@ -293,7 +293,14 @@ que dans une charge utile dont on sait deja qu'elle vient de nous.
courriel, et l'UUID brut de la carte mere est un identifiant materiel unique courriel, et l'UUID brut de la carte mere est un identifiant materiel unique
qui n'a pas a circuler en clair ni a finir dans nos journaux. qui n'a pas a circuler en clair ni a finir dans nos journaux.
- UUID lu par WMI (`Win32_ComputerSystemProduct`, COM via `Winapi.ActiveX` pour - UUID lu par WMI (`Win32_ComputerSystemProduct`, COM via `Winapi.ActiveX` pour
`IEnumVariant`). **Un UUID nul ou tout a FF est rejete** : beaucoup de VM et `IEnumVariant`). **`BoardUUID` appelle `CoInitializeEx` lui-meme** : sans ca
l'empreinte dependait de qui avait demarre avant — apres l'init de WebView2
elle lisait le vrai UUID, avant elle echouait et retombait sur `MachineGuid`,
soit DEUX empreintes pour une seule machine et une licence liee a l'une que
l'autre refuse. Un identifiant qui depend de l'ordre de demarrage n'est pas un
identifiant. **Et on ne fait PAS de `CoUninitialize` symetrique** : il parait
propre et se paie d'une violation d'acces, les mandataires WMI et le cache de
type-info de ComObj se liberant plus tard, dans un appartement ferme. **Un UUID nul ou tout a FF est rejete** : beaucoup de VM et
d'images clonees l'annoncent, et s'en contenter ferait tomber des postes d'images clonees l'annoncent, et s'en contenter ferait tomber des postes
differents sur la MEME empreinte — une licence emise pour l'un ouvrirait chez differents sur la MEME empreinte — une licence emise pour l'un ouvrirait chez
l'autre. Repli sur `MachineGuid` (HKLM\...\Cryptography), distinct par l'autre. Repli sur `MachineGuid` (HKLM\...\Cryptography), distinct par
+17
View File
@@ -53,6 +53,23 @@ var
LFetched: LongWord; LFetched: LongWord;
begin begin
Result := ''; Result := '';
// COM DOIT ETRE INITIALISE ICI, PAS AILLEURS PAR CHANCE.
//
// Sans ca, l'empreinte depend de qui a demarre avant nous : appelee apres
// l'initialisation de WebView2 elle lit le vrai UUID de la carte mere,
// appelee avant elle echoue et retombe sur MachineGuid — DEUX empreintes
// differentes pour une seule machine, et une licence liee a l'une que
// l'autre refuse. Un identifiant qui depend de l'ordre de demarrage n'est
// pas un identifiant.
//
// ET ON NE LIBERE PAS. Un CoUninitialize symetrique parait propre et se
// paie d'une violation d'acces : les mandataires WMI et le cache de
// type-info de ComObj survivent a l'appel et se liberent plus tard, dans un
// appartement qui n'existe plus. Laisser l'appartement ouvert pour la duree
// du processus ne coute rien ici — cette application heberge WebView2, donc
// COM y est de toute facon initialise et le reste.
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
try try
LLocator := CreateOleObject('WbemScripting.SWbemLocator'); LLocator := CreateOleObject('WbemScripting.SWbemLocator');
LServices := LLocator.ConnectServer('.', 'root\CIMV2'); LServices := LLocator.ConnectServer('.', 'root\CIMV2');