🇰🇷 한글 설명
Linux 커널의 Open vSwitch 구성 요소에서 flow table mask array를 재할당할 때 발생하는 Use-After-Free 취약점입니다. 기존 배열을 교체하기 전에 RCU 콜백을 호출하여, 새로운 배열이 할당되기 전 기존 배열이 메모리에서 해제될 수 있는 레이스 컨디션이 존재합니다.
💡 쉬운 설명
네트워크 데이터를 처리하는 과정에서 메모리를 관리하는 순서가 잘못되어, 이미 사용이 끝난 메모리 영역을 시스템이 다시 참조하려고 할 때 발생하는 오류입니다. 이로 인해 시스템이 충돌하거나 예상치 못한 동작을 할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net: openvswitch: fix use-after-free of the flow table mask array
tbl_mask_array_realloc() retires the old mask_array before it stops being
reachable:
old = ovsl_dereference(tbl->mask_array);
if (old) {
...
call_rcu(&old->rcu, mask_array_rcu_cb);
}
rcu_assign_pointer(tbl->mask_array, new);
call_rcu() only waits for read-side critical sections already in flight.
tbl->mask_array still points at old between the call_rcu() and the
rcu_assign_pointer(), so a reader entering ovs_flow_tbl_lookup_stats() in
that window picks up old in a fresh critical section that the pending
grace period does not cover.
tbl_mask_array_realloc() runs in process context under ovs_mutex, so the
window is preemptible and can outlast the grace period. Then
mask_array_rcu_cb() frees old before the swap runs:
BUG: KASAN: slab-use-after-free in flow_lookup.constprop.0+0x2bf/0x2f0
Read of size 8 at addr ffff888020b3e018 by task poc/741
flow_lookup.constprop.0+0x2bf/0x2f0
ovs_flow_tbl_lookup_stats+0x4a3/0x5c0
ovs_dp_process_packet+0x19c/0x710
ovs_vport_receive+0x243/0x390
internal_dev_xmit+0x81/0x170
Freed by task 728:
kfree+0x16a/0x4e0
rcu_core+0x853/0x1030
Publish the new array before retiring the old one. The kfree_rcu() that
call_rcu() replaced ran after the swap.
📍 영향받는 시스템
Linux Kernel (Open vSwitch 모듈 사용 환경)
⚔️ 공격 벡터
특수하게 조작된 네트워크 패킷을 전송하여 Open vSwitch의 flow table lookup 과정을 유도함으로써 발생 가능
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 mask_array 교체 로직을 수정해야 합니다.
🔧 검증 코드
출력된 커널 버전을 확인하여 해당 취약점이 해결된 패치 버전인지 확인합니다.