CVE-2021-47072

Orta

Təsvir

Linux nüvəsində aşağıdakı zəiflik aradan qaldırılmışdır: btrfs: loq sinxronizasiya edildikdən sonra hələ də mövcud olan silinmiş dentry-lərin düzəldilməsi Bir inode-u bir kataloqdan digərinə köçürdüyümüz zaman və həm həmin inode, həm də onun əvvəlki valideyn kataloqu daha öncə loqlanmışdırsa, loq sinxronizasiya edildikdən sonra enerji kəsintisi baş verdikdə köhnə valideyn üçün dentry-nin qalmaması lazımdır. Yalnız yeni dentry mövcud olmalıdır. Ümumiyyətlə bu proses düzgün işləyir, lakin hazırda bunun işləmədiyi bir ssenari mövcuddur, çünki köçürülmüş faylın/kataloqunun köhnə valideyni, köhnə dentry-nin dir index və dir item açarlarını ehtiva edən diapazon üçün avtoritativ deyil. Bu hal aşağıdakı nümunə və təkrarlaqıcı ilə daha yaxşı izah olunur: # Xətanı tetikləmək üçün test fs/subvolume btree-də açarların və elementlərin çox spesifik düzülüşünü tələb edir. Buna görə də hansı platformada olmağımızdan asılı olmayaraq, eyni yarpaq/qovşaq (leaf/node) ölçüsünün olduğundan əmin olmaq istəyirik. # # Hazırda btrfs-də qovşaq/yarpaq ölçüsü səhifə ölçüsündən kiçik ola bilməz (lakin səhifə ölçüsündən böyük ola bilər). Buna görə də dəstəklənən ən böyük qovşaq/yarpaq ölçüsündən (64K) istifadə edin. $ mkfs.btrfs -f -n 65536 /dev/sdc $ mount /dev/sdc /mnt # "testdir" inode 257-dir. $ mkdir /mnt/testdir $ chmod 755 /mnt/testdir # "testdir" kataloqunun elementlərinin bir neçə yarpağa (bu halda 7) yayılması üçün bir neçə boş fayl yaradın. $ for ((i = 1; i <= 1200; i++)); do echo -n > /mnt/testdir/file$i done # Bütün elementləri yarpaq 7-də yerləşən test kataloqumuz "dira"-nı yaradın, inode nömrəsi 1458. # # "dira" adlı girişə işarə edən inode 257 ("testdir") üçün BTRFS_DIR_ITEM_KEY elementi yarpaq 2-də, həmin girişə işarə edən BTRFS_DIR_INDEX_KEY elementi isə yarpaq 3-də yerləşir. # # Bu konkret fayl sistemi qovşaq ölçüsü (64K), faylların sayı və fayl adları üçün, yuxarıda qeyd edildiyi kimi, inode 257-dən gələn kataloq giriş elementləri yarpaq 2 və 3-də olur - bu test halı tərəfindən törədilən xətanı aktivləşdirmək üçün vacib olan odur ki, həmin elementlər yarpaq 1-də yerləşməsin, onlar inode 257 üçün inode elementini ehtiva edən yarpaqdan fərqli bir yarpaqda yerləşməlidir. # # Valideyn inode (257) üçün müvafiq BTRFS_DIR_ITEM_KEY və BTRFS_DIR_INDEX_KEY elementləri aşağıdakılardır: # # item 460 key (257 DIR_ITEM 3724298081) itemoff 48344 itemsize 34 # location key (1458 INODE_ITEM 0) type DIR # transid 6 data_len 0 name_len 4 # name: dira # # və: # # item 771 key (257 DIR_INDEX 1202) itemoff 36673 itemsize 34 # location key (1458 INODE_ITEM 0) type DIR # transid 6 data_len 0 name_len 4 # name: dira $ mkdir /mnt/testdir/dira # İndiyə qədər görülən hər şeyin davamlı şəkildə saxlandığından əmin olun. $ sync # İndi inode 257-də ("testdir") dəyişiklik edin ki, bu da inode 1458-ə (kataloq "dira") işarə edən kataloq elementlərini ehtiva edən yarpaq 2 və 3-ün COW edilməsi ilə nəticələnməsin. # # İcazələrin dəyişdirilməsi, sahibkarın/qrupun dəyişdirilməsi, xattr-ın yenilənməsi və ya əlavə edilməsi və s., yarpaq 2 və 3-ü dəyişməyəcək (COW etməyəcək). Sadəlik üçün inode 257-nin icazələrini dəyişin, bu onun inode elementinin yenilənməsi ilə nəticələnir və buna görə də yalnız yarpaq 1-i dəyişir (COW edir). $ chmod 700 /mnt/testdir # İndi kataloq inode 257-ni fsync edin. # # Yalnız birinci yarpaq dəyişdirildiyi/COW edildiyi üçün biz inode 257-nin inode elementini və yalnız birinci yarpaqda tapılan dentry-ləri loqlayırıq; bunların hamısı BTRFS_DIR_ITEM_KEY açar tipinə malikdir və heç bir BTRFS_DIR_INDEX_KEY tipi açar yoxdur, çünki onlar əvvəlki tipdən sonra sıralanırlar və birinci yarpaqda heç biri mövcud deyil. # # Biz həmçinin loqun avtoritativ olduğu dir elementləri və dir indeksləri üçün diapazonları təmsil edən 3 elementi loqlayırıq: # # 1) BTRFS_DIR_LOG_ITEM_KEY tipində bir açar, hansı ki, loqun [0, 2285968570] diapazonunda ofseti olan bütün BTRFS_DIR_ITEM_KEY açarları üçün avtoritativ olduğunu göstərir (buradakı ofset...

CiddilikOrta
CVSS5.5
İstismar ehtimalı—
MəhsulLinux Kernel
Dərc1 mar 2024
İlk görülmə1 mar 2024

Necə düzəltmək olar

Yeniləyin
  • linux linux_kernel5.12.7 və ya daha yeni versiya

Təsirlənən məhsullar

MəhsulTəsirlənən versiyalarDüzəldildiyi versiya
linux linux_kernel5.12 ≤ v < 5.12.7, 5.135.12.7

Versiyanızı yoxlayın

Məhsulu seçin və istifadə etdiyiniz versiyanı yazın; versiyanın təsirlənən aralıqda olub-olmadığını görün.

Intelligence 360 paketində

Attack Surface Management

Domenlərinizə bağlı aktivləri, onlarda işləyən texnologiyaları və məlum zəiflikləri bir siyahıda görün.