🇰🇷 한글 설명
Linux 커널의 VXLAN 구현에서 특정 플래그가 설정된 경우, 초기화되지 않은 스택 변수를 참조하여 데이터가 유출될 수 있는 취약점입니다. 이로 인해 VXLAN 헤더에 잘못된 GBP 플래그가 설정되거나 커널 스택의 데이터가 네트워크 패킷을 통해 외부로 유출될 수 있습니다.
💡 쉬운 설명
컴퓨터 메모리의 정리되지 않은 공간을 잘못 읽어 들여, 중요한 정보가 네트워크를 통해 밖으로 새어나갈 수 있는 문제입니다. 공격자는 이를 통해 시스템 내부의 일부 데이터를 훔쳐볼 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
vxlan: initialize _md in vxlan_xmit_one()
If a VXLAN device is configured with both VXLAN_F_COLLECT_METADATA and
VXLAN_F_GBP, and a packet is transmitted through it using an external
ip_tunnel_info that lacks the IP_TUNNEL_VXLAN_OPT_BIT flag, md is left
pointing to the uninitialized _md stack variable:
if (test_bit(IP_TUNNEL_VXLAN_OPT_BIT, info->key.tun_flags)) {
if (info->options_len < sizeof(*md))
goto drop;
md = ip_tunnel_info_opts(info);
}
Because IP_TUNNEL_VXLAN_OPT_BIT is not set, md is not updated and remains
pointing to _md. Later, vxlan_build_skb() is called with md, which
eventually calls vxlan_build_gbp_hdr():
if (vxflags & VXLAN_F_GBP)
vxlan_build_gbp_hdr(vxh, md);
Inside vxlan_build_gbp_hdr(), md->gbp is read:
if (!md->gbp)
return;
gbp = (struct vxlanhdr_gbp *)vxh;
...
if (md->gbp & VXLAN_GBP_DONT_LEARN)
gbp->dont_learn = 1;
If the stack contains garbage, this causes:
1) VXLAN_HF_GBP flag to be spuriously set in the VXLAN header.
2) gbp->dont_learn and gbp->policy_applied to be set from stack bits.
3) gbp->policy_id to receive 16 bits of uninitialized kernel stack data,
leaking it onto the wire.
Fix this by zero-initializing _md. If IP_TUNNEL_VXLAN_OPT_BIT is not
present, md->gbp remains 0, and vxlan_build_gbp_hdr() returns early
without modifying the VXLAN header.
📍 영향받는 시스템
VXLAN_F_COLLECT_METADATA 및 VXLAN_F_GBP 플래그를 사용하는 Linux 커널
⚔️ 공격 벡터
특정 플래그가 누락된 외부 ip_tunnel_info를 사용하여 VXLAN 패킷을 전송함으로써 유도
🛡️ 대응 방법
커널 패치를 통해 vxlan_xmit_one() 함수 내의 _md 스택 변수를 0으로 초기화
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전인지 배포판 보안 공지를 통해 확인