Intéressé par des cours d'informatique en ligne ?
Visitez mon nouveau site https://www.yesik.it !

La plupart des ordinateurs modernes utilise en standard un mécanisme appelé la mémoire virtuelle. En fait, il s'agit d'utiliser le disque dur pour suppléer à un manque de mémoire vive (RAM). L'avantage est évidemment d'ordre financier. Le prix du giga-octet de RAM est nettement plus élevé que celui d'un disque dur. La contre-partie principale est une dégradation des performances. Puisque l'accès aux données situées sur le disque dur est des centaines voire des milliers de fois plus lent que si elles étaient situées en mémoire vive.

Principe de fonctionnement

Pour commencer un petit rappel: l'ordinateur – ou pour être plus exact le micro-processeur ne peut manipuler que des données qui sont en RAM physique. Tant qu'il y a de la place en RAM, les nouvelles données y prennent place:

Tant qu'il y a de la place en mémoire physique les données y sont placées

Une fois la mémoire physique pleine, la mémoire virtuelle entre en jeu. Si l'ordinateur a besoin de charger des données supplémentaires pour les manipuler, le gestionnaire de mémoire virtuelle va devoir faire de la place en RAM.

Bien entendu, pour des raisons de performances, le gestionnaire de mémoire virtuelle ne travaille pas octet par octet. Mais par paquet de un ou plusieurs kilo-octets appelés page. Donc, le gestionnaire de mémoire virtuelle trouve une page susceptible d'être transférée sur le disque dur (parce que les données qu'elle contient n'ont pas été utilisées depuis longtemps, par exemple). Il la copie dans le fichier d'échange – ou swap (en anglais, et plus généralement dans le jargon Unix). Ensuite, la donnée à charger prend la place ainsi libérée en RAM physique.

Le gestionnaire de mémoire virtuelle doit transférer une page dans le fichier d'échange pour libérer de la mémoire physique pour de nouvelles données

Enfin, si l'ordinateur a à nouveau besoin de données précédemment copiées dans le fichier d'échange, il va d'abord falloir libérer une page de la RAM physique en la copiant elle aussi dans le fichier d'échange. Et ensuite, il faudra recharger la page demandée dans l'espace ainsi libéré. Bien sûr, plus il y a de mémoire virtuelle utilisée, plus ces échanges ont lieu fréquemment. Et moins le système est performant.

Remarque:

C'est aussi l'échange incessant entre le disque dur et la RAM qui est à l'origine du bruit caractéristique d'un ordinateur qui utilise beaucoup sa mémoire virtuelle: Crrrr-Crrrr-Crrrr---Crrrr-Crrrr.

Avant de recharger une page en RAM physique, il faut d'abord libérer une page en copiant son contenu vers l'espace d'échange

Un inconvénient sous-estimé

J'ai dit plus haut que l'inconvénient principal de la mémoire virtuelle était la dégradation des performances de l'ordinateur. Mais il y en a un autre. Très gros. Surtout si votre ordinateur manipule des données sensibles. En effet, qui dit enregistrement sur le disque dit possibilité de récupérer les données. Même après l'extinction de l'ordinateur (alors que la RAM physique est volatile: son contenu disparaît à température ambiante en quelques secondes).

Une petite expérience

A titre d'expérience, j'ai commencé à rédiger un message dans mon navigateur. Ce pourrait être un message dans votre WebMail, ou un post dans un blog, ou tout ce que vous voulez. Pour cette expérience, j'ai utilisé Iceweasel/Firefox – un logiciel pourtant réputé pour prendre au sérieux les problèmes de sécurité.

En outre, je tiens aussi à signaler que je n'ai même pas posté ce message. Je n'ai fait non plus aucune sauvegarde du texte de ce message. Je l'ai juste tapé dans la zone de saisie dans la fenêtre de mon navigateur:

Pendant et après la rédaction de ce message, j'ai ouvert un certain nombres d'applications: Eclipse, OpenOffice, Gimp, Dia. J'ai aussi écouté de la musique. Bref, j'ai tout fait pour occuper toute la mémoire vive et forcer Linux à faire usage du fichier d'échange (swap).

Remarque:

Peut-être allez-vous penser que je l'ai bien cherché. Et que dans la vraie vie, on ne lance pas plein d'applications pendant qu'on rédige un message.

Sachez simplement que pour cette expérience, je suis parti d'un swap complètement vide. Autrement dit, afin de faire cette expérience dans des conditions reproductibles, j'ai quitté toutes les applications sauf le strict nécessaire, et je me suis arrangé pour que toutes les données soient en RAM physique. D'où la nécessité de charger un peu l'ordinateur pour que Linux commence à swapper.

Maintenant, observez ce qui se passe dans la vraie vie: quand vous rédigez un message comme ici, vous avez sans doute déjà utilisé d'autres applications. Une (bonne) partie de la RAM physique est sans doute déjà utilisée. Et il y a certainement déjà des pages en mémoire virtuelle. Bref, il y a de grandes chances que votre ordinateur soit plus enclin à swaper que la machine clean de laquelle je suis parti...

Bref, je me suis arrangé pour faire swapper mon ordinateur. Alors passons maintenant au constat du délit. Tout d'abord, et toujours pour que vous ne m'accusiez pas de biaiser cette expérience, j'ai désactivé l'utilisation du fichier d'échange:

sh# swapoff -a

A partir de maintenant, le fichier d'échange n'est plus utilisé. Ce qu'il contient y reste pour que nous puisions l'examiner tranquillement. Sous Linux le fichier d'échange occupe sa propre partition. Avant d'aller plus loin, nous devons l'identifier. C'est facile, dans le fichier /etc/fstab c'est celle qui est marquée swap:

sh# cat /etc/fstab
# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/hda7       /               ext3    defaults,errors=remount-ro 0       1
/dev/hda5       /home           ext3    defaults        0       2
/dev/hda8       /mnt/fat32      vfat    defaults,umask=000        0       0
/dev/hda2       /windows        vfat    defaults        0       0
/dev/hda6       none            swap    sw              0       0
/dev/hdb        /media/cdrom0   udf,iso9660 user,noauto     0       0

Comme vous le voyez sur ma machine la partition de swap est celle identifiée par le périphérique bloc /dev/hda6.

Voyons un peu ce qu'il contient. Ici, j'utilise hexdump et less des outils rudimentaires disponibles en standard dans n'importe quelle distribution Linux. Un assaillant utiliserait sans doute plutôt des outils spécialisés...

sh$ hexdump -C /dev/hda6 | less
... # Après une recherche:
013d65b0  73 63 72 6f 6c 6c 3a 22  30 2c 30 22 7d 2c 20 7b  |scroll:"0,0"}, {|
013d65c0  75 72 6c 3a 22 68 74 74  70 3a 2f 2f 63 68 69 63  |url:"http://chic|
013d65d0  6f 72 65 65 2f 77 2f 69  6e 64 65 78 2e 70 68 70  |oree/w/index.php|
013d65e0  3f 74 69 74 6c 65 3d 54  6f 70 5f 73 65 63 72 65  |?title=Top_secre|
013d65f0  74 26 61 63 74 69 6f 6e  3d 65 64 69 74 22 2c 20  |t&action=edit", |
013d6600  63 68 69 6c 64 72 65 6e  3a 5b 5d 2c 20 74 69 74  |children:[], tit|
013d6610  6c 65 3a 22 4d 6f 64 69  66 69 63 61 74 69 6f 6e  |le:"Modification|
013d6620  20 64 65 20 54 6f 70 20  73 65 63 72 65 74 20 2d  | de Top secret -|
013d6630  20 43 68 69 63 6f 72 65  65 22 2c 20 63 61 63 68  | Chicoree", cach|
013d6640  65 4b 65 79 3a 30 2c 20  49 44 3a 39 2c 20 73 63  |eKey:0, ID:9, sc|
013d6650  72 6f 6c 6c 3a 22 30 2c  30 22 7d 5d 2c 20 69 6e  |roll:"0,0"}], in|
013d6660  64 65 78 3a 33 2c 20 7a  6f 6f 6d 3a 31 2c 20 64  |dex:3, zoom:1, d|
013d6670  69 73 61 6c 6c 6f 77 3a  22 22 2c 20 78 75 6c 74  |isallow:"", xult|
013d6680  61 62 3a 22 22 2c 20 65  78 74 44 61 74 61 3a 6e  |ab:"", extData:n|
013d6690  75 6c 6c 2c 20 74 65 78  74 3a 22 23 77 70 54 65  |ull, text:"#wpTe|
013d66a0  78 74 62 6f 78 31 3d 56  6f 69 63 69 25 32 30 75  |xtbox1=Voici%20u|
013d66b0  6e 25 32 30 65 78 65 6d  70 6c 65 25 32 30 64 65  |n%20exemple%20de|
013d66c0  25 32 30 74 65 78 74 65  25 32 30 74 61 70 25 43  |%20texte%20tap%C|
013d66d0  33 25 41 39 25 32 30 64  61 6e 73 25 32 30 6c 61  |3%A9%20dans%20la|
013d66e0  25 32 30 66 65 6e 25 43  33 25 41 41 74 72 65 25  |%20fen%C3%AAtre%|
013d66f0  32 30 64 27 25 43 33 25  41 39 64 69 74 69 6f 6e  |20d'%C3%A9dition|
013d6700  25 32 30 64 27 75 6e 25  32 30 6e 61 76 69 67 61  |%20d'un%20naviga|
...

Comme vous le voyez, par la magie de la mémoire virtuelle, le texte que j'ai tapé dans mon navigateur a été enregistré sur le disque dur!

Et il peut y rester un bon moment: tant que le gestionnaire de mémoire virtuelle n'a pas besoin de libérer cette page dans le fichier d'échange et qu'il ne l'écrase pas avec le contenu d'une nouvelle page, les données vont y rester. Autrement dit, si après avoir posté ce message secret vous éteignez votre ordinateur – ou simplement quittez votre poste de travail – n'importe qui ayant un accès physique au disque dur peut retrouver ces données tout aussi facilement.

Plus simple

Vous n'êtes pas convaincu. Vous vous dites toujours oui, mais il s'est mis dans des conditions particulières. Et puis le swap a de grandes chances d'être écrasé. Etc. Bref, vous voulez un exemple encore plus simple. Amusez-vous donc à faire cette même expérience de commencer à taper un message dans votre client de messagerie préféré (ou votre traitement de texte favori, ou n'importe quelle autre application). Puis passez votre ordinateur en veille longue. Relancez-le. Et là, surprise! A votre avis où sont sauvegardées les données qui étaient en RAM lors de la mise en veille? Dans le fichier d'échange!

Si vous examinez alors son contenu et vous verrez tout ce qui était en RAM lors de la mise en veille. Aussi bien le message que vous étiez en train de taper que toutes les données des applications ouvertes. Du pain béni pour un pirate qui mettrait la main sur votre disque dur...

Se protéger

La stratégie la plus simple pour éviter le risque qu'un assaillant ne récupère des données à partir du ficher d'échange, c'est de ne pas en utiliser. Et d'avoir assez de RAM physique pour satisfaire les besoins en mémoire des applications qui tournent sur votre machine.

Une autre alternative est de nettoyer le swap après avoir manipulé des données sensibles. C'est ce que nous allons faire maintenant. Sous Linux, c'est relativement simple. Il suffit d'arrêter la mémoire virtuelle (swapoff), puis d'écraser le contenu de la (ou les) partition(s) de swap(dd). Une fois cette opération effectuée, il faut recréer la partition de swap (mkswap) et la remettre en service (swapon):

Piège:

Faites extrêmement attention: ici nous allons utiliser la commande dd pour écraser tout le contenu d'une partition. Assurez-vous donc que la partition que vous écrasez est bien celle du swap (à vérifier dans /etc/fstab).

En effet, dd écrasera tout aussi allègrement n'importe quelle autre partition, y compris celle qui contient vos données importantes!

sh$ swapoff -a # Arrête la mémoire virtuelle
sh$ dd if=/dev/urandom of=/dev/hda6 # Remplit la partition de swap de données aléatoires
sh$ mkswap /dev/hda6 # Reconstruit le filesystem de la partition de swap
sh$ swapon -a # Réactive la mémoire virtuelle

Et voilà: après ces manipulations, le swap ne contient plus que des données aléatoires – et toutes les pages sont libres. Votre système d'exploitation peut à nouveau l'utiliser. Eventuellement pour recommencer à y copier des données sensibles, d'ailleurs...

Est-ce que ça suffit?

Ecraser les données du swap permet d'éviter à un individu malveillant de récupérer ses données avec les fonctionnalités supportées par votre système d'exploitation.

Néanmoins, en cas de données extrêmement sensibles, ceci n'est peut-être pas suffisant. En effet, il est possible à quelqu'un ayant un accès physique au disque d'utiliser des moyens d'investigation exotiques comme l'analyse de surface du disque. Ce sont là des moyens sans doute hors de portée d'un pirate ordinaire. Mais pas d'un gouvernement hostile ou tout simplement d'une société concurrente disposant du matériel nécessaire.

Quand à savoir combien d'écriture et ce qu'il faut écrire (des 1? des 0? ou des données aléatoires) pour vraiment rendre inaccessible les données a quelqu'un doté de l'équipement nécessaire, c'est une matière qui fait débat parmi les spécialistes. Certains affirment que les disques modernes ont une telle densité de surface qu'une seule écriture rend les données impossibles à reconstituer. D'autres affirment qu'il faut plusieurs (6 ou 7) ré-écritures avec un schéma bien précis pour rendre irrécupérables ces données. Enfin, certains soulignent même qu'en théorie, il est possible de reconstituer n'importe quelle donnée écrite sur un disque dur.[1] [2] [3] [4] [5]

A titre d'information, sachez que certaines agences gouvernementales insistent pour que les disques ayant contenus des données top-secret soient physiquement détruits par vaporisation, dissolution dans de l'acide ou abrasion de la surface des disques. Et encore dans ce dernier cas, le gouvernement du Royaume-Uni préconise que la poussière ainsi récoltée soit collectés dans des récipients scellés et classifiée pendant 12 ans!

L'alternative

L'alternative pour protégée vos données sensibles est tout simplement de crypter le swap. Sous Linux, depuis le Kernel 2.6 c'est possible avec dm-crypt. En fait, cet utilitaire permet de crypter à la volée les données de n'importe quelle partition de votre disque dur. L'inconvénient est que la mise en oeuvre n'est pas des plus faciles. Pour plus de renseignements, je vous conseille les liens suivants:

En conclusion

J'espère que cet article vous aura sensibilisé (sans jeu de mot) au risque de divulgation de données sensibles via le swap.

En tous cas, s'il n'y a qu'une chose à retenir, c'est que le disque dur est susceptible de trahir bien des secrets industriels. Et cela, même si vous pensez prendre des précautions comme chiffrer vos documents ou utiliser des protocoles de communication sécurisés. Le simple fait que des données soient chargées à un moment ou un autre en clair dans la RAM les rend candidates pour une copie (toujours en clair) dans le fichier d'échange.