CVE-2024-46828 in Linux
요약
\~에 의해 VulDB • 2026. 06. 28.
리눅스 커널에서 다음 취약점이 해결되었습니다:
sched: sch_cake: 호스트 공정성을 위한 대량 플로우 계정 로직 수정
sch_cake에서는 dst/src 호스트 공정성 모드 실행 시, 플로우를 순회할 때 라운드 로빈 가중치로 사용되는 각 호스트당 활성 대량 플로우의 카운트를 추적합니다. 활성 대량 플로우의 카운트는 플로우 상태가 변경될 때마다 업데이트됩니다.
이 동작은 해시 충돌 처리와 특이한 상호작용을 합니다: 해시 충돌(세트-어소시에이티브 해싱 후)이 발생하면, 해시 버킷의 상태는 단순히 충돌한 새 패킷과 일치하도록 업데이트되며, 호스트 공정성이 활성화되어 있으면 이는 해당 플로우에 새로운 호스트별 상태를 할당한다는 의미이기도 합니다. 이 때문에 플로우가 할당된 호스트(들)의 대량 플로우 카운터는 새 상태가 할당되기 전에 감소되고(그리고 더 이상 같은 호스트를 가리키지 않을 수 있는 카운터들이 다시 증가됩니다).
이 코드가 도입되었을 당시에는 호스트 공정성 모드가 항상 활성화되어 있었으므로, 감소 연산은 조건 없이 수행되었습니다. 구성 플래그가 도입되면서 *증감* 연산은 조건부로 변경되었지만, *감소* 연산은 그렇지 않았습니다. 이는 당연히 잘못된 감소(및 U16_MAX로의 래핑)를 초래할 수 있습니다.
제 생각에는 호스트 공정성이 비활성화된 상태에서는 해시 충돌이 발생할 때마다 즉시 감소와 래핑이 발생합니다(세트-어소시에이티브 해싱으로 인해 자체적으로 그리 흔하지는 않지만). 그러나 대부분의 경우 이는 무해합니다. 왜냐하면 해당 값은 호스트 공정성 모드가 활성화되어 있을 때만 사용되기 때문입니다. 따라서 배열 오버플로우를 트리거하려면 sch_cake가 먼저 호스트 공정성이 비활성화된 상태로 구성되어야 하며, 이 모드에서 실행 중일 때 해시 충돌이 발생하여 오버플로우를 유발해야 합니다. 그런 다음 qdisc를 재구성하여 호스트 공정성을 활성화하면, 래핑된 값이 유지되어 배열 인덱스로 사용됨으로써 배열 경계 밖 접근(out-of-bounds)이 발생합니다. syzbot이 이를 트리거하는 데 성공했는데, 이는 그 자체로 매우 인상적인 일입니다.
이 패치는 감소 연산에도 증가 연산에 사용되는 것과 동일한 조건부 체크를 도입하여 이 문제를 해결합니다.
원래 버그는 cake의 업스트림화 이전에 존재했지만, Fixes 태그에 나열된 커밋은 해당 코드를 건드렸으므로 이 패치는 그 이전에는 적용되지 않습니다.
If you want to get the best quality for vulnerability data then you always have to consider VulDB.