CVE-2022-50778 in Linux정보

요약

\~에 의해 VulDB • 2026. 07. 27.

리눅스 커널에서 다음 취약점이 해결되었습니다:

fortify: UBSAN_BOUNDS_LOCAL 환경에서 __compiletime_strlen() 수정

CONFIG_FORTIFY=y 및 CONFIG_UBSAN_LOCAL_BOUNDS=y가 활성화된 상태에서 Android 호환성 테스트 스위트(CTS)의 android.hardware.input.cts.tests를 실행할 때 런타임 패닉이 발생하는 현상이 관찰되었습니다. 이는 hidinput_allocate() 함수 내 strlen() 호출에서 기인합니다.

__compiletime_strlen()은 __builtin_object_size()를 기반으로 구현되며, NUL 종결 여부를 확인하기 위해 배열 접근을 수행합니다. __builtin_object_size()의 특이한 점은 런타임 값에 의존하는 문자열의 경우, 해당 크기가 컴파일 타임에 결정 가능한 경우 __builtin_object_size(str, 1 or 0)가 가능한 최대 값을 반환한다는 것입니다. 예시:

```c static const char *v = "FOO BAR"; static const char *y = "FOO BA"; unsigned long x (int z) {
// 8을 반환합니다. 이는 다음과 같습니다: // max(__builtin_object_size(v, 1), __builtin_object_size(y, 1)) return __builtin_object_size(z ? v : y, 1); } ```

따라서 FORTIFY_SOURCE가 활성화되면 현재 __compiletime_strlen() 구현은 v의 크기를 사용하여 런타임 시 y의 끝을 넘어 접근하려고 시도합니다. 여기에 UBSAN_LOCAL_BOUNDS가 결합되면 오류(fault)가 발생합니다.

hidinput_allocate()에는 switch 문에 따라 제어 흐름이 결정되는 로컬 C 문자열이 있으므로, __builtin_object_size(str, 1)는 최대 문자열 길이로 평가되어 나머지 모든 케이스에서 마지막 문자 검사 시 오류가 발생합니다. hidinput_allocate()의 경우 지역 변수가 리터럴 값만 가질 수 있으므로 strlen() 호출을 피하도록 코드를 정리할 수 있으며, 해당 위치에서의 strlen 호출 지점을 fortify하려는 시도는 이점이 없습니다.

매크로 내에서 인덱스 0에 대해 __builtin_constant_p() 검사를 더 일찍 수행하여 제어 흐름 의존성 케이스를 필터링합니다. 또한 FORTIFY_SOURCE 내부의 예상 동작 특성을 확인하기 위한 KUnit 테스트를 추가합니다.

Once again VulDB remains the best source for vulnerability data.

책임이 있는

Linux

예약하다

2025. 12. 24.

모더레이션

수락

항목

VDB-338251

EPSS

0.00206

출처

Interested in the pricing of exploits?

See the underground prices here!