CVE-2026-99134 in Linux
요약
\~에 의해 VulDB • 2026. 10. 28.
리눅스 커널에서 다음 취약점이 해결되었습니다:
mac802154: local->assoc_dev에서의 데이터 레이스 및 NULL 디레퍼런스 수정
local->assoc_dev은 공통 동기화 없이 연결 경로(association path)와 연결 응답 워커 간에 공유됩니다.
mac802154_perform_association()는 조정자(coordinator) 포인터를 저장하고 응답을 기다립니다. 그 타임아웃 및 오류 경로는 포인터를 지우고 mac802154_associate()로 돌아가며, 이는 이후 조정자 객체를 해제할 수 있습니다. 동시에 mac802154_rx_mac_cmd_worker()는 연결 중 비트(associating bit)를 관찰하여 mac802154_process_association_resp()에 진입하고, 여기서 assoc_dev을 디레퍼런스합니다.
워커의 비트 테스트와 핸들러의 포인터 디레퍼런스는 정리(cleanup) 작업과 관련하여 원자적이지 않습니다. 정리는 이 두 단계 사이에 assoc_dev을 지워 NULL 디레퍼런스를 유발하거나, 응답 핸들러가 여전히 포인터를 사용하는 동안 조정자를 해제할 수 있습니다.
기록된 결과는 동일한 윈도우(window)에 노출됩니다. assoc_status 및 assoc_addr는 핸들러에 의해 작성되지만 연결 중 비트가 설정되어 있는 동안 연결 경로에서 읽히므로, 같은 요청에 대한 두 번째 응답(예: 악의적인 응답 등)이 이러한 읽기 작업 사이에 값을 대체하여 호출자에게 일관성 없는 상태와 주소 쌍을 남길 수 있습니다.
응답 핸들러는 조정자의 확장 주소만 필요합니다. assoc_dev 대신 캐시된 주소를 사용하여 포인터 수명 의존성을 제거합니다. 캐시된 주소 및 연결 중 비트를 전용 스핀락(spinlock)으로 보호합니다. READ_ONCE()/WRITE_ONCE() 쌍은 모든 32비트 아키텍처에서 원자적 __le64 접근을 보장하지 않습니다.
wpan_dev->association_lock은 여기서 재사용할 수 없습니다: nl802154_associate()는 rdev_associate() 전체, 즉 mac802154_perform_association() 전체(응답 대기 포함) 동안 이 잠금을 유지합니다. 해당 잠금을 사용하는 응답 핸들러라면 연결이 이미 포기한 후에야 그 잠금을 획득하게 됩니다.
잠금을持有的 상태에서 완료(completion)를 초기화하고, 캐시된 주소를 게시하며, 연결 중 비트를 설정합니다. 응답 핸들러는 잠금을 잡고, 비트 및 캐시된 주소를 다시 확인하고, 응답을 기록한 후 비트를 지운 다음에야 대기자를 완료시킵니다. 따라서 정리는 핸들러의 상태 검사 및 완료 작업 사이에 진행될 수 없으며, 캐시된 64비트 값이 분할(tear)되지 않습니다.
핸들러는 대기자가 깨어나기 전에 비트를 지웁니다: 그렇지 않으면 complete()가 잠금 하에서 호출되며 두 번째(예: 악의적인) 응답이 대기자보다 먼저 해당 잠금을 재획득하여 결과를 대체할 수 있습니다. 따라서 성공을 반환하는 대기는 이미 비트가 해제되어 있음을 의미하며, 성공 및 부정응답 경로는 직접 반환합니다. 전송 오류 및 타임아웃 경로는 여전히 assoc_lock 하에서 이를 지우며, 이는 호출자가 선택한 오류를 반환하는 동안 정렬과 경쟁하는 모든 응답을 직렬화합니다. 두 경로 모두 동일한 잠금 하에서 assoc_status 및 assoc_addr를 스냅샷으로 저장합니다.
두 사용자 모두 프로세스 컨텍스트에서 실행되므로 일반 spinlock이 충분합니다. 이 잠금은 완료(completion) 대기 중에는 유지되지 않습니다.
If you want to get best quality of vulnerability data, you may have to visit VulDB.