Theo một blog được Photon xuất bản vào ngày 6 tháng 4 năm 2026, hệ thống macOS cũng có một quả bom hẹn giờ. Chức năng kết nối TCP sẽ dần bị tê liệt sau 49,7 ngày hoạt động liên tục. Nguyên nhân của sự cố là do lỗ hổng trong quá trình triển khai mạng TCP của Apple trong nhân XNU.

Công ty cung cấp dịch vụ AI và yêu cầu các tác vụ và giám sát xử lý cụm máy Mac chạy trong thời gian dài. Tuy nhiên, không rõ nguyên nhân nên một số thiết bị sẽ không thể kết nối mạng bình thường. Sau khi điều tra và xác minh, nhóm phát triển xác nhận đây là lỗi do Apple gây ra.
Trong trường hợp bình thường, sự cố này sẽ không ảnh hưởng đến người dùng thông thường. Ngay cả khi người dùng không chủ động khởi động lại thiết bị, Apple có thể đẩy bản cập nhật hệ thống để khởi động lại thiết bị. Chỉ những thiết bị chạy liên tục trong thời gian dài mà không khởi động lại mới bị ảnh hưởng bởi sự cố này.
Nguồn gốc của sự cố: tràn số nguyên không dấu 32 bit và đồng hồ bị treo
Cốt lõi của lỗ hổng này nằm ở việc sử dụng biến dấu thời gian RFC 1323 TCP tcp_now trong nhân XNU, đây là một biến uint32_t Bộ đếm loại số nguyên không dấu 32 bit ghi lại thời gian tính bằng mili giây kể từ khi hệ thống được khởi động.
Vấn đề là giá trị tối đa của thời gian này chỉ có thể là 4.294.967.295 mili giây, tức là khoảng 49 ngày, 17 giờ, 2 phút và 47,296 giây. Khi hệ thống chạy liên tục trong khoảng thời gian này, bộ đếm sẽ tràn và gần bằng 0.
Có một cơ chế bảo vệ tính đơn điệu trong kernel được sử dụng để đảm bảo rằng tcp_now chỉ tăng về phía trước, vì vậy sau khi tràn, giá trị cũ (gần 2³²-1) lớn hơn giá trị mới sau khi gói, khiến điều kiện so sánh luôn sai, vì vậy tcp_now bị đóng băng từ đó trở đi.
Sau khi đóng băng, bộ đếm thời gian mà đồng hồ của hệ thống con TCP không thể dựa vào không thể hoạt động bình thường, cuối cùng khiến tất cả các kết nối TCP không được tái chế bình thường và sau đó khi tất cả các cổng đã cạn kiệt, TCP không thể kết nối được nữa.
Tác động trực tiếp của lỗi:
Sau khi kết nối TCP trên macOS chuyển sang trạng thái TIME_WAIT, nó sẽ được giữ lại trong 30 giây theo mặc định để xử lý các tin nhắn bị trì hoãn. Trong trường hợp bình thường, hàm tcp_gc() của kernel sẽ xác định và đóng các trạng thái chờ này dựa trên tcp_now.
Nhưng sau khi tcp_now bị treo, logic so sánh TSTMP_GEQ (tcp_now, bộ đếm thời gian) luôn bị lỗi và tất cả các mục TIME_WAIT sẽ không bao giờ được tái sử dụng, vì vậy điều này gây ra nhiều vấn đề.
Số cổng tạm thời đã cạn kiệt: Thông thường các cổng tạm thời nằm trong khoảng từ 49152~65535, với tổng số khoảng 16.000 cổng. Các cảng này sẽ dần bị chiếm đóng.
Không thể thiết lập kết nối TCP mới: các lần thử kết nối tiếp theo đã chuyển sang trạng thái SYN_SENT và không thành công.
Mức sử dụng CPU hạt nhân tăng: liên tục quét hàng đợi TIME_WAIT ngày càng tăng.
Sự cố chức năng mạng: Ngoại trừ ICMP (tức là PING), hầu hết các ứng dụng TCP như trình duyệt, SSH, lệnh gọi API đều không hoạt động bình thường.
Các kết nối mạng hiện tại có thể vẫn được duy trì nhưng các kết nối TCP mới khởi tạo sẽ bị chặn.
Ảnh hưởng đến macOS 10.15 và các phiên bản mới hơn:
Sau khi kiểm tra, có thể khẳng định rằng lỗ hổng kernel này ảnh hưởng ít nhất đến Nó Hiện vẫn chưa thể kiểm tra xem macOS Catalina 10.15 trở lên và các phiên bản cũ hơn có gặp vấn đề tương tự hay không.
Điều đáng chú ý là sự cố này sẽ không gây ra sự cố kernel hoặc tạo ra nhật ký lỗi rõ ràng. Đó là một lỗi thầm lặng nên người dùng thường khó xác định được nguồn gốc của vấn đề ngay lập tức.
Đối với những người dùng có thể gặp phải sự cố này, giải pháp đơn giản nhất là đặt thời gian khởi động lại theo kế hoạch, nghĩa là đảm bảo hệ thống được khởi động lại trong vòng 49 ngày. Vẫn còn phải xem liệu Apple có sửa lỗi này trong tương lai hay không.
Tìm hiểu thêm:
https://photon.codes/blog/we-found-a-ticking-time-bomb-in-macos-tcp-networking