🇰🇷 한글 설명
Linux 커널의 cgroup/cpuset 구성 요소에서 원격 파티션 생성 시 CPU 할당 충돌을 적절히 처리하지 못하는 취약점이 발견되었습니다. 기존의 오류 체크 로직이 경고(WARN_ON_ONCE)로 대체되면서, 이미 다른 파티션이 점유 중인 CPU를 중복으로 할당하는 상태가 발생할 수 있습니다.
💡 쉬운 설명
컴퓨터의 CPU 자원을 나누어 쓰는 과정에서, 이미 사용 중인 CPU를 다른 그룹이 또 사용하겠다고 요청했을 때 이를 막지 못하는 문제입니다. 이로 인해 시스템의 자원 관리 규칙이 깨지고 충돌이 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
cgroup/cpuset: Return PERR_NOCPUS in remote_partition_enable() on subpartitions_cpus conflict
When a remote partition is created underneath an existing local partition
via a non-partition (PRS_MEMBER) intermediate cgroup, update_prstate() sees
parent->partition_root_state == PRS_MEMBER and calls
remote_partition_enable().
Commit 86888c7bd117 ("cgroup/cpuset: Add warnings to catch inconsistency
in exclusive CPUs") replaced the cpumask_intersects(tmp->new_cpus,
subpartitions_cpus) error check in remote_partition_enable() with
WARN_ON_ONCE(). As a result, remote_partition_enable() emits a warning
and proceeds to enable the remote partition on CPUs that are already
owned by the ancestor local partition in subpartitions_cpus.
This can be reproduced on Linux 7.3.0-rc3 with:
mkdir -p /tmp/cg1
mount -t cgroup2 none /tmp/cg1
echo "+cpuset" > /tmp/cg1/cgroup.subtree_control
mkdir /tmp/cg1/A
echo 1 > /tmp/cg1/A/cpuset.cpus
echo 1 > /tmp/cg1/A/cpuset.cpus.exclusive
echo root > /tmp/cg1/A/cpuset.cpus.partition
echo "+cpuset" > /tmp/cg1/A/cgroup.subtree_control
mkdir /tmp/cg1/A/B
echo 1 > /tmp/cg1/A/B/cpuset.cpus
echo 1 > /tmp/cg1/A/B/cpuset.cpus.exclusive
echo "+cpuset" > /tmp/cg1/A/B/cgroup.subtree_control
mkdir /tmp/cg1/A/B/D
echo 1 > /tmp/cg1/A/B/D/cpuset.cpus
echo 1 > /tmp/cg1/A/B/D/cpuset.cpus.exclusive
echo root > /tmp/cg1/A/B/D/cpuset.cpus.partition
which triggers:
WARNING: kernel/cgroup/cpuset.c:1594 at remote_partition_enable+0x1c1/0x300
and leaves both /tmp/cg1/A and /tmp/cg1/A/B/D as active root partitions
claiming exclusive CPU 1.
Fix this by returning PERR_NOCPUS when tmp->new_cpus intersects
subpartitions_cpus in remote_partition_enable(), matching the error code
used by remote_cpus_update() for the same subpartitions_cpus conflict, and
add a regression test case to
tools/testing/selftests/cgroup/test_cpuset_prs.sh.
Tested in QEMU on Linux 7.3.0-rc3 using the reproducer above and
tools/testing/selftests/cgroup/test_cpuset_prs.sh.
📍 영향받는 시스템
Linux kernel 7.3.0-rc3 및 해당 로직이 포함된 이전 버전
⚔️ 공격 벡터
로컬 사용자가 cgroup 설정을 통해 중복된 CPU 할당을 시도하여 자원 관리 무결성을 훼손
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 remote_partition_enable() 함수가 PERR_NOCPUS를 반환하도록 수정
🔧 검증 코드
출력된 커널 버전이 취약점이 해결된 패치 버전 이후인지 확인