{"id":"CVE-2026-90832","kind":"vulnerability","aliases":["CVE-2026-90832"],"related":[],"title":"Zephyr Bluetooth: periodic advertising report over-reads adjacent HCI memory into apps","description":"bt_hci_le_per_adv_report_common() in subsys/bluetooth/host/scan.c handles the HCI_LE_Periodic_Advertising_Report (and _v2) event. It verified that the fixed event header was present and that the controller-declared Data_Length fits the tailroom of the periodic-sync reassembly buffer, but never checked that the event actually carried as many data bytes as evt->length claims. Both reassembly paths — DATA_STATUS_PARTIAL, and DATA_STATUS_COMPLETE while a chain is already in progress — then called net_buf_simple_add_mem(&per_adv_sync->reassembly, buf->data, evt->length), copying up to 255 bytes starting past the end of the event's real payload.\n\nThe Data_Length field originates in the HCI controller, so the flaw is reachable in host-only/split builds where the controller is a separate part reached over H4 UART, SPI, USB or an inter-core IPC transport: a malicious, compromised or buggy controller (or an attacker able to inject on that link) can send a report declaring a length larger than the event payload. The generic event dispatcher in subsys/bluetooth/host/hci_core.c only enforces a per-event minimum length and never cross-checks the subevent's internal length field, so nothing else catches it. Builds using Zephyr's own in-image controller are not affected, because the controller always emits a length matching the bytes it appends.\n\nExploitation additionally requires CONFIG_BT_PER_ADV_SYNC with CONFIG_BT_PER_ADV_SYNC_BUF_SIZE > 0 (the option defaults to 0, which compiles the reassembly block out; LE Audio broadcast-sink and Public Broadcast Profile applications that reassemble fragmented periodic advertising data set it), and an established periodic advertising sync.\n\nThe consequence is an out-of-bounds read of adjacent HCI RX-pool memory — including stale contents of previously received HCI events — which is copied into the reassembly buffer and then delivered to every registered bt_le_per_adv_sync_cb.recv listener as if it were received advertising data, so the disclosed memory becomes application-visible and may be forwarded off-device. The write side remains in bounds because the tailroom check uses the same length value, so there is no memory corruption; impact is limited to information disclosure and undefined behaviour on the over-read. The fix drops any report whose declared length exceeds the remaining event payload, matching the guard already present in the extended and legacy advertising report handlers.","summary":"Zephyr's Bluetooth host copies more bytes than a periodic advertising report actually contains when reassembling fragmented data, reading past the event payload. A malicious or compromised Bluetooth controller on a split host/controller build can make that stale adjacent memory reach application callbacks, where it may be forwarded off-device.","severity":"medium","cvss":4.3,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["bluetooth","embedded","le-audio","runtime","zephyr"],"not_affected_if":["buf-size-zero","in-image-controller","per-adv-sync-disabled"],"how_to_check":"- Check whether the build uses a separate Bluetooth controller (H4 UART, SPI, USB or IPC) rather than Zephyr's in-image controller.\n- Check whether `CONFIG_BT_PER_ADV_SYNC` is enabled and `CONFIG_BT_PER_ADV_SYNC_BUF_SIZE` is greater than `0`.\n- Check the Zephyr version in use against the fixed release in the advisory.","fix":null,"status":"open","published_at":"2026-11-10T22:21:14+00:00","first_seen_at":"2026-11-10T22:27:31+00:00","triaged_at":"2026-11-10T22:31:02+00:00","updated_at":"2026-11-10T22:31:02+00:00","category":"runtime","confidence":0.7,"triage":{"at":"2026-11-10T22:31:02Z","model":"claude-haiku-5-5","output":{"fix":"unknown","reach":"local","title":"Zephyr Bluetooth: periodic advertising report over-reads adjacent HCI memory into apps","impact":"low","summary":"Zephyr's Bluetooth host copies more bytes than a periodic advertising report actually contains when reassembling fragmented data, reading past the event payload. A malicious or compromised Bluetooth controller on a split host/controller build can make that stale adjacent memory reach application callbacks, where it may be forwarded off-device.","audience":"developers","category":"runtime","nicknames":[],"who_cares":["zephyr","bluetooth","embedded","le-audio"],"confidence":0.7,"fix_status":"unknown","needs_auth":"unknown","worst_case":"Stale memory from adjacent HCI buffers is disclosed to application callbacks","analyst_note":"Confirm the fixed Zephyr release and the affected version ranges from the NVD and vendor advisory pages linked in the sources.","how_to_check":"- Check whether the build uses a separate Bluetooth controller (H4 UART, SPI, USB or IPC) rather than Zephyr's in-image controller.\n- Check whether `CONFIG_BT_PER_ADV_SYNC` is enabled and `CONFIG_BT_PER_ADV_SYNC_BUF_SIZE` is greater than `0`.\n- Check the Zephyr version in use against the fixed release in the advisory.","plain_action":"","product_name":"","needs_analyst":true,"not_affected_if":["in-image-controller","per-adv-sync-disabled","buf-size-zero"],"who_is_affected":"Only builds where the Bluetooth host runs separately from the controller chip and periodic advertising sync reassembly is compiled in, which is typical of LE Audio broadcast sink and Public Broadcast Profile applications. Builds using Zephyr's in-image controller are not affected, and builds with the reassembly option left at its default of 0 are not affected. Teams running only standard firmware without these options can skip it.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000899,"input_tokens":5344,"output_tokens":729,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-2026':15A,18A '-90832':16A,19A '/split':205C '0':324C,329C '255':175C 'abl':236C 'actual':39B,130C 'add':162C 'addit':309C 'adjac':9A,65B,370C 'adv':82C,165C,314C,320C 'advertis':4A,37B,92C,350C,358C,404C,479C 'affect':295C 'alreadi':154C,472C 'alway':299C 'app':13A 'append':307C 'applic':68B,345C,412C 'application-vis':411C 'attack':235C 'audio':24B,337C 'becom':410C 'behaviour':450C 'block':334C 'bluetooth':2A,20B,29B,54B 'bound':367C,426C 'broadcast':339C,343C 'broadcast-sink':338C 'bt':78C,312C,318C 'bt_le_per_adv_sync_cb.recv':397C 'buf':160C,168C,322C 'buffer':123C,390C 'buggi':231C 'build':60B,206C,284C 'byte':33B,135C,176C,305C 'call':158C 'callback':69B 'carri':131C 'catch':282C 'chain':152C 'check':126C,272C,430C 'claim':139C 'common':84C 'compil':331C 'complet':149C 'compromis':53B,229C 'config':311C,317C 'consequ':361C 'contain':40B 'content':378C 'control':55B,110C,195C,209C,232C,292C,298C 'controller-declar':109C 'copi':31B,172C,386C 'core':224C 'corrupt':441C 'cross':271C 'cross-check':270C 'cve':14A,17A 'data':44B,112C,134C,143C,147C,169C,188C,351C,405C 'declar':111C,246C,462C 'default':327C 'deliv':393C 'devic':77B,420C 'disclos':408C 'disclosur':447C 'dispatch':257C 'drop':458C 'els':281C 'embed':21B 'emit':300C 'end':180C 'enforc':261C 'establish':356C 'event':48B,96C,102C,129C,183C,252C,256C,265C,383C,467C 'everi':395C 'evt':137C,170C 'exceed':464C 'exploit':308C 'extend':476C 'field':190C,278C 'fit':114C 'fix':101C,457C 'flaw':198C 'forward':74B,417C 'fragment':43B,348C 'generic':255C 'guard':471C 'h4':216C 'handl':87C 'handler':481C 'hci':10A,79C,89C,194C,371C,382C 'header':103C 'host':30B,203C 'host-on':202C 'host/controller':59B 'imag':291C 'impact':442C 'in-imag':289C 'includ':376C 'inform':446C 'inject':238C 'inter':223C 'inter-cor':222C 'intern':276C 'ipc':225C 'larger':249C 'le':23B,80C,90C,336C 'le-audio':22B 'legaci':478C 'length':113C,138C,171C,189C,248C,267C,277C,302C,434C,463C 'limit':444C 'link':241C 'listen':398C 'make':62B 'malici':51B,228C 'mani':133C 'match':303C,469C 'may':72B,415C 'mem':163C 'memori':11A,66B,375C,409C,440C 'minimum':266C 'net':159C 'never':125C,269C 'noth':280C 'off-devic':75B,418C 'option':326C 'origin':191C 'out-of-bound':364C 'over-read':6A,453C 'part':213C 'partial':145C 'past':46B,178C 'path':142C 'payload':49B,186C,253C,468C 'per':81C,164C,264C,313C,319C 'per-ev':263C 'period':3A,36B,91C,120C,349C,357C 'periodic-sync':119C 'pool':374C 'present':105C,473C 'previous':380C 'profil':344C 'progress':156C 'public':342C 'reach':67B,214C 'reachabl':200C 'read':8A,45B,368C,455C 'real':185C 'reassembl':42B,122C,141C,167C,333C,347C,389C 'receiv':381C,403C 'regist':396C 'remain':424C,466C 'report':5A,38B,83C,93C,245C,460C,480C 'requir':310C 'runtim':25B 'rx':373C 'rx-pool':372C 'send':243C 'separ':212C 'set':352C 'side':423C 'simpl':161C 'sink':340C 'size':323C 'spi':218C 'split':58B 'stale':64B,377C 'start':177C 'status':144C,148C 'subev':274C 'subsys/bluetooth/host/hci_core.c':259C 'subsys/bluetooth/host/scan.c':86C 'sync':121C,166C,315C,321C,359C 'tailroom':116C,429C 'transport':226C 'uart':217C 'undefin':449C 'usb':219C 'use':285C,431C 'v2':95C 'valu':435C 'verifi':98C 'visibl':413C 'whose':461C 'write':422C 'zephyr':1A,26B,27B,286C","nicknames":[],"mitigations":[],"who_affected":"Only builds where the Bluetooth host runs separately from the controller chip and periodic advertising sync reassembly is compiled in, which is typical of LE Audio broadcast sink and Public Broadcast Profile applications. Builds using Zephyr's in-image controller are not affected, and builds with the reassembly option left at its default of 0 are not affected. Teams running only standard firmware without these options can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"unknown","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["bluetooth","embedded","leaudio","medium","runtime","zephyr"],"campaign_type":null,"search_a":"'-2026':15A,18A '-90832':16A,19A 'adjac':9A 'advertis':4A 'app':13A 'bluetooth':2A 'cve':14A,17A 'hci':10A 'memori':11A 'over-read':6A 'period':3A 'read':8A 'report':5A 'zephyr':1A","search_b":"'actual':39B 'adjac':65B 'advertis':37B 'applic':68B 'audio':24B 'bluetooth':20B,29B,54B 'build':60B 'byte':33B 'callback':69B 'compromis':53B 'contain':40B 'control':55B 'copi':31B 'data':44B 'devic':77B 'embed':21B 'event':48B 'forward':74B 'fragment':43B 'host':30B 'host/controller':59B 'le':23B 'le-audio':22B 'make':62B 'malici':51B 'may':72B 'memori':66B 'off-devic':75B 'past':46B 'payload':49B 'period':36B 'reach':67B 'read':45B 'reassembl':42B 'report':38B 'runtim':25B 'split':58B 'stale':64B 'zephyr':26B,27B","search_c":"'/split':205C '0':324C,329C '255':175C 'abl':236C 'actual':130C 'add':162C 'addit':309C 'adjac':370C 'adv':82C,165C,314C,320C 'advertis':92C,350C,358C,404C,479C 'affect':295C 'alreadi':154C,472C 'alway':299C 'append':307C 'applic':345C,412C 'application-vis':411C 'attack':235C 'audio':337C 'becom':410C 'behaviour':450C 'block':334C 'bound':367C,426C 'broadcast':339C,343C 'broadcast-sink':338C 'bt':78C,312C,318C 'bt_le_per_adv_sync_cb.recv':397C 'buf':160C,168C,322C 'buffer':123C,390C 'buggi':231C 'build':206C,284C 'byte':135C,176C,305C 'call':158C 'carri':131C 'catch':282C 'chain':152C 'check':126C,272C,430C 'claim':139C 'common':84C 'compil':331C 'complet':149C 'compromis':229C 'config':311C,317C 'consequ':361C 'content':378C 'control':110C,195C,209C,232C,292C,298C 'controller-declar':109C 'copi':172C,386C 'core':224C 'corrupt':441C 'cross':271C 'cross-check':270C 'data':112C,134C,143C,147C,169C,188C,351C,405C 'declar':111C,246C,462C 'default':327C 'deliv':393C 'devic':420C 'disclos':408C 'disclosur':447C 'dispatch':257C 'drop':458C 'els':281C 'emit':300C 'end':180C 'enforc':261C 'establish':356C 'event':96C,102C,129C,183C,252C,256C,265C,383C,467C 'everi':395C 'evt':137C,170C 'exceed':464C 'exploit':308C 'extend':476C 'field':190C,278C 'fit':114C 'fix':101C,457C 'flaw':198C 'forward':417C 'fragment':348C 'generic':255C 'guard':471C 'h4':216C 'handl':87C 'handler':481C 'hci':79C,89C,194C,371C,382C 'header':103C 'host':203C 'host-on':202C 'imag':291C 'impact':442C 'in-imag':289C 'includ':376C 'inform':446C 'inject':238C 'inter':223C 'inter-cor':222C 'intern':276C 'ipc':225C 'larger':249C 'le':80C,90C,336C 'legaci':478C 'length':113C,138C,171C,189C,248C,267C,277C,302C,434C,463C 'limit':444C 'link':241C 'listen':398C 'malici':228C 'mani':133C 'match':303C,469C 'may':415C 'mem':163C 'memori':375C,409C,440C 'minimum':266C 'net':159C 'never':125C,269C 'noth':280C 'off-devic':418C 'option':326C 'origin':191C 'out-of-bound':364C 'over-read':453C 'part':213C 'partial':145C 'past':178C 'path':142C 'payload':186C,253C,468C 'per':81C,164C,264C,313C,319C 'per-ev':263C 'period':91C,120C,349C,357C 'periodic-sync':119C 'pool':374C 'present':105C,473C 'previous':380C 'profil':344C 'progress':156C 'public':342C 'reach':214C 'reachabl':200C 'read':368C,455C 'real':185C 'reassembl':122C,141C,167C,333C,347C,389C 'receiv':381C,403C 'regist':396C 'remain':424C,466C 'report':83C,93C,245C,460C,480C 'requir':310C 'rx':373C 'rx-pool':372C 'send':243C 'separ':212C 'set':352C 'side':423C 'simpl':161C 'sink':340C 'size':323C 'spi':218C 'stale':377C 'start':177C 'status':144C,148C 'subev':274C 'subsys/bluetooth/host/hci_core.c':259C 'subsys/bluetooth/host/scan.c':86C 'sync':121C,166C,315C,321C,359C 'tailroom':116C,429C 'transport':226C 'uart':217C 'undefin':449C 'usb':219C 'use':285C,431C 'v2':95C 'valu':435C 'verifi':98C 'visibl':413C 'whose':461C 'write':422C 'zephyr':286C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-11-10T21:35:00+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N","cvss_by":"vulnerabilities@zephyrproject.org","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-90832","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-90832","severity":null,"published_at":"2026-11-10T22:21:14+00:00","modified_at":"2026-11-10T22:21:14+00:00","first_seen_at":"2026-11-10T22:27:31+00:00","fetched_at":"2026-11-10T22:27:31+00:00","note":null}],"documents":[{"id":119552,"url":"https://github.com/zephyrproject-rtos/zephyr/commit/e9c3252c244b094b9caf6f426ffb77c509e58a9f","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":119553,"url":"https://github.com/zephyrproject-rtos/zephyr/security/advisories/GHSA-2q4q-gv2c-997j","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-11-10T21:35:00+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"}