Skip to content

fix: add input validation to prevent remote crash from empty/malforme…#912

Merged
zxzxwu merged 2 commits intogoogle:mainfrom
ibondarenko1:fix/empty-pdu-crash
Apr 20, 2026
Merged

fix: add input validation to prevent remote crash from empty/malforme…#912
zxzxwu merged 2 commits intogoogle:mainfrom
ibondarenko1:fix/empty-pdu-crash

Conversation

@ibondarenko1
Copy link
Copy Markdown

…d PDUs

Add length checks in from_bytes() for ATT and SMP protocol parsers to prevent IndexError crashes from empty PDUs sent by remote Bluetooth devices. Also add buffer size limit and UTF-8 error handling in HFP protocol to prevent memory exhaustion and decode crashes.

  • bumble/att.py: validate PDU is non-empty before accessing pdu[0]
  • bumble/smp.py: validate PDU is non-empty before accessing pdu[0]
  • bumble/hfp.py: limit buffer to 64KB, handle invalid UTF-8 gracefully

These issues can be triggered by a remote Bluetooth device sending malformed packets, causing denial of service on the host.

@google-cla
Copy link
Copy Markdown

google-cla Bot commented Apr 16, 2026

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

…d PDUs

Add length checks in from_bytes() for ATT and SMP protocol parsers
to prevent IndexError crashes from empty PDUs sent by remote Bluetooth
devices. Also add buffer size limit and UTF-8 error handling in HFP
protocol to prevent memory exhaustion and decode crashes.

- bumble/att.py: validate PDU is non-empty before accessing pdu[0]
- bumble/smp.py: validate PDU is non-empty before accessing pdu[0]
- bumble/hfp.py: limit buffer to 64KB, handle invalid UTF-8 gracefully

These issues can be triggered by a remote Bluetooth device sending
malformed packets, causing denial of service on the host.
Copy link
Copy Markdown
Collaborator

@zxzxwu zxzxwu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for your PR, but I am wondering when do we need such handling?

For single packet parsing, we won't crash because there is a try-except umbrella at the packet sink root.

For HFP, despite the issue is possible, "normal" products qualified by SIG and authenticated by users should not send such invalid packets, and users can still define their own handling.

Comment thread bumble/att.py Outdated
@classmethod
def from_bytes(cls, pdu: bytes) -> ATT_PDU:
if not pdu:
raise ValueError("Empty ATT PDU")
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Comment thread bumble/smp.py Outdated
@classmethod
def from_bytes(cls, pdu: bytes) -> SMP_Command:
if not pdu:
raise ValueError("Empty SMP PDU")
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ditto

Comment thread bumble/hfp.py Outdated
Comment on lines +93 to +95
if len(self.buffer) > 65536:
logger.warning("HFP buffer overflow, truncating")
self.buffer = self.buffer[-65536:]
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe we can just abort new packets after overflow?

Suggested change
if len(self.buffer) > 65536:
logger.warning("HFP buffer overflow, truncating")
self.buffer = self.buffer[-65536:]
MAX_LINE_LENGTH = 65536
...
if len(self.buffer) > MAX_LINE_LENGTH:
logger.error("HFP buffer overflow, abort")
return

…ffer overflow

- att.py: raise core.InvalidPacketError instead of generic ValueError
- smp.py: raise core.InvalidPacketError instead of generic ValueError
- hfp.py: add MAX_BUFFER_SIZE class constant (64KB)
- hfp.py: drop incoming data when it would overflow buffer instead of
  truncating, preserving existing partial-packet state

Per review comments on PR google#912 by @zxzxwu.
@ibondarenko1
Copy link
Copy Markdown
Author

Thanks for the review @zxzxwu — pushed follow-up commit addressing both points:

  1. att.py / smp.py: switched from ValueError to core.InvalidPacketError so the exception fits the existing taxonomy and is caught by the packet-sink umbrella try/except as you noted.

  2. hfp.py: replaced truncation with abort-on-overflow using a MAX_BUFFER_SIZE class constant (64KB). When incoming data would overflow, we log a warning and drop only the new data via early return, keeping existing partial-packet state intact so a valid in-flight AT command can still parse.

Happy to adjust naming or buffer size if preferred.

@ibondarenko1
Copy link
Copy Markdown
Author

@googlebot I signed it!

@ibondarenko1
Copy link
Copy Markdown
Author

Gentle ping @zxzxwu — review fixes are in commit 444f43f, CLA is green, and checks pass. Let me know if any further changes are needed before merge. Thanks!

@ibondarenko1 ibondarenko1 requested a review from zxzxwu April 17, 2026 22:39
@zxzxwu zxzxwu merged commit bf0784d into google:main Apr 20, 2026
55 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants