<?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>DEV Community: Felipe</title>
    <description>The latest articles on DEV Community by Felipe (@lipedev).</description>
    <link>https://dev.to/lipedev</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4190172%2F882ea645-76f5-411e-88af-4391c9cafb51.png</url>
      <title>DEV Community: Felipe</title>
      <link>https://dev.to/lipedev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lipedev"/>
    <language>en</language>
    <item>
      <title>How My Fedora Hostname Linked a Random 2015 User to My Repo — And What I Found Dissecting GitHub's API</title>
      <dc:creator>Felipe</dc:creator>
      <pubDate>Sat, 17 Oct 2026 08:59:15 +0000</pubDate>
      <link>https://dev.to/lipedev/how-my-fedora-hostname-linked-a-random-2015-user-to-my-repo-and-what-i-found-dissecting-githubs-e73</link>
      <guid>https://dev.to/lipedev/how-my-fedora-hostname-linked-a-random-2015-user-to-my-repo-and-what-i-found-dissecting-githubs-e73</guid>
      <description>&lt;p&gt;While building a Java REST API on my Linux (Fedora) machine, I noticed something bizarre on my GitHub repository page: right next to my profile picture in the &lt;strong&gt;Contributors&lt;/strong&gt; sidebar, there was an unknown user (&lt;code&gt;@wroc&lt;/code&gt;), whose account was created back in 2015 and had no recent activity.&lt;/p&gt;

&lt;p&gt;The most intriguing detail? My local hostname/username on Fedora when I first initialized the project was &lt;code&gt;wroc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That coincidence triggered a few architecture and security questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How did a user who never had access to my repository officially appear as a code contributor?&lt;/li&gt;
&lt;li&gt;If their account was linked to the commit, did GitHub's backend return real account metadata in the API response without their authentication?&lt;/li&gt;
&lt;li&gt;How far does this behavior go if I intentionally test it against another account?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This article documents my step-by-step investigation—inspecting raw Git objects, dissecting GitHub REST API JSON payloads, decoding Base64 Global Node IDs, and running a practical Proof of Concept (PoC).&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Inspecting the Raw Git Object (&lt;code&gt;git cat-file&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;The first step was checking what was actually recorded locally in the repository's initial commits (specifically commit &lt;code&gt;b1a5ca0&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;To inspect the raw payload that Git sends over the wire during a &lt;code&gt;git push&lt;/code&gt;, without any UI formatting, we use &lt;code&gt;git cat-file -p&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git cat-file &lt;span class="nt"&gt;-p&lt;/span&gt; b1a5ca0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The output is surprisingly simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tree d3e2ab9087f6ccb4a141f7d368711233f879867d
author wroc &amp;lt;wroc@users.noreply.github.com&amp;gt; 1790719762 -0300
committer wroc &amp;lt;wroc@users.noreply.github.com&amp;gt; 1790719762 -0300

chore: initialize project structure and IDE configurations

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you run &lt;code&gt;git commit&lt;/code&gt;, Git operates 100% offline. It makes no network requests, verifies no SSH keys, and does not validate whether you actually own that email address. It simply writes a plain-text string inside &lt;code&gt;.git/objects/&lt;/code&gt;. At the time, my local Git config combined my Fedora hostname (&lt;code&gt;wroc&lt;/code&gt;) with GitHub's noreply domain (&lt;code&gt;wroc@users.noreply.github.com&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;So what happens when we push this plain-text object to GitHub's servers via a &lt;code&gt;git push&lt;/code&gt; authenticated with my own SSH key (&lt;code&gt;lipebackend&lt;/code&gt;)?&lt;/p&gt;




&lt;h2&gt;
  
  
  2. What Does GitHub's API Return in the Response?
&lt;/h2&gt;

&lt;p&gt;Querying GitHub's REST API directly for that specific commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://api.github.com/repos/lipebackend/api-rest/commits/b1a5ca0

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We get the following JSON payload back from GitHub's backend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sha"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"b1a5ca0edc8b69be88b91a67b4bd5d63543b8f90"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C_kwDOUzptmtoAKGIxYTVjYTBlZGM4YjY5YmU4OGI5MWE2N2I0YmQ1ZDYzNTQzYjhmOTA"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wroc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wroc@users.noreply.github.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-29T22:09:22Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"committer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wroc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wroc@users.noreply.github.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-09-29T22:09:22Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chore: initialize project structure and IDE configurations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"verified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unsigned"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"signature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"payload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"login"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wroc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11420820&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MDQ6VXNlcjExNDIwODIw"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"avatar_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://avatars.githubusercontent.com/u/11420820?v=4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.github.com/users/wroc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"html_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/wroc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"repos_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.github.com/users/wroc/repos"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"user_view_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"public"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"site_admin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looking closely at this API response raises three fascinating software engineering and security questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;I only pushed a plain-text string (&lt;code&gt;wroc@users.noreply.github.com&lt;/code&gt;), yet GitHub's server returned a full &lt;code&gt;"author"&lt;/code&gt; object containing the user's real internal database ID (&lt;code&gt;11420820&lt;/code&gt;), their &lt;code&gt;avatar_url&lt;/code&gt;, and a Base64-encoded &lt;code&gt;node_id&lt;/code&gt; (&lt;code&gt;MDQ6VXNlcjExNDIwODIw&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;When querying the user's public profile at &lt;code&gt;[https://api.github.com/users/wroc](https://api.github.com/users/wroc)&lt;/code&gt;, their &lt;code&gt;"email"&lt;/code&gt; field is &lt;code&gt;null&lt;/code&gt;! How did GitHub link the email if the public profile states &lt;code&gt;"email": null&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;Why is &lt;code&gt;node_id&lt;/code&gt; encoded in Base64?&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. Why is &lt;code&gt;node_id&lt;/code&gt; in Base64? (&lt;code&gt;MDQ6VXNlcjExNDIwODIw&lt;/code&gt;)
&lt;/h2&gt;

&lt;p&gt;If we decode the &lt;code&gt;"node_id": "MDQ6VXNlcjExNDIwODIw"&lt;/code&gt; field in a Linux terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"MDQ6VXNlcjExNDIwODIw"&lt;/span&gt; | &lt;span class="nb"&gt;base64&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="c"&gt;# Output: 04:User11420820&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why did GitHub engineers encode &lt;code&gt;04:User11420820&lt;/code&gt; in Base64? It wasn't for encryption—it was a database architecture and API evolution decision driven by the &lt;strong&gt;GraphQL Relay Specification&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In GitHub's relational database (MySQL), each table has its own sequential primary key (&lt;code&gt;id&lt;/code&gt;). There is an &lt;code&gt;id = 11420820&lt;/code&gt; in the &lt;code&gt;users&lt;/code&gt; table, but there can also be an &lt;code&gt;id = 11420820&lt;/code&gt; in the &lt;code&gt;repositories&lt;/code&gt; or &lt;code&gt;issues&lt;/code&gt; tables.&lt;/li&gt;
&lt;li&gt;When GitHub introduced its GraphQL API (v4), it needed a globally unique identifier (&lt;strong&gt;Global Node ID&lt;/strong&gt;) so a generic &lt;code&gt;node(id: "...")&lt;/code&gt; query would know exactly which table to &lt;code&gt;SELECT&lt;/code&gt; from.&lt;/li&gt;
&lt;li&gt;Their initial solution combined the type length + entity name + primary key: &lt;code&gt;04:User11420820&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why Base64?&lt;/strong&gt; To create an &lt;strong&gt;Opaque Identifier (Opaque Token)&lt;/strong&gt;, discouraging clients from doing &lt;code&gt;split(":")&lt;/code&gt; in their code and allowing GitHub to change the underlying structure in the future without breaking API contracts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And GitHub actually did change it! Compare the &lt;code&gt;node_id&lt;/code&gt; from the 2015 &lt;code&gt;wroc&lt;/code&gt; account (&lt;code&gt;MDQ6VXNlcjExNDIwODIw&lt;/code&gt; — plain text in Base64) with the &lt;code&gt;node_id&lt;/code&gt; from my newer &lt;code&gt;lipebackend&lt;/code&gt; account (&lt;code&gt;U_kgDOE_lvuA&lt;/code&gt; — serialized in binary &lt;strong&gt;MessagePack&lt;/strong&gt; + Base64).&lt;/p&gt;




&lt;h2&gt;
  
  
  4. How Did GitHub Link the Account if &lt;code&gt;"email": null&lt;/code&gt; in the Public API?
&lt;/h2&gt;

&lt;p&gt;If you query &lt;code&gt;[https://api.github.com/users/wroc](https://api.github.com/users/wroc)&lt;/code&gt; (or my own profile &lt;code&gt;[https://api.github.com/users/lipebackend](https://api.github.com/users/lipebackend)&lt;/code&gt;), you will see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"login"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"wroc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;11420820&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MDQ6VXNlcjExNDIwODIw"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"created_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2015-03-11T08:40:54Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;"email": null&lt;/code&gt; field in the public API DTO only means the user chose not to display a public email address on their profile bio. However, under the hood, when a commit arrives via &lt;code&gt;git push&lt;/code&gt;, GitHub's backend performs internal identity resolution:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Legacy &lt;code&gt;@users.noreply.github.com&lt;/code&gt; Routing Rule:&lt;/strong&gt; Accounts created before 2017 used the &lt;code&gt;&amp;lt;username&amp;gt;@users.noreply.github.com&lt;/code&gt; format (newer accounts use &lt;code&gt;&amp;lt;id&amp;gt;+&amp;lt;username&amp;gt;@users.noreply.github.com&lt;/code&gt; specifically to prevent collisions or broken links when changing &lt;code&gt;@username&lt;/code&gt;). When GitHub parses &lt;code&gt;wroc@users.noreply.github.com&lt;/code&gt; in the commit, it extracts the &lt;code&gt;wroc&lt;/code&gt; login and queries the users table directly (&lt;code&gt;WHERE login = ?&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Internal Private Email Table (The "Identity Oracle"):&lt;/strong&gt; Even if you don't use &lt;code&gt;@users.noreply.github.com&lt;/code&gt; and instead put someone's real personal email in the commit, GitHub's backend performs an internal &lt;code&gt;JOIN&lt;/code&gt; against its private registered emails table (&lt;code&gt;user_emails&lt;/code&gt;)—even if that email is marked as private on their profile—and attaches the owner's public user object to the commit response!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here is the complete flow happening behind the scenes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[1. COMMIT TIME - 100% Offline on Local Machine]
   git commit writes plain text into .git/objects:
   author: "wroc &amp;lt;wroc@users.noreply.github.com&amp;gt;" (No password / No SSH key)
          |
          v
[2. PUSH TIME - Authenticates Transport, NOT the Author!]
   git push connects using "lipebackend" SSH key
   GitHub server validates: "lipebackend owns the repo, push accepted!"
          |
          v
[3. AUTOMATIC BACKEND JOIN ON GITHUB]
   GitHub parses commit text and runs a SELECT on its Internal User Database
   Matches the real "wroc" record (id: 11420820) without requiring a signature!
          |
          v
[4. API RESPONSE / WEB UI]
   GET /repos/lipebackend/api-rest/commits/b1a5ca0
   Returns JSON with real "wroc" account metadata and adds them to Contributors!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Proof of Concept (PoC): Testing in Practice (Anonymized Data)
&lt;/h2&gt;

&lt;p&gt;To prove that &lt;em&gt;any&lt;/em&gt; email registered on GitHub (even hidden with &lt;code&gt;"email": null&lt;/code&gt; on the public profile) would be resolved and attached to my repository without any authentication from the other party, I ran a controlled test with a fellow developer's permission (anonymized below as &lt;code&gt;dev-example&lt;/code&gt; / &lt;code&gt;contact@example.dev&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;First, we verify that their email is hidden on their public profile (&lt;code&gt;[https://api.github.com/users/dev-example](https://api.github.com/users/dev-example)&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://api.github.com/users/dev-example | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'"(login|id|node_id|email)"'&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"login"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev-example"&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9876543&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"node_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MDQ6VXNlcjk4NzY1NDM="&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, we create an empty commit (&lt;code&gt;--allow-empty&lt;/code&gt;) in our repository by overriding Git environment variables and pushing to &lt;code&gt;origin&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;GIT_AUTHOR_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dev-example"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;GIT_AUTHOR_EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"contact@example.dev"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;GIT_COMMITTER_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"dev-example"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nv"&gt;GIT_COMMITTER_EMAIL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"contact@example.dev"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
git commit &lt;span class="nt"&gt;--allow-empty&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"chore: test commit author resolution"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push origin HEAD

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We immediately query the newly created commit via GitHub's API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-sL&lt;/span&gt; https://api.github.com/repos/lipebackend/api-rest/commits/&amp;lt;commit-sha&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And GitHub's backend immediately responds with the real account linked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sha"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eaf17be95da2a3210efba894140287493da7b7a4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"commit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev-example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"contact@example.dev"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-10-17T02:26:52Z"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chore: test commit author resolution"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"verification"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"verified"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"reason"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"unsigned"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"login"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dev-example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9876543&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"MDQ6VXNlcjk4NzY1NDM="&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"avatar_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://avatars.githubusercontent.com/u/9876543?v=4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.github.com/users/dev-example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"html_url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/dev-example"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  6. Security Implications (AppSec, OSINT, and Bug Bounty)
&lt;/h2&gt;

&lt;p&gt;While Git treats this as expected behavior (since Linus Torvalds designed Git as a decentralized system where maintainers apply emailed patches while preserving the original &lt;code&gt;Author&lt;/code&gt;), the way GitHub resolves and links user accounts without enforcing cryptographic signatures by default opens up real-world attack vectors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Email-to-Account Enumeration Oracle (OSINT):&lt;/strong&gt; Even if a user sets &lt;code&gt;"email": null&lt;/code&gt; on their public GitHub profile, anyone who possesses an email address can create a dummy commit in a private repository, push it, and inspect the API response (or Web UI) to unmask the exact GitHub account (&lt;code&gt;login&lt;/code&gt;, &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;avatar_url&lt;/code&gt;) tied to that private email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Commit &amp;amp; Contributor Spoofing:&lt;/strong&gt; Malicious repositories frequently inject commits using the email addresses of high-profile developers into their main branch so GitHub displays their official avatars and profiles under the &lt;strong&gt;Contributors&lt;/strong&gt; tab, manufacturing false credibility for supply-chain or social engineering attacks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-Party Integration Traps (Where Real Bug Bounties Live):&lt;/strong&gt; GitHub itself documents this behavior as &lt;em&gt;Known Issue / By Design&lt;/em&gt; because it exposes the &lt;code&gt;"verification": { "verified": false, "reason": "unsigned" }&lt;/code&gt; block. However, numerous third-party CI/CD tools, deployment bots, and enterprise integrations consume GitHub's Commits API and blindly trust &lt;code&gt;response.author.login&lt;/code&gt; (or &lt;code&gt;response.author.id&lt;/code&gt;), assuming GitHub has already authenticated the author's identity—completely forgetting to check whether &lt;code&gt;commit.verification.verified === true&lt;/code&gt;!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. How to Protect Yourself
&lt;/h2&gt;

&lt;p&gt;As a software engineer and architect, there are three essential layers of defense:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographically sign all your commits (SSH or GPG Signing):&lt;/strong&gt; Configure your SSH or GPG key in Git (&lt;code&gt;git config --global commit.gpgsign true&lt;/code&gt;) so all your legitimate commits return &lt;code&gt;"verified": true&lt;/code&gt; and display the green &lt;strong&gt;Verified&lt;/strong&gt; badge on GitHub.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable Vigilant Mode on GitHub:&lt;/strong&gt; Go to &lt;strong&gt;Settings → SSH and GPG keys → Vigilant mode&lt;/strong&gt; and check &lt;em&gt;"Flag unsigned commits as unverified"&lt;/em&gt;. Any commit spoofing your email without your cryptographic signature will explicitly display an &lt;strong&gt;Unverified&lt;/strong&gt; warning badge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;If you build integrations using GitHub's API:&lt;/strong&gt; Never trust a commit's &lt;code&gt;author.login&lt;/code&gt; or &lt;code&gt;author.id&lt;/code&gt; fields for authorization or security decisions without strictly validating that &lt;code&gt;commit.verification.verified === true&lt;/code&gt; first.&lt;/li&gt;
&lt;/ol&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>network</category>
      <category>api</category>
    </item>
  </channel>
</rss>
