Zephyr의 비동기 SNTP 클라이언트(subsys/net/lib/sntp/sntp.c, sntp_close_async)는 소켓 서비스 폴 스레드와 동기화하지 않고 네트워크 소켓 서비스에서 분리한 직후 호출 스레드에서 UDP 소켓 파일 설명자를 직접 닫았습니다. 소켓 서비스 스레드는 zvfs_poll을 통해 각 소켓을 폴링합니다. 이는 (zsock_poll_prepare_ctx에서) 소켓의 net_context(&ctx->recv_q)를 가리키는 k_poll_event를 등록한 다음 참조를 유지하지 않고 k_poll에서 차단합니다.
Zephyr의 비동기 SNTP 클라이언트(subsys/net/lib/sntp/sntp.c, sntp_close_async)는 소켓 서비스 폴 스레드와 동기화하지 않고 네트워크 소켓 서비스에서 분리한 직후 호출 스레드에서 UDP 소켓 파일 설명자를 직접 닫았습니다.
소켓 서비스 스레드는 zsock_poll_prepare_ctx에서 소켓의 net_context(&ctx->recv_q)를 가리키는 k_poll_event를 등록한 다음 참조나 잠금을 유지하지 않고 k_poll에서 차단하는 zvfs_poll을 통해 각 소켓을 폴링합니다. net_context 객체는 고정 풀(contexts[CONFIG_NET_MAX_CONTEXTS])에서 할당되고 닫힌 후 재사용됩니다.
sntp_close_async가 폴 스레드가 아닌 다른 스레드에서 호출되면(트리 내 소비자 subsys/net/lib/config/init_clock_sntp.c에서 소켓 서비스 스레드가 동일한 fd의 폴에서 차단되는 동안 SNTP 시간 초과 핸들러가 시스템 작업 대기열에서 실행됨) 폴 스레드에 여전히 해제된 개체에 연결된 폴러 노드가 있는 동안 닫기 작업이 net_context를 해제하고 재사용할 수 있으므로 해제 후 사용/객체 혼란이 발생합니다. 커널 폴링 구조.
SNTP 시간 초과 경로는 일반적인 무응답 실패 모드이므로 SNTP/NTP 응답을 삭제하거나 지연시키는 네트워크 피어 또는 경로 외부 공격자가 반복적으로(그리고 주기적으로 NET_CONFIG_SNTP_INIT_RESYNC를 사용하여) 경주를 종료할 수 있습니다. 가장 가능성이 높은 결과는 해제된 컨텍스트 슬롯이 재할당될 때 잠재적인 메모리 손상과 함께 네트워킹 스레드의 충돌(서비스 거부)입니다.
수정 사항은 net_socket_service_close(NET_SOCKET_SERVICE_CLOSE_SOCKETS)를 통해 소켓 서비스 스레드 자체에 대한 닫기를 연기하므로 폴링하는 동일한 스레드가 닫기를 수행하여 경합을 제거합니다. 영향을 받는 릴리스: v4.2.0~v4.4.0.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 65.00 |
| 악용 신호(PoC 존재) | ×1.20 |
| VPI | 78.00 |
VPI 공식 vpi-v1 기준