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.

출처

Do you need the next level of professionalism?

Upgrade your account now!