- Son 7 gün
CVE-2026-98980
Linux çekirdeğinde refwalk sırasında bağlanmış girdilerin ifşa olmasına yol açan kimlik doğrulama dışı yetki sorunu
- Yayımlandı
- Güncellendi
- 24 Eki 2026
- Açık yaşı
- 5 gün
- Kaydı açan
- Linux
ÖzetTürkçe
Linux çekirdeğinde, namei bileşeninin refwalk yolunda, bağlanmış (overmounted) girdilerin açığa çıkmasına neden olan bir sorun giderilmiştir. RCU tabanlı yürüyüşte dentry, kabul edilmeden önce doğrulanır: step_into d_seq değerini, __follow_mount_rcu ise mount_lock değerini yeniden kontrol eder ve bu sırada silinen bir girdi aramanın yeniden denenmesine ve kaçırılmasına yol açar. Refwalk ise lookup_fast ile karma tablosundaki dentry için bir referans alır ve bunu doğrudan kabul eder; bu nedenle referans alındıktan sonra gerçekleşen bir unlink işlemi refwalk tarafından görülmez. Basit dosyalarda bu bir sorun değildir, ancak kilitli bir bağlama noktasında durum farklıdır: unlink, tüm bağlamaları ayırır ve ardından adı kaldırır. Henüz bağlamaları incelenmemiş bir refwalk, altta kalan girdiyi ortaya çıkarabilir. Bu pencere dar olsa da tetiklenebilir. Düzeltme, step_into çağrısından sonra girdiyi kontrol eder. unlink, rmdir ve rename işlemleri, bağlamaları ayırmadan ve dentry'yi kaldırmadan önce dentry'yi dont_mount ile işaretler. Bu nedenle DCACHE_CANT_MOUNT bayrağı taşıyan ve bağlamaları incelendiğinde karma tablosundan çıkarılmış olan bir dentry, refwalk sırasında silinmiş bir ad anlamına gelir. Bu kontrol step_into_slowpath içine eklenmiştir. ".." ve LOOKUP_DOWN, karma tablosunda olmayan bir dizine meşru olarak ulaşabilir; bağlama noktasına geçen refwalk'ta path.mnt, nd->path.mnt değerinden farklıdır. Bir dosya sisteminin kendi başına bıraktığı dentry (d_invalidate, d_drop) bu bayrağa sahip değildir ve eskisi gibi ele alınır. Etkilenen sürüm aralığı: 3.18 sürümü. Düzeltilmiş sürümler: 6.12.113, 6.18.57 ve 7.2.11 ve sonrası. CVSS 3.1 puanı 8.8 (YÜKSEK), vektör: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H.
Kaynaktaki açıklama (İngilizce)
In the Linux kernel, the following vulnerability has been resolved:
namei: don't reveal overmounted entries in refwalk
In rcuwalk the dentry is validated before it is accepted. step_into()
step_into() rechecks d_seq and __follow_mount_rcu() rechecks mount_lock.
An entry that gets unlinked in between causes the lookup to retry and
miss.
A refwalk doesn't do this. lookup_fast() takes a reference on the hashed
dentry and simply accepts it. So an unlink that happens after the
reference was taken isn't seen by refwalk. That's fine for a simple
file. We just happened to open it before it was unlinked, no problem.
For a mountpoint and specifically a locked mountpoint it very much
isn't. The unlink detaches all mounts and then removes the name. Any
refwalk that hasn't traversed the mounts yet simply reveals the
underlying entry. It's a very narrow window but it can be hit:
reads of a covered file in 60 s, 3 walkers, ~15000 unlinks
no widening 27
that step + 200 us 3741
See the appended patch for a more reliable reproducer.
So check the entry after step_into(). unlink(), rmdir() and rename()
mark the dentry with dont_mount() before they detach the mounts and
remove the dentry.
So a dentry that is marked with DCACHE_CANT_MOUNT and is unhashed by the
time its mounts were looked at is a name that was unlinked under the
refwalk. DCACHE_CANT_MOUNT is read after the mounts were looked up and
it is set before they are detached by detach_mounts(). A refwalk that
missed the mounts will see DCACHE_CANT_MOUNT.
Plain d_unlinked() is fine. A rename takes the dentry off its hash chain
but ___d_drop() leaves d_hash.pprev set. So only __d_drop() and a rename
over the dentry unhash it. The only move that flips IS_ROOT splices in a
disconnected alias. That doesn't have DCACHE_CANT_MOUNT set.
Add the to step_into_slowpath(). ".." and LOOKUP_DOWN may legitimately
land on an unhashed directory. A refwalk that crossed onto a mount has
path.mnt different from nd->path.mnt. A dentry that a filesystem dropped
on its own (d_invalidate(), d_drop()) doesn't have the flag set and is
treated as before.
// SPDX-License-Identifier: GPL-2.0
/*
* unlink_covered: unlink a file that is a mountpoint in a detached copy of
* its mount, against walkers that open it through that copy.
*
* A is a tmpfs with the file f1 (content SECRET_F) and the plain file
* MARK_A. A' is an open_tree(OPEN_TREE_CLONE) copy of A with MARK_A bound
* on A'/f1, held through an O_PATH fd on its root once the tree fd is
* closed. Walkers open f1 through that fd while the driver unlinks A/f1,
* where nothing is mounted on it. A walker may read MARK_A or get ENOENT.
* A read of SECRET_F is a hit: the name was found after its mount was
* gone. The lockless walks use openat2(RESOLVE_CACHED).
*
* usage: unlink_covered [-t seconds] [-w walkers]
*/
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <errno.h>
#include <fcntl.h>
#include <pthread.h>
#include <stdatomic.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <linux/openat2.h>
#ifndef __NR_open_tree
#define __NR_open_tree 428
#endif
#ifndef __NR_move_mount
#define __NR_move_mount 429
#endif
#ifndef __NR_openat2
#define __NR_openat2 437
#endif
#ifndef OPEN_TREE_CLONE
#define OPEN_TREE_CLONE 1
#endif
#ifndef OPEN_TREE_CLOEXEC
#define OPEN_TREE_CLOEXEC O_CLOEXEC
#endif
#ifndef MOVE_MOUNT_F_EMPTY_PATH
#define MOVE_MOUNT_F_EMPTY_PATH 0x00000004
#endif
#define WORK "/tmp/uc"
#define ADIR WORK "/A"
static int duration = 60, nwalkers = 3;
static atomic_int stop, writer_waiting;
static pthread_rwlock_t cur_lock = PTHREAD_RWLOCK_INITIALIZER;
static int cur_fd = -1; /* the root of A', -1 while there is none */
static atomic_long n_unlink, n_walk, n_mark, n_enoent, n_othe
---truncated---
Bu açığın açıklamasını Türkçeye çevirdik. Adım adım çözüm önerilerini kritik ve yeni açıklar için hazırlıyoruz; düzeltilmiş sürüm aşağıdaki tabloda, ayrıntılar üreticinin duyurusunda.
Etkilenen sürümler1 yazılım
| Yazılım | Etkilenen | Düzeltildiği sürüm |
|---|---|---|
| Linux | 3.18 | – |
| < 3.18 Etkilenmiyor | – | |
| ≥ 6.12.113 Etkilenmiyor | – | |
| ≥ 6.18.57 Etkilenmiyor | – | |
| ≥ 7.2.11 Etkilenmiyor | – |
Kaynaklar6 kaynak
Kayıt geçmişi
- Yayımlandı
İlgili açıklar
Türkçe metin, resmi kayıtlardaki bilgilerle yapay zekâ yardımıyla yazıldı ve yayından önce otomatik kontrollerden geçti. Bir değişikliği uygulamadan önce üreticinin duyurusuna mutlaka bakın.