GCVE Workshop - 22 September 2026 (14:00-18:00), Luxembourg Before The Vulnopticon Conference - Registration

CVE-2025-22030 (GCVE-0-2025-22030)

Vulnerability from cvelistv5 – Published: 2025-04-16 14:11 – Updated: 2026-05-23 15:57
VLAI
Title
mm: zswap: fix crypto_free_acomp() deadlock in zswap_cpu_comp_dead()
Summary
In the Linux kernel, the following vulnerability has been resolved: mm: zswap: fix crypto_free_acomp() deadlock in zswap_cpu_comp_dead() Currently, zswap_cpu_comp_dead() calls crypto_free_acomp() while holding the per-CPU acomp_ctx mutex. crypto_free_acomp() then holds scomp_lock (through crypto_exit_scomp_ops_async()). On the other hand, crypto_alloc_acomp_node() holds the scomp_lock (through crypto_scomp_init_tfm()), and then allocates memory. If the allocation results in reclaim, we may attempt to hold the per-CPU acomp_ctx mutex. The above dependencies can cause an ABBA deadlock. For example in the following scenario: (1) Task A running on CPU #1: crypto_alloc_acomp_node() Holds scomp_lock Enters reclaim Reads per_cpu_ptr(pool->acomp_ctx, 1) (2) Task A is descheduled (3) CPU #1 goes offline zswap_cpu_comp_dead(CPU #1) Holds per_cpu_ptr(pool->acomp_ctx, 1)) Calls crypto_free_acomp() Waits for scomp_lock (4) Task A running on CPU #2: Waits for per_cpu_ptr(pool->acomp_ctx, 1) // Read on CPU #1 DEADLOCK Since there is no requirement to call crypto_free_acomp() with the per-CPU acomp_ctx mutex held in zswap_cpu_comp_dead(), move it after the mutex is unlocked. Also move the acomp_request_free() and kfree() calls for consistency and to avoid any potential sublte locking dependencies in the future. With this, only setting acomp_ctx fields to NULL occurs with the mutex held. This is similar to how zswap_cpu_comp_prepare() only initializes acomp_ctx fields with the mutex held, after performing all allocations before holding the mutex. Opportunistically, move the NULL check on acomp_ctx so that it takes place before the mutex dereference.
Impacted products
Vendor Product Version CPE status
Linux Linux Affected: 8d29ff5d50304daa41dc3cfdda4a9d1e46cf5be1 , < 747e3eec1d7d124ea90ed3d7b85369df8b4e36d2 (git)
Affected: 12dcb0ef540629a281533f9dedc1b6b8e14cfb65 , < a8d18000e9d2d97aaf105f5f9b3b0e8a6fbf8b96 (git)
Affected: 12dcb0ef540629a281533f9dedc1b6b8e14cfb65 , < 717d9c35deff6c33235693171bacbb03e9643fa4 (git)
Affected: 12dcb0ef540629a281533f9dedc1b6b8e14cfb65 , < c11bcbc0a517acf69282c8225059b2a8ac5fe628 (git)
Affected: 6.12.12 , < 6.12.23 (semver)
guessed Create a notification for this product.
Linux Linux Affected: 6.13
Unaffected: 0 , < 6.13 (semver)
Unaffected: 6.12.23 , ≤ 6.12.* (semver)
Unaffected: 6.13.11 , ≤ 6.13.* (semver)
Unaffected: 6.14.2 , ≤ 6.14.* (semver)
Unaffected: 6.15 , ≤ * (original_commit_for_fix)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "defaultStatus": "unaffected",
          "product": "Linux",
          "programFiles": [
            "mm/zswap.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "lessThan": "747e3eec1d7d124ea90ed3d7b85369df8b4e36d2",
              "status": "affected",
              "version": "8d29ff5d50304daa41dc3cfdda4a9d1e46cf5be1",
              "versionType": "git"
            },
            {
              "lessThan": "a8d18000e9d2d97aaf105f5f9b3b0e8a6fbf8b96",
              "status": "affected",
              "version": "12dcb0ef540629a281533f9dedc1b6b8e14cfb65",
              "versionType": "git"
            },
            {
              "lessThan": "717d9c35deff6c33235693171bacbb03e9643fa4",
              "status": "affected",
              "version": "12dcb0ef540629a281533f9dedc1b6b8e14cfb65",
              "versionType": "git"
            },
            {
              "lessThan": "c11bcbc0a517acf69282c8225059b2a8ac5fe628",
              "status": "affected",
              "version": "12dcb0ef540629a281533f9dedc1b6b8e14cfb65",
              "versionType": "git"
            },
            {
              "lessThan": "6.12.23",
              "status": "affected",
              "version": "6.12.12",
              "versionType": "semver"
            }
          ]
        },
        {
          "defaultStatus": "affected",
          "product": "Linux",
          "programFiles": [
            "mm/zswap.c"
          ],
          "repo": "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git",
          "vendor": "Linux",
          "versions": [
            {
              "status": "affected",
              "version": "6.13"
            },
            {
              "lessThan": "6.13",
              "status": "unaffected",
              "version": "0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.12.*",
              "status": "unaffected",
              "version": "6.12.23",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.13.*",
              "status": "unaffected",
              "version": "6.13.11",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "6.14.*",
              "status": "unaffected",
              "version": "6.14.2",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "unaffected",
              "version": "6.15",
              "versionType": "original_commit_for_fix"
            }
          ]
        }
      ],
      "cpeApplicability": [
        {
          "nodes": [
            {
              "cpeMatch": [
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.12.23",
                  "versionStartIncluding": "6.12.12",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.13.11",
                  "versionStartIncluding": "6.13",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.14.2",
                  "versionStartIncluding": "6.13",
                  "vulnerable": true
                },
                {
                  "criteria": "cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*",
                  "versionEndExcluding": "6.15",
                  "versionStartIncluding": "6.13",
                  "vulnerable": true
                }
              ],
              "negate": false,
              "operator": "OR"
            }
          ]
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "value": "In the Linux kernel, the following vulnerability has been resolved:\n\nmm: zswap: fix crypto_free_acomp() deadlock in zswap_cpu_comp_dead()\n\nCurrently, zswap_cpu_comp_dead() calls crypto_free_acomp() while holding\nthe per-CPU acomp_ctx mutex.  crypto_free_acomp() then holds scomp_lock\n(through crypto_exit_scomp_ops_async()).\n\nOn the other hand, crypto_alloc_acomp_node() holds the scomp_lock (through\ncrypto_scomp_init_tfm()), and then allocates memory.  If the allocation\nresults in reclaim, we may attempt to hold the per-CPU acomp_ctx mutex.\n\nThe above dependencies can cause an ABBA deadlock.  For example in the\nfollowing scenario:\n\n(1) Task A running on CPU #1:\n    crypto_alloc_acomp_node()\n      Holds scomp_lock\n      Enters reclaim\n      Reads per_cpu_ptr(pool-\u003eacomp_ctx, 1)\n\n(2) Task A is descheduled\n\n(3) CPU #1 goes offline\n    zswap_cpu_comp_dead(CPU #1)\n      Holds per_cpu_ptr(pool-\u003eacomp_ctx, 1))\n      Calls crypto_free_acomp()\n      Waits for scomp_lock\n\n(4) Task A running on CPU #2:\n      Waits for per_cpu_ptr(pool-\u003eacomp_ctx, 1) // Read on CPU #1\n      DEADLOCK\n\nSince there is no requirement to call crypto_free_acomp() with the per-CPU\nacomp_ctx mutex held in zswap_cpu_comp_dead(), move it after the mutex is\nunlocked.  Also move the acomp_request_free() and kfree() calls for\nconsistency and to avoid any potential sublte locking dependencies in the\nfuture.\n\nWith this, only setting acomp_ctx fields to NULL occurs with the mutex\nheld.  This is similar to how zswap_cpu_comp_prepare() only initializes\nacomp_ctx fields with the mutex held, after performing all allocations\nbefore holding the mutex.\n\nOpportunistically, move the NULL check on acomp_ctx so that it takes place\nbefore the mutex dereference."
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-05-23T15:57:40.079Z",
        "orgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
        "shortName": "Linux"
      },
      "references": [
        {
          "url": "https://git.kernel.org/stable/c/747e3eec1d7d124ea90ed3d7b85369df8b4e36d2"
        },
        {
          "url": "https://git.kernel.org/stable/c/a8d18000e9d2d97aaf105f5f9b3b0e8a6fbf8b96"
        },
        {
          "url": "https://git.kernel.org/stable/c/717d9c35deff6c33235693171bacbb03e9643fa4"
        },
        {
          "url": "https://git.kernel.org/stable/c/c11bcbc0a517acf69282c8225059b2a8ac5fe628"
        }
      ],
      "title": "mm: zswap: fix crypto_free_acomp() deadlock in zswap_cpu_comp_dead()",
      "x_generator": {
        "engine": "bippy-1.2.0"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "416baaa9-dc9f-4396-8d5f-8c081fb06d67",
    "assignerShortName": "Linux",
    "cveId": "CVE-2025-22030",
    "datePublished": "2025-04-16T14:11:50.625Z",
    "dateReserved": "2024-12-29T08:45:45.808Z",
    "dateUpdated": "2026-05-23T15:57:40.079Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "epss": {
      "cve": "CVE-2025-22030",
      "date": "2026-09-16",
      "epss": "0.00199",
      "percentile": "0.09998"
    },
    "nvd": "{\"cve\":{\"id\":\"CVE-2025-22030\",\"sourceIdentifier\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"published\":\"2025-04-16T15:15:55.607\",\"lastModified\":\"2026-06-17T08:44:53.033\",\"vulnStatus\":\"Analyzed\",\"cveTags\":[],\"descriptions\":[{\"lang\":\"en\",\"value\":\"In the Linux kernel, the following vulnerability has been resolved:\\n\\nmm: zswap: fix crypto_free_acomp() deadlock in zswap_cpu_comp_dead()\\n\\nCurrently, zswap_cpu_comp_dead() calls crypto_free_acomp() while holding\\nthe per-CPU acomp_ctx mutex.  crypto_free_acomp() then holds scomp_lock\\n(through crypto_exit_scomp_ops_async()).\\n\\nOn the other hand, crypto_alloc_acomp_node() holds the scomp_lock (through\\ncrypto_scomp_init_tfm()), and then allocates memory.  If the allocation\\nresults in reclaim, we may attempt to hold the per-CPU acomp_ctx mutex.\\n\\nThe above dependencies can cause an ABBA deadlock.  For example in the\\nfollowing scenario:\\n\\n(1) Task A running on CPU #1:\\n    crypto_alloc_acomp_node()\\n      Holds scomp_lock\\n      Enters reclaim\\n      Reads per_cpu_ptr(pool-\u003eacomp_ctx, 1)\\n\\n(2) Task A is descheduled\\n\\n(3) CPU #1 goes offline\\n    zswap_cpu_comp_dead(CPU #1)\\n      Holds per_cpu_ptr(pool-\u003eacomp_ctx, 1))\\n      Calls crypto_free_acomp()\\n      Waits for scomp_lock\\n\\n(4) Task A running on CPU #2:\\n      Waits for per_cpu_ptr(pool-\u003eacomp_ctx, 1) // Read on CPU #1\\n      DEADLOCK\\n\\nSince there is no requirement to call crypto_free_acomp() with the per-CPU\\nacomp_ctx mutex held in zswap_cpu_comp_dead(), move it after the mutex is\\nunlocked.  Also move the acomp_request_free() and kfree() calls for\\nconsistency and to avoid any potential sublte locking dependencies in the\\nfuture.\\n\\nWith this, only setting acomp_ctx fields to NULL occurs with the mutex\\nheld.  This is similar to how zswap_cpu_comp_prepare() only initializes\\nacomp_ctx fields with the mutex held, after performing all allocations\\nbefore holding the mutex.\\n\\nOpportunistically, move the NULL check on acomp_ctx so that it takes place\\nbefore the mutex dereference.\"},{\"lang\":\"es\",\"value\":\"En el kernel de Linux, se ha resuelto la siguiente vulnerabilidad: mm: zswap: correcci\u00f3n del bloqueo de crypto_free_acomp() en zswap_cpu_comp_dead(). Actualmente, zswap_cpu_comp_dead() llama a crypto_free_acomp() mientras mantiene el mutex acomp_ctx por CPU. A continuaci\u00f3n, crypto_free_acomp() mantiene scomp_lock (mediante crypto_exit_scomp_ops_async()). Por otro lado, crypto_alloc_acomp_node() mantiene scomp_lock (mediante crypto_scomp_init_tfm()) y luego asigna memoria. Si la asignaci\u00f3n resulta en una recuperaci\u00f3n, podemos intentar mantener el mutex acomp_ctx por CPU. Las dependencias anteriores pueden causar un bloqueo de ABBA. Por ejemplo, en el siguiente escenario: (1) Tarea A ejecut\u00e1ndose en la CPU n.\u00ba 1: crypto_alloc_acomp_node() Retiene scomp_lock Ingresa a recuperaci\u00f3n Lee per_cpu_ptr(pool-\u0026gt;acomp_ctx, 1) (2) La tarea A se desprograma (3) La CPU n.\u00ba 1 se desconecta zswap_cpu_comp_dead(CPU n.\u00ba 1) Retiene per_cpu_ptr(pool-\u0026gt;acomp_ctx, 1)) Llama a crypto_free_acomp() Espera a scomp_lock (4) Tarea A ejecut\u00e1ndose en la CPU n.\u00ba 2: Espera a per_cpu_ptr(pool-\u0026gt;acomp_ctx, 1) // Lee en la CPU n.\u00ba 1 BLOQUEO INTERMEDIO Dado que no es necesario llamar a crypto_free_acomp() con el mutex acomp_ctx por CPU retenido en zswap_cpu_comp_dead(), mu\u00e9valo despu\u00e9s de que se desbloquee el mutex. Tambi\u00e9n se desplazan las llamadas acomp_request_free() y kfree() para mantener la coherencia y evitar posibles dependencias de bloqueo sutil en el futuro. Con esto, solo se establece el valor NULL de los campos acomp_ctx con el mutex retenido. Esto es similar a c\u00f3mo zswap_cpu_comp_prepare() solo inicializa los campos acomp_ctx con el mutex retenido, despu\u00e9s de realizar todas las asignaciones antes de retener el mutex. Oportunistamente, se desplaza la comprobaci\u00f3n de valores NULL en acomp_ctx para que se realice antes de la desreferencia del mutex.\"}],\"affected\":[{\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"affectedData\":[{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"unaffected\",\"programFiles\":[\"mm/zswap.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"8d29ff5d50304daa41dc3cfdda4a9d1e46cf5be1\",\"lessThan\":\"747e3eec1d7d124ea90ed3d7b85369df8b4e36d2\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"12dcb0ef540629a281533f9dedc1b6b8e14cfb65\",\"lessThan\":\"a8d18000e9d2d97aaf105f5f9b3b0e8a6fbf8b96\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"12dcb0ef540629a281533f9dedc1b6b8e14cfb65\",\"lessThan\":\"717d9c35deff6c33235693171bacbb03e9643fa4\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"12dcb0ef540629a281533f9dedc1b6b8e14cfb65\",\"lessThan\":\"c11bcbc0a517acf69282c8225059b2a8ac5fe628\",\"versionType\":\"git\",\"status\":\"affected\"},{\"version\":\"6.12.12\",\"lessThan\":\"6.12.23\",\"versionType\":\"semver\",\"status\":\"affected\"}]},{\"vendor\":\"Linux\",\"product\":\"Linux\",\"defaultStatus\":\"affected\",\"programFiles\":[\"mm/zswap.c\"],\"repo\":\"https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git\",\"versions\":[{\"version\":\"6.13\",\"status\":\"affected\"},{\"version\":\"0\",\"lessThan\":\"6.13\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.12.23\",\"lessThanOrEqual\":\"6.12.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.13.11\",\"lessThanOrEqual\":\"6.13.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.14.2\",\"lessThanOrEqual\":\"6.14.*\",\"versionType\":\"semver\",\"status\":\"unaffected\"},{\"version\":\"6.15\",\"lessThanOrEqual\":\"*\",\"versionType\":\"original_commit_for_fix\",\"status\":\"unaffected\"}]}]}],\"metrics\":{\"cvssMetricV31\":[{\"source\":\"nvd@nist.gov\",\"type\":\"Primary\",\"cvssData\":{\"version\":\"3.1\",\"vectorString\":\"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H\",\"baseScore\":5.5,\"baseSeverity\":\"MEDIUM\",\"attackVector\":\"LOCAL\",\"attackComplexity\":\"LOW\",\"privilegesRequired\":\"LOW\",\"userInteraction\":\"NONE\",\"scope\":\"UNCHANGED\",\"confidentialityImpact\":\"NONE\",\"integrityImpact\":\"NONE\",\"availabilityImpact\":\"HIGH\"},\"exploitabilityScore\":1.8,\"impactScore\":3.6}]},\"weaknesses\":[{\"source\":\"nvd@nist.gov\",\"type\":\"Primary\",\"description\":[{\"lang\":\"en\",\"value\":\"CWE-667\"}]}],\"configurations\":[{\"nodes\":[{\"operator\":\"OR\",\"negate\":false,\"cpeMatch\":[{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*\",\"versionStartIncluding\":\"6.12.12\",\"versionEndExcluding\":\"6.12.23\",\"matchCriteriaId\":\"C007FC9C-EF72-4E8D-B8AF-1F5CEBB036E0\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*\",\"versionStartIncluding\":\"6.13.1\",\"versionEndExcluding\":\"6.13.11\",\"matchCriteriaId\":\"A1ED3A9A-88AD-47D5-B428-93C7630E46F8\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*\",\"versionStartIncluding\":\"6.14\",\"versionEndExcluding\":\"6.14.2\",\"matchCriteriaId\":\"FADAE5D8-4808-442C-B218-77B2CE8780A0\"},{\"vulnerable\":true,\"criteria\":\"cpe:2.3:o:linux:linux_kernel:6.13:-:*:*:*:*:*:*\",\"matchCriteriaId\":\"5A3F9505-6B98-4269-8B81-127E55A1BF00\"}]}]}],\"references\":[{\"url\":\"https://git.kernel.org/stable/c/717d9c35deff6c33235693171bacbb03e9643fa4\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]},{\"url\":\"https://git.kernel.org/stable/c/747e3eec1d7d124ea90ed3d7b85369df8b4e36d2\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]},{\"url\":\"https://git.kernel.org/stable/c/a8d18000e9d2d97aaf105f5f9b3b0e8a6fbf8b96\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]},{\"url\":\"https://git.kernel.org/stable/c/c11bcbc0a517acf69282c8225059b2a8ac5fe628\",\"source\":\"416baaa9-dc9f-4396-8d5f-8c081fb06d67\",\"tags\":[\"Patch\"]}]}}",
    "redhat_vex": {
      "aggregate_severity": "Moderate",
      "current_release_date": "2026-06-30T00:44:15+00:00",
      "cve": "CVE-2025-22030",
      "id": "CVE-2025-22030",
      "initial_release_date": "2025-04-16T00:00:00+00:00",
      "product_status:known_affected": "28",
      "product_status:known_not_affected": "246",
      "source": "Red Hat CSAF VEX",
      "status": "final",
      "title": "kernel: mm: zswap: fix crypto_free_acomp() deadlock in zswap_cpu_comp_dead()",
      "url": "https://security.access.redhat.com/data/csaf/v2/vex/2025/cve-2025-22030.json",
      "version": "3"
    },
    "suse_vex": {
      "aggregate_severity": "moderate",
      "current_release_date": "2026-09-07T16:36:38Z",
      "cve": "CVE-2025-22030",
      "id": "CVE-2025-22030",
      "initial_release_date": "2025-04-18T01:24:00Z",
      "product_status:known_affected": "565",
      "product_status:known_not_affected": "256",
      "product_status:recommended": "400",
      "source": "SUSE CSAF VEX",
      "status": "interim",
      "title": "SUSE CVE CVE-2025-22030",
      "url": "https://ftp.suse.com/pub/projects/security/csaf-vex/cve-2025-22030.json",
      "version": "39"
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…

Related by attack behaviour

Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.


Loading…