Linux 커널에서는 다음 취약점이 해결되었습니다. kthread: use-after-free를 방지하기 위해 kthread 종료 경로를 통합합니다. Guillaume은 손상된 RCU 콜백 함수 포인터로 인한 충돌을 보고했습니다. KUnit 테스트 중. 충돌은 pidfs rhashtable로 추적되었습니다. 24바이트 rb_node를 8바이트 rhash_head로 대체한 변환 struct pid에서 160바이트에서 144바이트로 축소되었습니다. struct kthread(CONFIG_BLK_CGROUP 제외)도 144바이트입니다. 와 CONFIG_SLAB_MERGE_DEFAULT 및
Linux 커널에서는 다음 취약점이 해결되었습니다.
kthread: use-after-free를 방지하기 위해 kthread 종료 경로를 통합합니다.
Guillaume은 손상된 RCU 콜백 함수 포인터로 인한 충돌을 보고했습니다. KUnit 테스트 중. 충돌은 pidfs rhashtable로 추적되었습니다. 24바이트 rb_node를 8바이트 rhash_head로 대체한 변환 struct pid에서 160바이트에서 144바이트로 축소되었습니다.
struct kthread(CONFIG_BLK_CGROUP 제외)도 144바이트입니다. 와 CONFIG_SLAB_MERGE_DEFAULT 및 SLAB_HWCACHE_ALIGN은 모두 다음으로 반올림됩니다. 192바이트이며 동일한 슬랩 캐시를 공유합니다. 구조체 pid.rcu.func 및 struct kthread.affinity_node는 둘 다 오프셋 0x78에 있습니다.
kthread가 make_task_dead()를 통해 종료되면 kthread_exit()를 우회하고 Affinity_node 정리가 누락되었습니다. free_kthread_struct()는 메모리를 해제합니다. 노드는 여전히 전역 kthread_affinity_list에 연결되어 있습니다. 에이 다른 kthread에 의한 후속 list_del()은 댕글링 목록을 통해 씁니다. 해제되고 재사용된 메모리에 대한 포인터로 인해 PID가 손상됩니다. rcu.func 포인터.
누락된 정리를 처리하기 위해 free_kthread_struct()를 패치하는 대신, 모든 kthread 종료 경로를 통합합니다. kthread_exit()를 매크로로 변환 do_exit()를 호출하고 다음에서 호출되는 kthread_do_exit()를 추가합니다. PF_KTHREAD가 설정된 모든 작업에 대해 do_exit(). 이는 다음을 보장합니다. kthread 관련 정리는 종료 경로에 관계없이 항상 발생합니다. make_task_dead(), 직접 do_exit() 또는 kthread_exit().
__to_kthread()를 새로운 tsk_is_kthread() 접근자로 교체합니다. 공개 헤더. 모듈 코드를 사용하여 do_exit()를 내보냅니다. kthread_exit() 매크로는 이제 직접 필요합니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 98.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 98.00 |
VPI 공식 vpi-v1 기준