In the Linux kernel, the following vulnerability has been resolved:
f2fs: fix to avoid mapping wrong physical block for swapfile
Xiaolong Guo reported a f2fs bug in bugzilla [1]
[1] https://bugzilla.kernel.org/show_bug.cgi?id=220951
Quoted:
"When using stress-ng's swap stress test on F2FS filesystem with kernel 6.6+, the system experiences data corruption leading to either: 1 dm-verity corruption errors and device reboot 2 F2FS node corruption errors and boot hangs
The issue occurs specifically when: 1 Using F2FS filesystem (ext4 is unaffected) 2 Swapfile size is less than F2FS section size (2MB) 3 Swapfile has fragmented physical layout (multiple non-contiguous extents) 4 Kernel version is 6.6+ (6.1 is unaffected)
The root cause is in check_swap_activate() function in fs/f2fs/data.c. When the first extent of a small swapfile (< 2MB) is not aligned to section boundaries, the function incorrectly treats it as the last extent, failing to map subsequent extents. This results in incorrect swap_extent creation where only the first extent is mapped, causing subsequent swap writes to overwrite wrong physical locations (other files' data).
Steps to Reproduce 1 Setup a device with F2FS-formatted userdata partition 2 Compile stress-ng from https://github.com/ColinIanKing/stress-ng 3 Run swap stress test: (Android devices) adb shell "cd /data/stressng; ./stress-ng-64 --metrics-brief --timeout 60 --swap 0"
Log: 1 Ftrace shows in kernel 6.6, only first extent is mapped during second f2fs_map_blocks call in check_swap_activate(): stress-ng-swap-8990: f2fs_map_blocks: ino=11002, file offset=0, start blkaddr=0x43143, len=0x1 (Only 4KB mapped, not the full swapfile) 2 in kernel 6.1, both extents are correctly mapped: stress-ng-swap-5966: f2fs_map_blocks: ino=28011, file offset=0, start blkaddr=0x13cd4, len=0x1 stress-ng-swap-5966: f2fs_map_blocks: ino=28011, file offset=1, start blkaddr=0x60c84b, len=0xff
The problematic code is in check_swap_activate(): if ((pblock - SM_I(sbi)->main_blkaddr) % blks_per_sec || nr_pblocks % blks_per_sec || !f2fs_valid_pinned_area(sbi, pblock)) { bool last_extent = false;
not_aligned++;
nr_pblocks = roundup(nr_pblocks, blks_per_sec); if (cur_lblock + nr_pblocks > sis->max) nr_pblocks -= blks_per_sec;
/* this extent is last one */ if (!nr_pblocks) { nr_pblocks = last_lblock - cur_lblock; last_extent = true; }
ret = f2fs_migrate_blocks(inode, cur_lblock, nr_pblocks); if (ret) { if (ret == -ENOENT) ret = -EINVAL; goto out; }
if (!last_extent) goto retry; }
When the first extent is unaligned and roundup(nr_pblocks, blks_per_sec) exceeds sis->max, we subtract blks_per_sec resulting in nr_pblocks = 0. The code then incorrectly assumes this is the last extent, sets nr_pblocks = last_lblock - cur_lblock (entire swapfile), and performs migration. After migration, it doesn't retry mapping, so subsequent extents are never processed. "
In order to fix this issue, we need to lookup block mapping info after we migrate all blocks in the tail of swapfile.
CVSS Details
- CVSS 3.1 Base Score: 7.8
- CVSS 3.1 Vector: (CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H)
Covered by Rapid7
| Product | Vendor Advisory | Solution File | Added | Published |
|---|---|---|---|---|
| Debian | — | Upgrade linux | Jul 23, 2026 | Jul 23, 2026 |
| Ubuntu | — | Upgrade linux-image-nvidia-tegra-rtUpgrade linux-image-raspi-realtime-6.8Upgrade linux-image-6.8.0-134-genericUpgrade linux-image-nvidia-64k-6.8Upgrade linux-image-6.8.0-1062-azure-fdeUpgrade linux-image-lowlatencyUpgrade linux-image-xilinx-6.8Upgrade linux-image-aws-fips-6.8Upgrade linux-image-realtime-6.8.1Upgrade linux-image-oem-20.04bUpgrade linux-image-raspi-6.8Upgrade linux-image-virtual-6.8Upgrade linux-image-nvidia-64k-hwe-22.04Upgrade linux-image-6.8.0-1058-nvidia-lowlatencyUpgrade linux-image-aws-64k-lts-24.04Upgrade linux-image-azureUpgrade linux-image-azure-fdeUpgrade linux-image-generic-lpaeUpgrade linux-image-ibmUpgrade linux-image-fipsUpgrade linux-image-oracle-6.8Upgrade linux-image-6.8.0-1060-ibmUpgrade linux-image-azure-fde-lts-24.04Upgrade linux-image-gcp-64k-lts-24.04Upgrade linux-image-6.8.0-1063-gcp-64kUpgrade linux-image-oracle-64k-6.8Upgrade linux-image-generic-64k-6.8Upgrade linux-image-oracle-64k-lts-24.04Upgrade linux-image-awsUpgrade linux-image-6.8.0-1060-aws-64kUpgrade linux-image-nvidia-6.8Upgrade linux-image-6.8.0-1057-oracleUpgrade linux-image-gke-64k-6.8Upgrade linux-image-6.8.0-136-generic-64kUpgrade linux-image-gcp-lts-24.04Upgrade linux-image-ibm-lts-24.04Upgrade linux-image-gke-64kUpgrade linux-image-aws-6.8Upgrade linux-image-nvidia-lowlatency-64kUpgrade linux-image-6.8.0-1029-nvidia-tegra-rtUpgrade linux-image-nvidia-tegra-6.8Upgrade linux-image-6.8.0-1058-nvidia-64kUpgrade linux-image-6.8.0-134-fipsUpgrade linux-image-aws-64k-6.8Upgrade linux-image-laptop-23.10Upgrade linux-image-6.8.0-1063-gcpUpgrade linux-image-ibm-6.8Upgrade linux-image-azure-lts-24.04Upgrade linux-image-azure-fipsUpgrade linux-image-nvidia-lowlatencyUpgrade linux-image-raspiUpgrade linux-image-ibm-classicUpgrade linux-image-oem-22.04aUpgrade linux-image-oem-22.04dUpgrade linux-image-lowlatency-6.8Upgrade linux-image-6.8.0-134-lowlatencyUpgrade linux-image-6.8.0-1062-azure-fipsUpgrade linux-image-gcp-64kUpgrade linux-image-aws-fipsUpgrade linux-image-kvmUpgrade linux-image-lowlatency-hwe-22.04Upgrade linux-image-gcp-fipsUpgrade linux-image-gke-6.8Upgrade linux-image-6.8.0-2049-raspi-realtimeUpgrade linux-image-6.8.0-134-generic-64kUpgrade linux-image-oem-20.04cUpgrade linux-image-realtime-hwe-22.04Upgrade linux-image-6.8.0-1060-raspiUpgrade linux-image-intel-iot-realtimeUpgrade linux-image-6.8.0-1029-nvidia-tegraUpgrade linux-image-6.8.0-1060-aws-fipsUpgrade linux-image-gkeUpgrade linux-image-fips-6.8Upgrade linux-image-xilinxUpgrade linux-image-generic-hwe-22.04Upgrade linux-image-nvidia-lowlatency-64k-6.8Upgrade linux-image-gcp-64k-6.8Upgrade linux-image-nvidia-tegra-rt-6.8Upgrade linux-image-nvidia-lowlatency-6.8Upgrade linux-image-lowlatency-64k-hwe-22.04Upgrade linux-image-genericUpgrade linux-image-xilinx-zynqmpUpgrade linux-image-gkeopUpgrade linux-image-6.8.0-1058-nvidiaUpgrade linux-image-gcp-fips-6.8Upgrade linux-image-azure-fde-6.8Upgrade linux-image-aws-lts-24.04Upgrade linux-image-6.8.0-1058-gkeUpgrade linux-image-oem-22.04Upgrade linux-image-oem-20.04Upgrade linux-image-intel-iotgUpgrade linux-image-gkeop-6.8Upgrade linux-image-generic-64k-hwe-22.04Upgrade linux-image-azure-fips-6.8Upgrade linux-image-6.8.0-1057-oracle-64kUpgrade linux-image-virtual-hwe-22.04Upgrade linux-image-virtualUpgrade linux-image-realtimeUpgrade linux-image-oracle-64kUpgrade linux-image-6.8.1-1055-realtimeUpgrade linux-image-6.8.0-134-lowlatency-64kUpgrade linux-image-6.8.0-1060-awsUpgrade linux-image-oem-20.04dUpgrade linux-image-generic-6.8Upgrade linux-image-nvidia-64kUpgrade linux-image-gcpUpgrade linux-image-aws-64kUpgrade linux-image-oracleUpgrade linux-image-6.8.0-1058-gke-64kUpgrade linux-image-6.8.0-1045-gkeopUpgrade linux-image-raspi-realtimeUpgrade linux-image-oracle-lts-24.04Upgrade linux-image-nvidiaUpgrade linux-image-lowlatency-64k-6.8Upgrade linux-image-generic-64kUpgrade linux-image-6.8.0-1063-azureUpgrade linux-image-6.8.0-1058-nvidia-lowlatency-64kUpgrade linux-image-6.8.0-1032-xilinxUpgrade linux-image-oem-22.04cUpgrade linux-image-nvidia-hwe-22.04Upgrade linux-image-gcp-6.8Upgrade linux-image-azure-6.8Upgrade linux-image-6.8.0-136-genericUpgrade linux-image-6.8.0-1063-gcp-fipsUpgrade linux-image-lowlatency-64kUpgrade linux-image-oem-22.04bUpgrade linux-image-nvidia-tegra | Jul 2, 2026 | Jul 1, 2026 |
Prioritise with Active Threat Intelligence
With curated Threat Intelligence, you can see which vulnerabilities truly put you at risk, prioritize what matters most, and act before attackers do.
Explore Intelligence Hub