<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Amit Goyal</title>
    <description>The latest articles on Forem by Amit Goyal (@amit_goyal_17e33ae6c92a93).</description>
    <link>https://forem.com/amit_goyal_17e33ae6c92a93</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3808067%2F7eb796ed-b28f-4ddc-93ba-81c7cc5f0d7b.jpg</url>
      <title>Forem: Amit Goyal</title>
      <link>https://forem.com/amit_goyal_17e33ae6c92a93</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/amit_goyal_17e33ae6c92a93"/>
    <language>en</language>
    <item>
      <title>How I Discovered a Bluetooth Trust Flaw in Android (Google VRP Report)</title>
      <dc:creator>Amit Goyal</dc:creator>
      <pubDate>Thu, 05 Mar 2026 13:52:53 +0000</pubDate>
      <link>https://forem.com/amit_goyal_17e33ae6c92a93/how-i-discovered-a-bluetooth-trust-flaw-in-android-google-vrp-report-1co</link>
      <guid>https://forem.com/amit_goyal_17e33ae6c92a93/how-i-discovered-a-bluetooth-trust-flaw-in-android-google-vrp-report-1co</guid>
      <description>&lt;p&gt;Originally published on Medium:&lt;a href="https://medium.com/meetcyber/%EF%B8%8F-how-i-discovered-a-bluetooth-pairing-flaw-in-android-reported-under-googles-android-vrp-1b987516c6d6" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A logic bug, a cup of cold tea, and how curiosity quietly led me to my first big report.&lt;/p&gt;

&lt;h2&gt;
  
  
  ☕ When Curiosity Took Over the Protocol
&lt;/h2&gt;

&lt;p&gt;It was a quiet weekend evening. Logs on one side, Bluetooth tools open, and — as always — a hot cup of tea beside me.&lt;/p&gt;

&lt;p&gt;But by the time I looked up again… the tea had gone cold.&lt;/p&gt;

&lt;p&gt;And as someone from Assam, trust me — that’s a big deal.&lt;/p&gt;

&lt;p&gt;But that day, curiosity won over everything.&lt;/p&gt;

&lt;p&gt;For the past few weekends, I had been diving deep into how Android handles Bluetooth at a system level — especially around device pairing and communication flows.&lt;/p&gt;

&lt;p&gt;While exploring how Bluetooth connections are initiated, how devices identify each other, and how permissions are set, I began experimenting with edge-case scenarios using standard tools and by reading parts of the Bluetooth stack code.&lt;/p&gt;

&lt;p&gt;That’s when I spotted something interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔐 A Pairing That Skipped the Permission Part
&lt;/h2&gt;

&lt;p&gt;While reviewing the codebase, I noticed that the logic handling "trusted" devices didn’t enforce any relationship with the "paired" status.&lt;/p&gt;

&lt;p&gt;In other words, nothing ensured that a device had actually completed pairing before being allowed to become trusted.&lt;/p&gt;

&lt;p&gt;That triggered an idea:&lt;/p&gt;

&lt;p&gt;What if I skipped pairing entirely and directly invoked the trust logic?&lt;/p&gt;

&lt;p&gt;So I set up a test using my laptop and an Android phone.&lt;/p&gt;

&lt;p&gt;I simulated a scenario where the trust state was set without any successful pairing handshake.&lt;/p&gt;

&lt;p&gt;To my surprise, the Android phone appeared in my laptop’s trusted list — even though the phone user had never approved any pairing request.&lt;/p&gt;

&lt;p&gt;Once the phone appeared in the trusted list, I attempted a file transfer.&lt;/p&gt;

&lt;p&gt;Instantly the Android phone displayed a notification:&lt;/p&gt;

&lt;p&gt;"XYZ wants to send you a file via Bluetooth."&lt;/p&gt;

&lt;p&gt;The user still had to accept or reject the transfer, but the key point was:&lt;/p&gt;

&lt;p&gt;The pop-up appeared &lt;strong&gt;without any pairing ever being completed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even after disconnecting, the Android phone remained in my trusted list.&lt;/p&gt;

&lt;p&gt;The next day, when I tried again while the phone was nearby, the same notification appeared again.&lt;/p&gt;

&lt;p&gt;No pairing.&lt;br&gt;&lt;br&gt;
No confirmation steps.  &lt;/p&gt;

&lt;p&gt;Just a direct file transfer prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔍 Testing Across Devices
&lt;/h2&gt;

&lt;p&gt;To confirm this wasn’t accidental behavior, I tested across multiple devices and Android versions.&lt;/p&gt;

&lt;p&gt;Devices tested:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Realme Narzo (Android 14, 15)&lt;/li&gt;
&lt;li&gt;Motorola G series (Android 12)&lt;/li&gt;
&lt;li&gt;Pixel devices and others (Android 11, 13)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Results were consistent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A device could be added to the trusted list without pairing&lt;/li&gt;
&lt;li&gt;File transfer prompts appeared without pairing approval&lt;/li&gt;
&lt;li&gt;The trusted status persisted even after disconnection&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 Root Cause (Code Logic)
&lt;/h2&gt;

&lt;p&gt;After digging into the Bluetooth stack logic (BlueZ), the reason became clear.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Paired flag&lt;/strong&gt; is set only after successful key exchange during pairing.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Trusted flag&lt;/strong&gt;, however, is simply a policy toggle and can be set independently.&lt;/p&gt;

&lt;p&gt;Example logic:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// Paired flag: only true after successful key exchange
void device_set_paired(struct btd_device *device, bool paired) {
    device-&amp;gt;paired = paired;
    if (paired)
        write_link_key(device);
}

// Trusted flag: can be set anytime, no pairing check
void device_set_trusted(struct btd_device *device, bool trusted) {
    device-&amp;gt;trusted = trusted;
    write_trust(device);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The issue is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trusted does not verify Paired.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This allows a device to be marked trusted even when no valid pairing exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  📩 Reporting to Google
&lt;/h2&gt;

&lt;p&gt;After documenting the behavior across devices and Android versions, I submitted the findings to Google's Android &amp;amp; Google Devices Vulnerability Reward Program.&lt;/p&gt;

&lt;p&gt;The Android Security team reviewed the report, validated the issue, and acknowledged it through their official process.&lt;/p&gt;

&lt;h2&gt;
  
  
  💰 Recognition
&lt;/h2&gt;

&lt;p&gt;The report resulted in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Official recognition by the Android Security Team&lt;/li&gt;
&lt;li&gt;Classification as a moderate severity issue&lt;/li&gt;
&lt;li&gt;A bounty reward under the Android VRP&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✦ A Quiet Milestone
&lt;/h2&gt;

&lt;p&gt;This discovery started as a simple weekend experiment and turned into a meaningful security report.&lt;/p&gt;

&lt;p&gt;Moments like this remind me why security research is so rewarding.&lt;/p&gt;

&lt;p&gt;Sometimes all it takes is curiosity, persistence — and occasionally letting your tea go cold.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclaimer
&lt;/h2&gt;

&lt;p&gt;This write-up reflects personal security research and observations. The issue was responsibly disclosed to the vendor. No exploit code or sensitive information is shared. The purpose of this article is educational awareness.&lt;/p&gt;

</description>
      <category>cybersecurity</category>
      <category>android</category>
      <category>bluetooth</category>
      <category>bugbounty</category>
    </item>
  </channel>
</rss>
