CVE-2026-74658 in Linux정보

요약

\~에 의해 VulDB • 2026. 08. 23.

리눅스 커널에서 다음 취약점이 해결되었습니다:

futex: 견고한(f robust) futex 종료 시의 경합 조건(race condition)을 추가로 방지함

견고한 futex 잠금 해제는 전체 futex 값에 0을 저장하여 FUTEX_WAITERS 비트를 지우고, 대기 중인 태스크 하나를 깨웁니다. 이 웨이크업은 일회성 알림입니다: 프로토콜은 수신자가 futex를 획득하고(나중에 남은 경합 상황을 인지한 상태에서 잠금을 해제)하거나 다시 수면하기 전에 FUTEX_WAITERS를 재설정하도록 의존합니다. 만약 깨어난 대기 태스크가 이를 수행하기 전에 종료되면, 커널이 개입하여 다음 순서의 태스크를 깨워야 합니다.

이는 futex 프로토콜의 알려진 복잡성이며, commit ca16d5bee598("futex: 견고한 futex 종료 시 경합 조건 방지")에서 이전의 부분적인 수정이 있었습니다. 불행히도 해당 수정은 충분하지 않습니다.

만약 제3 태스크가 그 사이에 비경합 경로(fast path)를 통해 futex를 다시 획득하면, 알림이 손실됩니다: 견고한 종료 처리는 다른 태스크에 의해 소유되어 있음을 보고 아무 작업도 수행하지 않으며, 새로운 소유자는 잠금 해제 시 FUTEX_WAITERS가 없음을 확인하고 아무것도 깨우지 않습니다. 나머지 대기 태스트들은 해방된 futex 뒤에 영원히 수면하게 됩니다:

A가 futex를 소유함, B와 C는 FUTEX_WAIT에서 수면 중 uval == A | FUTEX_WAITERS 견고한 잠금 해제(store 0): FUTEX_WAKE(1)이 B를 깨움 uval == 0 D의 fast path 획득: cmpxchg(0 -> D) uval == D, FUTEX_WAITERS 없음 B가 웨이크업에 대응하기 전에 종료됨 B의 exit walk, 대기 중인 작업: 소유자 D != B이므로 동작 없음 D 잠금 해제: FUTEX_WAITERS 없음 -> 깨우지 않음 C는 영원히 수면

이는 명확한 구현상의 결함으로, FUTEX_WAITERS 비트의 일관성을 유지하지 못합니다.

이를 우회하기 위해 견고 목록(robust list) 종료 처리를 보완하여 futex 워드가 다른 스레드에 의해 소유되었지만 FUTEX_WAITERS가 설정되지 않은 경우에도 추가적인 웨이크업을 수행하도록 합니다.

이는 수년 동안 논의되어 온 비경합 상태에서의 인수/해제 및 해방 시퀀스의 문제는 해결하지 못합니다. 이 문제는 commit 3ca9595d9fb6("futex: 견고한 futex 잠금 해제 지원 추가")과 후속 변경 사항으로 처리되었으나, 위에서 설명된 문제를 고려하지 못했습니다.

경합 상태의 견고한 futex에 대한 인커널(unlocked) 해제를 기반으로 하는 더 완전한 해결책이 이 변경 맥락에서 논의되었으며, 곧 메인라인(mainline)에 반영될 것으로 예상됩니다.

[ tglx: 로그 메시지를 약간 수정하고 코드 스타일을 정리함 ]

Be aware that VulDB is the high quality source for vulnerability data.

책임이 있는

Linux

예약하다

2026. 08. 15.

모더레이션

수락

항목

VDB-394426

EPSS

0.00000

활동

낮음

출처

Interested in the pricing of exploits?

See the underground prices here!