La plupart des gens qui utilisent une Debian ou une Ubuntu ont entièrement confiance dans les mises à jour de sécurité. Ils ont bien raison, c'est pour cela qu'on utilise une distribution.[1]

Cependant, après le traditionnel aptitude update && aptitude safe-upgrade ou un clic sur Installer les mises à jour du Gestionnaire de mises à jour, il faut bien penser à redémarrer les logiciels concernés par les mises à jour, notamment dans le cas de bibliothèques partagées ou de mise à jour du noyau !

En effet, quasiment tous les programmes installés sur une distribution Linux utilisent des bibliothèques partagées. Ce sont des morceaux de code, regroupés dans un fichier .so et chargés en mémoire à l'exécution du programme. Par exemple, si je prends l'exemple du logiciel Apache2 tournant actuellement sur mon Linux :

$ sudo ps ax |grep apache2
5245 ?        Ss     0:00 /usr/sbin/apache2 -k start
5379 ?        S      0:00 /usr/sbin/apache2 -k start
5382 ?        S      0:00 /usr/sbin/apache2 -k start
5384 ?        S      0:00 /usr/sbin/apache2 -k start
5385 ?        S      0:00 /usr/sbin/apache2 -k start
5388 ?        S      0:00 /usr/sbin/apache2 -k start
6612 ?        S      0:00 /usr/sbin/apache2 -k start
7225 pts/0    R+     0:00 grep apache2

Le processus apache2 a pour PID (Process IDentifier) 5245. Je regarde les bibliothèques partagées utilisées par ce processus :

$ sudo cat /proc/5245/maps
7f65ad09a000-7f65ad0b0000 r-xp 00000000 08:03 3599252                    /usr/lib/php5/20060613/pdo.so
7f65ad0b0000-7f65ad2b0000 ---p 00016000 08:03 3599252                    /usr/lib/php5/20060613/pdo.so
7f65ad2b0000-7f65ad2b1000 r--p 00016000 08:03 3599252                    /usr/lib/php5/20060613/pdo.so
7f65ad2b1000-7f65ad2b4000 rw-p 00017000 08:03 3599252                    /usr/lib/php5/20060613/pdo.so
7f65ad2b4000-7f65ad2bf000 r-xp 00000000 08:03 4540164                    /lib/libnss_files-2.8.90.so
7f65ad2bf000-7f65ad4be000 ---p 0000b000 08:03 4540164                    /lib/libnss_files-2.8.90.so
7f65ad4be000-7f65ad4bf000 r--p 0000a000 08:03 4540164                    /lib/libnss_files-2.8.90.so
7f65ad4bf000-7f65ad4c0000 rw-p 0000b000 08:03 4540164                    /lib/libnss_files-2.8.90.so
7f65ad4c0000-7f65ad4ca000 r-xp 00000000 08:03 4540166                    /lib/libnss_nis-2.8.90.so
[...]

Au total, il y a environ 63 bibliothèques différentes utilisées par Apache2.

Lors d'une mise à jour de sécurité d'une bibliothèque partagée, le système de mise à jour va remplacer sur le disque le contenu de /usr/lib/toto.so par un nouveau /usr/lib/toto.so corrigeant la faille de sécurité. Mais si mon programme Apache2 utilise cette bibliothèque toto.so, les versions en mémoire utilisées par les processus apache2 ne seront pas mises à jour ! C'est une propriété des systèmes Unix : si on efface un fichier en cours d'utilisation, l'ancienne version actuellement utilisée par des programmes leurs est toujours accessible, et ce jusqu'à la fermeture par les programmes concernés de ce fichier.[2]

Au final, pour faire une mise à jour complète, il faut identifier les programmes à redémarrer pour que tous utilisent les nouvelles versions corrigées des bibliothèques :

  • faire l'habituel aptitude safe-upgrade ;
  • si un paquet du style libtoto3 est mis à jour, repérer tous les programmes utilisant cette bibliothèque avec lsof (merci Saint Gilles et François !) et les redémarrer :
$ sudo lsof | grep toto
[ des processus s'affichent comme zedémon ]
$ sudo invoke-rc.d zedémon restart
  • si les paquets mis à jour sont le noyau Linux ou des bibliothèques utilisées par tous les programmes, redémarrer la machine.[3]

Idéalement, le système de mise à jour des paquets devrait redémarrer les programmes qui le nécessitent. Vous pouvez utiliser le programme checkrestart du paquet Debian debian-goodies pour vous indiquer les services à redémarrer.[4]

Si votre Debian ou Ubuntu est une machine que vous éteignez tous les soirs, ne vous donnez pas la peine de chercher et redémarrer les programmes le nécessitant, la bonne version sera utilisée au prochain démarrage.

Mise à jour. 2009-04-11 : ajout information sur checkrestart.

Notes

[1] Sinon on suit les annonces de sécurité des logiciels installés et ont fait les patches et autres mises à jour soit-même.

[2] C'est justement cette propriété qui permet de mettre à jour dynamiquement un système sans perturber le fonctionnement des programmes en cours. Windows n'en est pas capable.

[3] Une tradition Unix veut qu'on ne redémarre jamais une machine. Mais ce folklore a été établi à une époque où il n'y avait pas autant d'alertes de sécurité. Si on n'utilise pas les noyaux à jour, on se fait attaquer, comme les serveurs Debian en novembre 2003.

[4] Merci à Fred pour avoir creusé le problème et donné le pointeur sur checkrestart sur gulliver@.