CVE-2026-40343: CVE-2026-40343: free5GC UDR 정책 데이터 구독에서 Fail-Open 요청 처리
발행: (2026년 4월 22일 AM 10:40 GMT+9)
4 분 소요
원문: Dev.to
Source: Dev.to
취약점 개요
- 취약점 ID: CVE-2026-40343
- CVSS 점수: 6.9 (무결성)
- 공개일: 2026-04-21
- CWE: CWE‑754 (비정상 또는 예외 상황에 대한 부적절한 검사)
- 공격 벡터: 네트워크
- 악용 상태: 없음
- KEV 상태: 목록에 없음
free5GC UDR 서비스(버전 1.4.2 이하)에서 요청 처리 시 fail‑open 취약점이 존재합니다. Policy Data 구독 POST 요청을 처리할 때, HTTP 본문을 읽거나 JSON을 역직렬화하는 과정에서 오류가 발생해도 실행을 중단하지 않아 초기화되지 않은 데이터를 사용하게 됩니다. 이로 인해 공격자는 잘못되거나 의도하지 않은 Policy Data 알림 구독을 생성하고 내부 상태를 조작할 수 있습니다.
기술적 세부 사항
- 구성 요소: free5GC UDR (User Data Repository)
- 영향을 받는 버전: ≤ 1.4.2
- 근본 원인:
HandlePolicyDataSubsToNotifyPost함수(api_datarepository.go파일)에서 오류 반환 경로가 누락됨. - 영향: 무결성 – 공격자는 UDR이 유효한 것으로 처리하도록 잘못된 구독 객체를 삽입해 무단 정책 변경이나 서비스 중단을 초래할 수 있습니다.
실패 흐름
- 핸들러가
c.GetRawData()를 호출해 요청 본문을 읽음. - 오류가 발생하면 코드는 오류를 로그에 남기지만 반환하지 않아 실행이 계속됨.
- 핸들러는 이후
openapi.Deserialize()를 호출해 JSON 페이로드를 파싱함. Deserialize()에서 발생한 오류도 조기 반환 없이 로그만 남김.- 함수는 부분적으로 채워진
policyDataSubscription구조체를 사용하게 되어 정의되지 않은 동작을 일으킴.
해결 단계
- 취약 함수 찾기
// File: api_datarepository.go func HandlePolicyDataSubsToNotifyPost(c *gin.Context) { // ... } - 오류 처리 블록에 명시적인 반환을 추가:
rawData, err := c.GetRawData() if err != nil { log.Errorf("Failed to read request body: %v", err) c.JSON(http.StatusBadRequest, gin.H{"error": "invalid request body"}) return // <-- added } var policyDataSubscription openapi.PolicyDataSubscription if err := openapi.Deserialize(rawData, &policyDataSubscription); err != nil { log.Errorf("JSON deserialization error: %v", err) c.JSON(http.StatusBadRequest, gin.H{"error": "invalid JSON payload"}) return // <-- added } Deserialize에 구조체를 포인터로 전달하도록 수정(위와 같이)하여 올바른 역직렬화를 보장.- 패치를 적용한 후 재컴파일 및 재배포하여 UDR 서비스를 업데이트.
추가 완화 방안
- SBI(서비스 기반 인터페이스) 엔드포인트에 대한 네트워크 분리를 수행해 노출을 제한.
- **Web Application Firewall (WAF)**을 배포하고, OpenAPI 스키마에 맞는 API 페이로드 검증 규칙을 적용.
참고 자료
- 공식 CVE Advisory – CVE-2026-40343 (cve.org)
- National Vulnerability Database (NVD) entry
- free5GC UDR Repository
- OSV Record for CVE-2026-40343
전체 분석 보고서(대화형 다이어그램 및 악용 세부 사항 포함)는 프로젝트 웹사이트에서 확인할 수 있습니다.