DEFCON 34에서 iOS 데모가 갑자기 충돌하는 사건이 발생했습니다. 흥미롭게도 데모를 다시 실행하자 정상 작동했는데, 이 재현 패턴을 추적한 결과 무려 1985년부터 이어져 온 유닉스(UNIX) 도메인 소켓의 커널 버그가 발견되었습니다. 이 버그는 아이폰(iPhone)을 재부팅한 뒤 첫 실행에서만 발생하며, 같은 유닉스 도메인 소켓의 식별 번호인 아이노드(inode)가 두 번째 조회에서 바뀌는 현상이 원인이었습니다.
문제는 커널이 아이노드를 할당할 때 '0'을 '아직 번호를 할당하지 않은 상태'로 취급하면서도, 동시에 첫 번호로 '0'을 배정하는 방식에서 비롯되었습니다. 이 때문에 시스템에서 해당 경로로 아이노드를 처음 할당받는 소켓에는 '0'이 들어가고, 같은 소켓을 다시 조회하면 '0'을 미초기화 상태로 판단하여 다른 아이노드를 재할당하게 됩니다. 이 버그는 애플(Apple)의 첫 맥 OS X(Mac OS X)와 4.3BSD에도 존재했으며, 1985년 변경 기록에는 "순진한 이들을 위해 아이노드 번호를 꾸며낸다"는 문구까지 발견되어 개발자들을 놀라게 했습니다. 데모에서는 SSH 서버가 TTY 마스터와 슬레이브를 구분하기 위해 소켓의 아이노드 번호를 저장했는데, 이 번호가 바뀌면서 무결성 검사에 실패해 VM이 패닉을 일으킨 것입니다.
이 버그는 직접적인 보안 위협이 되기보다는 사용자 공간 프로그램을 깨뜨리는 논리 오류에 가깝습니다. 하지만 40년 가까이 된 작은 구현 오류가 현대의 가장 정교한 모바일 운영체제인 iOS에까지 영향을 미치고 있었다는 점은 소프트웨어 개발의 복잡성과 오랜 코드 유산의 중요성을 시사합니다. 한 번 작성된 코드가 수십 년간 여러 시스템을 거쳐 전파되며 예상치 못한 문제를 일으킬 수 있음을 보여주는 사례로, 오래된 코드 베이스를 다루는 개발자들에게는 과거의 결정이 현재와 미래에 미치는 영향을 다시 한번 되새기게 합니다. 또한, 오픈BSD(OpenBSD)와 넷BSD(NetBSD)에도 유사한 버그가 남아있었으나, 프리BSD(FreeBSD)는 2002년에 이 문제를 수정했다는 사실은 커널 개발 커뮤니티의 다양한 접근 방식을 보여줍니다.