CVE-2026-74620 in Linux
요약
\~에 의해 VulDB • 2026. 08. 22.
리눅스 커널에서 다음 취약점이 해결되었습니다:
net/sched: act_gact, act_police: 폴백 제어 작업에 대한 범위 검사 적용
tcf_action_check_ctrlact()는 기본 제어 작업의 범위를 검사합니다:
if (!opcode) ret = action > TC_ACT_VALUE_MAX ? -EINVAL : 0;
TC_ACT_VALUE_MAX은 TC_ACT_TRAP이므로, 커널 내부 심판값(verdicts) 중 그보다 큰 값들은 해당 방식으로 설정될 수 없습니다. 그러나 act_gact와 act_police는 각각 사용자 공간에서 제공하는 두 번째 독립적인 제어 작업을 포함하며, 이 작업들은 위의 헬퍼 함수에 도달하지 않습니다(각각 TCA_GACT_PROB.paction 및 TCA_POLICE_RESULT). 둘 다 TC_ACT_GOTO_CHAIN만 거부하므로, 그 외의 모든 값은 그대로 저장되고 작업으로부터 그대로 반환됩니다.
특히 사용자 공간에서는 UAPI 값 범위에 의도적으로 포함되지 않은 TC_ACT_VALUE_MAX + 1인 TC_ACT_CONSUMED를 저장할 수 있습니다. 이 심판값은 각 호출자에게 해당 작업이 skb(스케줄러 버퍼)의 소유권을 가졌음을 알리므로, 아무도 이를 해제하지 않습니다: sch_handle_ingress(), sch_handle_egress() 및 tcf_qevent_handle()는 모두 이에 대해 의도적으로 해제를 건너뜁니다. 그 결과 필터를 통과하는 모든 패킷당 하나씩 sk_buff와 해당 데이터 버퍼가 누설되며, 이는 커널에서 생성된 패킷을 포함한 체인상의 모든 트래픽에 대해 무제한으로 발생합니다.
두 경우 모두 결정론적이며 쉽게 재현 가능합니다. act_gact는 tcfg_pval를 >= 1로 클램핑하므로, pval = 1일 때 gact_determ()은 모든 패킷에 대해 폴백을 반환합니다. act_police에는 필수적인レート(rate)가 없으므로, rate = 0이면 tcfp_mtu = ~0이 되어 tcf_police_mtu_check()는 항상 통과합니다.
TC_ACT_CONSUMED는 commit 720f22fed81b("net: sched: refactor reinsert action")에서 추가되었으며, 이는 두 가지 goto-chain 가드가 작성된 이후의 작업입니다: commit 9469f375ab09 ("net/sched: act_gact: disallow 'goto chain' on fallback control action") 및 commit c08f5ed5d625 ("net/sched: act_police: disallow 'goto chain' on fallback control action"). 새로운 심판값이 등장했을 때 어느 가드도 확장되지 않았습니다.
기존의 범위 테스트를 tcf_action_check_ctrlact()에서 분리하여 tcf_action_valid()로 만들고, 두 폴백 모두에 적용합니다. 이 헬퍼는 goto_chain를 할당하기도 하는 tcf_action_check_ctrlact()를 직접 호출할 수 없는데, 이는 정확히 이러한 두 위치가 수행해서는 안 되는 작업이기 때문입니다.
v7.2-rc6에서 재현됨: kmemleak은 패킷당 1개의 누설된 232바이트 skbuff_head_cache 객체와 그 704바이트 데이터 버퍼를 보고합니다. 이 패치를 적용하면 두 구성 모두 -EINVAL로 거부되며, kmemleak은 아무것도 보고하지 않습니다.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.