Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
TotalRecall — Cet outil extrait et affiche les données de la fonctionnalité Recall de Windows 11, offrant un moyen facile d'accéder aux informations sur les instantanés d'activité de votre PC. | Kitploit
Outils/GitHubGitHub/xaitax/totalrecall
Escalade de PrivilègesReconnaissanceExploitationExfiltration de DonnéesCollecte d'InformationsPost-ExploitationTests d'IntrusionRed Teaming
GitHubxaitax/totalrecall

TotalRecall

Cet outil extrait et affiche les données de la fonctionnalité Recall de Windows 11, offrant un moyen facile d'accéder aux informations sur les instantanés d'activité de votre PC.

Voir le dépôt
164123il y a 5 moisVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

TotalRecall Reloaded

Briser Windows Recall. Encore.

image

Lorsque Microsoft a repensé Recall avec des enclaves VBS, le chiffrement AES-256-GCM, l'authentification Windows Hello et un hôte Protected Process Light, le message était clair : les données sont verrouillées dans un coffre-fort.

Le coffre-fort est solide. Le camion de livraison ne l'est pas.

AIXHost.exe, le processus qui rend la timeline Recall, n'a pas de PPL, ni d'AppContainer, ni de vérification de l'intégrité du code. Tout processus s'exécutant sous l'utilisateur connecté peut y injecter du code et appeler les mêmes API COM que l'interface légitime. Une fois que l'utilisateur s'authentifie avec Windows Hello, les captures d'écran déchiffrées, le texte OCR et les métadonnées circulent dans AIXHost.exe sous forme d'objets COM vivants. TotalRecall Reloaded se place dans ce processus et extrait tout.

Aucun administrateur requis. Utilisateur standard. Pas d'exploit noyau. Pas de contournement crypto. Juste des appels COM.


Comment ça fonctionne

L'injection

TotalRecall Reloaded se compose de deux fichiers : un injecteur (totalrecall.exe) et une DLL de charge utile (totalrecall_payload.dll).

L'injecteur trouve AIXHost.exe via CreateToolhelp32Snapshot, alloue de la mémoire dans la cible avec VirtualAllocEx, écrit le chemin de la DLL avec WriteProcessMemory, et crée un thread distant pointant vers LoadLibraryW. Injection DLL classique. Rien de sophistiqué, car rien de sophistiqué n'est nécessaire. AIXHost.exe n'a aucune protection contre cela.

Cela fonctionne avec un privilège d'utilisateur standard. Pas d'élévation, pas de SeDebugPrivilege. La DACL Windows par défaut permet aux processus du même utilisateur un accès complet entre eux. Vérifié : le jeton s'exécute au niveau obligatoire Medium avec BUILTIN\Administrators configuré en refus seul.

Authentification

L'enclave VBS ne déchiffrera rien sans Windows Hello. L'outil ne contourne pas cela. Il oblige l'utilisateur à le faire, suit silencieusement lorsque l'utilisateur le fait, ou attend que l'utilisateur le fasse.

--launch simule Win+J via keybd_event, le raccourci clavier qui ouvre la timeline Recall. L'utilisateur voit une invite Hello (visage, empreinte digitale ou code PIN), s'authentifie, et l'enclave commence à servir les données déchiffrées. Du point de vue de l'utilisateur, Recall s'est ouvert normalement. Du nôtre, la charge utile est déjà à l'intérieur, en attente.

--stealth est le mode entièrement silencieux. Il fonctionne comme suit :

  1. Injecte dans AIXHost.exe (toujours en cours d'exécution) et patche DiscardDataAccess en un no-op
  2. Attend silencieusement que l'utilisateur ouvre Recall et s'authentifie normalement
  3. Lorsque l'utilisateur ferme Recall, Baker.dll tente de révoquer l'autorisation d'accès aux données, mais le patch la bloque
  4. AIXHost.exe se termine et redémarre. L'outil détecte le redémarrage et réinjecte dans le nouveau processus
  5. L'autorisation d'authentification persiste dans aihost.exe (la révocation a été bloquée). L'extraction commence immédiatement
  6. Pas de Win+J, pas d'invite Hello, pas d'interface visible. Jusqu'à 5 tentatives de réinjection.

--wait est la contrepartie passive de --launch. Au lieu de simuler Win+J, l'outil reste inactif pendant que l'utilisateur ouvre Recall lui-même — depuis la barre des tâches, un raccourci ou tout autre chemin. Lorsque AIXHost.exe apparaît et que l'utilisateur termine Hello naturellement, la charge utile est injectée et l'extraction commence. Utile sur une machine observée, ou lorsque la session Recall doit sembler entièrement initiée par l'utilisateur sans aucune saisie clavier synthétique.

La chaîne d'extraction

Une fois à l'intérieur de AIXHost.exe, la charge utile initialise un appartement COM avec CoInitializeEx(COINIT_APARTMENTTHREADED) et configure le transfert d'identité proxy avec CoSetProxyBlanket(EOAC_DYNAMIC_CLOAKING). C'est critique. Sans le masquage dynamique, le proxy COM ne transporte pas l'identité authentifiée vers le serveur.

L'extraction suit le même chemin que l'interface Recall légitime :

  1. Initialisation de l'enclave : DataManager.Load() déclenche le chargement de la clé de l'enclave. DataStoreManager.DecryptDatabase() (slot 37) prépare les vues déchiffrées. La charge utile interroge DataManager.DataStatus jusqu'à ce qu'il retourne 3 (déverrouillé).

  2. Énumération des entités : MemoryEntityStatics.GetLightMemoryItemsBefore() (slot 9) retourne un vecteur de références d'entités légères. Chacune porte un ID de contexte à l'offset +8. Sur une machine typique, cela retourne des centaines d'entités couvrant des jours ou des semaines d'activité.

  3. Extraction par entité : Pour chaque ID de contexte, la charge utile charge l'entité complète via ContextEngine2.TryGetEntityForId() (slot 6), la déballage via IEntityWrapper (slot 6), et QueryInterface vers IMemoryEntity. De là :

    • Métadonnées (synchrone) : titre (slot 8), ID du modèle d'application (slot 9), nom de l'application (slot 10), chemin du processus (slot 11), URL (slot 12), domaine (slot 13), URI de fichier (slot 15), horodatage (slot 7), limites de la fenêtre (slot 16). Via QI vers IMemoryEntity2/3 : capacité de restauration, temps de séjour dans l'application, temps de séjour sur le Web
    • Capture d'écran (asynchrone) : (slot 19) retourne un . vers , appelle pour obtenir un bitmap WIC, encoder en PNG via

Chaque appel est encapsulé dans __try/__except car une seule violation d'accès sur un appel de proxy COM tue définitivement le canal RPC vers aihost.exe. Il n'y a pas de récupération. Vous devriez redémarrer AIXHost.exe. Les wrappers SEH attrapent les plantages dus à des types de paramètres incorrects et maintiennent la session en vie.

Capacités avant authentification

Plusieurs opérations fonctionnent sans aucune authentification Hello :

Extraction de capture d'écran : RecallPrivacyIndicatorSettings (CLSID {42C63551-...}) expose GetRecentCaptureThumbnail(width, height) au slot 13. Le nom de la méthode dit "thumbnail" mais le serveur n'impose pas de limite de résolution. Passer 3840x3840 retourne la capture Recall la plus récente en pleine résolution. Le résultat IRandomAccessStream est converti en IStream via CreateStreamOverRandomAccessStream (shcore.dll) et sauvegardé en BMP.

Destruction de données : IDataStoreManager::DeleteEvents() (slot 12) efface tout l'historique des captures. Aucun paramètre, aucune authentification. L'analyse Ghidra a confirmé : le gestionnaire de suppression à FUN_1802ddd10 ne contient aucun appel à la fonction de porte d'autorisation. La vérification d'authentification n'a jamais été câblée.

Divulgation de métadonnées : Les chemins de stockage (y compris le GUID UKP spécifique à l'utilisateur), la taille de la base de données, la politique de conservation, l'état de capture, et l'ID de contexte de la capture la plus récente sont tous lisibles sans authentification via IDataStoreManagerStatics et RecallPrivacyIndicatorSettings.


Utilisation

image``` totalrecall.exe --launch Open Recall, trigger Hello, extract everything totalrecall.exe --stealth Silent extraction (patches auth revocation, waits) totalrecall.exe --wait Wait for user to manually open Recall totalrecall.exe --preauth Grab latest screenshot + settings (no Hello) totalrecall.exe --search "password" Search OCR text in latest extraction totalrecall.exe --destroy Wipe all Recall data (confirmation required, no Hello)

root@kitploit:~
| Mode | Authentification requise | Ce qu'il fait |
|------|:---:|-------------|
| `--launch` | Hello | Simule Win+J, l'utilisateur s'authentifie, extraction complète |
| `--stealth` | Passif | Corrige la révocation d'authentification, attend que l'utilisateur s'authentifie à Recall, extrait silencieusement |
| `--wait` | Hello | Attend que l'utilisateur ouvre Recall naturellement, puis extrait |
| `--preauth` | **Non** | Dernière capture d'écran + tous les paramètres |
| `--search` | Non | Recherche de texte OCR insensible à la casse sur la dernière extraction |
| `--destroy` | **Non** | `DeleteEvents()`, irréversible, nécessite de taper DESTROY pour confirmer |

### Exemple de sortie

**`--stealth` (premier lancement, en attente de l'utilisateur) :**```
[+] Target: AIXHost.exe  PID 8648 (stealth mode)
[*] Patching auth revocation...
[+] Waiting for Recall session...
[+] Recall session detected
[*] Waiting for user to close Recall...
[*] Recall closed, waiting for AIXHost to respawn...
[+] Extracting from AIXHost PID 26208
[+] Payload active
[*] Extracting
[##############################] 384/384 entities

EXTRACTION COMPLETE  6 min 51 sec
Screenshots       192   328.8 MB
OCR Text          184   535.2 KB
Metadata (CSV)    384    97.4 KB

--stealth (exécution ultérieure, session en cache) :``` [+] Target: AIXHost.exe PID 27532 (stealth mode) [] Patching auth revocation... [+] Waiting for Recall session... [+] Cached session found, extracting... [] Extracting [##############################] 398/398 entities

root@kitploit:~
**`--launch`:**```
[+] Target: AIXHost.exe  PID 14636  Memory 60 MB
[*] Triggering Recall via Win+J...
[*] Waiting for Hello authentication authenticating
[+] Recall ready  PID 14636  Memory 242 MB
[*] Extracting
[##############################] 212/212 entities

EXTRACTION COMPLETE  3 min 59 sec
Screenshots       104   184.0 MB

--preauth (pas de Hello requis):``` [+] Target: AIXHost.exe PID 27532 (pre-auth mode) [*] Injecting payload (pre-auth only)... [+] Payload active

PRE-AUTH EXTRACTION COMPLETE 0 min 1 sec

Screenshot 4K (3840x2464) 36.1 MB

Settings Storage Path C:\Users<user>\AppData\Local\CoreAIPlatform.00\UKP{...} Storage Size 178.3 MB Capture Count 0 Retention Days 90

root@kitploit:~
**`--search`:**```
Searching for: "password"
In: extraction_20260406_152736

[1] === [12] ctxId=90443 Settings | Chrome ===
     Saved passwords and passkeys
[2] === [47] ctxId=91201 inbox | Thunderbird ===
     Your temporary password has been reset

Répertoire de sortie```

extraction_20260404_143052/ screenshots/ Full-resolution decrypted PNGs screenshots/*.txt Per-image OCR text thumbnails/ Thumbnail PNGs (fallback when full screenshot unavailable) ocr_text.txt Combined OCR text for all captures recall_data.csv Structured metadata settings.txt Storage path, size, retention, capture state latest_capture_4k.bmp Pre-auth screenshot of most recent capture extraction.log Detailed extraction log with timing

root@kitploit:~
## Compilation

**Prérequis :** Visual Studio avec les outils C++ ARM64, Windows 11 ARM64 avec Recall activé.```
make.bat

Produit totalrecall.exe et totalrecall_payload.dll. Les deux doivent se trouver dans le même dossier lors de l'exécution.


Modèle de confiance de Recall```

VTL1 (Secure World) +--------------------------------------------------+ | VBS Enclave: AES-256-GCM, sealed keys | | snapshot_support.dll / storage_support.dll | | Keys never leave here. Crypto is sound. | +--------------------------------------------------+ ^ CallEnclave | VTL0 (Normal World) +--------------------------------------------------+ | aihost.exe (PPL, Signer=5) | | +-- Microsoft.Windows.AI.Platform.dll (6.9 MB) | | 44 methods on IDataStoreManager alone | | Enclave bridge. Protected. Can't touch it. | | | | AIXHost.exe (NO PROTECTION) | | +-- Baker.dll: OCR, NER, AI classification | | +-- Receives decrypted data for rendering | | +-- CreateRemoteThread = game over | +--------------------------------------------------+

root@kitploit:~
The key hierarchy: Hello -> NGC ECDH P-384 (TPM-backed) -> VTL1 mutual auth -> enclave-sealed key material -> per-page AES-256-GCM with random nonces and page-number AAD. Six layers of key derivation. The cryptography is genuinely solid.

The problem is what happens after decryption. The plaintext crosses into `AIXHost.exe`, an unprotected, injectable, same-user process. The enclave doesn't distinguish between `Baker.dll` and injected code. It can't.

---

## Principales conclusions

### La frontière de confiance s'arrête trop tôt

Le [blog d'architecture](https://blogs.windows.com/windowsexperience/2024/09/27/update-on-recall-security-and-privacy-architecture/) de Microsoft indique que « les processus en dehors des enclaves VBS ne reçoivent jamais directement l'accès aux captures d'écran ou aux clés de chiffrement » et que la conception « limite les tentatives de logiciels malveillants latents qui cherchent à profiter d'une authentification utilisateur pour voler des données ».

En pratique, `AIXHost.exe` reçoit chaque capture d'écran déchiffrée ainsi que chaque résultat OCR sous forme d'objet COM en direct. Il n'y a aucune vérification par appelant à l'intérieur du processus. Pas de vérification du type « es-tu `Baker.dll` ? ». Si vous êtes dans le processus, vous êtes considéré comme fiable. La frontière de sécurité est l'enclave VBS et le PPL, pas le processus de rendu. Les données déchiffrées sont à un seul `CreateRemoteThread` de n'importe quelle application du même utilisateur.

### Le contournement du contrôle d'accès d'IResponse4

Une lacune d'autorisation directe.

Lorsque vous appelez `ContextDataSource.Search()` et que vous recevez un `IResponse`, le chemin naturel est `IResponse.get_Items()` (slot 9) pour obtenir les résultats. Sur une session fraîche, cela retourne `0x80005473`, un code d'erreur personnalisé propre à Recall. Le serveur rejette délibérément l'appel. `IResponse2.ItemsAfterIndex()` retourne la même erreur. Le contrôle d'accès fonctionne.

Mais l'objet `IResponse` implémente quatre versions d'interface. `IResponse4.get_UnfilledItems()` (slot 9 sur un IID différent) retourne la même collection de données sous-jacente sans aucun contrôle d'accès.```
IResponse.get_Items()           -> 0x80005473 (ACCESS DENIED)
IResponse2.ItemsAfterIndex()    -> 0x80005473 (ACCESS DENIED)
IResponse4.get_UnfilledItems()  -> S_OK (all entities returned)

Mêmes données. Version d'interface différente. Aucune autorisation. La méthode était destinée au chargement paresseux interne dans le pipeline de recherche. L'examen de sécurité a repéré get_Items et ItemsAfterIndex, mais a manqué get_UnfilledItems. C'est le schéma qui rend la sécurité difficile : la vérification existe sur un chemin de code (ce qui signifie que quelqu'un a décidé qu'elle était nécessaire), et est absente sur un autre.

À partir de ces éléments, l'ID de contexte de chaque entité mène à ContextEngine2.TryGetEntityForId(), qui charge l'entité complète avec captures d'écran, OCR et métadonnées. L'enclave déchiffre tout sur demande.

La dérogation DiscardDataAccess

Lorsque l'utilisateur ferme la fenêtre Recall, Baker.dll appelle IDataProtectionManager3::DiscardDataAccess() pour révoquer explicitement l'autorisation d'accès aux données dans aihost.exe. C'est pourquoi l'authentification ne persiste pas après la session Recall normale de l'utilisateur : Baker.dll nettoie après elle.

La dérogation : le code injecté dans AIXHost.exe peut modifier la table virtuelle du proxy COM pour remplacer DiscardDataAccess (slot 8) par une fonction sans opération. Un appel VirtualProtect, une écriture de pointeur. Lorsque l'utilisateur ferme Recall, Baker.dll appelle le slot modifié, rien ne se passe, et l'autorisation reste active dans aihost.exe. Toute instance ultérieure de AIXHost.exe hérite silencieusement de l'autorisation mise en cache.

En pratique, --stealth déploie le correctif dans AIXHost.exe (qui est toujours en cours d'exécution) et attend. La prochaine fois que l'utilisateur ouvre et ferme Recall normalement, le nettoyage est supprimé et l'autorisation d'accès aux données persiste. L'outil détecte l'accès, gère les redémarrages du processus AIXHost via une réinjection automatique (re-correction de chaque nouvelle instance), et extrait tout silencieusement. La correction est par processus et par exécution : elle protège la session d'extraction en cours. L'utilisation ultérieure de Recall après la sortie de l'outil revient au comportement normal.

DeleteEvents : Destruction sans authentification

IDataStoreManager::DeleteEvents() efface tout l'historique des captures sans Windows Hello. Ghidra a confirmé : le gestionnaire de suppression ne contient aucun appel à la fonction de vérification d'autorisation. La vérification d'authentification n'a jamais été câblée dans le chemin de suppression. Un attaquant qui ne peut pas lire les données peut toujours les détruire. Anti-forensics depuis un utilisateur standard.

Extraction de capture d'écran avant authentification

RecallPrivacyIndicatorSettings.GetRecentCaptureThumbnail renvoie la capture d'écran Recall la plus récente à la résolution demandée. La méthode est destinée au petit indicateur de confidentialité dans la barre des tâches. Personne n'a limité la résolution. Tout processus du même utilisateur peut récupérer silencieusement ce qui était à l'écran en dernier, sans Hello requis.

Comptage des captures avant authentification via GetSecureStorageInfo

GetWindowCaptureCount (slot 26) renvoie E_ACCESSDENIED sans Hello. Mais GetSecureStorageInfo (slot 27) renvoie une structure StorageInfo avec exactement les mêmes données, sans authentification requise. La structure contient NumberOfItems (nombre de captures) et Size (taille totale du stockage crypté en octets). Un attaquant peut surveiller cela pour suivre l'activité de Recall en temps réel sans aucune authentification.

Persistance de l'état d'authentification

Une fois Hello complété, l'état d'authentification est mis en cache dans aihost.exe (PPL) pour toute la session Windows. Tuer et redémarrer AIXHost.exe ne l'efface pas. Un attaquant peut attendre que l'utilisateur ouvre naturellement Recall, puis extraire silencieusement des données des heures plus tard. Extraction répétée illimitée sans invites supplémentaires, sans fenêtres visibles, sans connaissance de l'utilisateur.


Ce que Recall capture (et ce qui est extrait)

Recall ne prend pas seulement des captures d'écran. Il construit un profil comportemental complet de tout ce que vous faites sur votre ordinateur. Toutes les quelques secondes, il prend une capture d'écran, exécute une OCR et (supposément) une classification IA dessus, et stocke le résultat dans une base de données SQLite cryptée.

Tout ce qui suit est confirmé à partir de deux sources indépendantes : les métadonnées WinRT privées (Microsoft.Windows.AI.Platform.winmd, analysées via cppwinrt.exe) et le binaire de l'enclave VBS (storage_support.dll, qui contient le schéma complet de la base de données en chaînes de texte brut).

Données par capture

Note : les noms de champs ci-dessous sont confirmés à partir des métadonnées WinRT et des chaînes du binaire de l'enclave. Les descriptions de ce que chaque champ contient sont déduites des noms et des types d'API, et n'ont pas toutes été vérifiées dynamiquement au moment de l'exécution.

Métadonnées traitées par IA

Note : même avertissement que ci-dessus. Les noms de classes et d'énumérations sont énumérés à partir des métadonnées WinRT et des chaînes de DLL de l'enclave ; les descriptions de ce qu'ils représentent sont déduites des noms et du contexte et n'ont pas toutes été vérifiées dynamiquement pour chaque entrée.

En plus de la capture brute, Recall exécute une classification IA qui produit :

  • Reconnaissance d'entités nommées (10 types) : PersonName, Organization, Product, Address, Location, DateTime, Event, Duration, WebUrl, EmailAddress. Chacune extraite du texte OCR avec sa position source.
  • Classification thématique (23 catégories) : Topic, Person, Emoji, App, FileKind, , , , , , , , , , , , , , , , , , . Chacune avec des scores de confiance et des boîtes englobantes optionnelles.

Pipeline de capture

Toutes les quelques secondes, le service de capture de Recall évalue 12 politiques avant de décider de prendre une capture d'écran :

GameModeActive, BatterySaverActive, UserActivityIdle, UserPresenceIdle, StorageLow, PrivateWindow, BlockedByContentProtection, BlockedAppId, BlockedExecutable, BlockedURL, BlockedContentFilePath, BitLockerDisabled

Si aucun d'entre eux ne se déclenche, il capture. La structure d'entrée par capture (d'après les métadonnées WinRT) :``` WindowData { WindowId, Foreground, Title, Bounds, Minimized, PrivateState, InputScopePrivacy AppData { AppUserModelId, ProcessPath, IconUri, AppName, TileId RemoteClient, IsBrowserWindow } RestoreData { WebUrl, FilePath, ActivationUri, ActivityId, WebIconUri FileObjectId, VolumeId // NTFS persistent file identifiers SensitivityLabelData { State, Labels } } }

root@kitploit:~
### La base de données

La base de données principale (`ukg.db`) utilise SQLite SEE avec un chiffrement AES-256-GCM. Schéma confirmé à partir de `storage_support.dll` (le binaire de l'enclave VBS qui contient les instructions CREATE TABLE en texte clair) :

**Tables principales (17) :**```
WindowCapture              Id, Name, ImageToken, IsForeground, WindowId, WindowBounds,
                           WindowTitle, Properties, IsProcessed, Retry, ActivationUri,
                           ActivityId, FallbackUri, TimeStamp, DwellTime
WindowCaptureAppRelation   WindowCaptureId, AppId, IsBackground
WindowCaptureWebRelation   WindowCaptureId, WebId, IsBackground
WindowCaptureFileRelation  WindowCaptureId, FileId
WindowCaptureTopicRelation WindowCaptureId, TopicId, Score (float)
WindowCaptureTextIndex     FTS5 virtual table (WindowCaptureId, WindowTitle, OcrText)
App                        Id, WindowsAppId, IconUri, Name, Path, TileId, Properties
Web                        Id, Domain, Uri, IconUri, Properties
File                       Id, Path, Name, Extension, Kind, Type, ObjectId, VolumeId
Topic                      Id, Title, Properties
ScreenRegion               Id, WindowCaptureId, RegionKind, OcrText, Bounds
AppDwellTime               Id, WindowsAppId, HourOfDay, DayOfWeek, HourStartTimestamp, DwellTime
WebDomainDwellTime         Domain, HourOfDay, DayOfWeek, HourStartTimestamp, DwellTime
SearchHistory              SessionId, CorrelationId, TimeStamp, Kind, Text, Language
SearchFeedback             SessionId, CorrelationId, TimeStamp, Kind, Text, Language,
                           ItemChosenEventId, FeedbackType
IdTable                    NextId
_MigrationMetadata         Id, Version

Index de recherche sémantique (SemanticTextStore.sidb / SemanticImageStore.sidb):``` si_items Core embedding storage si_embedding_metadata Embedding type and source mapping si_diskann_graph DiskANN approximate nearest neighbor graph si_diskann_references Graph edge references si_diskann_config Index configuration si_diskann_info Index statistics si_application_values Application-level settings

root@kitploit:~
Au cours d'une journée de travail typique, des centaines de captures s'accumulent. La conservation par défaut est de 90 jours avec un seuil de stockage de 75 Go. Chaque email ouvert, chaque document modifié, chaque site web visité, chaque commande de terminal à l'écran, chaque conversation de messagerie visible. Le tout traité par OCR, avec extraction d'entités, classification thématique et indexation sémantique.

Votre vie numérique entière, indexée et consultable. Comme prévu.

---

## Ce que Microsoft a bien fait

L'enclave VBS est extrêmement solide. Le matériel de clé ne quitte jamais VTL1. Le chiffrement AES-256-GCM par page avec des nonces aléatoires est correct selon les manuels. La protection PPL de `aihost.exe` est efficace, le noyau bloque l'injection. CFG est complet sur ARM64. Les requêtes SQL sont entièrement paramétrées (dix charges utiles d'injection, zéro effet secondaire). Le modèle d'authentification est sans état et sans conditions de concurrence (des milliers de sondes, zéro contournement).

Le problème fondamental n'est pas le chiffrement, l'enclave, l'authentification ou le PPL. C'est l'envoi du contenu déchiffré à un processus non protégé pour le rendu. La porte du coffre est en titane. Le mur à côté est en placoplâtre.

---

## Divulgation responsable

Cette recherche a été divulguée de manière responsable au Microsoft Security Response Center (MSRC).

### Calendrier

| Date | Événement |
|------|-----------|
| 2024-06-07 | Original [TotalRecall](https://github.com/xaitax/TotalRecall) publié (Recall avant chiffrement) |
| 2024-06-13 | Microsoft retarde le lancement de Recall, annonce une refonte avec des enclaves VBS |
| 2025-04 | Recall relancé avec des enclaves VBS, chiffrement, authentification Hello |
| 2026-03-06 | Rapport soumis à MSRC : documentation complète, code source, instructions de construction |
| 2026-03-09 | MSRC ouvre le dossier 109586, statut : Révision / Repro |
| 2026-03-27 | MSRC : « l'équipe d'ingénierie est actuellement en phase finale d'investigation » |
| 2026-04-03 | MSRC clôt le dossier comme **Pas une vulnérabilité** : « fonctionne dans le cadre de la conception de sécurité documentée actuelle » |
| 2026-04-09 | TotalRecall Reloaded publié publiquement |

### Position de Microsoft

Après examen avec leurs équipes d'ingénierie, le MSRC a déterminé que « le comportement observé fonctionne dans le cadre de la conception de sécurité documentée actuelle de Recall » et que « les schémas d'accès démontrés sont cohérents avec les protections prévues et les contrôles existants ». Ils ont cité leur [blog d'architecture](https://blogs.windows.com/windowsexperience/2024/09/27/update-on-recall-security-and-privacy-architecture/), précisant que l'autorisation « restreint les tentatives de logiciels malveillants latents cherchant à profiter d'une authentification utilisateur pour voler des données » et que « les processus en dehors des enclaves VBS ne reçoivent jamais directement l'accès aux instantanés ou aux clés de chiffrement et ne reçoivent que les données renvoyées par l'enclave après autorisation ».

Le dossier a été clos comme Pas une vulnérabilité.

Les conclusions pré-authentification documentées ici (destruction de données non authentifiée, extraction de captures d'écran) ont été découvertes lors de recherches ultérieures après la clôture du dossier.

---

## Environnement testé

| | Détails |
|---|---|
| **OS** | Windows 11 25H2 (Build 26300.8155) |
| **Architecture** | ARM64 |
| **AIXHost.exe** | v2126.7602.0.0 |
| **Privilège** | Utilisateur standard (intégrité moyenne, aucune élévation) |

---

## Travaux antérieurs

- [TotalRecall](https://github.com/xaitax/TotalRecall) (juin 2024), l'outil Python original pour Recall avant chiffrement
- [L'analyse de Kevin Beaumont](https://doublepulsar.com/recall-stealing-everything-youve-ever-typed-or-viewed-on-your-own-windows-pc-is-now-possible-da3e12e9465e), la recherche qui a tout déclenché

## Remerciements

Merci à [Jeff McJunkin](https://x.com/jeffmcjunkin) et [Kevin Beaumont](https://cyberplace.social/@GossiTheDog) pour les tests et la validation.

---

**Alexander Hagenah ([@xaitax](https://x.com/xaitax))**
Télécharger l’outil
TryGetBitmapCaptureAsync()
SoftwareBitmap
QueryInterface
ISoftwareBitmapNative
GetData(IID_IWICBitmap)
IWICBitmapEncoder
  • OCR + NER + IA (asynchrone) : ContextEngine2.TryGetMemoryEntityDetailsForIdAsync() (slot 8) retourne les détails de l'entité. QI vers IMemoryEntityDetails pour OcrLines (slot 7), IMemoryEntityDetails2 pour les entités textuelles NER (personnes, emails, adresses), et IMemoryEntityDetails4 pour les descriptions d'activité IA
  • Tours de reprise : Baker.dll (la bibliothèque d'interface Recall) remplit le cache ContextEngine de manière asynchrone. Après le passage initial, la charge utile pompe les messages Windows pendant 3 secondes (boucle PeekMessage/DispatchMessage) et réessaie toute entité qui n'était pas disponible. Chaque tour donne généralement ~12 entités supplémentaires. Jusqu'à 10 tours de reprise.

  • DonnéesSourceCe qu'elle contient
    Capture d'écranTryGetBitmapCaptureAsyncPNG pleine résolution de tout votre écran
    Capture d'écran redimensionnéeTryGetBitmapCaptureAsync(Size, Mode)Capture d'écran à n'importe quelle résolution demandée avec interpolation configurable
    VignetteTryGetBitmapCaptureThumbnailAsyncImage d'aperçu en basse résolution
    Texte OCROcrText (Details3)OCR complet concaténé de tout ce qui est visible à l'écran
    Lignes OCROcrLines (Details1)Lignes OCR individuelles sous forme de chaînes séparées
    Mots OCRstruct OcrWordChaque mot avec une boîte englobante pixel-précise (RectInt32)
    Titre de fenêtreget_TitleTexte de la barre de titre de la fenêtre active
    Applicationget_AppDisplayNameQuelle application était au premier plan (Chrome, Outlook, Terminal, …)
    ID de modèle d'applicationget_AppUserModelIdChaîne d'identité UWP/Win32 de l'application
    Chemin du processusget_ProcessPathChemin complet de l'exécutable (C:\Program Files\...\chrome.exe)
    Icône d'applicationIMemoryEntity2.IconUriChemin vers l'icône de l'application
    URLget_WebUrlURL complète dans la barre d'adresse du navigateur
    Domaineget_WebDomainDomaine du site web
    Faviconget_WebIconUriURL du favicon pour le site web actif
    Chemin de fichierget_FileUriDocument ou chemin de fichier actif
    Position de la fenêtreget_WindowBoundsCoordonnées écran pixel-précises : X, Y, Largeur, Hauteur
    Horodatageget_TimestampHeure exacte de la capture (précision de 100 nanosecondes)
    Temps passé dans l'applicationIMemoryEntity3Combien de temps vous avez passé dans chaque application (millisecondes)
    Temps passé sur le webIMemoryEntity3Combien de temps vous avez passé sur chaque site web (millisecondes)
    Étiquette de sensibilitéIMemoryEntity5Classification Microsoft Purview/DLP : nom, couleur, info-bulle
    ID d'activité utilisateurIMemoryEntity6ID de corrélation d'activité du Timeline Windows
    Capacité de restaurationIMemoryEntity2Masque de bits : peut relancer application (0x1), URL (0x2), fichier (0x4), URI (0x8), timeline (0x10)
    Restauration du contexteTryRestoreContextAsyncRouvrir l'application exacte, la page ou le document à partir de n'importe quelle capture
    Domain
    UserTag
    Organization
    Product
    Address
    Location
    DateTime
    Event
    Duration
    MemoryDsc
    SensitivityLabel
    WebVideo
    Meeting
    Chat
    MailingPackage
    TextRatio
    SkipTopics
    Any
  • Régions d'écran (10 types) : Text, Image, Table, Container, Menu, ToolBar, AddressBar, Toolpane, TabBar, TitleBar. Chacune avec des boîtes englobantes pixel-précises et du texte OCR intégré.
  • Descriptions d'activités : L1Description (résumé en prose généré par IA de ce que vous faisiez), L1Activity (catégorisé : navigation, codage, écriture, lecture de courriels), L1Application (contexte d'application classifié par IA).
  • Nœuds de mémoire (4 types) : Meeting (appels de conférence), Chat (messagerie), WebVideo (lecture vidéo), MailingPackage (courriels/newsletters). Regroupe plusieurs captures en sessions d'activité logiques.
  • Classification du contexte (7 types) : UserActivity, KMeansCluster, LobeTopicCluster, ApplicationDwellTime, WebsiteDwellTime, ClipboardImageCopied, Topic.
  • Filtrage de contenu sensible (186 règles, activables/désactivables) : La DLL Platform intègre l'ensemble de règles Content Exposure Prevention (CEP) de Microsoft sous forme de XML, utilisé pour filtrer le contenu sensible des captures. Les règles couvrent les numéros de carte de crédit, les numéros de sécurité sociale, les codes banque, les permis de conduire, les passeports et les identifiants fiscaux dans plus de 30 pays, plus les identifiants cloud : clés de stockage Azure, clés secrètes AWS S3, PAT Azure DevOps, jetons client Azure AD, clés privées X.509, clés API, mots de passe généraux et identifiants de connexion. Le filtrage est contrôlé via IsContentFilteringEnabled sur l'interface IAutomatedCaptureController6.
  • Étiquettes de sensibilité : Classification Microsoft Purview/DLP par capture et par détail d'entité, avec nom, couleur et info-bulle.
  • Intégrations sémantiques (8 variantes) : 4 intégrations d'image (Originale, Plus grande région, Deuxième plus grande, Composite) et 4 intégrations de texte (OCR complet, filtré par région, par région, Titre de fenêtre). Stockées dans des index vectoriels DiskANN pour la recherche de similarité sur tout votre historique.