Connexion Premium

Les Mac perdent leur connexion réseau après 49 jours, 17 heures, 2 minutes et 47 secondes

Retour vers le futur, en version 32 bits

Les Mac perdent leur connexion réseau après 49 jours, 17 heures, 2 minutes et 47 secondes

© Francisco De Legarreta C. (Unsplash)

Au bout de 49 jours, 17 heures, 2 minutes et 47 secondes, un Mac resté allumé tout ce temps commencera à perdre sa connexion réseau. La seule solution ? Le redémarrage de l’ordinateur. En cause : un problème d’horloge interne…

Une « bombe à retardement », c’est ainsi que Photon, un service qui connecte des agents IA à iMessage d’Apple, qualifie sa découverte sur Mac. L’image est parlante, mais un rien exagérée car il suffit d’un redémarrage pour que tout revienne à la normale. Néanmoins, cette « date d’expiration » peut représenter un sérieux problème dans les organisations qui ont besoin de faire tourner des Mac en continu.

Une horloge interne en panique

Le noyau XNU de macOS en charge des ressources du Mac, s’appuie sur un compteur interne pour suivre le temps dans la gestion des connexions réseau, sous la forme d’un entier non signé sur 32 bits. Il peut donc contenir des valeurs allant de 0 à 4 294 967 295 (2³²). Si on se sert d’un entier non signé de 32 bits pour compter le temps en millisecondes, le compteur peut donc aller jusqu’à 4  294  967 secondes, soit 49 jours, 17 heures, 2 minutes et 47 secondes. Au-delà ? Ça dépend des cas : retour à zéro, plantage…

Photon a découvert que sur Mac, une vérification mal conçue dans le noyau empêche le système de reconnaître correctement ce basculement après les 49 jours, 17 heures… Tant que le compteur peut augmenter, tout fonctionne normalement. Mais quand il atteint sa limite et repart de zéro, la machine se grippe. macOS considère alors, à tort, que le nouveau temps est « inférieur » à l’ancien et refuse de l’enregistrer.

Le sujet n’est pas nouveau et largement documenté. On le trouve par exemple dans le bug de l’an 2038 sur Linux. Un petit changement sur Debian depuis la version 13 a permis de résoudre le souci : la distribution utilise le format 64 bits (au lieu de 32 bits), de quoi repousser l’échéance de… 292 milliards d’années. Si on remonte dans le temps à l’époque de Windows 95, certains se souviendront peut-être que le système plantait aussi après 49,7 jours d’utilisation.

Résultat, l’horloge TCP reste figée à sa dernière valeur valide. Tous les mécanismes qui dépendent du temps, à l’image de la suppression des connexions fermées, cessent de fonctionner normalement. Il en va ainsi des ressources réseau qui dépendent des connexions TCP : elles s’accumulent jusqu’à saturation, ce qui rend impossible l’ouverture de nouvelles connexions.

Le redémarrage, ultime solution pour l’instant

Photon s’est rendu compte du problème en surveillant sa flotte de Mac qui font tourner plusieurs services iMessage. Des machines qui fonctionnent 24/7 et ne redémarrent qu’en cas de nécessité absolue. Plusieurs de ces Mac ont cessé d’établir de nouvelles connexions TCP 49,7 jours après leur dernier redémarrage.

« Les pings continuaient de fonctionner. Les connexions existantes restaient actives. Mais toute tentative nécessitant l’ouverture d’un nouveau socket TCP échouait », écrit le service. Seule solution : un redémarrage. Cela concerne donc les Mac fonctionnant en continu pendant plus de 49 jours et 17 heures sans redémarrer et qui ont une activité réseau TCP (tous les Mac connectés, au fond). 

Selon Tidbits, il semblerait que le bug soit circonscrit à macOS Tahoe, la dernière version du système d’exploitation (macOS 26). Les précédentes moutures de l’OS ne seraient pas affectées, ce qui explique pourquoi le problème n’a jamais été remonté auparavant. Photon de son côté laisse entendre que le bug pourrait remonter à Catalina… Apple ne s’est pour le moment pas exprimé.

Par ailleurs, un Mac en veille devrait aussi repousser l’échéance fatale. De plus, sur un ordinateur peu sollicité, l’épuisement des ports peut aussi mettre beaucoup plus de temps pour devenir perceptible. Pour le grand public, ce n’est pas nécessairement un bug handicapant : même si l’habitude d’éteindre son ordinateur tous les soirs en partant du bureau s’est perdue, il arrive tout de même assez régulièrement de devoir redémarrer sa machine. Ne serait-ce que pour installer une mise à jour du système.

Pour savoir depuis quand un Mac est allumé, il suffit de saisir la commande uptime dans un Terminal :

Ce compteur défectueux posera davantage de problème dans des environnements professionnels, comme c’est le cas chez Photon mais aussi dans des entreprises qui se servent de Mac Pro ou de Mac Studio pour des tâches très longues (rendu, compilation, simulation…) ou au sein de structures hébergeant des Mac en colocation administrés à distance.

Ou encore dans les fermes de Mac mini pour le partage de calcul ou les infrastructures de test. Néanmoins, ces services évitent de faire tourner leurs serveurs Mac avec la version la plus à jour de macOS, pour des questions de sécurité et de fiabilité. Il n’empêche qu’il s’agit tout de même là d’un bug qu’Apple serait avisée de corriger rapidement.

Commentaires (25)

votre avatar
Et maintenant avec les mises à jour de sécurité ou autre. il faut redémarré les PC beaucoup plus souvent que cela aussi.
votre avatar
On n'avait un truc qui ressemblait sous 2008 R2, mais au bout de plus longtemps. 180 à 300 jours, impossible de me rappeler plus précisément :oops:.
Idem au bout du nombre de jours, la pile réseau lâchait ==> reboot.
On l'a vu sur les Hosts qui n'étaient pas patchés :-D

Troll : Comme quoi un 2008 est plus fiable qu'un MacOS :D /Troll

Edit : J'ai retrouvé, 248 jours si l'offloading est utilisé (les joies du début de Chimney...), 497 sinon.
votre avatar
Bah non, justement il ne plantait pas. Ce qui suit peut légitimement est considéré comme une anecdote, mais néanmoins c'est bien ce qui s'est passé. Attention, ce qui suit est long. Temps estimé de lecture : 49 jours et ... heu non, moins que ça quand-même.

Nous avions à l'époque (1997) écrit un logiciel de monitoring qui était censé tourner en continu, et la cible était Windows 95. Ce machin n'avait pas la notion de service donc toute l'application tournait comme des exécutables Windows et se minimisaient dans la traybar. Et ça incluait un serveur Personal Oracle 7, de la connexion réseau (des envois d'e-mail et autres popups via la fonction Windows dédiée, etc.)

En lisant la doc, on a donc bien évidemment tiqué sur ce compteur 32 bits en millisecondes, et on a ajouté un garde-fou qui commençait à conseiller aux utilisateurs de rebooter la machine si on se rendait compte qu'elle avait démarré il y a plus que 40 jours. Au bout de 3 mois les utilisateurs nous ont demandé d'enlever cette notification qui les enquiquinait tous les jours...

Y'avait certes des logiciels ou drivers tiers qui se plantaient (le lien parle de vtdapi.vxd mais y'en avait évidemment d'autres) et entraînaient tout Windows avec eux (et merci de ne pas rigoler rétrospectivement sur le fait que l'OS n'est pas sécurisé par design - à l'époque un Mac, ou Novell Netware, se plantaient taut autant si un driver faisait des siennes), mais le système lui-même n'avait pas cette limitation, et apparemment notre application n'était pas affectée...
votre avatar
Cela remet en cause le choix d'un Mac mini comme serveur car je ne sais pas si on peut réimager un Mac avec un ancien comme n-1 ou n-2 ?
votre avatar
Néanmoins, cette « date d’expiration » peut représenter un sérieux problème dans les organisations qui ont besoin de faire tourner des Mac en continu.
Si le besoin est critique, on met de la redondance. S'il n'est pas critique, on n'en met pas et on accepte l'indispo.

C'est décidé par le SLA.

Quoiqu'il en soit, même allumé en continu, le Mac va avoir besoin de faire des mises à jour régulières, et donc de rebooter. Le mythe de l'OS qui ne reboot absolument jamais et l'uptime de 3 ans, c'était valable y'a une décennie. Aujourd'hui, vu combien une politique de patch management est indipensable en matière de sécu IT, cette idée n'a plus aucun sens.
votre avatar
Tu as moyen de mettre a jour un kernel Linux sans reboot (pas très fiable avec la version libre mais qui visiblement marche bien avec une solution propriétaire).
Il me semble même que Ubuntu server s'en sert.
votre avatar
Oui, le patching à chaud existe depuis quelques temps.

Mais, encore une fois, si on estime que la dispo doit être de 99.999%, on met de la redondance.

Pour info, un SLA de 99.9% tolère 1 min 26 secondes d'indispo quotidienne. Soit le temps de reboot d'une machine...
votre avatar
Alors là, j'aimerais bien voir quel serveur boote effectivement en 1 minute 30. Sur les Dell PowerEdge que je connais, en 1 minute 30, on n'est pas encore sorti du BIOS...
votre avatar
J'avais plus de la VM que du physique en tête. Mais soit, ça n'enlève rien à mon propos

Edit : un mac (pour rester dans le sujet) ça reboot super vite
votre avatar
Et ta VM, tu ne la fais pas tourner sur un hôte macOS, et c'est réglé :D
votre avatar
Certes :D
votre avatar
1 minute 26 quotidiennement, donc si tu rebootes une fois par semaine ça laisse 9 min 30.
votre avatar
Je me réfère généralement à cet outil pour avoir la traduction d'un SLA de disponibilité.
votre avatar
https://www.kernel.org/doc/html/latest/livepatch/livepatch.html

C'est intégré à Ubuntu, il me semble aussi dispo sous RedHat.

Un reboot reste nécessaire pour upgrader le kernel, ce qui est utile pour bénéficier d'améliorations sans rapport avec la sécurité.

kexec est une piste pour accélérer les reboot, surtout sur les serveurs, car ça permet de changer de kernel sans redémarrer "à froid" et donc en bypassant tout l'init hardware qui peut prendre plusieurs minutes.
votre avatar
Don't reboot it, just patch !

Uptime funk

live patching hallelujah ! :dix:
votre avatar
C'est le kernel 4.0 qui a introduit le live patching (d'où le changement de version majeure), en 2015 il y'a plus de 10ans donc !

Côté Linux c'est le gestionnaire de màj de la distribution qui ne s'embête pas à l'intégrer, j'imagine que l'effort de dev est important pour un ROI factuellement null pour un end-user desktop linux. (tu restes sur l'ancien kernel jusqu'au prochain reboot)
Côté serveur il y'a un cas d'usage : tu peux rester à la fois dispo et parfaitement à jour...

C'est incroyable de voir l'écart avec d'autres OS :

  • Windows qui demande toujours de rebooter à chaque fois que tu installes un truc,

  • MacOS qui a un OS qui planterait tous les 49j depuis près de 7ans et personne ne s'en était rendu compte avant !



J'ai quand même l'impression que c'est exactement le même bug que celui de Windows 95 : overflow d'un compteur d'uptime en millisecondes stocké dans un entier 32bits
votre avatar
La redondance a assez peu d'intérêt dans le cas présent, puisque les deux systèmes seront impactés au même moment. Sauf à prévoir de les redémarrer tous 40 jours avec un délai de 20 jours. Mais dans ce cas là ce n'est plus vraiment de la redondance, plutot du load balancing avec de la maintenance préventive...
votre avatar
Une redondance n'implique pas forcément que tous les noeuds soient actifs. Tu peux très bien faire de l'actif / passif et c'est le LB qui se charge de router quand l'un fini en cadavre. Le cadavre reboot et devient le noeud passif.

C'est du basique en matière de clustering et de haute dispo.

Et dans le cas d'un actif / actif, bah généralement on évite de mettre en maintenance les deux noeuds en même temps.
votre avatar
Un passif est quand même démarré, donc la remarque de Poppu78 est très pertinante
votre avatar
Ah, ça explique des choses. J'ai eu en fin de semaine dernière des problèmes de connexion et je n'ai pas pu me (re)connecter à n'importe quel réseau sans fil. Certes, je dois seulement redémarrer, mais c'est un peu dommage quand ça arrive au milieu de quelque chose.
(Et oui, il reste toujours allumé car j'y accède régulièrement à distance et il fait aussi un peu serveur...)
votre avatar
Merci pour l'article de qualité.

C'est bon à savoir, par ex. pour ceux qui utilisent des Mac dans une ferme d'intégration continue (ces machines tournent typiquement en permanence, mais sans les mécanismes de redondance d'un service avec SLA), ou de manière générale comme serveur pour des services internes ou perso.

Ça peut faire perdre beaucoup de temps de comprendre pourquoi la machine de CI macOS arrête de fonctionner.
votre avatar
Si on ne s'en est pas rendu compte plus tôt, c'est bien le signe que les Mac ne sont pas utilisés comme serveurs.
votre avatar
Le bug de l'an 2038 approche... Tout ne sera peut-être pas résolu finalement :)