﻿﻿{"id":2689,"date":"2026-04-07T13:30:00","date_gmt":"2026-04-07T11:30:00","guid":{"rendered":"https:\/\/elearningsamba.com\/index.php\/macos-votre-reseau-tcp-meurt-au-bout-de-49-jours\/"},"modified":"2026-04-07T13:30:00","modified_gmt":"2026-04-07T11:30:00","slug":"macos-votre-reseau-tcp-meurt-au-bout-de-49-jours","status":"publish","type":"page","link":"https:\/\/elearningsamba.com\/index.php\/macos-votre-reseau-tcp-meurt-au-bout-de-49-jours\/","title":{"rendered":"macOS &#8211; Votre r\u00e9seau TCP meurt au bout de 49 jours"},"content":{"rendered":"<p>49 jours, les amis, c&#8217;est la dur\u00e9e de vie d&#8217;un Mac avant que son r\u00e9seau TCP ne s&#8217;effondre dans un silence assourdissant. Il suffit d&#8217;un overflow d&#8217;entier 32 bits dans le kernel XNU, une horloge interne qui se bloque, et hop, plus moyen d&#8217;ouvrir la moindre connexion. Le ping marche toujours, parce qu&#8217;ICMP se fout du TCP, mais pour le reste&#8230; c&#8217;est reboot obligatoire ou rien.<\/p>\n<p>Pour savoir combien de temps il vous reste, tapez <code>uptime<\/code> dans le Terminal. Si votre Mac sous macOS Sequoia, Sonoma ou m\u00eame Ventura tourne depuis plus de 7 semaines sans red\u00e9marrage, c&#8217;est le moment d&#8217;y rem\u00e9dier car le bug touche toutes les versions.<\/p>\n<p>C&#8217;est l&#8217;\u00e9quipe de<br \/>\n<a href=\"https:\/\/photon.codes\/blog\/we-found-a-ticking-time-bomb-in-macos-tcp-networking\">Photon<\/a><br \/>\nqui a r\u00e9v\u00e9l\u00e9 le probl\u00e8me. Celui-ci est apparu sur une flotte de Macs d\u00e9di\u00e9e \u00e0 la t\u00e9l\u00e9m\u00e9trie iMessage. Pile 49,7 jours apr\u00e8s le dernier red\u00e9marrage, plusieurs machines ont l\u00e2ch\u00e9 en m\u00eame temps. Plus de nouvelles connexions r\u00e9seau, mais le ping r\u00e9pondait toujours.<\/p>\n<p>En fouillant le code du<br \/>\n<a href=\"https:\/\/korben.info\/kext-macos-ios-vulnerable.html\">noyau XNU d&#8217;Apple<\/a><br \/>\n(qui est open source, faut le rappeler), ils sont tomb\u00e9 sur une variable <code>tcp_now<\/code>, qui est un compteur 32 bits qui s&#8217;incr\u00e9mente chaque milliseconde. En gros, imaginez un compteur kilom\u00e9trique qui arriv\u00e9 au max (environ 4,3 milliards), repasse \u00e0 z\u00e9ro.<\/p>\n<p>Sauf que le code contient un garde fou cens\u00e9 emp\u00eacher l&#8217;horloge de reculer du genre &#8220;<em>si la nouvelle valeur est plus petite que l&#8217;ancienne, on ne met pas \u00e0 jour<\/em>&#8220;. \u00c7a a l&#8217;air malin mais en fait, au moment du rebouclage, patatras : la nouvelle valeur (proche de z\u00e9ro) est forc\u00e9ment plus petite que l&#8217;ancienne (proche du max), du coup le garde fou bloque tout et l&#8217;horloge TCP se fige.<\/p>\n<p>Et ensuite, \u00e7a part en cascade. Les connexions ferm\u00e9es restent normalement en TIME_WAIT durant 30 secondes sur macOS, avant d&#8217;\u00eatre nettoy\u00e9es par <code>tcp_gc()<\/code> mais avec l&#8217;horloge gel\u00e9e, ce nettoyage ne se fait plus. Un <code>netstat -an | grep TIME_WAIT<\/code> montre alors la catastrophe en temps r\u00e9el avec des connexions mortes qui s&#8217;empilent, et finissent par bouffer les 16 384 ports \u00e9ph\u00e9m\u00e8res (range 49152-65535 sur macOS) restant&#8230; Et au bout de quelques heures, plus rien ne passe !<\/p>\n<p>Photon a laiss\u00e9 tourner deux machines apr\u00e8s l&#8217;overflow pour voir. Neuf heures plus tard, l&#8217;une affichait 8 000 connexions zombies et un load average de 49. La machine ne faisait plus que scanner sa propre file d&#8217;attente de connexions mortes.<\/p>\n<p>Si \u00e7a vous rappelle quelque chose, c&#8217;est normal car j&#8217;sais pas si vous vous souvenais mais Windows 95 plantait au bout du m\u00eame d\u00e9lai pour la m\u00eame raison (le fameux <code>GetTickCount()<\/code> en 32 bits). Le Boeing 787 avait \u00e9galement un souci similaire au bout de 51 jours sur ses switches r\u00e9seau, sans oublier le bug de l&#8217;an 2038 sous Unix, qui est la version sign\u00e9e du m\u00eame ph\u00e9nom\u00e8ne. 30 ans s\u00e9parent certains de ces bugs qui pourtant appartiennent \u00e0 la m\u00eame cat\u00e9gorie !<\/p>\n<p>Apr\u00e8s flippez pas car des devs avec des Macs \u00e0 plus de 600 jours d&#8217;uptime disent n&#8217;avoir jamais eu le souci. \u00c0 vrai dire, le bug ne se d\u00e9clencherait que si votre Mac n&#8217;a aucun trafic TCP pile au moment de l&#8217;overflow. Si votre machine cause au r\u00e9seau en permanence (et c&#8217;est le cas de 99% des Macs), l&#8217;horloge passe le cap sans broncher.<\/p>\n<p>Les machines les plus expos\u00e9es sont en fait les serveurs CI\/CD sous macOS, les<br \/>\n<a href=\"https:\/\/korben.info\/apfel-ia-mac-apple-silicon.html\">Mac mini<\/a><br \/>\nen ferme de build Jenkins ou GitHub Actions, les Mac Pro d\u00e9di\u00e9s au rendu 3D avec Blender ou Cinema 4D. Le MacBook qui passe en veille tous les soirs n&#8217;est pas vraiment concern\u00e9 (le compteur <code>tcp_now<\/code> ne tourne pas pendant la veille, donc le d\u00e9lai de 49 jours ne concerne que le temps d&#8217;activit\u00e9 r\u00e9el).<\/p>\n<p>Maintenant pour v\u00e9rifier votre compte \u00e0 rebours personnel, ouvrez un Terminal et collez y ceci :<\/p>\n<div class=\"highlight\">\n<pre class=\"chroma\"><code class=\"language-fallback\" data-lang=\"fallback\"><span class=\"line\"><span class=\"cl\">boot_sec=$(sysctl kern.boottime | grep -o 'sec = [0-9]*' | head -1 | awk '{print $3}')\n<\/span><\/span><span class=\"line\"><span class=\"cl\">now_sec=$(date +%s)\n<\/span><\/span><span class=\"line\"><span class=\"cl\">remain=$(( 4294967 - (now_sec - boot_sec) ))\n<\/span><\/span><span class=\"line\"><span class=\"cl\">echo \"Temps restant avant overflow : $((remain\/3600))h $((remain%3600\/60))m\"\n<\/span><\/span><\/code><\/pre>\n<p>Apple n&#8217;a pour l&#8217;instant rien communiqu\u00e9 sur le sujet, ce qui n&#8217;est gu\u00e8re surprenant vu que<br \/>\n<a href=\"https:\/\/korben.info\/faille-apple-puce-t2.html\">c&#8217;est un peu leur sp\u00e9cialit\u00e9<\/a><br \/>\nquand une vuln\u00e9rabilit\u00e9 est remont\u00e9e. L&#8217;\u00e9quipe de Photon dit travailler sur un moyen de contourner le probl\u00e8me qui \u00e9viterait de rebooter, mais en attendant, le seul fix c&#8217;est le red\u00e9marrage, qui remet le compteur \u00e0 z\u00e9ro&#8230; et relance le compte \u00e0 rebours.<\/p>\n<p>Bref, y&#8217;a rien \u00e0 faire si ce n&#8217;est de v\u00e9rifier votre uptime et faire \u00e9ventuellement un petit reboot pr\u00e9ventif. Tic tac, l&#8217;horloge tourne ^^.<\/p>\n<p>\n<a href=\"https:\/\/photon.codes\/blog\/we-found-a-ticking-time-bomb-in-macos-tcp-networking\">Source<\/a>\n<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>49 jours, les amis, c&#8217;est la dur\u00e9e de vie d&#8217;un Mac avant que son r\u00e9seau TCP ne s&#8217;effondre dans un silence assourdissant. Il suffit d&#8217;un overflow d&#8217;entier 32 bits dans le kernel XNU, une horloge interne qui se bloque, et hop, plus moyen d&#8217;ouvrir la moindre connexion. Le ping marche toujours, parce qu&#8217;ICMP se fout du TCP, mais pour le reste&#8230; c&#8217;est reboot obligatoire ou rien. Pour savoir combien de temps il vous reste, tapez uptime dans le Terminal. Si votre Mac sous macOS Sequoia, Sonoma ou m\u00eame Ventura tourne depuis plus de 7 semaines sans red\u00e9marrage, c&#8217;est le moment d&#8217;y rem\u00e9dier car le bug touche toutes les versions. C&#8217;est l&#8217;\u00e9quipe de Photon qui a r\u00e9v\u00e9l\u00e9 le probl\u00e8me. Celui-ci est apparu sur une flotte de Macs d\u00e9di\u00e9e \u00e0 la t\u00e9l\u00e9m\u00e9trie iMessage. Pile 49,7 jours apr\u00e8s le dernier red\u00e9marrage, plusieurs machines ont l\u00e2ch\u00e9 en m\u00eame temps. Plus de nouvelles connexions r\u00e9seau, mais le ping r\u00e9pondait toujours. En fouillant le code du noyau XNU d&#8217;Apple (qui est open source, faut le rappeler), ils sont tomb\u00e9 sur une variable tcp_now, qui est un compteur 32 bits qui s&#8217;incr\u00e9mente chaque milliseconde. En gros, imaginez un compteur kilom\u00e9trique qui arriv\u00e9 au max (environ 4,3 milliards), repasse \u00e0 z\u00e9ro. Sauf que le code contient un garde fou cens\u00e9 emp\u00eacher l&#8217;horloge de reculer du genre &#8220;si la nouvelle valeur est plus petite que l&#8217;ancienne, on ne met pas \u00e0 jour&#8220;. \u00c7a a l&#8217;air malin mais en fait, au moment du rebouclage, patatras : la nouvelle valeur (proche de z\u00e9ro) est forc\u00e9ment plus petite que l&#8217;ancienne (proche du max), du coup le garde fou bloque tout et l&#8217;horloge TCP se fige. Et ensuite, \u00e7a part en cascade. Les connexions ferm\u00e9es restent normalement en TIME_WAIT durant 30 secondes sur macOS, avant d&#8217;\u00eatre nettoy\u00e9es par tcp_gc() mais avec l&#8217;horloge gel\u00e9e, ce nettoyage ne se fait plus. Un netstat -an | grep TIME_WAIT montre alors la catastrophe en temps r\u00e9el avec des connexions mortes qui s&#8217;empilent, et finissent par bouffer les 16 384 ports \u00e9ph\u00e9m\u00e8res (range 49152-65535 sur macOS) restant&#8230; Et au bout de quelques heures, plus rien ne passe ! Photon a laiss\u00e9 tourner deux machines apr\u00e8s l&#8217;overflow pour voir. Neuf heures plus tard, l&#8217;une affichait 8 000 connexions zombies et un load average de 49. La machine ne faisait plus que scanner sa propre file d&#8217;attente de connexions mortes. Si \u00e7a vous rappelle quelque chose, c&#8217;est normal car j&#8217;sais pas si vous vous souvenais mais Windows 95 plantait au bout du m\u00eame d\u00e9lai pour la m\u00eame raison (le fameux GetTickCount() en 32 bits). Le Boeing 787 avait \u00e9galement un souci similaire au bout de 51 jours sur ses switches r\u00e9seau, sans oublier le bug de l&#8217;an 2038 sous Unix, qui est la version sign\u00e9e du m\u00eame ph\u00e9nom\u00e8ne. 30 ans s\u00e9parent certains de ces bugs qui pourtant appartiennent \u00e0 la m\u00eame cat\u00e9gorie ! Apr\u00e8s flippez pas car des devs avec des Macs \u00e0 plus de 600 jours d&#8217;uptime disent n&#8217;avoir jamais eu le souci. \u00c0 vrai dire, le bug ne se d\u00e9clencherait que si votre Mac n&#8217;a aucun trafic TCP pile au moment de l&#8217;overflow. Si votre machine cause au r\u00e9seau en permanence (et c&#8217;est le cas de 99% des Macs), l&#8217;horloge passe le cap sans broncher. Les machines les plus expos\u00e9es sont en fait les serveurs CI\/CD sous macOS, les Mac mini en ferme de build Jenkins ou GitHub Actions, les Mac Pro d\u00e9di\u00e9s au rendu 3D avec Blender ou Cinema 4D. Le MacBook qui passe en veille tous les soirs n&#8217;est pas vraiment concern\u00e9 (le compteur tcp_now ne tourne pas pendant la veille, donc le d\u00e9lai de 49 jours ne concerne que le temps d&#8217;activit\u00e9 r\u00e9el). Maintenant pour v\u00e9rifier votre compte \u00e0 rebours personnel, ouvrez un Terminal et collez y ceci : boot_sec=$(sysctl kern.boottime | grep -o &#8216;sec = [0-9]*&#8217; | head -1 | awk &#8216;{print $3}&#8217;) now_sec=$(date +%s) remain=$(( 4294967 &#8211; (now_sec &#8211; boot_sec) )) echo &#8220;Temps restant avant overflow : $((remain\/3600))h $((remain%3600\/60))m&#8221; Apple n&#8217;a pour l&#8217;instant rien communiqu\u00e9 sur le sujet, ce qui n&#8217;est gu\u00e8re surprenant vu que c&#8217;est un peu leur sp\u00e9cialit\u00e9 quand une vuln\u00e9rabilit\u00e9 est remont\u00e9e. L&#8217;\u00e9quipe de Photon dit travailler sur un moyen de contourner le probl\u00e8me qui \u00e9viterait de rebooter, mais en attendant, le seul fix c&#8217;est le red\u00e9marrage, qui remet le compteur \u00e0 z\u00e9ro&#8230; et relance le compte \u00e0 rebours. Bref, y&#8217;a rien \u00e0 faire si ce n&#8217;est de v\u00e9rifier votre uptime et faire \u00e9ventuellement un petit reboot pr\u00e9ventif. Tic tac, l&#8217;horloge tourne ^^. Source<\/p>\n","protected":false},"author":1,"featured_media":2690,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"give_campaign_id":0,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_kadence_starter_templates_imported_post":false,"footnotes":""},"class_list":["post-2689","page","type-page","status-publish","has-post-thumbnail","hentry"],"campaignId":"","_links":{"self":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/comments?post=2689"}],"version-history":[{"count":0,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/pages\/2689\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media\/2690"}],"wp:attachment":[{"href":"https:\/\/elearningsamba.com\/index.php\/wp-json\/wp\/v2\/media?parent=2689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}