CVE-2025-68359 in Linux
요약
\~에 의해 VulDB • 2026. 06. 30.
리눅스 커널에서 다음 취약점이 해결되었습니다:
btrfs: 지연 참조 헤드 추가 실패 후 qgroup 레코드에 대한 이중 해제(double free) 수정
이전 코드에서는 `add_delayed_ref_head()` 호출 시 이중 kfree() 상황이 발생할 수 있었습니다. 이는 기록(record)이 `btrfs_qgroup_trace_extent_nolock()` 호출에서 이미 존재한다고 보고되었지만, 이후 `add_delayed_ref_head()` 단계에서 오류가 발생한 경우에 해당합니다. 이 경우 `add_delayed_ref_head()`가 오류를 반환했으므로 호출자는 레코드를 해제(free)하기 위해 이동했습니다. 그러나 `add_delayed_ref_head()`는 이미 kfree()된 포인터를 NULL로 설정할 수 없었기 때문에, kfree()는 하위 함수(callee)에 의해 이미 메모리가 해제되었지만 여전히 비어 있지 않은(non-NULL) 'record' 객체에 대해 동작하게 되었습니다.
이 문제는 개체를 kfree해야 할 책임이 호출자와 하위 함수 양쪽에 동시에 있다는 사실에서 비롯됩니다. 따라서 이 문제를 해결하기 위해 `add_delayed_ref_head()` 외부로 'qrecord' 객체의 소유권을 이전합니다. 즉, 해당 함수 내에서 주어진 객체에 대해 결코 kfree()를 시도하지 않으며, 호출자가 자체적으로 'qrecord' 객체를 처리할 것으로 기대합니다. 'qrecord' 객체가 kfree될 수 없는 유일한 예외 상황은 추적 로직(tracing logic)에 삽입된 경우이며, 이를 위해 이미 `qrecord_inserted_ret` 부울 변수가 존재하여 이러한 상황을 고려하고 있습니다. 따라서 호출자는 `add_delayed_ref_head()`가 추적 로직에 삽입하지 않았다고 보고하는 경우에만 개체를 kfree해야 합니다.
위 변경의 부작용으로, 'qrecord_inserted_ret'는 함수 끝이 아닌 시작 시점에 적절히 초기화되어야 하며, 실제 삽입 발생 시 설정되어야 함을 보장해야 합니다. 이렇게 하면 조기 종료(early exit) 시 'qrecord_inserted_ret'가 유효하지 않은 값을 갖지 않도록 방지할 수 있습니다.
또한 `add_delayed_ref_head()`의 문서화가 업데이트되어 'qrecord' 객체의 정확한 소유권을 반영했습니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.