{"record":{"id":"86b5e7c372df6a3d","repo":"CloakHQ/CloakBrowser","slug":"exc","errorCode":null,"errorMessage":"{exc}","messagePattern":"\\{exc\\}","errorType":"exception","errorClass":"BinaryVerificationError","httpStatus":null,"severity":"critical","filePath":"cloakbrowser/download.py","lineNumber":591,"sourceCode":"            f\"{base}/SHA256SUMS.sig\", follow_redirects=True, timeout=10.0\n        )\n        sig_resp.raise_for_status()\n    except Exception as exc:\n        # Fetch failure is transient, not tampering — raise a plain RuntimeError\n        # (the router reports it as \"unavailable, retry\") rather than a\n        # BinaryVerificationError (which it surfaces as a tampering signal).\n        raise RuntimeError(\n            f\"Could not fetch the signed SHA256SUMS for Pro {version} ({exc})\"\n        ) from exc\n\n    manifest_bytes = manifest_resp.content\n    # _verify_signature / _verify_checksum raise plain RuntimeError; convert to\n    # BinaryVerificationError so the Pro router treats them as tampering signals\n    # (re-raise) rather than transient failures (fall back to free).\n    try:\n        _verify_signature(manifest_bytes, sig_resp.content)\n    except RuntimeError as exc:\n        raise BinaryVerificationError(str(exc)) from exc\n    manifest_text = manifest_bytes.decode(\"utf-8\")\n\n    # Version binding: same forced-downgrade defense as the official path.\n    declared = _parse_manifest_version(manifest_text)\n    if declared != version:\n        raise BinaryVerificationError(\n            f\"Version mismatch in signed Pro SHA256SUMS: requested {version}, \"\n            f\"manifest declares {declared or 'none'}. Refusing (possible downgrade).\"\n        )\n\n    tarball_name = get_archive_name()\n    expected = _parse_checksums(manifest_text).get(tarball_name)\n    if expected is None:\n        raise BinaryVerificationError(\n            f\"Signature-verified Pro SHA256SUMS has no entry for {tarball_name} — \"\n            f\"cannot confirm binary integrity.\"\n        )\n    try:","sourceCodeStart":573,"sourceCodeEnd":609,"githubUrl":"https://github.com/CloakHQ/CloakBrowser/blob/d6bad5de261bedf025280ace1d14e800aee13923/cloakbrowser/download.py#L573-L609","documentation":"The Pro SHA256SUMS manifest's signature failed verification; the underlying RuntimeError message is re-wrapped as BinaryVerificationError so the Pro router treats it as a tampering signal (abort), not a transient failure.","triggerScenarios":"_verify_signature(manifest_bytes, sig_resp.content) failing during a Pro download — wrong/invalid signature over the manifest.","commonSituations":"MITM or compromised mirror serving altered manifests; CDN misconfiguration; signature key rotation mismatch with an old client.","solutions":["Do not retry blindly — verify your network path (DNS, proxy, TLS)","Update cloakbrowser to the latest version in case of signing key rotation","Report the incident upstream — this indicates authenticity failure"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"from cloakbrowser.download import BinaryVerificationError\ntry:\n    install()\nexcept BinaryVerificationError as e:\n    security_alert(f\"Pro manifest signature failure: {e}\")\n    raise  # never bypass","preventionTips":["Never catch-and-continue BinaryVerificationError","Audit DNS/TLS paths when it fires — suspect MITM","Keep the library updated for signing-key rotations"],"tags":["security","signature","tampering","verification"],"backgroundTag":"signature-verification-failed","analyzedSha":"d6bad5de261bedf025280ace1d14e800aee13923","analyzedAt":"2026-08-28T14:13:12.918Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}