The Phucking Salt
Posted by NiTRo | Filed under Hardware, Kb, Performance, Test, Tips & Tricks, VMware
MAJ 18/05/2016 : Finalement les Large Pages c’est vraiment pas top…
These issues are due to bug in large page promotion path on destination host during vMotion.
MAJ 22/10/2015 : Et encore des mecs qui confondent cloud et homelab…
All experiments run on a dual CPU blade server with two AMD Opteron 6272 CPUs (16 cores each) and 32 GB of RAM.
MAJ 26/02/2015 : Le patch pour la 5.0 vient de sortir, la boucle est bouclée.
Vous ne vous en êtes peut être pas rendu compte lors de votre dernière campagne de patching mais depuis mi-Octobre 2014, tout nouveau patch d’ESXi ajoute une fonctionnalité de salage pour TPS. Désactivée lors de son introduction mais bien destinée à être activée de force lors d’un patch ultérieur. Jusqu’à fin Janvier, seule la version 5.1 était concernée mais depuis le 27/01 la version 5.5 bénéficie aussi de cette nouvelle “feature”. La 5.0 est encore épargnée à ce jour.
As we noted earlier on Oct 16, Nov 24 and Dec 4, VMware has introduced new TPS (Transparent Page Sharing) management options. Today’s release of ESXi 5.5 U2d restricts TPS to individual VMs and disables inter-VM TPS by default unless an administrator chooses to re-enable it. Please see KB 2097593 for full details on the functionality.
Depuis l’annonce, beaucoup de bullshit. De nombreux blogeurs ont donné leur avis sur la question en omettant volontairement (aka je-suis-pas-un-expert-en-sécu) d’analyser les recherches qui ont abouti a cette rustine. Nous ne sommes pas expert en matière de sécurité non plus, par contre on ne va pas se gêner pour décortiquer les résultats de ces recherches et les critiquer. On commence par la kb 2080735 de VMware :
Published academic papers have demonstrated that by forcing a flush and reload of cache memory, it is possible to measure memory timings to try and determine an AES encryption key in use on another virtual machine running on the same physical processor of the host server if Transparent Page Sharing is enabled between the two virtual machines. This technique works only in a highly controlled system configured in a non-standard way that VMware believes would not be recreated in a production environment.
Even though VMware believes information being disclosed in real world conditions is unrealistic, out of an abundance of caution upcoming ESXi Update releases will no longer enable TPS between Virtual Machines by default
C’est pourtant clair mais VMware à quand même choisi de jouer la carte de la sécurité.
Une petit coup de Google nous a rapidement permis d’identifier les rapports de recherche à l’origine du mélodrame : Fine grain Cross-VM Attacks on Xen and VMware are possible! et Wait a minute! A fast, Cross-VM attack on AES dont les travaux semble basés sur un autre rapport datant de 2013 : FLUSH+RELOAD: a High Resolution, Low Noise, L3 Cache Side-Channel Attack
Extraits choisis du document de 2013 :
The technique uses the processor’s clflush instruction to evict the monitored memory locations from the cache, and then tests whether the data in these locations is back in the cache after allowing the victim program to execute a small number of instructions.
While copy-on-write protects shared pages from modifications, it is not fully transparent. The delay introduced when modifying a shared page can be detected by processes, leading to a potential information leak attack.
An important feature of the LLC in modern Intel processors is that it is an inclusive cache (NDLR : Et donc pas AMD). That is, the LLC contains copies of all of the data stored in the lower cache levels. Consequently, flushing or evicting data from the LLC also remove said data from all other cache levels of the processor. Our attack exploits this cache behaviour.
Retrieving data from memory or from cache levels closer to memory takes longer than retrieving it from cache levels closer to the core. This difference in timing has been exploited for side-channel attacks.
A round of attack consists of three phases. During the first phase, the monitored memory line is flushed from the cache hierarchy.
The spy, then, waits to allow the victim time to access the memory line before the third phase.
In the third phase, the spy reloads the memory line, measuring the time to load it. If during the wait phase the victim accesses the memory line, the line will be available in the cache and the reload operation will take a short time.
Maintenant qu’on en sait un peut plus sur la nature de l’attaque, voyons un peu les contraintes d’applications dans la vraie vie :
For a virtualised environment, the attacker needs access to a guest co-located on the same host as the victim guest. Techniques for achieving co-location are described by Ristenpart et al.
[...]
Identifying the OS and software version in co-resident guests has been dealt with in past research.
D’un coup de baguette magique, on se retrouve sur le même ESX avec le même GuestOS. Facile. On continue :
For the attack to work, the spy and the victim must execute on the same physical processor. For our testing, we set the processor affinity on the multi-processor system. However, in a real attack scenario the attack depends on the system scheduler.
Vous avez bien lu, la VM de l’attaquant doit résider sur le même processeur que la VM de la victime. Cache L3 oblige. Et c’est pas fini :
When performing the tests, the spy and the victim were the only load on the system. Such a scenario is not representative of a real system where multiple processes are running. We expect such load to create noise that will affect the quality of capture. Furthermore, for a load that includes multiple parallel instances of GnuPG, the spy will be unable to distinguish between memory access of each instance and will be unable to recover any data.
Donc, pour que l’attaque soit réalisable, il faut que la VM de l’attaquant se retrouve, avec la VM de la victime, seules sur le même socket du même ESX et avec le même GuestOS ! Et c’est toujours pas fini.
Extraits choisis du document sur l’attaque AES :
We know that VMware implements TPS with large pages (2 MB) or small pages (4 KB). We decided to use the later one, since it seems to be the default for most systems. Furthermore, as stated in [28], even if the large page sharing is selected, the VMM will still look for identical small pages to share.
Sachant que TPS ne supporte pas les large pages qui sont la configuration par défaut d’ESX depuis des années, non seulement ESX ne serait que partiellement vulnérable uniquement en cas d’overcommit important mais de plus le contexte initiale de l’étude est complètement faux.
Disabling the deduplication would make the attack impossible in the cloud however memory deduplication is highly performance beneficial, especially in cloud where multiple users share the same hardware. This is why we believe that the system designers should restrict the deduplication mechanism rather then completely disabling it.
Quel dilemme…
We not only performed the attack in native machine, but also in a cloud-like cross-VM scenario.
“cloud-like” et pourtant :
All experiments were performed on a machine featuring an Intel i5-3320M four core clocked at 3.2GHz.
Ironie du sort, un récent rapport de recherche décrit un nouveau type d’attaque sur le cache L3 en exploitant…les large pages !
S$A: A new deduplication free L3 cache side channel technique: We proposed a new side channel technique that is applied in the L3 cache and therefore can be applied in cross-core scenarios. The new side channel technique bases its methodology in the usage of huge size pages, which give extra information about the position that each memory location occupies in the L3 cache.
Prochaine étape : désactivation des large pages par défaut ou V2P en masse.
The relevance of these studies is highlighted by the prompt security update by VMware, making memory deduplication an opt-in feature that was formerly enabled by default.
[...]
We have disclosed our attack to the security teams of VMware, Amazon AWS and Citrix.
Mais revenons en au salting et à ses effets en cas d’overcommit. Sur un Dell R730 avec 256Go de RAM, nous nous sommes amusé à démarrer 512 VM SUSE 11 x64 1vcpu 2Go de vRAM avec des combinaisons de settings Mem.ShareForceSalting et Mem.AllocGuestLargePage différentes. Pour éviter que ça coince pendant le swapout, nous avons redirigé les vswp sur des SSD NVMe. On commence en mode défaut (Mem.ShareForceSalting=2 et Mem.AllocGuestLargePage=1) :
La courbe d’overhead (orange) permet de se rendre compte de la progression du démarrage des 512 VM. On remarque qu’au 3/4 du bootstorm le premier mécanisme de reclaim est la swap, viennent ensuite la compression, le ballooning et seulement après le sharing (principalement des zéros). Avec 23Go de swap et 43Go de zip, n’espérez pas des temps de réponses de folie même avec du SSD. On continue sans le salting (Mem.ShareForceSalting=0 et Mem.AllocGuestLargePage=1) :
Avec plus de 100Go de sharing et seulement 3,6Go de swap les effets de l’overcommit (3:1 quand même) sont presque imperceptibles dans ce scénario même si on regrette de constater que le swapping est encore le 1er mécanisme à se déclencher. Maintenant passons en full small pages (Mem.ShareForceSalting=0 et Mem.AllocGuestLargePage=0) :
Là on est au top, 200Go de sharing et un démarrage tout en douceur sans swap, compression ni balloon. Et pour finir, notre fameuse technique du Large Page on Demand (Mem.ShareForceSalting=0 Mem.AllocGuestLargePage=1 et LPage.LPageAlwaysTryForNPT=0) :
Même chose mais avec “seulement” 143Go de sharing, la différence étant vraisemblablement attribuée à des large pages.
Moralité, optez pour un régime sans sel !
Tags: Bullshit, overcommit, salt, TPS, Transparent Page Sharing
February 13th, 2015 at 18:38
Hypervisor investigator strikes again !!
February 19th, 2015 at 9:50
Bravo pour ce tour de la question ! C’est beaucoup plus clair à présent, notamment sur les motivations (que l’on peut trouver discutables, mais le principe de précaution peut prévaloir dans certains environnements)
Un p’tit one-liner pour forcer Mem.ShareForceSalting=0 et Mem.AllocGuestLargePage=0 ?
Merci à vous !
February 19th, 2015 at 10:11
Au final :
vim-cmd hostsvc/advopt/update Mem.AllocGuestLargePage long 1
vim-cmd hostsvc/advopt/update Mem.ShareForceSalting long 0
vim-cmd hostsvc/advopt/update Mem.AllocGuestRemoteLargePage long 0
vim-cmd hostsvc/advopt/update Mem.ShareForceSalting long 0
vim-cmd hostsvc/advopt/update LPage.LPageAlwaysTryForNPT long 0
Et on est bon, avec un bon compromis overcommit/performance workload.
V.
February 19th, 2015 at 10:20
Merci pour votre feedback. @Vincent, vous n’êtes pas le premier à me demander un oneliner, je vais poster une update ASAP. Pour info Mem.AllocGuestRemoteLargePage ne sert qu’aux machines non-NUMA.
March 31st, 2015 at 15:45
En attendant le OneLiner magique
Via la VMA
Appliquer
esxcfg-advcfg –vihost HOSTNAME -set 0 Mem.ShareForceSalting
CHeck
esxcfg-advcfg –vihost HOSTNAME -get Mem.ShareForceSalting
April 1st, 2015 at 10:59
Salut dans le KB VMware
Il y a un script permettant d’activer ou non le Salting sur les ESXi
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2097593
.\pshare-salting.ps1 -s -> Enables pshare salting.
.\pshare-salting.ps1 -o -> Turn offs pshare salting and falls back to default TPS behavior.
April 1st, 2015 at 14:19
[...] A voir : http://www.hypervisor.fr/?p=5298 [...]
July 23rd, 2015 at 16:47
Super article !
Petite coquille dans le premier test : “Mem.ShareForceSalting=2″
Jeremy
July 24th, 2015 at 9:06
Edit : My bad, on peut maintenant mettre une valeur de 2 à ce paramètre !
Depuis la sortie de ce fameux patch fin 2014, un nouveau patch a été déployé par VMware (26/02/2015) qui autorise plus d’option pour ce paramètre : http://kb.vmware.com/kb/2097593
Jeremy
July 24th, 2015 at 16:52
@Jeremy pour moi ce setting à toujours eu 3 valeurs possible. Où as tu vu le contraire ?
July 24th, 2015 at 17:51
@NiTRo, sur un de mes lab, j’ai 2 ESXi 5.5U2 + le patch de novembre (build 2143827) et pour le force salt, j’ai max 1.
On retrouve une KB d’époque d’ailleurs : http://kb.vmware.com/kb/2091682 ou il est précisé que 2 valeurs possibles.
Jeremy
July 24th, 2015 at 19:16
Bien vu. Heureusement que 0 correspond toujours à la même fonctionnalité…
June 29th, 2018 at 12:34
[...] donc le moment de sortir les popcorn’s. Quand on se souvient de l’affaire du salage de TPS pour des histoires de differences de latenc…, on se régale de la com VMware qui justifiera la désactivation d’HT dans [...]