// For flags

CVE-2023-52759

gfs2: ignore negated quota changes

Severity Score

"-"
*CVSS v-

Exploit Likelihood

*EPSS

Affected Versions

*CPE

Public Exploits

0
*Multiple Sources

Exploited in Wild

-
*KEV

Decision

Track
*SSVC
Descriptions

In the Linux kernel, the following vulnerability has been resolved:

gfs2: ignore negated quota changes

When lots of quota changes are made, there may be cases in which an
inode's quota information is increased and then decreased, such as when
blocks are added to a file, then deleted from it. If the timing is
right, function do_qc can add pending quota changes to a transaction,
then later, another call to do_qc can negate those changes, resulting
in a net gain of 0. The quota_change information is recorded in the qc
buffer (and qd element of the inode as well). The buffer is added to the
transaction by the first call to do_qc, but a subsequent call changes
the value from non-zero back to zero. At that point it's too late to
remove the buffer_head from the transaction. Later, when the quota sync
code is called, the zero-change qd element is discovered and flagged as
an assert warning. If the fs is mounted with errors=panic, the kernel
will panic.

This is usually seen when files are truncated and the quota changes are
negated by punch_hole/truncate which uses gfs2_quota_hold and
gfs2_quota_unhold rather than block allocations that use gfs2_quota_lock
and gfs2_quota_unlock which automatically do quota sync.

This patch solves the problem by adding a check to qd_check_sync such
that net-zero quota changes already added to the transaction are no
longer deemed necessary to be synced, and skipped.

In this case references are taken for the qd and the slot from do_qc
so those need to be put. The normal sequence of events for a normal
non-zero quota change is as follows:

gfs2_quota_change
do_qc
qd_hold
slot_hold

Later, when the changes are to be synced:

gfs2_quota_sync
qd_fish
qd_check_sync
gets qd ref via lockref_get_not_dead
do_sync
do_qc(QC_SYNC)
qd_put
lockref_put_or_lock
qd_unlock
qd_put
lockref_put_or_lock

In the net-zero change case, we add a check to qd_check_sync so it puts
the qd and slot references acquired in gfs2_quota_change and skip the
unneeded sync.

En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: gfs2: ignora los cambios de cuota negados. Cuando se realizan muchos cambios de cuota, puede haber casos en los que la información de cuota de un inodo aumenta y luego disminuye, como cuando se agregan bloques a un archivo, luego eliminado de él. Si es el momento adecuado, la función do_qc puede agregar cambios de cuota pendientes a una transacción, luego, otra llamada a do_qc puede negar esos cambios, lo que resulta en una ganancia neta de 0. La información de cuota_cambio se registra en el búfer qc (y en el elemento qd). del inodo también). El búfer se agrega a la transacción mediante la primera llamada a do_qc, pero una llamada posterior cambia el valor de distinto de cero a cero. En ese momento ya es demasiado tarde para eliminar buffer_head de la transacción. Más tarde, cuando se llama al código de sincronización de cuota, el elemento qd de cambio cero se descubre y se marca como una advertencia de afirmación. Si fs se monta con errores = pánico, el kernel entrará en pánico. Esto generalmente se ve cuando los archivos se truncan y los cambios de cuota se niegan mediante punch_hole/truncate, que usa gfs2_quota_hold y gfs2_quota_unhold en lugar de bloquear asignaciones que usan gfs2_quota_lock y gfs2_quota_unlock, que sincronizan automáticamente la cuota. Este parche resuelve el problema agregando una verificación a qd_check_sync de modo que los cambios de cuota neta cero ya agregados a la transacción ya no se consideren necesarios para sincronizarse y omitirse. En este caso, se toman referencias para el qd y el slot de do_qc, por lo que es necesario ponerlas. La secuencia normal de eventos para un cambio de cuota normal distinto de cero es la siguiente: gfs2_quota_change do_qc qd_hold slot_hold Más tarde, cuando se van a sincronizar los cambios: gfs2_quota_sync qd_fish qd_check_sync obtiene qd ref mediante lockref_get_not_dead do_sync do_qc(QC_SYNC) qd_put lockref_put_or_lock qd_unlock qd_put lockref_put_or_lock En el caso de cambio neto cero, agregamos una verificación a qd_check_sync para que coloque las referencias de qd y slot adquiridas en gfs2_quota_change y omita la sincronización innecesaria.

*Credits: N/A
CVSS Scores
Attack Vector
-
Attack Complexity
-
Privileges Required
-
User Interaction
-
Scope
-
Confidentiality
-
Integrity
-
Availability
-
* Common Vulnerability Scoring System
SSVC
  • Decision:Track
Exploitation
None
Automatable
No
Tech. Impact
Partial
* Organization's Worst-case Scenario
Timeline
  • 2024-05-21 CVE Reserved
  • 2024-05-21 CVE Published
  • 2024-05-22 EPSS Updated
  • 2024-08-02 CVE Updated
  • ---------- Exploited in Wild
  • ---------- KEV Due Date
  • ---------- First Exploit
CWE
CAPEC
Affected Vendors, Products, and Versions
Vendor Product Version Other Status
Vendor Product Version Other Status <-- --> Vendor Product Version Other Status
Linux
Search vendor "Linux"
Linux Kernel
Search vendor "Linux" for product "Linux Kernel"
< 4.14.331
Search vendor "Linux" for product "Linux Kernel" and version " < 4.14.331"
en
Affected
Linux
Search vendor "Linux"
Linux Kernel
Search vendor "Linux" for product "Linux Kernel"
< 4.19.300
Search vendor "Linux" for product "Linux Kernel" and version " < 4.19.300"
en
Affected
Linux
Search vendor "Linux"
Linux Kernel
Search vendor "Linux" for product "Linux Kernel"
< 5.4.262
Search vendor "Linux" for product "Linux Kernel" and version " < 5.4.262"
en
Affected
Linux
Search vendor "Linux"
Linux Kernel
Search vendor "Linux" for product "Linux Kernel"
< 5.10.202
Search vendor "Linux" for product "Linux Kernel" and version " < 5.10.202"
en
Affected
Linux
Search vendor "Linux"
Linux Kernel
Search vendor "Linux" for product "Linux Kernel"
< 5.15.140
Search vendor "Linux" for product "Linux Kernel" and version " < 5.15.140"
en
Affected
Linux
Search vendor "Linux"
Linux Kernel
Search vendor "Linux" for product "Linux Kernel"
< 6.1.64
Search vendor "Linux" for product "Linux Kernel" and version " < 6.1.64"
en
Affected
Linux
Search vendor "Linux"
Linux Kernel
Search vendor "Linux" for product "Linux Kernel"
< 6.5.13
Search vendor "Linux" for product "Linux Kernel" and version " < 6.5.13"
en
Affected
Linux
Search vendor "Linux"
Linux Kernel
Search vendor "Linux" for product "Linux Kernel"
< 6.6.3
Search vendor "Linux" for product "Linux Kernel" and version " < 6.6.3"
en
Affected
Linux
Search vendor "Linux"
Linux Kernel
Search vendor "Linux" for product "Linux Kernel"
< 6.7
Search vendor "Linux" for product "Linux Kernel" and version " < 6.7"
en
Affected