🇰🇷 한글 설명
Linux 커널의 f2fs 파일시스템에서, LVM 장치에 스냅샷을 생성하면 장치의 discard_max_bytes가 0으로 바뀌어 __submit_discard_cmd()가 NULL bio 포인터를 받아 커널 패닉(WARNING/BUG)이 발생하는 문제가 수정되었습니다. 수정 내용은 스냅샷 생성 후 남은 discard 요청을 모두 제거하고, discard 제출 전에 discard_max_bytes를 확인하는 것입니다.
💡 쉬운 설명
LVM 장치에서 스냅샷을 만들면 파일시스템이 쓰레기 공간 정리 작업을 잘못 시도해 시스템이 멈출 수 있었습니다. 이번 패치는 스냅샷 생성 후 대기 중인 정리 작업을 취소하고, 실행 전에 장치 설정을 먼저 확인하도록 고칩니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
f2fs: fix to drop all discards after creating snapshot on lvm device
Piergiorgio reported a bug in bugzilla as below:
------------[ cut here ]------------
WARNING: CPU: 2 PID: 969 at fs/f2fs/segment.c:1330
RIP: 0010:__submit_discard_cmd+0x27d/0x400 [f2fs]
Call Trace:
__issue_discard_cmd+0x1ca/0x350 [f2fs]
issue_discard_thread+0x191/0x480 [f2fs]
kthread+0xcf/0x100
ret_from_fork+0x31/0x50
ret_from_fork_asm+0x1a/0x30
w/ below testcase, it can reproduce this bug quickly:
- pvcreate /dev/vdb
- vgcreate myvg1 /dev/vdb
- lvcreate -L 1024m -n mylv1 myvg1
- mount /dev/myvg1/mylv1 /mnt/f2fs
- dd if=/dev/zero of=/mnt/f2fs/file bs=1M count=20
- sync
- rm /mnt/f2fs/file
- sync
- lvcreate -L 1024m -s -n mylv1-snapshot /dev/myvg1/mylv1
- umount /mnt/f2fs
The root cause is: it will update discard_max_bytes of mounted lvm
device to zero after creating snapshot on this lvm device, then,
__submit_discard_cmd() will pass parameter @nr_sects w/ zero value
to __blkdev_issue_discard(), it returns a NULL bio pointer, result
in panic.
This patch changes as below for fixing:
1. Let's drop all remained discards in f2fs_unfreeze() if snapshot
of lvm device is created.
2. Checking discard_max_bytes before submitting discard during
__submit_discard_cmd().
📍 영향받는 시스템
f2fs 파일시스템을 LVM 장치에서 사용하는 Linux 커널 (수정된 커널 버전 이전의 여러 stable 브랜치)
⚔️ 공격 벡터
로컬 사용자 또는 관리자가 f2fs가 마운트된 LVM 논리 볼륨에 스냅샷을 생성하면 커널 패닉을 유발할 수 있음 (서비스 거부)
🛡️ 대응 방법
패치된 리눅스 커널 버전으로 업데이트하고 배포판의 보안 업데이트를 적용하십시오.
🔧 검증 코드
출력된 커널 버전을 배포판 보안 공지 또는 kernel.org의 stable 패치 목록과 비교하여, CVE-2024-56565 수정이 포함된 버전인지 확인합니다. 수정 전 버전이면 업데이트가 필요합니다.