macOS 49일 TCP 버그: Mac 가동 시간 확인 및 네트워크 장애 타이머 방지 방법

macOSTahoe ·
macOS 49일 TCP 버그: Mac 가동 시간 확인 및 네트워크 장애 타이머 방지 방법

재부팅 없이 49.7일 가동 후 모든 네트워크 연결을 끊는 macOS XNU 커널 TCP 버그를 알아보세요. Mac의 가동 시간을 확인하고 자신을 보호하는 방법을 학습합니다.

2026년 초, Photon이라는 닉네임으로 알려진 독립 보안 연구원이 자신의 블로그(photon.codes)에 상세한 분석을 게재하여 macOS 커뮤니티에 큰 충격을 주었습니다. Apple의 XNU 커널 깊숙이 숨어 있는 버그가 재부팅 없이 정확히 49.7일 동안 실행된 모든 Mac에서 새로운 TCP 연결을 조용히 종료한다는 것입니다. 경고 대화 상자도, 오류 메시지도 없습니다. Mac이 인터넷, 로컬 네트워크 공유, TCP에 의존하는 모든 것에 대한 연결을 단순히 중단하며 유일한 해결책은 완전한 재시작뿐입니다. 이 발견은 이후 Tom's Hardware에서 보도되고, TidBITS에서 심층 분석되었으며, Reddit, MacRumors 포럼, Hacker News에서 열띤 토론이 벌어져 수천 개의 댓글과 상당한 우려를 낳았습니다. 이 글은 버그를 이해하고, 영향을 받는지 확인하고, 즉시 자신을 보호하며, Apple이 어떤 조치를 취하고 있는지 파악하는 데 필요한 포괄적인 가이드를 제공합니다.

핵심 요약

  • macOS XNU 커널의 심각한 정수 오버플로 버그로 인해 약 49.7일(49일 17시간 2분 47초)의 연속 가동 후 모든 새 TCP 연결이 조용히 실패합니다.
  • 이 버그는 Wi-Fi 전환, 네트워크 설정 재설정, 개별 앱 재시작으로는 해결할 수 없습니다. 시스템 전체를 재부팅해야만 네트워크 연결이 복원됩니다.
  • 가장 위험에 노출된 사용자는 Mac mini를 서버로, 항상 켜져 있는 개발 머신, 미디어 서버, 홈 오토메이션 허브, 거의 재시작하지 않는 Mac을 사용하는 분들입니다.
  • Apple은 현재 베타 2 단계인 macOS 26.5에서 수정을 제공할 예정이나, 현재 프로덕션 버전에는 패치가 존재하지 않습니다.
  • 간단한 Terminal 명령으로 가동 시간을 확인하고 49일 임계값에 도달하기 전에 주기적인 재시작을 예약하여 즉시 자신을 보호할 수 있습니다.

49일 TCP 버그란 무엇입니까?

49일 TCP 버그는 Apple의 XNU 커널에 있는 소프트웨어 결함입니다. XNU는 macOS, iOS, iPadOS 및 기타 모든 Apple 플랫폼을 뒷받침하는 핵심 운영 체제 커널입니다. 이 버그는 Photon이 XNU 소스 코드(Apple이 오픈 소스로 게시함)를 주의 깊게 분석하는 과정에서 발견되었습니다. 오랫동안 실행된 Mac에서 신비로운 네트워크 장애 패턴을 추적한 결과, 커널의 TCP 스택에서 특정 비교 연산으로 이어졌습니다.

핵심적으로 이 버그는 정수 오버플로입니다. XNU 커널은 32비트 부호 없는 정수(uint32_t)를 사용하여 밀리초 단위로 시스템 가동 시간을 추적하는 내부 타이머를 유지합니다. 32비트 부호 없는 정수가 담을 수 있는 최댓값은 4,294,967,295입니다. 이 밀리초 수를 일 수로 변환하면 약 49.71일이 됩니다.

4,294,967,295 milliseconds
= 4,294,967.295 seconds
= 71,582.788 minutes
= 1,193.046 hours
= 49.71 days

이 임계값을 지나면 타이머 값이 최댓값에서 0으로 되돌아갑니다. 이것은 컴퓨팅에서 드문 일이 아닙니다. 타이머 오버플로는 잘 알려진 현상이며, 견고한 코드는 이를 처리하도록 작성됩니다. 그러나 XNU의 TCP 스택에는 이 오버플로를 올바르게 처리하지 않는 비교 연산이 포함되어 있습니다. 타이머가 오버플로하면 비교 연산이 잘못된 결과를 생성하여 커널이 모든 새 TCP 연결의 타이밍 매개변수가 유효하지 않다고 판단합니다. 그 결과 커널이 새 TCP 연결 시도를 조용히 드롭합니다.

중요한 점은 오버플로 이전에 설정된 기존 TCP 연결은 잠시 계속 작동할 수 있다는 것입니다(핸드셰이크 프로세스를 이미 완료했기 때문에). 그러나 새 웹 페이지 열기, 새 SSH 세션 시작, API 연결, 이메일 확인 등 모든 새 연결은 실패합니다. 오버플로 이후 짧은 시간 내에 기존 연결도 시간 초과 후 실패하여 Mac이 TCP를 통해 완전히 통신할 수 없는 상태가 됩니다.

이 버그는 특히 TCP 프로토콜 계층에 영향을 미칩니다. TCP에 의존하지 않는 다른 네트워크 프로토콜(기본 ICMP 핑 등)은 계속 작동할 수 있어 문제 진단이 특히 혼란스러울 수 있습니다. Mac이 네트워크에 "연결"된 것처럼 보이고 핑에 응답할 수도 있지만 응용 프로그램 수준의 네트워크 통신은 작동하지 않습니다.

XNU 커널 TCP 정수 오버플로 다이어그램

Mac에 어떤 영향을 미칩니까?

49일 TCP 버그의 실질적인 영향은 전적으로 한 가지 요인에 달려 있습니다. 재시작 사이에 Mac이 얼마나 오래 실행되는지입니다. 적어도 49일마다 한 번씩 Mac을 재부팅, 재시작 또는 종료하면 이 버그를 만나지 않습니다. 타이머는 모든 부팅 시 0으로 재설정됩니다.

TidBITS가 이 문제에 대한 분석에서 지적했듯이 대부분의 일반 Mac 사용자는 영향을 받을 가능성이 낮습니다. Apple의 소프트웨어 업데이트는 일반적으로 재시작을 요구하며, 많은 사용자들이 적어도 일주일에 한 번은 Mac을 종료하거나 재시작합니다. 이러한 사용자들에게 버그는 사실상 보이지 않습니다.

그러나 이 버그가 심각한 운영 위험이 되는 중요한 Mac 사용자 범주가 있습니다.

Mac Mini 서버 및 헤드리스 Mac

Mac mini는 소형의 에너지 효율적인 서버로 점점 더 인기를 얻고 있습니다. 사용자들은 Mac mini를 웹 서버, CI/CD 빌드 서버, 미디어 서버(Plex 또는 Jellyfin 실행), 홈 오토메이션 컨트롤러 및 원격 개발 머신으로 배포합니다. 이러한 머신은 재시작 없이 지속적으로 실행되도록 특별히 설계되었습니다. 1월에 설정되어 계속 실행되는 Mac mini 서버는 2월 말에 49일째에 도달하여 경고 없이 모든 네트워크 연결을 잃게 됩니다.

항상 켜져 있는 개발 머신

많은 소프트웨어 개발자들은 수십 개의 터미널 세션, 개발 서버, 데이터베이스 연결, IDE 창이 열린 채로 Mac을 지속적으로 실행합니다. 재시작은 이 전체 환경을 재구성하는 것을 의미하며 상당한 시간이 걸릴 수 있습니다. 이러한 사용자들은 49일을 훨씬 초과하는 가동 시간을 자주 축적합니다.

장시간 렌더링 작업을 진행하는 크리에이티브 전문가

비디오 편집자, 3D 아티스트 및 음악 프로듀서는 수일 또는 수주에 걸친 확장된 렌더링 또는 처리 작업을 실행하는 경우가 있습니다. 이들은 이러한 작업 중에 재시작을 피하며, 이미 상당한 가동 시간이 있는 머신에서 작업이 시작되면 렌더링 중간에 49일 임계값을 넘을 수 있습니다.

기업 및 교육 기관 배포

키오스크 모드, 디지털 사이니지, 실험실 환경 또는 공유 워크스테이션에 Mac을 배포하는 조직은 이러한 머신을 무기한 실행하도록 구성할 수 있습니다. Mac 집단을 관리하는 IT 관리자는 이 버그를 특히 주의해야 합니다.

홈 오토메이션 및 IoT 허브 Mac

항상 켜져 있는 Mac에서 HomeKit 서버, Home Assistant 또는 기타 홈 오토메이션 플랫폼을 실행하는 사용자는 위험에 노출됩니다. 허브 머신의 네트워크 장애는 스마트 홈 인프라 전체를 다운시킬 수 있습니다.

현재 위험에 처해 있는지 확인하는 방법

가장 간단한 테스트는 Mac의 가동 시간을 확인하는 것입니다. 가동 시간이 49일에 가까워지거나 이를 초과했다면 재시작을 계획해야 합니다. 다음 섹션에서는 정확히 확인하는 방법을 설명합니다.

Mac의 가동 시간 확인 방법

마지막 재시작 이후 Mac이 얼마나 오래 실행되었는지 확인하는 방법은 여러 가지가 있습니다. 각각 약간 다른 정보를 제공하며 모두 신뢰할 수 있습니다.

방법 1: uptime Terminal 명령

Terminal을 열고(응용 프로그램 > 유틸리티 > Terminal, 또는 Spotlight에서 Cmd+Space를 누르고 "Terminal" 입력) 다음을 입력합니다.

uptime

그러면 다음과 유사한 출력이 반환됩니다.

10:32  up 43 days, 7:14, 2 users, load averages: 1.82 2.01 1.97

이 예에서 Mac은 43일 약 7시간 동안 실행 중입니다. 이 머신은 위험 구역에 가까워지고 있으며 며칠 내에 재시작해야 합니다.

Terminal 명령을 효과적으로 사용하기 위한 더 자세한 가이드는 Terminal 완전 정복 가이드를 참고하세요.

방법 2: system_profiler 명령

더 자세한 부팅 시간 정보를 보려면 다음을 사용합니다.

system_profiler SPSoftwareDataType

다음을 포함하는 출력이 반환됩니다.

Software:

    System Software Overview:

      System Version: macOS 26.4 (26E252)
      Kernel Version: Darwin 25.5.0
      Boot Volume: Macintosh HD
      ...
      Time since boot: 43 days, 7:14

"Time since boot" 줄은 시스템이 얼마나 오래 실행 중인지 정확히 알려줍니다.

방법 3: sysctl로 정확한 부팅 시간 확인

Mac이 마지막으로 부팅된 시점에 대한 가장 정확한 정보를 얻으려면 다음을 사용합니다.

sysctl kern.boottime

다음이 출력됩니다.

kern.boottime: { sec = 1709812345, usec = 0 } Mon Mar  7 14:32:25 2026

이를 통해 마지막 부팅의 정확한 날짜와 시간을 알 수 있어 49일 임계값에 정확히 언제 도달하는지 계산할 수 있습니다.

방법 4: 빠른 계산 스크립트

49일째가 정확히 언제인지 알려주는 간단한 스크립트를 만들 수 있습니다.

#!/bin/bash
boot_time=$(sysctl -n kern.boottime | awk '{print $4}' | tr -d ',')
danger_time=$((boot_time + 4294967))
current_time=$(date +%s)
remaining=$((danger_time - current_time))

if [ $remaining -le 0 ]; then
    echo "WARNING: Your Mac has EXCEEDED the 49-day threshold!"
    echo "You should restart immediately."
else
    days=$((remaining / 86400))
    hours=$(((remaining % 86400) / 3600))
    echo "Days until 49-day TCP bug: ${days} days, ${hours} hours"
    echo "Danger date: $(date -r $danger_time)"
fi

이것을 check_tcp_bug.sh로 저장하고, chmod +x check_tcp_bug.sh로 실행 권한을 부여한 후 ./check_tcp_bug.sh로 실행합니다.

방법 5: 활동 모니터

그래픽 방식을 선호한다면 활동 모니터를 사용할 수 있습니다.

  1. 활동 모니터를 엽니다(응용 프로그램 > 유틸리티 > 활동 모니터, 또는 Spotlight에서 검색)
  2. "CPU" 탭을 클릭합니다
  3. 창 하단에서 "시스템 가동 시간"을 찾습니다(일부 버전에서는 "창" 메뉴에서 시스템 정보를 표시해야 할 수 있습니다)

활동 모니터와 모든 기능에 대한 포괄적인 가이드는 활동 모니터 가이드를 참고하세요.

버그를 수정하고 예방하는 방법

현재 macOS 프로덕션 버전에 소프트웨어 패치가 없으므로, 49일 TCP 버그의 유일한 해결책은 임계값에 도달하기 전에 Mac을 재시작하는 것입니다. 간단한 수동 재시작부터 완전 자동화 솔루션까지 여러 가지 방법이 있습니다.

즉각적인 해결책: Mac 재시작

Mac이 현재 네트워크 장애를 겪고 있으며 49일 이상 실행 중이라면 즉시 재시작하세요.

  • Apple 메뉴에서: 왼쪽 상단 Apple 로고를 클릭하고 "재시작..."을 선택합니다
  • Terminal에서: sudo shutdown -r now을 실행합니다
  • 강제 재시작(Mac이 응답하지 않는 경우): 전원 버튼을 10초 동안 누른 다음 다시 눌러 시작합니다

재시작 후 모든 네트워크 연결이 즉시 복원됩니다. 가동 시간 카운터가 0으로 재설정되어 버그가 재발하기까지 49일이 다시 생깁니다.

예방 전략 1: 월간 재시작 예약

가장 간단한 예방 전략은 고정된 일정에 따라 Mac을 재시작하는 것입니다. 한 달에 한 번이면 충분합니다. 매월 첫째 날(또는 원하는 날)에 Mac을 재시작하도록 캘린더 알림을 설정하세요. 월간 재시작으로 가동 시간을 49일 위험 임계값 훨씬 아래로 유지하고 시스템 업데이트와 메모리 정리가 정기적으로 이루어지도록 할 수 있습니다.

예방 전략 2: pmset을 사용한 자동 재시작

macOS에는 자동 재시작을 예약할 수 있는 pmset이라는 내장 전원 관리 도구가 포함되어 있습니다. 이것이 가장 간단한 자동화 방법입니다.

# Schedule a restart every Sunday at 3:00 AM
sudo pmset repeat restart MTWRFSU 03:00:00

매주 특정 날을 예약하려면 다음을 사용합니다.

# Restart every Sunday at 4:00 AM
sudo pmset repeat restart U 04:00:00

예약된 재시작을 확인하려면 다음을 사용합니다.

pmset -g sched

예약된 재시작을 제거하려면 다음을 사용합니다.

sudo pmset repeat cancel

pmset 방법은 macOS의 내장 전원 관리 시스템을 사용하며 사용자가 로그인하지 않아도 작동하기 때문에 이상적입니다. 헤드리스 서버 및 항상 켜져 있는 Mac에 완벽합니다.

예방 전략 3: launchd를 사용한 자동 재시작

더 정교한 제어를 위해 특정 일정에 따라 재시작을 트리거하는 launchd plist를 만들 수 있습니다. 이 방법은 pmset보다 더 많은 유연성을 제공합니다.

/Library/LaunchDaemons/com.local.scheduled-restart.plist에 파일을 만듭니다.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.local.scheduled-restart</string>
    <key>ProgramArguments</key>
    <array>
        <string>/sbin/shutdown</string>
        <string>-r</string>
        <string>now</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Weekday</key>
        <integer>7</integer>
        <key>Hour</key>
        <integer>4</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>RunAtLoad</key>
    <false/>
</dict>
</plist>

다음 명령으로 로드합니다.

sudo launchctl load /Library/LaunchDaemons/com.local.scheduled-restart.plist

이렇게 하면 매주 일요일 오전 4시에 Mac이 재시작됩니다. 필요에 맞게 Weekday, Hour, Minute 값을 조정할 수 있습니다. Weekday 값은 1(월요일)에서 7(일요일)입니다.

예방 전략 4: 가동 시간 모니터링 스크립트

자동 재시작 대신 임계값 전에 경고를 받고 싶은 사용자는 가동 시간이 40일에 가까워지면 경고를 보내는 모니터링 스크립트를 설정할 수 있습니다.

#!/bin/bash
# Save as /usr/local/bin/uptime_monitor.sh

THRESHOLD_DAYS=40
UPTIME_SECONDS=$(( $(date +%s) - $(sysctl -n kern.boottime | awk '{print $4}' | tr -d ',') ))
UPTIME_DAYS=$(( UPTIME_SECONDS / 86400 ))

if [ $UPTIME_DAYS -ge $THRESHOLD_DAYS ]; then
    osascript -e "display notification \"Your Mac has been running for ${UPTIME_DAYS} days. Please restart soon to avoid the TCP bug.\" with title \"Uptime Warning\" subtitle \"49-Day TCP Bug Prevention\""
fi

이것을 스크립트를 매일 실행하는 launchd plist와 결합하면 재시작이 필요할 때 macOS 알림을 받습니다.

예방 전략 5: shutdown 명령 직접 사용

빠른 일회성 예약 재시작을 위해 shutdown 명령을 사용할 수 있습니다.

# Restart in 30 minutes
sudo shutdown -r +30

# Restart at a specific time today
sudo shutdown -r 23:00

# Cancel a pending restart
sudo shutdown -c

이것은 Mac을 적극적으로 사용하지 않을 것임을 알고 있는 하루 중 나중에 재시작을 예약하는 데 유용합니다.

이 특정 버그를 넘어 더 광범위한 네트워크 문제가 있다면 macOS Tahoe Wi-Fi 문제 해결 가이드에서 추가 진단 및 수정 방법을 확인하세요.

패치가 출시될 예정입니까?

네. Apple이 문제를 인정했으며, macOS 26.5에서 수정이 제공될 예정입니다. 작성 시점에서 macOS 26.5는 두 번째 베타 버전(베타 2)이며, Apple의 베타 프로그램을 통해 개발자 및 공개 베타 테스터가 이용할 수 있습니다.

현재 상태

  • macOS 26.4 및 이전 버전: 모든 프로덕션 버전에 버그가 있습니다. 49일 전에 재시작하는 것 외에 다른 해결 방법이 없습니다.
  • macOS 26.5 베타 1: 초기 베타에는 수정이 포함되지 않았습니다.
  • macOS 26.5 베타 2: 베타 테스터의 보고에 따르면 Apple이 TCP 스택의 근본적인 정수 오버플로를 해결했다고 합니다. 그러나 버그가 나타나는 데 49일의 가동 시간이 필요하기 때문에 일반적인 베타 테스트를 통해 수정을 빠르게 확인하기 어렵습니다.
  • 예상 출시 시기: Apple의 일반적인 베타 사이클을 기반으로 macOS 26.5는 2026년 늦봄 또는 초여름에 일반 출시될 것으로 예상됩니다.

Apple이 왜 더 빨리 패치를 제공하지 않았습니까?

여러 가지 요인이 지연에 기여했을 가능성이 있습니다.

발견 시점: 버그는 2026년 초에 공개적으로 공개되었습니다. Photon의 공개 블로그 게시물 이전에 책임 있는 공개 채널을 통해 Apple에 보고되었을 수 있지만, 커널 수준의 수정을 개발, 테스트 및 출시하는 일정은 며칠이 아닌 수 개월 단위로 측정됩니다.

커널 수준의 복잡성: XNU 커널은 모든 Apple 플랫폼의 기반입니다. TCP 스택의 수정은 수백만 대의 장치에 영향을 미칠 수 있는 회귀를 도입하지 않도록 철저히 테스트되어야 합니다. 타이머 비교에서의 정수 오버플로 수정은 다른 커널 하위 시스템과 미묘한 상호 작용을 가질 수 있습니다.

테스트의 어려움: 버그를 재현하려면 약 50일의 연속 가동 시간이 필요하기 때문에 수정 사항을 테스트하는 것은 본질적으로 느립니다. Apple은 테스트 환경에서 시간 조작 기술을 사용하여 수정을 확인한 다음 정상적인 TCP 작업이 중단되지 않는지 확인해야 할 것입니다.

해결 방법이 간단: Apple의 위험 평가 관점에서 해결 방법(일상적인 재시작)은 간단하고 비파괴적입니다. 예를 들어 원격 코드 실행 취약점에 비해 긴급성이 낮아집니다.

macOS 업데이트 및 알려진 문제에 대한 최신 정보는 macOS Tahoe 문제 해결 가이드를 참고하세요.

기술 심층 분석: XNU 커널 정수 오버플로

이 섹션은 개발자, 시스템 관리자 및 코드 수준에서 이 버그가 어떻게, 왜 발생하는지 기술적인 관심을 가진 분들을 대상으로 합니다.

오버플로의 메커니즘

XNU 커널은 틱 카운터를 사용하여 시스템 가동 시간을 추적합니다. 이 카운터는 uint32_t 데이터 타입을 사용하는 변수에 저장되며, 0에서 4,294,967,295까지의 값을 담을 수 있는 32비트 부호 없는 정수입니다.

커널은 이 카운터를 밀리초 간격으로 증가시킵니다. TCP 스택은 다음을 포함한 다양한 타이밍 작업에 이 카운터를 사용합니다.

  • 재전송 타이머: 확인되지 않은 패킷을 재전송하기 전에 대기하는 시간
  • 연결 시간 초과 계산: 연결 시도가 실패한 것으로 간주하는 시점
  • 킵얼라이브 타이밍: 유휴 연결에서 주기적인 킵얼라이브 프로브를 보내는 시점
  • 타임스탬프 비교: 패킷 헤더의 TCP 타임스탬프 옵션 유효성 검사

핵심 결함은 비교 연산에 있습니다. 단순화된 의사 코드로 문제가 있는 로직은 다음과 같습니다.

// Simplified representation of the buggy comparison
uint32_t current_time = get_system_uptime_ms();
uint32_t connection_timestamp = tcp_header->timestamp;

// This comparison fails when current_time has wrapped around
if (current_time - connection_timestamp > MAX_ALLOWED_DELTA) {
    // Drop the connection as "too old" or "invalid"
    drop_packet();
}

시스템이 49.7일 미만 실행된 경우 current_time은 단순히 증가하는 값이며 비교가 올바르게 작동합니다. 그러나 current_time이 4,294,967,295를 초과하여 오버플로되어 작은 숫자(예: 1,000)로 되돌아가면, current_time - connection_timestamp의 빼기 연산이 부호 없는 정수 언더플로로 인해 예상치 못하게 큰 결과를 생성하여 커널이 모든 새 연결의 타이밍 데이터를 유효하지 않은 것으로 해석합니다.

왜 발견되지 않았습니까?

이 유형의 버그는 여러 가지 이유로 악명 높을 정도로 발견하기 어렵습니다.

1. 시간 의존적 재현: 버그는 49.7일 후에만 나타납니다. Apple의 CI/CD 파이프라인을 포함한 대부분의 자동화된 테스트는 그 기간 동안 개별 테스트 사이클을 실행하지 않습니다. TCP 스택의 단위 테스트는 다양한 시간 값에서 정확성을 테스트하지만 오버플로 경계를 넘는 전환을 특별히 테스트하지 않을 수 있습니다.

2. 코드가 얼핏 보면 정확해 보입니다: 비교 연산은 구문적으로 유효하며 처음 49일 동안은 올바르게 작동합니다. 코드 검토자는 버그를 발견하기 위해 오버플로 케이스를 특별히 고려해야 합니다. XNU처럼 방대한 코드베이스(수백만 줄의 코드)에서는 이런 종류의 미묘한 문제가 검토를 통과하기 쉽습니다.

3. 현대 Mac은 자주 재시작됩니다: macOS 업데이트는 일반적으로 재시작을 필요로 하며, 대부분의 소비자용 Mac은 버그가 나타나지 않을 만큼 충분히 자주 재시작됩니다. 패턴이 주목받을 만큼의 노출을 만든 것은 점점 증가하는 항상 켜져 있는 Mac 서버(특히 Mac mini) 인구였습니다.

4. 오해를 불러일으키는 증상: 버그가 발생하면 운영 체제 버그가 아닌 네트워크 인프라 문제처럼 보입니다. 사용자(심지어 경험 많은 관리자도)는 일반적으로 Mac의 커널을 의심하기 전에 라우터, DNS 서버, ISP 연결 및 네트워크 스위치를 조사합니다. 이 버그를 겪은 많은 사용자들은 재시작 자체가 수정이라는 것을 깨닫지 못한 채 Mac을 재시작하여 "해결"했을 가능성이 있으며, 문제를 다른 원인에 돌렸을 것입니다.

올바른 수정 방법

C에서 타이머 오버플로 비교의 올바른 수정은 잘 확립되어 있습니다. 원시 타이머 값을 비교하는 대신, 오버플로를 올바르게 처리하는 부호 있는 산술을 사용하여 비교를 수행해야 합니다.

// Correct wraparound-safe comparison
// Cast the difference to a signed type
int32_t time_delta = (int32_t)(current_time - connection_timestamp);

if (time_delta > MAX_ALLOWED_DELTA || time_delta < 0) {
    drop_packet();
}

또는 커널은 64비트 타이머(uint64_t)를 사용할 수 있는데, 이는 약 5억 8천 4백만 년 동안 오버플로하지 않아 오버플로 우려를 사실상 없앨 수 있습니다. 그러나 타이머 폭을 변경하면 커널 전체에 더 광범위한 영향을 미치고 더 광범위한 변경 및 테스트가 필요합니다.

TCP 연결 타임라인 및 오버플로 포인트

다른 Apple 플랫폼은 어떻습니까?

XNU가 모든 Apple 플랫폼(macOS, iOS, iPadOS, watchOS, tvOS, visionOS)의 공유 커널이기 때문에 iPhone과 iPad도 영향을 받는지 자연스럽게 궁금할 것입니다.

이론적으로 동일한 취약한 코드가 모든 Apple 플랫폼에 존재합니다. 실제로는 iOS 및 iPadOS 장치가 Mac보다 훨씬 자주 재시작됩니다. 시스템 업데이트, 배터리 소모 및 정상적인 사용 패턴으로 인해 iPhone이 49일 연속 가동 시간에 도달하는 경우는 거의 없습니다. Apple Watch 및 Apple TV 장치도 마찬가지로 정기적으로 재시작되는 경향이 있습니다. 그러나 iPad가 어떤 이유로든 재시작 없이 50일 연속 실행된다면 이론적으로 동일한 버그의 영향을 받을 것입니다.

역사적 배경: 이것이 처음은 아닙니다

macOS 49일 TCP 버그에는 오래된 컴퓨팅 베테랑들이 즉시 알아볼 놀라운 역사적 선례가 있습니다. 1990년대의 악명 높은 Windows 49일 버그입니다.

Windows 49.7일 버그

Microsoft Windows 95, Windows 98 및 Windows ME 모두 거의 동일한 버그를 포함했습니다. Windows 커널 함수 GetTickCount()는 시스템이 시작된 이후 밀리초 수를 나타내는 DWORD(32비트 부호 없는 정수)를 반환했습니다. 49.7일 후 이 값이 오버플로하여 0으로 되돌아갔습니다.

Windows에서의 결과는 현재 macOS 버그보다 더 심각했다고 할 수 있습니다. Windows 95에서 오버플로는 다음을 일으킬 수 있었습니다.

  • 시스템 전체 정지 및 충돌(죽음의 블루스크린)
  • 응용 프로그램 중단 및 데이터 손상
  • 재시작이 필요한 완전한 시스템 불안정

Windows 버그는 1990년대 후반에 잘 알려졌으며 광범위하게 문서화되었습니다. 정수 오버플로를 왜 신중하게 처리해야 하는지에 대한 프로그래밍 교과서의 표준 예가 되었습니다. Microsoft는 결국 Windows Vista(2007년)에서 GetTickCount64()를 도입했으며, 이는 64비트 카운터를 사용하여 약 5억 8천 4백만 년 동안 오버플로하지 않습니다.

아이러니

Windows에서 잘 알려진 문제가 된 지 거의 30년 후에 Apple이 본질적으로 동일한 종류의 버그인 32비트 밀리초 타이머 오버플로를 제공했다는 아이러니는 개발자 커뮤니티에서 주목받지 못하지 않았습니다. macOS 버그에 대한 Hacker News 토론은 Windows 선례를 자주 참조하며, 그러한 잘 알려진 오류 클래스가 현대 운영 체제 커널에 들어올 수 있다는 것에 놀라움을 표현하는 댓글이 많습니다.

그러나 XNU 커널이 수십 년에 걸쳐 축적된 코드를 가진 방대하고 복잡한 코드베이스라는 점을 주목할 가치가 있습니다. 버그를 포함하는 특정 비교 연산은 오래 전에(아마도 NeXTSTEP 시대나 OS X 초기에) 작성되었으며, Mac을 항상 켜져 있는 서버로 실행하는 최근 추세가 생기기 전까지는 결함을 드러낼 조건에서 실행된 적이 없었을 가능성이 있습니다.

컴퓨팅 역사의 다른 주목할 만한 타이머 오버플로 버그

49일 오버플로는 컴퓨팅 역사 전반에 걸친 타이머 관련 버그의 더 광범위한 패턴의 일부입니다.

  • 보잉 787 드림라이너(2015년): FAA는 발전기 제어 장치의 32비트 타이머 오버플로로 인한 완전한 전력 손실을 방지하기 위해 보잉 787 항공기를 248일마다 전원을 껐다 켜도록 요구하는 감항성 지시를 발행했습니다.
  • PlayStation 3 윤년 버그(2010년): PS3 내부 시계의 계산 오류로 인해 시스템이 날짜를 2010년 2월 29일(존재하지 않는 날)로 믿게 되어 전 세계 콘솔이 24시간 동안 작동 불능 상태가 되었습니다.
  • 화성 패스파인더(1997년): 엄밀히 말해 타이머 오버플로는 아니지만, 패스파인더의 우선순위 역전 버그는 로버가 화성에서 운용된 후 현장에서 발견되어 시간 의존적 버그가 광범위한 배포 전 테스트를 피할 수 있다는 것을 보여주었습니다.
  • Y2K(2000년): 2자리 연도 표현이 세기 경계에서 광범위한 장애를 일으킬 위협을 가져온 컴퓨팅 역사상 가장 유명한 날짜/시간 컴퓨팅 버그입니다.

이러한 예들은 일관된 주제를 보여줍니다. 시간 관련 버그는 극단적인 시간 지속 또는 경계 조건을 특별히 고려하지 않는 테스트를 피하기 때문에 컴퓨팅에서 가장 교활한 버그 중 하나입니다.

문제 해결: Mac이 버그에 걸린 신호

Mac이 49일 TCP 버그에 걸렸을 수 있다고 의심된다면, 다음에서 확인해야 할 구체적인 증상과 이 버그를 다른 네트워크 문제와 구별하는 방법을 설명합니다.

주요 증상

1. 모든 새 TCP 연결이 동시에 실패합니다

이것이 특징적인 증상입니다. 하나의 앱이나 하나의 웹사이트가 아닌 TCP를 사용하는 모든 것이 실패합니다.

  • 웹 브라우저가 어떤 페이지도 로드할 수 없음(Safari, Chrome, Firefox — 모두 실패)
  • 이메일 클라이언트가 메일 서버에 연결할 수 없음
  • SSH 연결이 시간 초과
  • iMessage와 FaceTime이 작동하지 않음
  • iCloud 동기화가 중단
  • App Store가 연결할 수 없음
  • 파일 공유 및 AirDrop이 실패할 수 있음
  • Homebrew, npm, pip 및 기타 패키지 관리자가 어떤 것도 다운로드할 수 없음

2. Wi-Fi 또는 이더넷이 연결된 것으로 표시됩니다

Mac의 메뉴 바에는 여전히 연결된 Wi-Fi 신호 또는 이더넷 연결이 표시됩니다. 네트워크 인터페이스는 계층 1과 계층 2(물리적 및 데이터 링크)에서 작동 중이며, 계층 4(전송/TCP)만 손상된 것입니다.

3. 핑이 여전히 작동할 수 있습니다

ICMP 핑은 TCP를 사용하지 않기 때문에 외부 호스트에 성공적으로 핑할 수 있습니다.

ping google.com

핑은 작동하지만 웹 브라우저와 응용 프로그램이 작동하지 않는 경우, 이것은 일반적인 네트워크나 DNS 문제가 아닌 TCP 버그의 강한 지시입니다.

4. DNS 확인이 여전히 작동할 수 있습니다

UDP를 사용하는 DNS 쿼리(대부분의 DNS 조회의 기본값)는 계속 작동할 수 있습니다.

nslookup google.com

DNS는 해결되지만 TCP 연결이 실패한다면 TCP 버그가 유력한 원인입니다.

5. 가동 시간이 49일 이상입니다

이전 섹션에서 설명한 대로 가동 시간을 확인하세요. 가동 시간이 49일 이상이고 위의 증상이 나타난다면 버그가 거의 확실히 원인입니다.

다른 네트워크 문제와 구별하는 방법

49일 TCP 버그는 여러 다른 일반적인 네트워크 문제와 혼동될 수 있습니다. 구별하는 방법은 다음과 같습니다.

증상TCP 버그Wi-Fi 문제DNS 문제방화벽 차단ISP 중단
모든 TCP 연결 실패예가능아니오가능가능
핑 작동예아니오예가능아니오
DNS 확인예아니오아니오예가능
Wi-Fi가 연결됨으로 표시예아니오예예예
가동 시간 > 49일예무관무관무관무관
다른 장치 영향아니오경우에 따라경우에 따라아니오예
재시작으로 수정예경우에 따라아니오아니오아니오

가장 확실한 테스트는 49일 이상의 가동 시간 + 모든 TCP 연결 실패 + 핑 작동 + 재시작으로 수정의 조합입니다. 네 가지 조건이 모두 충족되면 버그를 만난 것입니다.

다른 원인을 배제하는 데 도움이 될 수 있는 Wi-Fi 특정 문제 해결에 대해서는 macOS Tahoe Wi-Fi 문제 해결 가이드를 참고하세요.

네트워크 진단 명령

Terminal에서 이 명령들을 실행하여 진단 정보를 수집합니다.

# Check uptime
uptime

# Test TCP connection to a known-good server
nc -zv google.com 443

# Test DNS resolution
nslookup apple.com

# Test ICMP connectivity
ping -c 4 8.8.8.8

# Check network interfaces
ifconfig | grep "status"

# View active TCP connections
netstat -an | grep ESTABLISHED | head -20

# Check for TCP connection errors
netstat -s | grep -i "error\|fail\|drop\|overflow"

nc -zv google.com 443이 실패(연결 시간 초과)하지만 ping -c 4 8.8.8.8이 성공하고 가동 시간이 49일 이상인 경우, TCP 버그의 강력한 증거가 있습니다.

Mac이 네트워크 문제와 함께 정지나 성능 문제도 경험하고 있다면 macOS Tahoe 정지 수정 가이드에서 추가적인 도움이 되는 내용을 확인하세요.

버그를 확인했을 때 해야 할 일

  1. 열린 응용 프로그램의 저장하지 않은 작업을 저장합니다
  2. 활성 파일 작업이 있는 응용 프로그램(데이터베이스, 비디오 인코딩 등)을 정상적으로 닫습니다
  3. sudo shutdown -r now 또는 Apple 메뉴를 사용하여 Mac을 재시작합니다
  4. 재시작 후 웹 페이지를 로드하고 uptime을 실행하여 카운터가 재설정되었는지 확인하여 연결을 확인합니다
  5. 위의 섹션에서 예방 전략을 구현하여 버그를 다시 만나지 않도록 합니다

자주 묻는 질문

제 Mac이 49일 TCP 버그의 영향을 받습니까?

macOS를 실행하는 모든 Mac은 하드웨어 모델, 프로세서 유형 또는 macOS 버전에 관계없이 잠재적으로 영향을 받습니다. 버그는 모든 macOS 설치의 기반인 XNU 커널에 존재합니다. 그러나 재시작 없이 49.7일 이상 Mac이 지속적으로 실행되는 경우에만 버그가 발생합니다. 수동으로든 시스템 업데이트를 통해서든 적어도 한 달에 한 번 Mac을 재시작한다면 이 버그를 만나지 않을 것입니다.

버그를 피하기 위해 얼마나 자주 Mac을 재부팅해야 합니까?

30일마다 한 번 재부팅하면 49.7일 임계값보다 충분히 여유 있는 안전 여유를 확보할 수 있습니다. 미션 크리티컬 서버 Mac의 경우 주간 재시작(이상적으로는 비피크 시간에)을 통해 더 큰 안전 여유를 확보할 수 있습니다. 위의 예방 섹션에서 설명한 pmset, launchd 또는 예약된 shutdown -r 명령을 사용하여 이것을 자동화할 수 있습니다. 더 자주 재시작하는 것은 단점이 없습니다. 실제로 정기적인 재시작은 메모리 누수를 제거하고, 대기 중인 업데이트를 적용하며, 전반적인 시스템 건강을 유지하는 데 도움이 됩니다.

Apple이 이 버그를 수정합니까?

네, Apple은 2026년 4월 현재 베타 2 단계인 macOS 26.5에서 버그를 수정할 예정입니다. Apple의 일반적인 베타 사이클을 기반으로 공개 출시는 2026년 늦봄 또는 초여름에 예상됩니다. 수정에는 XNU 커널의 TCP 스택에서 정수 비교를 수정하여 32비트 타이머 오버플로를 올바르게 처리하거나, 잠재적으로 타이머를 64비트 정수로 업그레이드하는 것이 포함될 가능성이 있습니다. 수정이 프로덕션 버전에 포함될 때까지 유일한 완화책은 49일 가동 시간 임계값에 도달하기 전에 Mac을 재시작하는 것입니다.

이 버그가 Apple Silicon과 Intel Mac 모두에 영향을 미칩니까?

네. 버그는 XNU 커널의 TCP 스택에 있으며, 이것은 Apple Silicon(M1, M2, M3, M4 및 M5 시리즈) 및 Intel 프로세서 모두에서 실행되는 아키텍처 독립적인 코드입니다. 정수 오버플로는 기본 하드웨어 아키텍처에 관계없이 동일한 방식으로 발생합니다. Intel 프로세서가 있는 2015년 MacBook Pro든 M5 Ultra가 있는 2026년 Mac Studio든 버그는 동일하게 동작합니다.

Mac의 가동 시간을 원격으로 확인할 수 있습니까?

네, Mac에 SSH 액세스 권한이 있다면(시스템 설정 > 일반 > 공유 > 원격 로그인을 통해 활성화) 원격으로 가동 시간을 확인할 수 있습니다.

ssh username@your-mac-ip "uptime"

여러 Mac을 관리하기 위해 모든 머신의 가동 시간을 확인하는 스크립트를 만들 수 있습니다.

#!/bin/bash
# check_all_macs.sh
MACS=("mac1.local" "mac2.local" "mac3.local")

for mac in "${MACS[@]}"; do
    echo "--- $mac ---"
    ssh user@$mac "uptime" 2>/dev/null || echo "  Connection failed"
done

Apple Remote Desktop(ARD) 또는 모바일 장치 관리(MDM) 솔루션을 사용하여 관리되는 Mac 집단의 가동 시간을 모니터링할 수도 있습니다.

네트워크 드라이브나 NAS 장치에 연결하는 Mac을 관리한다면 49일 버그가 SMB 파일 공유 연결도 중단시킬 수 있습니다. 관련 네트워크 스토리지 문제 해결에 대해서는 macOS Tahoe SMB/NAS 문제 해결 가이드를 참고하세요.

결론

macOS 49일 TCP 버그는 미묘한 정수 오버플로, 즉 소프트웨어 버그 중 가장 오래되고 가장 잘 문서화된 클래스 중 하나가 항상 켜져 있는 Mac 서버 구성을 채택하는 사용자가 늘어남에 따라 현대적이고 성숙한 운영 체제 커널에서 수년간 감지되지 않은 채로 지속될 수 있음을 보여주는 매혹적인 사례 연구입니다.

대부분의 Mac 사용자에게 이 버그는 일상적인 컴퓨팅에 영향을 미치지 않을 흥미로운 기술적 호기심입니다. 그러나 Mac을 서버, 개발 머신, 항상 켜져 있는 인프라로 의존하는 성장하는 사용자 커뮤니티에게는 주의와 완화가 필요한 실제 운영 위험입니다.

좋은 소식은 완화책이 간단하다는 것입니다. 가동 시간을 확인하고, 49일 전에 재시작하며, 이상적으로는 프로세스를 자동화하여 다시는 생각할 필요가 없도록 하세요. 그리고 macOS 26.5가 가까이 오면서 영구적인 수정이 가시권에 있습니다.

그 동안 이것을 가장 세련되고 신뢰할 수 있는 컴퓨팅 플랫폼도 인간에 의해 만들어지며 인간이 작성한 코드는 결코 완벽하지 않다는 훌륭한 상기로 여기세요. 정기적인 재시작은 단순히 게으른 IT 지원 진부한 표현이 아닙니다. 정확히 이런 종류의 잠재적 결함으로부터 보호하는 진정한 모범 사례입니다.

관련 리소스

TCP 버그와 함께 다른 macOS Tahoe 문제를 해결하고 있다면 다음 가이드가 도움이 될 수 있습니다.