{"id":"CVE-2026-102537","kind":"vulnerability","aliases":["CVE-2026-102537"],"related":[],"title":"BACnet Stack: Linux WebSocket client accepts self-signed hub certificates","description":"BACnet Stack is a BACnet open source protocol stack C library for embedded systems. Prior to versions 1.4.6, 1.5.2, and 1.6.1, bws_cli_connect() in ports/linux/websocket-cli.c loads the trusted CA cert into the libwebsockets context, then always sets LCCSCF_ALLOW_SELFSIGNED in the connection flags. So lws accepts any self-signed hub certificate, whether or not it chains to the loaded CA. A BACnet/SC node finishes the TLS handshake to a rogue hub that presents a self-signed cert. It then hands the attacker its identity (VMAC, UUID) and all later BACnet traffic. This issue has been patched in versions 1.4.6, 1.5.2, 1.6.1, and 1.7.0.","summary":"The BACnet Stack Linux WebSocket client accepts any self-signed certificate from a hub, even when it does not chain to the trusted CA. An attacker running a rogue hub can receive the node's identity and all later BACnet traffic.","severity":"high","cvss":7.7,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["bacnet","bacnet-sc","embedded","libwebsockets","linux","package"],"not_affected_if":["fixed-version","no-bacnet-sc","non-linux-port"],"how_to_check":"- Check the BACnet Stack version in use against the fixed versions below.\n- Look for `ports/linux/websocket-cli.c` in the build and confirm whether `LCCSCF_ALLOW_SELFSIGNED` is set in `bws_cli_connect()`.","fix":"- Move to `1.4.6`, `1.5.2`, `1.6.1`, or `1.7.0`, the versions the description names as patched.","status":"open","published_at":"2026-11-13T19:17:37+00:00","first_seen_at":"2026-11-13T19:52:09+00:00","triaged_at":"2026-11-13T19:54:08+00:00","updated_at":"2026-11-13T19:54:08+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-13T19:54:08Z","model":"claude-haiku-5-5","output":{"fix":"- Move to `1.4.6`, `1.5.2`, `1.6.1`, or `1.7.0`, the versions the description names as patched.","reach":"network","title":"BACnet Stack: Linux WebSocket client accepts self-signed hub certificates","impact":"high","summary":"The BACnet Stack Linux WebSocket client accepts any self-signed certificate from a hub, even when it does not chain to the trusted CA. An attacker running a rogue hub can receive the node's identity and all later BACnet traffic.","audience":"developers","category":"package","nicknames":[],"who_cares":["bacnet","bacnet-sc","embedded","linux","libwebsockets"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"Attacker impersonates hub and receives node identity and BACnet traffic.","analyst_note":"","how_to_check":"- Check the BACnet Stack version in use against the fixed versions below.\n- Look for `ports/linux/websocket-cli.c` in the build and confirm whether `LCCSCF_ALLOW_SELFSIGNED` is set in `bws_cli_connect()`.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["fixed-version","no-bacnet-sc","non-linux-port"],"who_is_affected":"Only builds that use the Linux WebSocket client in ports/linux/websocket-cli.c, which is used by BACnet/SC nodes. Systems that run other BACnet ports or do not use BACnet/SC are not described as affected. Teams that embed the library in BACnet/SC devices should check their version against the fixed releases.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"unknown"},"cost_usd":0.000776,"input_tokens":4731,"output_tokens":606,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-102537':14A,17A '-2026':13A,16A '1.4.6':85C,170C '1.5.2':86C,171C '1.6.1':88C,172C '1.7.0':174C 'accept':6A,32B,115C 'allow':107C 'alway':104C 'attack':52B,153C 'bacnet':1A,18B,20B,27B,66B,68C,72C,161C 'bacnet-sc':19B 'bacnet/sc':132C 'bws':89C 'c':77C 'ca':50B,97C,130C 'cert':98C,148C 'certif':11A,37B,121C 'chain':46B,126C 'cli':90C 'client':5A,31B 'connect':91C,111C 'context':102C 'cve':12A,15A 'embed':22B,80C 'even':41B 'finish':134C 'flag':112C 'hand':151C 'handshak':137C 'hub':10A,40B,56B,120C,141C 'ident':62B,155C 'issu':164C 'later':65B,160C 'lccscf':106C 'librari':78C 'libwebsocket':23B,101C 'linux':3A,24B,29B 'load':94C,129C 'lws':114C 'node':60B,133C 'open':73C 'packag':25B 'patch':167C 'ports/linux/websocket-cli.c':93C 'present':143C 'prior':82C 'protocol':75C 'receiv':58B 'rogu':55B,140C 'run':53B 'sc':21B 'self':8A,35B,118C,146C 'self-sign':7A,34B,117C,145C 'selfsign':108C 'set':105C 'sign':9A,36B,119C,147C 'sourc':74C 'stack':2A,28B,69C,76C 'system':81C 'tls':136C 'traffic':67B,162C 'trust':49B,96C 'uuid':157C 'version':84C,169C 'vmac':156C 'websocket':4A,30B 'whether':122C","nicknames":[],"mitigations":[],"who_affected":"Only builds that use the Linux WebSocket client in ports/linux/websocket-cli.c, which is used by BACnet/SC nodes. Systems that run other BACnet ports or do not use BACnet/SC are not described as affected. Teams that embed the library in BACnet/SC devices should check their version against the fixed releases.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["bacnet","bacnetsc","embedded","high","libwebsockets","linux","package"],"campaign_type":null,"search_a":"'-102537':14A,17A '-2026':13A,16A 'accept':6A 'bacnet':1A 'certif':11A 'client':5A 'cve':12A,15A 'hub':10A 'linux':3A 'self':8A 'self-sign':7A 'sign':9A 'stack':2A 'websocket':4A","search_b":"'accept':32B 'attack':52B 'bacnet':18B,20B,27B,66B 'bacnet-sc':19B 'ca':50B 'certif':37B 'chain':46B 'client':31B 'embed':22B 'even':41B 'hub':40B,56B 'ident':62B 'later':65B 'libwebsocket':23B 'linux':24B,29B 'node':60B 'packag':25B 'receiv':58B 'rogu':55B 'run':53B 'sc':21B 'self':35B 'self-sign':34B 'sign':36B 'stack':28B 'traffic':67B 'trust':49B 'websocket':30B","search_c":"'1.4.6':85C,170C '1.5.2':86C,171C '1.6.1':88C,172C '1.7.0':174C 'accept':115C 'allow':107C 'alway':104C 'attack':153C 'bacnet':68C,72C,161C 'bacnet/sc':132C 'bws':89C 'c':77C 'ca':97C,130C 'cert':98C,148C 'certif':121C 'chain':126C 'cli':90C 'connect':91C,111C 'context':102C 'embed':80C 'finish':134C 'flag':112C 'hand':151C 'handshak':137C 'hub':120C,141C 'ident':155C 'issu':164C 'later':160C 'lccscf':106C 'librari':78C 'libwebsocket':101C 'load':94C,129C 'lws':114C 'node':133C 'open':73C 'patch':167C 'ports/linux/websocket-cli.c':93C 'present':143C 'prior':82C 'protocol':75C 'rogu':140C 'self':118C,146C 'self-sign':117C,145C 'selfsign':108C 'set':105C 'sign':119C,147C 'sourc':74C 'stack':69C,76C 'system':81C 'tls':136C 'traffic':162C 'trust':96C 'uuid':157C 'version':84C,169C 'vmac':156C 'whether':122C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-10-04T10:38:14+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:A/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-102537","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-102537","severity":null,"published_at":"2026-11-13T19:17:37+00:00","modified_at":"2026-11-13T19:17:37+00:00","first_seen_at":"2026-11-13T19:52:09+00:00","fetched_at":"2026-11-13T19:52:09+00:00","note":null}],"documents":[{"id":149126,"url":"https://github.com/bacnet-stack/bacnet-stack/security/advisories/GHSA-jgm4-2wg9-jwfg","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-10-04T10:38:14+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}