CVE-2026-98974

Yüksek

Açıklama

Linux çekirdeğinde aşağıdaki güvenlik açığı giderilmiştir: xfs: exchange-range-to-eof dosya boyutu değişimi düzeltildi Norbert Szetei, XFS_IOC_EXCHANGE_RANGE'in TO_EOF bayrağındaki bir hatanın eksik açıklamasını içeren bir yama paylaşmıştır. Bu hata, exchange-range işlemini kandırarak bir dosyayı, EOF'un ötesinden başlayan paylaşılan bloklara sahip olacak şekilde değiştirmesine neden olur; bu durum asla izin verilmez çünkü dosyalar hiçbir zaman EOF'un ötesinde yazılmış veri bulundurmaz ve yalnızca yazılmış veri blokları paylaşılabilir. Sonrasında meydana gelen tüm hatalı davranışların temel nedeni budur. Nihayetinde Norbert'ten neyin yanlış gittiğine dair şu açıklama alınmıştır: > Adil olsun. İşte fiziksel blok numaralarıyla, 4k bloklar şeklinde anlatımı. peer yeniden yazılan dosyadır ve file1 ise sonunda bayrağı temizlenen dosyadır. > > Başlangıçta, paylaşılan bir şey yok: > > peer size 4096 -> [100] > file1 size 12288 -> [200] [201] [202] > donor1 size 4096 -> [300] > donor2 size 4096 -> [400] > > 1. FICLONERANGE ile peer'ın bloğu file1'in orta yuvasına kopyalanır: > > peer size 4096 -> [100] > file1 size 12288 -> [200] [100] [202] reflink bayrağı ayarlandı > ^^^^^ her iki dosya da blok 100'e sahip > > 2. XFS_IOC_EXCHANGE_RANGE ile file1, donor1'e karşı; file1_offset 0, > file2_offset 8192, length 0, TO_EOF olarak değiştirilir. Bir blok değiştirilir ve boyutlar da onunla birlikte değiştirilir: > > file1 size 4096 -> [200] [100] [300] reflink bayrağı ayarlı > ^^^^^^^^^^^ hala sahipliğinde, ancak artık boyutun dışında > donor1 size 12288 -> [202] > > file1 üç bloğa sahip olmasına rağmen tek blok uzunluğunda olduğunu belirtiyor. Hiçbir şey eşlemeden çıkarılmadı. file2_offset blok 2 olduğu için bu değişim bir bayrağı temizleyemez. > > 3. XFS_IOC_EXCHANGE_RANGE ile file1, donor2'ye karşı; her iki offset de 0, length 4096. > i_disk_size değerine göre bu, her şeyi takas eden iki adet tek bloklu dosyanın işlemidir, dolayısıyla xmi_can_exchange_reflink_flags() bunu onaylar ve bayrak temizlenir: > > file1 size 4096 -> [400] [100] [300] reflink bayrağı TEMİZLENDİ > donor2 size 4096 -> [200] > > Blok 100 hala peer ile paylaşılıyor. > > 4. pwrite(file1, 4096, 4096), yani file1'in ikinci yuvası olan blok 100. > xfs_is_cow_inode(file1) false olduğundan CoW gerçekleşmez: > > peer size 4096 -> [100] aynı blok, yeni içerikler > > Burada önemli olan tek şey blok 100'dür. Aşağıdaki PoC, mevcut dizindeki peer adlı bir dosyayı okumaktadır. Dosya sisteminin, mkfs.xfs 7.x sürümünün varsayılan olarak etkinleştirdiği reflink ve exchange-range özelliklerine ihtiyacı vardır. Evet, TO_EOF, veri bloğunu doğru şekilde değiştirse bile dosya boyutunu bozmaktadır. Man sayfasında tanımlandığı üzere XFS_EXCHANGE_RANGE_TO_EOF'un beklenen davranışı şöyledir: "length parametresini yoksay. file1_fd içindeki file1_offset'ten EOF'a kadar olan tüm baytlar file2_fd'ye taşınır ve file2'nin boyutu (file2_offset+(file1_length-file1_offset)) olarak ayarlanır. Bu sırada, file2 içindeki file2_offset'ten EOF'a kadar olan tüm baytlar file1'e taşınır ve file1'in boyutu (file1_offset+(file2_length-file2_offset)) olarak ayarlanır." Başka bir deyişle, eğer dosya verilerinin yalnızca bir kısmını değiştiriyorsak, sadece değiştirilen verilerle ilgili olan dosya boyutu kısmını değiştirmeliyiz. Ne yazık ki kod, diskteki dosya boyutu ile bellek içi (incore) dosya boyutlarını takas etmektedir; çağrıcı sıfırdan farklı bir offset geçtiğinde bu durum yanlıştır. Dosya boyutlarını karıştıran PoC, reflink uygulanmamış tek bloklu bir dosya gibi görünen yapı üzerinde ikinci bir exchange-range çağrısı kullanır. Dosya boyutu yanlış ayarlandığı için exchange-range, iki dosyanın tam içeriğini değiştirdiğini düşünür ve bozuk dosyadaki reflink bayrağını temizler. Bu, bozuk dosyanın genişletici bir yazma işlemiyle, EOF'un hemen ötesindeki paylaşılan bloğun üzerine yazılmasını sağlar. Bu durum halk arasında "refluxfs" olarak bilinmeye başlanmıştır. Dosya boyutları doğru şekilde ayarlandığında, ikinci exchange-range artık bunun tam içerik takası olduğunu düşünmez, dolayısıyla dosya argümanlarından herhangi birindeki reflink bayrağını temizlemez. Norbert, bu yamanın önceki bir versiyonunun ardından, i_disk_size durumunu doğru yönetmediğimizle ilgili ikinci bir şikayette bulunmuştur: > Offset'ler bellek içi i_size'a göre sınırlandırılmış ancak şundan çıkarılmıştır > ---kesildi---

ÖnemYüksek
CVSS7.8
İstismar olasılığı—
ÜrünLinux
Yayın23 Eki 2026
İlk görülme23 Eki 2026

Nasıl düzeltilir

Güncelleyin
  • Linux Linuxb361d32b884f8ddcb9bad5d99b69eece648f8e43, cf32eb20dfacfd2e92ce86ba1fece9ae5f98a7d8, 952b5c99a840c2bff1f6645fd5e06e1db6ec2623, 7dfb218c829c1acb626e0fe92c5fddb9a26a03e9 ya da sonraki bir sürüm

Etkilenen ürünler

ÜrünEtkilenen sürümlerDüzeltildiği sürüm
Linux Linux966ceafc7a437105ecfe1cadb3747b2965a260ca ≤ v < b361d32b884f8ddcb9bad5d99b69eece648f8e43, 966ceafc7a437105ecfe1cadb3747b2965a260ca ≤ v < cf32eb20dfacfd2e92ce86ba1fece9ae5f98a7d8, 966ceafc7a437105ecfe1cadb3747b2965a260ca ≤ v < 952b5c99a840c2bff1f6645fd5e06e1db6ec2623, 966ceafc7a437105ecfe1cadb3747b2965a260ca ≤ v < 7dfb218c829c1acb626e0fe92c5fddb9a26a03e9, 6.10b361d32b884f8ddcb9bad5d99b69eece648f8e43, cf32eb20dfacfd2e92ce86ba1fece9ae5f98a7d8, 952b5c99a840c2bff1f6645fd5e06e1db6ec2623, 7dfb218c829c1acb626e0fe92c5fddb9a26a03e9

Sürümünüzü kontrol edin

Ürünü seçin ve kullandığınız sürümü yazın; sürümün etkilenen aralıkta olup olmadığını görün.

Intelligence 360 paketinde

Attack Surface Management

Alan adlarınıza bağlı varlıkları, bu varlıklarda çalışan teknolojileri ve bilinen zafiyetleri tek listede görün.

CVE-2026-98974 · Linux · Dark Radar