
Ubuntu 24.04에서 NVIDIA와 함께 CVE-2026-98432에 대한 안전한 커널 업그레이드 및 버그 분석
이 작업은 NVIDIA GPU가 있는 Ubuntu 24.04 머신을 커널의 IPv4 TCP 코드에 존재하는 use-after-free 취약점인 CVE-2026-98432를 수정한 커널로 옮깁니다. 업그레이드가 잘못될 경우 접근하지 못할 수도 있는 머신을 위해 만들어졌습니다. 부팅이 완료되기 전까지는 아무것도 신뢰하지 않으며, 실패한 단계는 깨진 호스트를 남기는 대신 명시적으로 중단됩니다.
Ubuntu의 일반 업데이트에 수정 사항이 포함되어 있다면 그것을 우선 사용하십시오. 이 작업이 존재하는 이유는, 이 작업이 작성된 긴급 상황에서 유일하게 수정된 커널이 Canonical의 스테이징 아카이브에 있는 사전 릴리스 빌드뿐이었기 때문입니다. 가장 최근에 게시된 커널인 7.0.0-42에도 여전히 버그가 있었습니다.
버전 번호로 판단하지 마십시오. personal_server의 게이트를 사용하여 실행 중인 커널의 자체 코드를 읽으십시오:
sudo bash scripts/14_verify_kernel_fixes.sh
실행 중인 커널의 기계어 코드를 라이브 메모리에서 읽고, GRUB이 다음에 부팅할 커널의 기계어 코드를 해당 이미지에서 읽는다. 수정된 커널에서는 inet_sock_destruct와 tcp_v4_reqsk_destructor가 kvfree_call_rcu를 호출한다. 취약한 커널에서는 이들이 kfree를 호출한다.
실패하면 먼저 일반 경로를 시도하라:
sudo apt-get update
sudo apt-get install --only-upgrade linux-generic-hwe-24.04
sudo systemctl reboot
고정 커널이 없는 경우에만 이 저장소를 사용하십시오.
프로세스가 실행 중에 감사 추적을 Git에 게시하므로 자신만의 복사본이 필요합니다. 이 저장소를 포크한 후, 해당 머신에서:
git clone <your fork> && cd <it>
kernel-upgrade/install.sh
sudo systemctl reboot
재부팅에 약 8분을 할애하세요. 머신은 스스로 두 번 더 재부팅되며, 여러분의 조작이 필요하지 않습니다:
uname -r # must print 7.0.0-43-generic
python3 -I kernel-upgrade/upgrade.py status # must say complete
머신에 맞지 않으면 설치 프로그램이 이유를 알려주고 아무것도 변경하지 않습니다. kernel-upgrade/PROCEDURE.md에는 호스트에 필요한 사항, 모든 실패와 그에 대한 대처 방법, 그리고 크래시 경계가 담겨 있습니다.
| 부팅 | 시작 주체 | 커널 | 수행 내용 |
|---|---|---|---|
| 1 | 사용자 | 이곳에서 작동하는 것으로 알려진 커널 | GRUB이 이 디스크에 쓸 수 있음을 증명하여, 일회성 부팅이 실제로 한 번만 이루어지도록 함 |
| 2 | 프로세스, 1회 | -43, 단 한 번만 | 커널 메모리에서 수정 사항을 읽고 호스트가 이전에 가졌던 모든 것을 확인함. 패닉이 발생하면 자동으로 정상 작동하는 커널로 복귀함 |
| 3 | 프로세스, 1회 | -43, 기본 GRUB을 통해 | 기본 GRUB이 복원되고 다른 모든 커널이 제거된 최종 상태를 증명함 |
보장 사항:
complete는 증명되었음을 의미합니다. 이 상태는 최종 GRUB 및 커널 상태를 통한 부팅 이후에만 도달하며, 최종 기록은 상태가 저장되기 전에 Git에 도달합니다.lock.json은 설치할 항목을 명시하며 어떤 머신에 대한 정보도 담고 있지 않습니다. 폴백, 제거 목록, 상태 기준선은 모두 호스트에서 읽어오며 첫 변경 전에 게시됩니다.PROCEDURE.md에 명시된 구간을 제외하고는. 다음 부팅은 명시적으로 계속되거나 중단됩니다.kernel-upgrade/vm/final-run.sh는 4 TB 에뮬레이션 NVMe 디스크를 갖춘 UEFI 테스트 머신을 처음부터 구축하고 그 안에서 정확한 설치 프로그램을 실행합니다. test-report.json은 통과한 항목의 해시를 기록하며, install.sh는 코드가 해당 보고서와 다를 경우 실행을 거부합니다.
24개의 시나리오는 패키지 처리 중, 최종 퍼지 중, 최종 기록 이후의 실제 정전, 커널 패닉과 행(hang), 각 단계에서의 GitHub 다운, 그리고 반드시 거부되어야 하는 머신을 다룹니다. from-zero는 실제 Ubuntu 아카이브에서 personal_server의 실제 스크립트로 머신을 구축하고, 게이트가 이를 거부하는 것을 확인한 뒤 업그레이드하고, 게이트가 통과하는 것을 확인합니다. from-zero는 이 저장소 옆에 personal_server의 클론이 필요합니다.
VM이 보여줄 수 없는 것은 PROCEDURE.md에 나열되어 있습니다. 주요한 것은 실제 펌웨어이며, 이는 부팅 1에서 머신 자체에서 테스트됩니다.
이것은 2026-11-02에 4 TB NVMe 디스크와 RTX 5090을 갖춘 인터넷에 노출된 서버에서 실행되었습니다. 그 머신에는 원격 콘솔이 없고 네트워크에 연결된 전원 스위치만 있었습니다. 기본 GRUB을 통한 첫 부팅은 모든 검사를 통과했으며, 7.0.0-43이 유일한 커널이었고 수정 사항은 라이브 커널 메모리에서 확인되었습니다.
이 프로세스의 첫 버전은 그곳에서 작동했지만 올바르지 않았습니다. systemd가 마지막 밀리초에 이를 종료했는데, 실행 중에 자체 유닛 파일을 삭제했기 때문입니다. 또한 기본 GRUB이 부팅되기 전에 스스로를 complete라고 불렀고, 그 머신의 세부 정보가 내장되어 있었습니다. 이 저장소는 재구축된 것입니다. 이후 독립적인 검토에서 다시 실행되기 전에 추가적인 실제 결함이 발견되었으며, 여기에는 패키지가 변경된 후 모든 실제 NVMe 호스트를 중단시켰을 검사도 포함됩니다.
├── ANALYSIS.md what the bug is, what MPTCP changes, and the limits of that
├── upstream-fix.diff the two-line upstream fix
├── filter/ an interim packet filter. It reduces exposure and isn't a fix
└── kernel-upgrade/
├── PROCEDURE.md the full procedure, failure table and crash boundary
├── install.sh the entry point
├── upgrade.py the controller and the audit publisher
├── lock.json what to install, with hashes
├── cuda-probe.c a real GPU allocation, for the health check
├── test_upgrade.py logic tests against a real Git remote
├── test-report.json what passed, and the exact bytes it covered
├── test-evidence/ the journal of each VM scenario
└── vm/ the VM test harness
코드는 Unlicense에 따라 배포됩니다. 패키지는 각자의 라이선스를 유지합니다. 릴리스에는 Canonical의 커널 패키지와 dkms가 포함되어 있는데, 이는 스테이징 아카이브가 오래된 빌드를 삭제하기 때문입니다. NVIDIA의 패키지는 여기서 재배포되지 않습니다. 이 패키지들은 사용자의 Ubuntu 아카이브에서 가져옵니다.