Security Vulnerability Report
中文
CVE-2025-66038 CVSS 3.9 LOW

CVE-2025-66038

Published: 2026-03-30 18:16:18
Last Modified: 2026-04-01 17:40:36

Description

OpenSC is an open source smart card tools and middleware. Prior to version 0.27.0, sc_compacttlv_find_tag searches a compact-TLV buffer for a given tag. In compact-TLV, a single byte encodes the tag (high nibble) and value length (low nibble). With a 1-byte buffer {0x0A}, the encoded element claims tag=0 and length=10 but no value bytes follow. Calling sc_compacttlv_find_tag with search tag 0x00 returns a pointer equal to buf+1 and outlen=10 without verifying that the claimed value length fits within the remaining buffer. In cases where the sc_compacttlv_find_tag is provided untrusted data (such as being read from cards/files), attackers may be able to influence it to return out-of-bounds pointers leading to downstream memory corruption when subsequent code tries to dereference the pointer. This issue has been patched in version 0.27.0.

CVSS Details

CVSS Score
3.9
Severity
LOW
CVSS Vector
CVSS:3.1/AV:P/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L

Configurations (Affected Products)

cpe:2.3:a:opensc_project:opensc:*:*:*:*:*:*:*:* - VULNERABLE
OpenSC < 0.27.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
/* * PoC Concept for CVE-2025-66038 * This C code demonstrates the condition that triggers the vulnerability. */ #include <stdio.h> #include <stdlib.h> // Mocking the vulnerable function signature int sc_compacttlv_find_tag_vulnerable(const unsigned char *buf, size_t buflen, unsigned int tag_in, const unsigned char **buf_out, size_t *len_out) { // Simplified vulnerable logic if (buflen < 1) return -1; unsigned char first_byte = buf[0]; unsigned char current_tag = first_byte >> 4; unsigned char current_len = first_byte & 0x0F; if (current_tag == tag_in) { // VULNERABILITY: Does not check if current_len fits in (buflen - 1) *buf_out = buf + 1; *len_out = current_len; return 0; // Success } return -1; // Not found } int main() { // Malicious input: Tag 0x0, Length 10 (0xA), but buffer size is only 1 byte unsigned char malicious_buffer[] = {0x0A}; const unsigned char *result_ptr = NULL; size_t result_len = 0; printf("Attempting to parse malicious buffer...\n"); int ret = sc_compacttlv_find_tag_vulnerable(malicious_buffer, sizeof(malicious_buffer), 0x00, &result_ptr, &result_len); if (ret == 0) { printf("Tag found. Pointer: %p, Length: %zu\n", result_ptr, result_len); // The following access would cause an out-of-bounds read // printf("Value: %x\n", *result_ptr); printf("Out-of-bounds read prevented in this demo.\n"); } return 0; }

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-66038", "sourceIdentifier": "[email protected]", "published": "2026-03-30T18:16:18.177", "lastModified": "2026-04-01T17:40:36.183", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "OpenSC is an open source smart card tools and middleware. Prior to version 0.27.0, sc_compacttlv_find_tag searches a compact-TLV buffer for a given tag. In compact-TLV, a single byte encodes the tag (high nibble) and value length (low nibble). With a 1-byte buffer {0x0A}, the encoded element claims tag=0 and length=10 but no value bytes follow. Calling sc_compacttlv_find_tag with search tag 0x00 returns a pointer equal to buf+1 and outlen=10 without verifying that the claimed value length fits within the remaining buffer. In cases where the sc_compacttlv_find_tag is provided untrusted data (such as being read from cards/files), attackers may be able to influence it to return out-of-bounds pointers leading to downstream memory corruption when subsequent code tries to dereference the pointer. This issue has been patched in version 0.27.0."}, {"lang": "es", "value": "OpenSC es un conjunto de herramientas y middleware de código abierto para tarjetas inteligentes. Antes de la versión 0.27.0, sc_compacttlv_find_tag busca una etiqueta dada en un búfer compact-TLV. En compact-TLV, un solo byte codifica la etiqueta (nibble superior) y la longitud del valor (nibble inferior). Con un búfer de 1 byte {0x0A}, el elemento codificado declara etiqueta=0 y longitud=10 pero no le siguen bytes de valor. Llamar a sc_compacttlv_find_tag con la etiqueta de búsqueda 0x00 devuelve un puntero igual a buf+1 y outlen=10 sin verificar que la longitud de valor declarada cabe dentro del búfer restante. En los casos en que a sc_compacttlv_find_tag se le proporcionan datos no confiables (como los leídos de tarjetas/archivos), los atacantes pueden influir en ella para que devuelva punteros fuera de los límites, lo que lleva a una corrupción de memoria posterior cuando el código subsiguiente intenta desreferenciar el puntero. Este problema ha sido corregido en la versión 0.27.0."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:P/AC:H/PR:N/UI:N/S:U/C:L/I:L/A:L", "baseScore": 3.9, "baseSeverity": "LOW", "attackVector": "PHYSICAL", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "LOW", "integrityImpact": "LOW", "availabilityImpact": "LOW"}, "exploitabilityScore": 0.5, "impactScore": 3.4}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:P/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", "baseScore": 6.8, "baseSeverity": "MEDIUM", "attackVector": "PHYSICAL", "attackComplexity": "LOW", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 0.9, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-126"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:opensc_project:opensc:*:*:*:*:*:*:*:*", "versionEndExcluding": "0.27.0", "matchCriteriaId": "D890677F-5379-4587-B8E7-D38B02AD525A"}]}]}], "references": [{"url": "https://github.com/OpenSC/OpenSC/commit/6db171bcb6fd7cb3b51098fefbb3b28e44f0a79c", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/OpenSC/OpenSC/security/advisories/GHSA-72x5-fwjx-2459", "source": "[email protected]", "tags": ["Exploit", "Vendor Advisory"]}, {"url": "https://github.com/OpenSC/OpenSC/wiki/CVE-2025-66038", "source": "[email protected]", "tags": ["Vendor Advisory"]}]}}