CVE-2025-38670 in Linux정보

요약

\~에 의해 VulDB • 2026. 05. 25.

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

arm64/entry: cpu_switch_to(), call_on_irq_stack()에서 DAIF 마스킹

`cpu_switch_to()` 및 `call_on_irq_stack()`은 Shadow Call Stack(SCS)이 활성화된 경우 다른 스택으로 전환하기 위해 SP를 조작합니다. 이러한 두 스택 변경 작업은 원자적으로 수행될 수 없으며, 두 함수 모두 SErrors 또는 Debug Exceptions에 의해 인터럽트될 수 있습니다. 이러한 상황은 발생 확률이 낮지만 매우 심각한 결함을 초래합니다. 인터럽트된 경우, 일치하지 않는 스택과 Shadow Call Stack으로 인해 스택이 손상(clobbered)될 수 있습니다.

`cpu_switch_to()`의 경우, SP_EL0가 새 태스크를 가리키지만 x18은 여전히 이전 태스크의 SCS를 가리킬 때 발생할 수 있습니다. 인터럽트 핸들러가 태스크의 SCS 포인터를 저장하려고 할 때, 이전 태스크의 SCS 포인터(x18)를 SP_EL0가 가리키는 새 태스크 구조체에 저장하여 이를 손상시킵니다.

`call_on_irq_stack()`의 경우, 태스크 스택에서 IRQ 스택으로 전환할 때와 다시 전환할 때 발생할 수 있습니다. 두 경우 모두 SCS 포인터가 IRQ SCS를 가리키지만 SP가 태스크 스택을 가리킬 때 인터럽트될 수 있습니다. 중첩된 인터럽트 핸들러는 IRQ SCS에 반환 주소를 푸시합니다. 그런 다음 SP가 태스크 스택을 가리키는 것을 감지하고 `call_on_irq_stack()`을 호출하여 IRQ SCS 포인터로 태스크 SCS 포인터를 손상시키며, 이 IRQ SCS 포인터도 함께 사용합니다.

이로 인해 태스크가 잘못된 SCS, 심지어 IRQ SCS의 주소로 반환하여, CONFIG_VMAP_STACK 또는 FPAC가 활성화된 경우 커널 패닉을 유발합니다.

이 문제는 기본 구성에서도 가능하지만 발생 확률은 낮습니다. 그러나 CONFIG_ARM64_PSEUDO_NMI를 활성화하면 DAIF가 언마스크되고, 대신 GIC가 우선순위에 따라 CPU가 수신해야 하는 인터럽트를 필터링하는 역할을 합니다. NMIs를 에뮬레이션하는 목표에 따라, 시스템 구성과 워크로드에 따라 *매우* 빈번하게 pseudo-NMI가 `cpu_switch_to()` 및 `call_on_irq_stack()` 중 CPU에 수신될 수 있으며, 이는 예측 불가능한 커널 패닉으로 이어집니다.

`cpu_switch_to()`에서 DAIF를 완전히 마스킹하고 복귀 시 복원합니다. `call_on_irq_stack()`에서도 동일하게 수행하되, 분기 주변에서 마스킹과 복원을 수행합니다. 모든 구성 간 동작의 일관성을 위해 CONFIG_SHADOW_CALL_STACK가 활성화되지 않은 경우에도 DAIF를 마스킹합니다.

기존 매크로는 IF만 마스킹하지만, DAIF를 저장하고 마스킹하기 위해 어셈블리 매크로를 도입하고 사용합니다.

Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.

책임이 있는

Linux

예약하다

2025. 04. 16.

모더레이션

수락

항목

VDB-321113

EPSS

0.00152

출처

Interested in the pricing of exploits?

See the underground prices here!