CVE-2026-95625 (GCVE-0-2026-95625)
Vulnerability from cvelistv5
Published
2026-09-23 08:51
Modified
2026-09-23 14:10
CWE
  • CWE-354 - Improper Validation of Integrity Check Value
Summary
The Tauri updater plugin verifies update binaries using minisign signatures, but the signature covers only the raw binary bytes. The update manifest -- which contains the version number, download URL, and signature -- is fetched over TLS but is never itself signed or authenticated. Because the only anti-rollback check compares the manifest's version field against the current version, and that field is unsigned, an attacker who can serve a crafted manifest can force installation of any older signed release without possessing the developer's private key.
Impacted products
Vendor Product Version
Tauri tauri-plugin-updater Version: 2.0.0   ≤
Version: 2.12.0   ≤ *
Create a notification for this product.
Show details on NVD website


{
  "containers": {
    "adp": [
      {
        "metrics": [
          {
            "other": {
              "content": {
                "id": "CVE-2026-95625",
                "options": [
                  {
                    "Exploitation": "none"
                  },
                  {
                    "Automatable": "no"
                  },
                  {
                    "Technical Impact": "total"
                  }
                ],
                "role": "CISA Coordinator",
                "timestamp": "2026-09-23T14:07:42.715205Z",
                "version": "2.0.3"
              },
              "type": "ssvc"
            }
          }
        ],
        "providerMetadata": {
          "dateUpdated": "2026-09-23T14:10:35.332Z",
          "orgId": "134c704f-9b21-4f2e-91b3-4a467353bcc0",
          "shortName": "CISA-ADP"
        },
        "title": "CISA ADP Vulnrichment"
      }
    ],
    "cna": {
      "affected": [
        {
          "collectionURL": "https://crates.io/crates/tauri-plugin-updater",
          "defaultStatus": "unaffected",
          "packageName": "tauri-plugin-updater",
          "product": "tauri-plugin-updater",
          "programFiles": [
            "plugins/updater/src/updater.rs",
            "plugins/updater/src/config.rs"
          ],
          "repo": "git://github.com/tauri-apps/plugins-workspace",
          "vendor": "Tauri",
          "versions": [
            {
              "lessThan": "2.12.0",
              "status": "affected",
              "version": "2.0.0",
              "versionType": "semver"
            },
            {
              "lessThanOrEqual": "*",
              "status": "affected",
              "version": "2.12.0",
              "versionType": "semver"
            }
          ]
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Yuval Moravchick"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "JFrog Security Research"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eThe Tauri updater plugin verifies update binaries using minisign signatures, but the signature covers only the raw binary bytes. The update manifest -- which contains the version number, download URL, and signature -- is fetched over TLS but is never itself signed or authenticated. Because the only anti-rollback check compares the manifest\u0027s version field against the current version, and that field is unsigned, an attacker who can serve a crafted manifest can force installation of any older signed release without possessing the developer\u0027s private key.\u003c/p\u003e"
            }
          ],
          "value": "The Tauri updater plugin verifies update binaries using minisign signatures, but the signature covers only the raw binary bytes. The update manifest -- which contains the version number, download URL, and signature -- is fetched over TLS but is never itself signed or authenticated. Because the only anti-rollback check compares the manifest\u0027s version field against the current version, and that field is unsigned, an attacker who can serve a crafted manifest can force installation of any older signed release without possessing the developer\u0027s private key."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "attackComplexity": "HIGH",
            "attackVector": "NETWORK",
            "availabilityImpact": "NONE",
            "baseScore": 5.9,
            "baseSeverity": "MEDIUM",
            "confidentialityImpact": "HIGH",
            "integrityImpact": "HIGH",
            "privilegesRequired": "HIGH",
            "scope": "UNCHANGED",
            "userInteraction": "NONE",
            "vectorString": "CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:N",
            "version": "3.1"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "GENERAL"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-354",
              "description": "CWE-354: Improper Validation of Integrity Check Value",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-09-23T08:51:53.922Z",
        "orgId": "48a46f29-ae42-4e1d-90dd-c1676c1e5e6d",
        "shortName": "JFROG"
      },
      "references": [
        {
          "name": "GHSA-j38x-g3m3-95fr (tauri-apps/plugins-workspace)",
          "tags": [
            "issue-tracking"
          ],
          "url": "https://github.com/tauri-apps/plugins-workspace/security/advisories/GHSA-j38x-g3m3-95fr"
        },
        {
          "name": "tauri-apps/plugins-workspace repository",
          "tags": [
            "product"
          ],
          "url": "https://github.com/tauri-apps/plugins-workspace"
        },
        {
          "name": "Add requireSignedVersion to bind an update to its signed version",
          "tags": [
            "patch"
          ],
          "url": "https://github.com/tauri-apps/plugins-workspace/commit/690dcfd694"
        },
        {
          "name": "tauri-plugin-updater 2.12.0 release notes",
          "tags": [
            "release-notes"
          ],
          "url": "https://github.com/tauri-apps/plugins-workspace/releases/tag/updater-v2.12.0"
        }
      ],
      "solutions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eaddressed in tauri-plugin-updater 2.12.0, and it has to be switched on. The new requireSignedVersion option compares the version announced by the endpoint against the version recorded in the signature\u0027s trusted comment, which the signature does cover, and rejects the update when they differ.\u003c/p\u003e"
            }
          ],
          "value": "addressed in tauri-plugin-updater 2.12.0, and it has to be switched on. The new requireSignedVersion option compares the version announced by the endpoint against the version recorded in the signature\u0027s trusted comment, which the signature does cover, and rejects the update when they differ."
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "timeline": [
        {
          "lang": "en",
          "time": "2026-09-01T13:31:00.000Z",
          "value": "Reported to the Tauri team as GHSA-j38x-g3m3-95fr"
        },
        {
          "lang": "en",
          "time": "2026-09-19T23:57:00.000Z",
          "value": "Opt-in fix released in tauri-plugin-updater 2.12.0, commit 690dcfd694, adding the requireSignedVersion option"
        }
      ],
      "title": "Tauri framework v2 missing updater signature version number validation can be exploited into forced downgrade",
      "x_generator": {
        "engine": "Vulnogram 1.0.5"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "48a46f29-ae42-4e1d-90dd-c1676c1e5e6d",
    "assignerShortName": "JFROG",
    "cveId": "CVE-2026-95625",
    "datePublished": "2026-09-23T08:51:53.922Z",
    "dateReserved": "2026-09-22T10:38:03.883Z",
    "dateUpdated": "2026-09-23T14:10:35.332Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "vulnrichment": {
      "containers": "{\"adp\": [{\"title\": \"CISA ADP Vulnrichment\", \"metrics\": [{\"other\": {\"type\": \"ssvc\", \"content\": {\"id\": \"CVE-2026-95625\", \"role\": \"CISA Coordinator\", \"options\": [{\"Exploitation\": \"none\"}, {\"Automatable\": \"no\"}, {\"Technical Impact\": \"total\"}], \"version\": \"2.0.3\", \"timestamp\": \"2026-09-23T14:07:42.715205Z\"}}}], \"providerMetadata\": {\"orgId\": \"134c704f-9b21-4f2e-91b3-4a467353bcc0\", \"shortName\": \"CISA-ADP\", \"dateUpdated\": \"2026-09-23T14:10:32.174Z\"}}], \"cna\": {\"title\": \"Tauri framework v2 missing updater signature version number validation can be exploited into forced downgrade\", \"source\": {\"discovery\": \"EXTERNAL\"}, \"credits\": [{\"lang\": \"en\", \"type\": \"finder\", \"value\": \"Yuval Moravchick\"}, {\"lang\": \"en\", \"type\": \"coordinator\", \"value\": \"JFrog Security Research\"}], \"metrics\": [{\"format\": \"CVSS\", \"cvssV3_1\": {\"scope\": \"UNCHANGED\", \"version\": \"3.1\", \"baseScore\": 5.9, \"attackVector\": \"NETWORK\", \"baseSeverity\": \"MEDIUM\", \"vectorString\": \"CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:U/C:H/I:H/A:N\", \"integrityImpact\": \"HIGH\", \"userInteraction\": \"NONE\", \"attackComplexity\": \"HIGH\", \"availabilityImpact\": \"NONE\", \"privilegesRequired\": \"HIGH\", \"confidentialityImpact\": \"HIGH\"}, \"scenarios\": [{\"lang\": \"en\", \"value\": \"GENERAL\"}]}], \"affected\": [{\"repo\": \"git://github.com/tauri-apps/plugins-workspace\", \"vendor\": \"Tauri\", \"product\": \"tauri-plugin-updater\", \"versions\": [{\"status\": \"affected\", \"version\": \"2.0.0\", \"lessThan\": \"2.12.0\", \"versionType\": \"semver\"}, {\"status\": \"affected\", \"version\": \"2.12.0\", \"versionType\": \"semver\", \"lessThanOrEqual\": \"*\"}], \"packageName\": \"tauri-plugin-updater\", \"programFiles\": [\"plugins/updater/src/updater.rs\", \"plugins/updater/src/config.rs\"], \"collectionURL\": \"https://crates.io/crates/tauri-plugin-updater\", \"defaultStatus\": \"unaffected\"}], \"timeline\": [{\"lang\": \"en\", \"time\": \"2026-09-01T13:31:00.000Z\", \"value\": \"Reported to the Tauri team as GHSA-j38x-g3m3-95fr\"}, {\"lang\": \"en\", \"time\": \"2026-09-19T23:57:00.000Z\", \"value\": \"Opt-in fix released in tauri-plugin-updater 2.12.0, commit 690dcfd694, adding the requireSignedVersion option\"}], \"solutions\": [{\"lang\": \"en\", \"value\": \"addressed in tauri-plugin-updater 2.12.0, and it has to be switched on. The new requireSignedVersion option compares the version announced by the endpoint against the version recorded in the signature\u0027s trusted comment, which the signature does cover, and rejects the update when they differ.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"\u003cp\u003eaddressed in tauri-plugin-updater 2.12.0, and it has to be switched on. The new requireSignedVersion option compares the version announced by the endpoint against the version recorded in the signature\u0027s trusted comment, which the signature does cover, and rejects the update when they differ.\u003c/p\u003e\", \"base64\": false}]}], \"references\": [{\"url\": \"https://github.com/tauri-apps/plugins-workspace/security/advisories/GHSA-j38x-g3m3-95fr\", \"name\": \"GHSA-j38x-g3m3-95fr (tauri-apps/plugins-workspace)\", \"tags\": [\"issue-tracking\"]}, {\"url\": \"https://github.com/tauri-apps/plugins-workspace\", \"name\": \"tauri-apps/plugins-workspace repository\", \"tags\": [\"product\"]}, {\"url\": \"https://github.com/tauri-apps/plugins-workspace/commit/690dcfd694\", \"name\": \"Add requireSignedVersion to bind an update to its signed version\", \"tags\": [\"patch\"]}, {\"url\": \"https://github.com/tauri-apps/plugins-workspace/releases/tag/updater-v2.12.0\", \"name\": \"tauri-plugin-updater 2.12.0 release notes\", \"tags\": [\"release-notes\"]}], \"x_generator\": {\"engine\": \"Vulnogram 1.0.5\"}, \"descriptions\": [{\"lang\": \"en\", \"value\": \"The Tauri updater plugin verifies update binaries using minisign signatures, but the signature covers only the raw binary bytes. The update manifest -- which contains the version number, download URL, and signature -- is fetched over TLS but is never itself signed or authenticated. Because the only anti-rollback check compares the manifest\u0027s version field against the current version, and that field is unsigned, an attacker who can serve a crafted manifest can force installation of any older signed release without possessing the developer\u0027s private key.\", \"supportingMedia\": [{\"type\": \"text/html\", \"value\": \"\u003cp\u003eThe Tauri updater plugin verifies update binaries using minisign signatures, but the signature covers only the raw binary bytes. The update manifest -- which contains the version number, download URL, and signature -- is fetched over TLS but is never itself signed or authenticated. Because the only anti-rollback check compares the manifest\u0027s version field against the current version, and that field is unsigned, an attacker who can serve a crafted manifest can force installation of any older signed release without possessing the developer\u0027s private key.\u003c/p\u003e\", \"base64\": false}]}], \"problemTypes\": [{\"descriptions\": [{\"lang\": \"en\", \"type\": \"CWE\", \"cweId\": \"CWE-354\", \"description\": \"CWE-354: Improper Validation of Integrity Check Value\"}]}], \"providerMetadata\": {\"orgId\": \"48a46f29-ae42-4e1d-90dd-c1676c1e5e6d\", \"shortName\": \"JFROG\", \"dateUpdated\": \"2026-09-23T08:51:53.922Z\"}}}",
      "cveMetadata": "{\"cveId\": \"CVE-2026-95625\", \"state\": \"PUBLISHED\", \"dateUpdated\": \"2026-09-23T14:10:35.332Z\", \"dateReserved\": \"2026-09-22T10:38:03.883Z\", \"assignerOrgId\": \"48a46f29-ae42-4e1d-90dd-c1676c1e5e6d\", \"datePublished\": \"2026-09-23T08:51:53.922Z\", \"assignerShortName\": \"JFROG\"}",
      "dataType": "CVE_RECORD",
      "dataVersion": "5.2"
    }
  }
}


Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Sightings

Author Source Type Date

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or seen somewhere by the user.
  • Confirmed: The vulnerability is confirmed from an analyst perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: This vulnerability was exploited and seen by the user reporting the sighting.
  • Patched: This vulnerability was successfully patched by the user reporting the sighting.
  • Not exploited: This vulnerability was not exploited or seen by the user reporting the sighting.
  • Not confirmed: The user expresses doubt about the veracity of the vulnerability.
  • Not patched: This vulnerability was not successfully patched by the user reporting the sighting.


Loading…

Loading…