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.