30 comments

  • cbsks9 hours ago
    Looks like Firefox is immune.<p>This works by looking for web accessible resources that are provided by the extensions. For Chrome, these are are available in a webpage via the URL chrome-extension:&#x2F;&#x2F;[PACKAGE ID]&#x2F;[PATH] <a href="https:&#x2F;&#x2F;developer.chrome.com&#x2F;docs&#x2F;extensions&#x2F;reference&#x2F;manifest&#x2F;web-accessible-resources" rel="nofollow">https:&#x2F;&#x2F;developer.chrome.com&#x2F;docs&#x2F;extensions&#x2F;reference&#x2F;manif...</a><p>On Firefox, web accessible resources are available at &quot;moz-extension:&#x2F;&#x2F;&lt;extension-UUID&gt;&#x2F;myfile.png&quot; &lt;extension-UUID&gt; is not your extension&#x27;s ID. This ID is randomly generated for every browser instance. This prevents websites from fingerprinting a browser by examining the extensions it has installed. <a href="https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;manifest.json&#x2F;web_accessible_resources" rel="nofollow">https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;Web...</a>
    • rchaud9 hours ago
      And they said that using a browser with sub-5% market share would cause us to miss out on the latest and greatest in web technology!
      • userbinator5 hours ago
        The latest and greatest is not great for you, but for <i>them</i>.
      • dana3219 hours ago
        chrome was made by ex-firefox devs, chrome is still not as good!
    • LAC-Tech2 hours ago
      Anecdotally, I sometimes notice my computer fan spinning ferociously... it&#x27;s almost always because I have left a firefox tab with linkedin open somewhere.<p>Are they bit coin mining or are they just incompetent?
      • farhanhubble58 minutes ago
        If the two are indeed &quot;Linked&quot;, I see a case for users-first browsers to show system metrics right along the page.
      • kijin1 hour ago
        Judging from GP&#x27;s description of how extension IDs work in Firefox, I wouldn&#x27;t be surprised if LinkedIn were trying to brute-force those UUIDs!
      • techpression2 hours ago
        Considering the app was a battery catastrophe I’m confident in the latter, even if your question could be read as rhetorical.
    • awesome_dude9 hours ago
      This is probably a naive question, but...<p>Doesn&#x27;t the idea of swapping extension specific IDs to your browser specific extension IDs mean that instead of your browser being identifiable, you become identifiable?<p>I mean, it goes from &quot;Oh they have X, Y , and Z installed&quot; to &quot;Oh, it&#x27;s jim bob, only he has that unique set of IDs for extensions&quot;
      • triceratops9 hours ago
        It&#x27;s not a naive question. This comment says it&#x27;s not possible to do that: <a href="https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=46905213">https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=46905213</a>
        • awesome_dude9 hours ago
          Oh, it&#x27;s (re)randomised upon each restart, whew, thanks for the heads up<p>edit: er, I think that that also suggests that I need to restart firefox more often...
          • tech234a8 hours ago
            The webpage would have to scan the entire UUID space to create this fingerprint, which seems unlikely.
            • throwaway8080818 hours ago
              Just have a database of UUIDs. Seems pretty trivial to generate and sort as it&#x27;s only 16 bytes each.
              • Mikhail_Edoshin2 hours ago
                16 bytes is a lot. 4 bytes are within reach, we can scan all of them quickly, but even 8 bytes are already too much.<p>Kolmogorov said that computers do not help with naturally hard tasks; they raise a limit compared to what we can fo manually, but above that limit the task stays as hard is it was.
              • pshirshov5 hours ago
                That&#x27;s actually a bright idea! Have you ever thought about applying for VC funds?<p>Once you deliver that, you can also think about a database of natural numbers!
              • direwolf203 hours ago
                It exists<p><a href="https:&#x2F;&#x2F;everyuuid.com&#x2F;" rel="nofollow">https:&#x2F;&#x2F;everyuuid.com&#x2F;</a>
              • dullcrisp7 hours ago
                <a href="https:&#x2F;&#x2F;libraryofbabel.info&#x2F;" rel="nofollow">https:&#x2F;&#x2F;libraryofbabel.info&#x2F;</a>
              • Dylan168076 hours ago
                &quot;Just&quot; have a database, and then what? I can set up a database of all UUIDs very easily, but I don&#x27;t think it&#x27;s helpful.
                • direwolf203 hours ago
                  Where are you storing them, a black hole?
                  • Dylan168072 hours ago
                    All you need is basic compression, like storing the start and stop points of each block of UUIDs in the database.<p>Wait, you already linked to everyuuid. Do you think the server it&#x27;s on uses black hole storage?
                  • seg_lol1 hour ago
                    I would store them as offsets within the digits of pi.
                  • techpression2 hours ago
                    Fast writes, very slow reads.
              • voussoir5 hours ago
                Relevant: <a href="https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=42342382">https:&#x2F;&#x2F;news.ycombinator.com&#x2F;item?id=42342382</a>
              • stirfish7 hours ago
                lol<p>Let&#x27;s go a step further and just iterate through them on the client. I plan on having this phone well past the heat death of the universe, so this is guaranteed to finish on my hardware.<p><pre><code> function* uuidIterator() { const bytes = new Uint8Array(16); while (true) { yield formatUUID(bytes); let carry = 1; for (let i = 15; i &gt;= 0 &amp;&amp; carry; i--) { const sum = bytes[i] + carry; bytes[i] = sum &amp; 0xff; carry = sum &gt; 0xff ? 1 : 0; } if (carry) return; } } function formatUUID(b) { const hex = [...b].map(x =&gt; x.toString(16).padStart(2, &quot;0&quot;)); return ( hex.slice(0, 4).join(&quot;&quot;) + &quot;-&quot; + hex.slice(4, 6).join(&quot;&quot;) + &quot;-&quot; + hex.slice(6, 8).join(&quot;&quot;) + &quot;-&quot; + hex.slice(8, 10).join(&quot;&quot;) + &quot;-&quot; + hex.slice(10, 16).join(&quot;&quot;) ); } </code></pre> This is free. Feel free to use it in production.
          • jorvi7 hours ago
            Doing it on restart makes the mitigation de facto useless. How often do you have 10, 20, 30d (or even longer) desktop uptime these days? And no one is regularly restarting their core applications when their desktop is still up.<p>Enjoy the fingerprinting.
            • tristan9577 hours ago
              I restart my browser basically every day.
              • cyanydeez6 hours ago
                yeah I close out everything as a mental block against anything I&#x27;m working on.<p>I think there&#x27;s a subset of people that offload memory to their browsers and that&#x27;s kinda scary given how these fingerprint things work.
            • eek21217 hours ago
              Umm, I restart my PC about once a week for security and driver updates.<p>If you don&#x27;t, you have a lot more to worry about beyond fingerprinting...<p>Oh and I&#x27;m on LINUX (CachyOS) mind you.
      • b1129 hours ago
        Maybe, but how long are the extension ids? And if they are random, how long to scan a trillion random alphanumeric ids, to find matches?<p>I presume the extension knows when it wants to access resources of its own. But random javascript, doesn&#x27;t.
        • maples379 hours ago
          The extension IDs are UUIDs&#x2F;GUIDs, so 128 bits of entropy. No site is going to be able to successfully scan that full range.
          • Sophira5 hours ago
            And just in case the magnitude of that isn&#x27;t obvious to people, that means there are 340,282,366,920,938,463,463,374,607,431,768,211,456 total possible UUIDs. Good luck.
          • b1128 hours ago
            ChatGPT told me it can be done though.<p>It won&#x27;t disclose how, as it says it has had several users report it. And that it expects 50% of the bounty, and will use it for GPU upgrades.
      • calvinmorrison5 hours ago
        yes thats how browser fingerprinting works and it is impossible to defeat because there are just too many variations in monitors (relevant for fonts), simple things like user agent, etc.
  • rdoherty10 hours ago
    Skimming the list, looks like most extensions are for scraping or automating LinkedIn usage. Not surprising as there&#x27;s money to be made with LinkedIn data. Scraping was a problem when I worked there, the abuse teams built some reasonably sophisticated detection &amp; prevention, and it was a constant battle.
    • cxr9 hours ago
      In order to create the data source that LinkedIn&#x27;s extension-fingerprinting relies on to work, someone (at LinkedIn*?) almost certainly violated the Chrome Web Store TOS—by (perversely*) scraping it.<p>* if LinkedIn didn&#x27;t get it from an existing data source
      • direwolf203 hours ago
        Programmers don&#x27;t appreciate the fact that you can just violate terms of service. You can just do it. It&#x27;s okay. The police won&#x27;t come after you. Usually.
      • bastawhiz3 hours ago
        3000 extensions is few enough that a small team could download each extension manually over a few months. You don&#x27;t need to scrape at all.
        • cxr3 hours ago
          In the first place, no one said they needed to, only that they probably did.<p>Secondly, it&#x27;s not &quot;3000 extensions&quot;. They didn&#x27;t somehow magically divine that the 2953 (+&#x2F;-47) extensions we see here were the ones that they needed to download in order to be able to exploit the content-accessible resources described in their extension manifest. They looked at a much larger set, and it got filtered down to these 2953 that satisfied the necessary criteria.
          • bastawhiz2 hours ago
            Lol no, did you even read the list? You could pay someone to just search &quot;LinkedIn&quot; and &quot;talent&quot; and &quot;recruiting&quot; on the chrome web store and download each extension. It&#x27;s probably harder to automate this than it is to do it manually. This is something you could develop in an afternoon and pay a small team of people to do for pennies on the dollar. Even ten thousand extensions is nothing. Spread that over years and this is trivial.
    • tlogan50 minutes ago
      By looking the list it seems like it is not really “sophisticated”. It is just list based on names (if there is a “email” in the name). Majority of extensions do not even ask for permissions to access linkedin.com.
    • winddude9 hours ago
      a problem for linkedin != &quot;a problem&quot;. The real problem for people is the back room data brokering linkedin and others do.
    • bryanrasmussen10 hours ago
      from the code doesn&#x27;t look like they do anything if they have a match, they just save all the results to a csv for fingerprinting?
      • cxr9 hours ago
        &quot;The code&quot; here you&#x27;re referring to (fetch_extension_names.js[1]) isn&#x27;t and doesn&#x27;t claim to be LinkedIn&#x27;s fingerprinting code. It&#x27;s a scraper that the researcher behind this repo wrote themselves in order to create the CSV of the data that they&#x27;re publishing here.<p>LinkedIn&#x27;s fingerprinting code, as the README explains, is found in fingerprint.js[2], which embeds a big JSON literal with the IDs of the extensions it probes for. (Sickeningly enough, this data starts about two-thirds of the way through the file* and <i>isn&#x27;t</i> the culprit behind the bulk of its 2.15 MB size…)<p>* On line 34394; the one starting:<p><pre><code> const r = [{ id: &quot;aacbpggdjcblgnmgjgpkpddliddineni&quot;, file: &quot;sidebar.html&quot; </code></pre> 1. &lt;<a href="https:&#x2F;&#x2F;github.com&#x2F;mdp&#x2F;linkedin-extension-fingerprinting&#x2F;blob&#x2F;main&#x2F;fetch_extension_names.js" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;mdp&#x2F;linkedin-extension-fingerprinting&#x2F;blo...</a>&gt;<p>2. &lt;<a href="https:&#x2F;&#x2F;github.com&#x2F;mdp&#x2F;linkedin-extension-fingerprinting&#x2F;blob&#x2F;main&#x2F;fingerprint.js" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;mdp&#x2F;linkedin-extension-fingerprinting&#x2F;blo...</a>&gt;
        • bryanrasmussen1 hour ago
          thanks, my fault for not reading the read me and just doing a quick read of the code.
    • RHSman24 hours ago
      I had the pleasure of scraping LinkedIn for a client. Great fun.
    • hsbauauvhabzb10 hours ago
      Wont someone think of poor little LinkedIn, a subsidiary of one of the largest data brokers in the world?
      • charcircuit10 hours ago
        Why frame what you are trying to say like that? Businesses of all sizes deserve the ability to protect their businesses from abuse.
        • jmward019 hours ago
          Do they respect my data? Why do they get to track me across sites when I clearly don&#x27;t want them to but someone can&#x27;t scrape their data when they don&#x27;t want them to. Why should big companies get the pass but individuals not? They clearly consider internet traffic fair game and are invasive and abusive about it so it is not only fair to be invasive and abusive back, it is self defense at this point.
          • hsbauauvhabzb9 hours ago
            They don’t need to track your web browser when they’re owned by Microsoft, because they track every action at a lower level.
            • 0x1ch7 hours ago
              Weird, I don&#x27;t use Windows as an OS but have linkedin. I&#x27;d believe the concern and disregard of Linkedin&#x27;s concern is fair game.
            • missingdays9 hours ago
              What lower level? Microsoft owns internet?
              • zelphirkalt9 hours ago
                The operating system. For example see the Windows 11 screenshot debacle&#x2F;scandal.
                • Dylan168075 hours ago
                  Are you talking about Recall, which got such huge negative press they delayed it a year and added a clear opt-in? And never sent anything off the device itself?<p>If anyone has evidence of constant tracking and reporting then please share it.
          • thesmtsolver21 hour ago
            You do realize anti-scraping measures are one way of protecting your data too?
          • john-h-k7 hours ago
            Because you signed up to a set of terms and conditions saying LinkedIn can use your data in this way
            • inetknght2 hours ago
              What if I signed up before those ToS said they could use <i>my</i> data in this way?<p>Oh right, companies change ToS and EULA and &quot;agreements&quot; without notice, without due process, and without recourse.<p>I have no problem changing how I use &quot;their&quot; data in such situations.
              • RulerOf2 hours ago
                &gt; Oh right, companies change ToS and EULA and &quot;agreements&quot; without notice, without due process, and without recourse.<p>Companies change their terms of service all the time. They usually send emails about it.<p>I&#x27;ve responded to decline them a handful of times and asked for my account to be deleted. I chuckle slightly at the work it creates, but sometimes it has been easier to close an account that way.
            • direwolf203 hours ago
              That doesn&#x27;t actually mean anything
            • hsbauauvhabzb6 hours ago
              No one likes paying taxes but they still do it. They could just not work and not have money and therefore not need to pay tax.
            • echelon7 hours ago
              I didn&#x27;t want the web to turn into monolithic platforms. I abhor this status quo.<p>You cannot function without these enterprises, but that doesn&#x27;t mean they&#x27;re ideal or even ethical.<p>Microsoft wins because of network effects. It&#x27;s impossible to compete. So I think it should be allowed to assail their monopoly here by any means. It&#x27;s maximally fair for consumers and for free markets.<p>Ideally capitalism remains cutthroat and impossible to grow into undislodgeable titans.<p>Even more ideally, this would become a distributed protocol rather than a privately owned and guarded database.
        • ronsor10 hours ago
          I think they framed it this way because they don&#x27;t consider scraping abuse (to be fair, neither do I, as long as it doesn&#x27;t overload the site). Botting accounts for spam is clear abuse, however, so that&#x27;s fair game.
          • hsbauauvhabzb9 hours ago
            No, I consider all data collection and scraping egregious. From that perspective, LinkedIn is hypocritical when Microsoft discloses every filesystem search I do locally to bing.
            • dylan6048 hours ago
              Are you not scraping a site with your eyeballs when you view a site?
              • hsbauauvhabzb4 hours ago
                By that logic I can charge you for looking at me.
                • direwolf203 hours ago
                  I agree. Maybe that logic (which is your logic) isn&#x27;t very good.
                  • hsbauauvhabzb2 hours ago
                    You’re just making yourself look dumb by drawing invalid comparisons and an inaccurate understanding of my logic.
        • RockRobotRock7 hours ago
          When they scrape, it’s innovation. When you scrape, it’s a felony.
        • direwolf203 hours ago
          What is abuse? Is it anything that reduces my profit margin? Or is it anything that makes the world a worse place? The Flock CEO called Deflock terrorism, is he right?
        • nitwit0059 hours ago
          I&#x27;m sure there are issues with fake accounts for scraping, but the core issue is that LinkedIn considers the data valuable. LinkedIn wants to be able to sell the data, or access to it at least, and the scrapers undermine that.<p>They could stop all the scraping by providing a downloadable data bundle like Wikipedia.
          • sidrag225 hours ago
            thinking more about, I don&#x27;t think its a terrible thing that they prevent scraping. Their listings are already suffering from being flooded with garbage applications and having to sift through tons of noise. allowing scraping would just amplify that and make the platform almost entirely worthless.<p>I &quot;scrape&quot; linkedin in a roundabout way for personal use, and really what Ive found is that i should just maybee not bother at all. I can&#x27;t get through the noise even when im applying at places that heavily match my skillset, and just get automated rejection emails.
          • compiler-guy9 hours ago
            LLMs scrape Wikipedia all the time, or at least attempt to.<p>The data bundle doesn&#x27;t help that at all.
            • nitwit0055 hours ago
              That&#x27;s true, the normal scraping would still happen, but it would eliminate this side business of trying to re-sell LinkedIn&#x27;s data.
        • sellmesoap10 hours ago
          We enjoy the fruits of an LLM or two from time to time, derived from hoards of ill gotten data. Linkedin has the resourses to attempt to block scraping, but even at the resource scale of LI I doubt the effort is effective.
          • charcircuit9 hours ago
            I am not denying that scraping is useful. If it wasn&#x27;t people wouldn&#x27;t do it. But if the site rules say you aren&#x27;t allowed to scrape, then I don&#x27;t think people should be hostile towards the people enforcing the rules.
            • ronsor9 hours ago
              Well, they can try to enforce the rules; that&#x27;s perfectly fair. At the same time, there are many methods of &quot;trying&quot; which I would not consider valid or acceptable ones. &quot;Enforcing the rules&quot; does not give a carte blanche right to snoop and do &quot;whatever&#x27;s necessary.&quot; Sony tried that with their CD rootkits and got multiple lawsuits.
        • b1129 hours ago
          Yes, until it becomes abusive and malignly affects innocents.
        • mistrial96 hours ago
          this exchange -- obvious critical &#x2F; perhaps insurrection speech versus a stable voice of business economics -- should be within the purview of an orderly and predictable legal environment. BUT things moved quickly in the phone battles. Some people say that the legal system has never caught up to the data brokering, and in fact the surveillance state grew by leaps and bounds.<p>So, reasonable people may disagree. This is a fine place to mention it .. what if individual profiles built at LinkedIn are being combined with illegitimate and even directly illegal surveillance data and sold daily? Everyone stand up and salute when LinkedIn walks in the room? there has to be legal and direct ways to deal with change, and enforcement to complete an orderly and predictable economic marketplace.
        • cyanydeez6 hours ago
          the abuse&gt;using the information they publish to the public
        • qotgalaxy6 hours ago
          [dead]
        • schmidtleonard10 hours ago
          The big social media businesses deserve a Teddy Roosevelt character swooping in and busting their trusts, forcing them to play ball with others even if it destroys their moats. Boo hoo! Good riddance. World&#x27;s tiniest violin.<p>This is a popular position across the aisle. Here&#x27;s hoping the next guy can&#x27;t be bought, or at least asks for more than a $400M tacky gold ballroom!
      • xp8410 hours ago
        I mean, regardless of who they are or even if you don’t like what LinkedIn does themselves with the data people have given them, the random third parties with the extensions don’t additionally deserve to just grab all that data too, do they?
        • mathfailure9 hours ago
          Surely they do! The data is in the public internets, aren&#x27;t they?
          • ronsor9 hours ago
            They&#x27;d put Widevine or PlayReady DRM on the website if they could, I&#x27;m sure.
        • josephg9 hours ago
          Eh. I worked at a company which made an extension which scraped LinkedIn. We provided a service to recruiters, who would start a hiring process by putting candidates into our system.<p>The recruiters all had LinkedIn paid accounts, and could access all of this data on the web. We made a browser extension so they wouldn’t need to do any manual data entry. Recruiters loved the extension because it saved them time.<p>I think it was a legitimate use. We were making LinkedIn more useful to some of their actual customers (recruiters) by adding a somewhat cursed api integration via a chrome extension. Forcing recruiters to copy and paste did’t help anyone. Our extension only grabbed content on the page the recruiter had open. It was purely read only and scoped by the user.
          • RHSman24 hours ago
            I started their but it felt like a dodgy way (as it could be seen to be illegal). We then just went aloffical and went through Google search API’s with LinkedIn as the target. Worked a treat and was cheaper than recruiter!!!<p>So when pay the highest scraper, it’s ok! Same data, different manner.
          • xp847 hours ago
            Doesn&#x27;t sound like your operation was particularly questionable, but I can imagine there must be some of those 3,000 extensions where the data flow isn&#x27;t just &quot;DOM -&gt; End User&quot; but more of a &quot;Dom -&gt; Cloud Server -&gt; ??? -&gt; Profit!&quot; with perhaps a little detour where the end user gets some value too as a hook to justify the extension&#x27;s existence.
        • hsbauauvhabzb8 hours ago
          I say the same thing about my start menu sending every action I perform to bing.
        • sieabahlpark10 hours ago
          [dead]
    • dumbo239 hours ago
      [dead]
  • bastard_op8 hours ago
    Chrome is the new IE6. Google set themselves up to be the next Microsoft and is &quot;ad friendly&quot; in all the creepy ways because that&#x27;s what Google IS an ad company. All they&#x27;ve contributed to security is diminishing the capability of adblockers and letting malware to do bad things to you as consumers.
    • hashstring2 hours ago
      I fully agree that Chrome is spyware.<p>However, they do contribute to security: Chrome was first to implement Site Isolation, sandboxing too. These are essential security features for modern browsers. They are also not doing too bad with patching and security testing.
    • userbinator5 hours ago
      Chrome has become much <i>worse</i> than IE6. Microsoft was not in the business of tracking users and selling ads back then.
      • therealdrag02 hours ago
        It certainly doesn’t feel like I have a worse UX, as a daily chrome user.
    • 0xbadcafebee8 hours ago
      He who controls the Ads, controls the Internet.
    • themafia8 hours ago
      &gt; Google set themselves up to be the next Microsoft<p>Google became a monopoly. All monopolies do this.
      • cyanydeez6 hours ago
        there&#x27;s a step before that. Google is a pure capitalist enterprize&gt;pure capitalism goes to monopoly&gt;all monopolies do this.
    • brianpbeau7 hours ago
      Imagine being the nerd that is still using Chrome in the YOL 2026.
  • minkeymaniac10 hours ago
    I can confirm.. open up linkedIn.. hit F12 and watch the error count keep going up and up and up<p>Screenshots found here <a href="https:&#x2F;&#x2F;x.com&#x2F;DenisGobo&#x2F;status&#x2F;2018334684879438150" rel="nofollow">https:&#x2F;&#x2F;x.com&#x2F;DenisGobo&#x2F;status&#x2F;2018334684879438150</a>
    • 902100710 hours ago
      xcancel link: <a href="https:&#x2F;&#x2F;xcancel.com&#x2F;DenisGobo&#x2F;status&#x2F;2018334684879438150" rel="nofollow">https:&#x2F;&#x2F;xcancel.com&#x2F;DenisGobo&#x2F;status&#x2F;2018334684879438150</a>
  • avastel9 hours ago
    I wrote a blog post recently about the technique used by LinkedIn to do extension probing, as well as other ways to do it with less side effects<p><a href="https:&#x2F;&#x2F;blog.castle.io&#x2F;detecting-browser-extensions-for-bot-detection-lessons-from-linkedin-and-castle&#x2F;" rel="nofollow">https:&#x2F;&#x2F;blog.castle.io&#x2F;detecting-browser-extensions-for-bot-...</a>
    • direwolf203 hours ago
      Patch Firefox so navigator.webdriver is always false, then remote control it. Seems not easily detectable. You could still watch for fast input patterns...
    • pests7 hours ago
      Nice write up, definitely exactly this.
  • shouldnt_be9 hours ago
    I wrote an article about it a couple of months ago. I also explain why, how and a way to prevent it.<p><a href="https:&#x2F;&#x2F;javascript.plainenglish.io&#x2F;the-extensions-you-use-are-not-a-secret-especially-to-linkedin-64a8ef3f5b25?gi=62ac8f643b12" rel="nofollow">https:&#x2F;&#x2F;javascript.plainenglish.io&#x2F;the-extensions-you-use-ar...</a>
    • jmholla9 hours ago
      To clarify, you talk about why it&#x27;s possible, not why LinkedIn is doing it, right? Or did I miss something in your article.
  • Banditoz4 hours ago
    LinkedIn has been employing a lot of strange dark patterns recently:<p>* Overriding scroll speed on Firefox Web. Not sure why.<p>* Opening a profile on mobile web, then pressing back to go to last page, takes me to the LinkedIn homepage everytime.<p>* One of their analytic URLs is a randomly generated path on www.linkedin.com, supposedly to make it harder to block. Regex rules on ublock origin sufficiently stop this.<p>Anyone know why they could be doing this?
    • gabeh2 hours ago
      Giving them the benefit of the doubt here obviously, I know they&#x27;re in an all out war with the contact database industry. Going from websoup to agents dialing out to rent-a-human services requires different tactics.
  • bitbasher7 hours ago
    Looks like this has been known since 2019.<p><a href="https:&#x2F;&#x2F;www.nymeria.io&#x2F;blog&#x2F;linkedins-war-on-email-finder-extensions-like-nymeria" rel="nofollow">https:&#x2F;&#x2F;www.nymeria.io&#x2F;blog&#x2F;linkedins-war-on-email-finder-ex...</a>
  • bitbasher7 hours ago
    The list of extensions being scanned for are pretty clear and obvious. What is really interesting to me are the extensions _not_ being scanned for that should be.<p>The big one that comes to mind is &quot;Contact Out&quot; which is scan-able, but LinkedIn seems to pretend like it doesn&#x27;t exist? Smells like a deal happened behind the scenes...<p><a href="https:&#x2F;&#x2F;chromewebstore.google.com&#x2F;detail&#x2F;email-finder-by-contactou&#x2F;jjdemeiffadmmjhkbbpglgnlgeafomjo" rel="nofollow">https:&#x2F;&#x2F;chromewebstore.google.com&#x2F;detail&#x2F;email-finder-by-con...</a>
    • cxr6 hours ago
      That extension cannot be fingerprinted by its content-accessible resources. It doesn&#x27;t declare any in its manifest.
    • imvyarqoyzcuem1 hour ago
      interesting to see why they don&#x27;t block Claude in chrome or even this: <a href="https:&#x2F;&#x2F;chromewebstore.google.com&#x2F;detail&#x2F;dassi-ai-coworking-agent&#x2F;bjcngahpcjeililljmfegmlanlpgibdi" rel="nofollow">https:&#x2F;&#x2F;chromewebstore.google.com&#x2F;detail&#x2F;dassi-ai-coworking-...</a>
  • zahlman10 hours ago
    &gt; This repository documents every extension LinkedIn checks for and provides tools to identify them.<p>I get that the CSV lists the extensions, and the tools are provided in order to show work (mapping IDs to actual software). But how was it determined that LinkedIn checks for extensions with these IDs?<p>And is this relevant for non-Chrome users?
    • usefulposter10 hours ago
      Technical writeup from a few weeks ago by a vendor that explains how LinkedIn does it, then boasts that their approach is &quot;quieter, harder to notice, and easier to run at scale&quot;:<p><a href="https:&#x2F;&#x2F;blog.castle.io&#x2F;detecting-browser-extensions-for-bot-detection-lessons-from-linkedin-and-castle&#x2F;" rel="nofollow">https:&#x2F;&#x2F;blog.castle.io&#x2F;detecting-browser-extensions-for-bot-...</a>
  • mongrelion10 hours ago
    Curious question: why would they check for installed extensions on one&#x27;s browser?
    • CobrastanJorji9 hours ago
      Fingerprinting. There are a few reasons you&#x27;d do it:<p>1. Bot prevention. If the bots don&#x27;t know that you&#x27;re doing this, you might have a reliable bot detector for a while. The bots will quite possibly have no extensions at all, or even better specific exact combination they always use. Noticing bots means you can block them from scraping your site or spamming your users. If you wanna be very fancy, you could provide fake data or quietly ignore the stuff they create on the site.<p>2. Spamming&#x2F;misuse evasion. Imagine an extension called &quot;Send Messages to everybody with a given job role at this company.&quot; LinkedIn would prefer not to allow that, probably because they&#x27;d want to sell that feature.<p>3. User tracking.
      • b1temy5 hours ago
        &gt; The bots will quite possibly have no extensions at all<p>I imagine most users will also not have extensions at all, so this would not be a reliable metric to track bots. Maybe it might be hard to imagine for someone whose first thing to do after installing a web browser is to install some extensions that they absolutely can&#x27;t live without (ublock origin, privacy badger, dark mode reader, noscript, vimium c, whatever). But I imagine the majority of casual users do not install any extensions or even know of its existence (Maybe besides some people using something like Grammarly, or Honey, since they aggressively advertise on Youtube).<p>I do agree with the rest of your reasons though, like if bots used a specific exact combinations of extensions, or if there was an extension specifically for linkedin scraping&#x2F;automation they want to detect, and of course, user tracking.
      • xz18r8 hours ago
        I wrote some automation scripts that are not triggered via browser extensions (e.g., open all my sales colleagues’ profiles and like their 4 most recent unliked posts to boost their SSI[1], which is probably the most ‘innocent’ of my use-cases). It has random sleep intervals. I’ve done this for years and never faced a ban hammer.<p>Wonder if with things like Moltbot taking the scene, a form of “undetectable LinkedIn automation” will start to manifest. At some point they won’t be able to distinguish between a chronically online seller adding 100 people per day with personalized messages, or an AI doing it with the same mannerisms.<p>[1] <a href="https:&#x2F;&#x2F;business.linkedin.com&#x2F;sales-solutions&#x2F;social-selling&#x2F;the-social-selling-index-ssi" rel="nofollow">https:&#x2F;&#x2F;business.linkedin.com&#x2F;sales-solutions&#x2F;social-selling...</a>
    • jppope10 hours ago
      most automations for sales and marketing use browser extensions... linkedIn wants you using their tools not 3rd party
      • Nextgrid10 hours ago
        Their own tools suck, that’s the issue.
        • direwolf203 hours ago
          Third–party tools don&#x27;t bring money to LinkedIn, that&#x27;s the issue. Rather than try to compete, much easier to force you to use their tools! Reddit did the same thing.
    • staticshock10 hours ago
      For a social network, more information about their users = better ad targeting. It likely gets plumbed into models to inform user profiles.
      • Aurornis9 hours ago
        Look at the actual list. It&#x27;s primarily questionable AI tools, scrapers, lead generation tools, and other plugins in that vein.<p>I would guess this is for rate limiting and abuse detection.
    • HPsquared10 hours ago
      An attempt at fingerprinting, I suppose?
  • mrkramer8 hours ago
    LinkedIn is the worst walled garden of all of them.
  • dwedge8 hours ago
    I wonder if this is why the linkedin feed blocker I installed in Firefox 2 weeks ago stopped working for me within 24 hours
  • ddtaylor6 hours ago
    Does anyone know if Brave has any defense against this like Firefox does?
    • pnw3 hours ago
      It doesn&#x27;t seem like Brave&#x27;s fingerprinting prevention includes extensions, so on my first pass I would say no.
      • ddtaylor3 hours ago
        Good call. I did a test and on Chrome I see the spam and I also see the spam on Brave as well, so they don&#x27;t seem to be any different.
  • hasperdi9 hours ago
    Another thing... they alter the localStorage &amp; sessionStorage prototype, by wrapping the native ones with a wrapper that prevent keys that not in their whitelist from being set.<p>You can try this by opening devtools and setting<p><pre><code> localStorage.setItem(&#x27;hi&#x27;, 123)</code></pre>
  • Aurornis9 hours ago
    I suggest everyone take a look at the list of extensions and their names for some very important context: <a href="https:&#x2F;&#x2F;github.com&#x2F;mdp&#x2F;linkedin-extension-fingerprinting&#x2F;blob&#x2F;main&#x2F;chrome_extensions_with_names_all.csv" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;mdp&#x2F;linkedin-extension-fingerprinting&#x2F;blo...</a><p>I didn&#x27;t find popular extensions like uBlock or other ad blockers.<p>The list is full of scammy looking data collection and AI tools, though. Some random names from scrolling through the list:<p>- LinkedGPT: ChatGPT for LinkedIn<p>- Apollo Scraper - Extract &amp; Export Apollo B2B Leads<p>- AI Social Media Assistant<p>- LinkedIn Engagement Assistant<p>- LinkedIn Lead Magnet<p>- LinkedIn Extraction Tool - OutreachSheet<p>- Highperformr AI - Phone Number and Email Finder<p>- AI Agent For Jobs<p>These look like the kind of tools scummy recruiters and sales people use to identify targets for mass spamming. I see several AI auto-application tools in there too.
    • cxr7 hours ago
      &gt; I suggest everyone take a look at the list of extensions and their names for some very important context[…] I didn&#x27;t find popular extensions like uBlock<p>Unsurprising outcome since uBlock (specifically: uBlock Origin Lite, the only version available for Chrome on the Chrome Web Store) makes itself undetectable using this method. (All of its content-accessible resources have &quot;use_dynamic_url&quot; set to &quot;true&quot; in its extension manifest.) So its absence in this data is not dispositive of any actual intent by LinkedIn to exclude it—because they couldn&#x27;t have included it even if they wanted to.
    • NicuCalcea8 hours ago
      LinkedIn itself provides tools for scummy recruiters to mass spam, so this is just them protecting their business.<p>Also, not all of them are data collection tools. There are ad blockers listed (Hide LinkedIn Ads, SBlock - Super Ad Blocker) and just general extensions (Ground News - Bias Checker, Jigit Studio - Screen Recorder, RealEyes.ai — Detect Deepfakes Across Online Platforms, Airtable Clipper).
  • ta9888 hours ago
    So it really is espionage at all levels.
  • input_sh9 hours ago
    <p><pre><code> cut -d&#x27;,&#x27; -f2 chrome_extensions_with_names_all.csv | grep -c &quot;AI&quot; 474 </code></pre> Only 16%!?
  • insin7 hours ago
    So every Chrome extension that wants to avoid being detected this way needs to proxy fetch() on the target site, imagining someone with a bunch of them installed having every legit HTTP request on the target site going through a big stack of proxies
  • jmyeet4 hours ago
    I started using Chrome at version 2 I think. It still had the 3D logo. It was such a breath of fresh air and the big innovation was running one process per tab. Firefox existed but the entire browser could (and did) hang. And IE was... well, IE.<p>I did have a relatively early beef with Chrome though, whcih was I couldn&#x27;t completely opt out of Flash. As in, I didn&#x27;t even want it installed. This turned out to be an issue because Flash turned out to be one of the earliest vectors for so-called &quot;zombie cookies&quot;.<p>Fingerprinting in general has been a longstanding problem and has become more and more advanced.<p>Add to this that Google is, first and foremost, an advertising business and they&#x27;ve become increasingly hostile to ad-bloccking tech for obvious reasons.<p>Basically what I&#x27;m getting at is something I couldn&#x27;t have imagined a decade ago where I think I really have go switch away from Chrome to something that takes privacy and security seriously so that LinkedIn can&#x27;t do things like this. And I increasingly don&#x27;t trust Google to do that.<p>I actually have more trust in Apple because they have historically been user-focused eg blocking Meta&#x27;s third party cookies. But obviously Safari isn&#x27;t an option because it&#x27;s not cross-platform.<p>I&#x27;m not sure I trust the current state of Mozilla. What&#x27;s the alternative? Brave? Is Opera still a thing? I honestly don&#x27;t know.<p>What I really want is a cross-platform browser written in Rust that black-holes ads out of the box. Why Rust? Memory safety. I simply don&#x27;t trust a large C&#x2F;C++ code to never have buffer overruns. Memory safety has become too important.<p>I don&#x27;t want my browser to provide information on what extensions I&#x27;m using to a site and that shouldn&#x27;t be a thing I have to ask for or turn on in any way.
    • direwolf203 hours ago
      There&#x27;s a menagerie of de-mozillaed Firefox forks.
      • rudhdb773b1 hour ago
        My suggestions:<p>Desktop - Librewolf<p>Android - Ironfox
  • tech234a9 hours ago
    See also: a demo page for the same technique that can enumerate many extensions installed in your browser: <a href="https:&#x2F;&#x2F;browserleaks.com&#x2F;chrome" rel="nofollow">https:&#x2F;&#x2F;browserleaks.com&#x2F;chrome</a>
    • xnx8 hours ago
      Yuck. Disgusting that extension detection is possible.
  • ece5 hours ago
    Cover your tracks from EFF doesn&#x27;t seem to check extensions? Are there other fingerprint tests to use?
  • DOM1008 hours ago
    const nameA = getName(a).toLowerCase(); const nameB = getName(b).toLowerCase(); return nameA.localeCompare(nameB);<p>const msg = createDoneMessage(); msg.style.opacity = &#x27;1&#x27;;<p><pre><code> console.log(&quot;Extensions sorted alphabetically!&quot;); console.table(sortedCards.map(c =&gt; ({ name: getName(c), id: c.id || &#x27;—&#x27;</code></pre>
  • ramuel7 hours ago
    We live in the best timeline.
  • unstatusthequo9 hours ago
    I’m probably on the list. I made a LinkedIn Redactor that allowed you to add keywords and remove posts from your thread that included such words. It’s the X feature but for LinkedIn. Anyway, got a cease and desist from those lame fucks at LI. So I removed from the chrome store but it’s still available on GitHub.
  • fHr6 hours ago
    Linkedin is such a shity wanabe HR adult day care recruiting bs platform, if it would go offline tomorrow and never came back not a single tear would be shed by any Engineer.
  • lapcat10 hours ago
    [removed]
    • chocolatkey10 hours ago
      That’s incorrect, it’s trying to load an asset (hardcoded unique per-extension path) for each extension, there is a huge list of these in the source code: <a href="https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;mdp&#x2F;linkedin-extension-fingerprinting&#x2F;refs&#x2F;heads&#x2F;main&#x2F;fingerprint.js" rel="nofollow">https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;mdp&#x2F;linkedin-extension-fin...</a>
    • ronsor10 hours ago
      This is a security vulnerability and should be patched. Sorry, LinkedIn.<p>(Alternatively extension developers can modify their extensions to block these requests!)
      • 0cf8612b2e1e10 hours ago
        No kidding. I am shocked this works.<p>Does Firefox have a similar weakness?
        • tech234a9 hours ago
          No. Firefox always randomizes the extension ID used for URLs to web accessible resources on each restart [1]. Apparently, manifest v3 extensions on Chromium can now opt into similar behavior [2].<p>[1]: <a href="https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;Chrome_incompatibilities#miscellaneous_incompatibilities" rel="nofollow">https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;Web...</a><p>[2]: <a href="https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;manifest.json&#x2F;web_accessible_resources#manifest_v3_syntax" rel="nofollow">https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;Web...</a>
          • cxr7 hours ago
            That&#x27;s a different form of defense. The original claim in this thread was that LinkedIn&#x27;s fingerprinting implementation was making cross-site requests to Chrome Web Store, and that they were reading back the response of those requests.<p>Firefox isn&#x27;t susceptible to that, because that&#x27;s not how Firefox and addons.mozilla.org work. Chrome, as it turns out, isn&#x27;t susceptible to it, either, because that&#x27;s also not how Chrome and the Chrome Web Store work. (And that&#x27;s not what LinkedIn&#x27;s fingerprinting technique does.)<p>(Those randomized IDs for content-accessible resources, however, do explain why the technique that LinkedIn actually uses is is a non-starter for Firefox.)
          • tech234a8 hours ago
            An additional improvement added in manifest v3 in both Chromium and Firefox is that extensions can choose to expose web accessible resources to only certain websites. Previously, exposing a web accessible resource always made that resource accessible to all websites.
        • cxr9 hours ago
          It doesn&#x27;t work. The person who posted the comment you&#x27;re responding to has absolutely no idea what he&#x27;s talking about. He confabulated the entire explanation based on a single misunderstood block of code that contains the comment «<i>Remove &quot; - Chrome Web Store&quot; suffix if present</i>» in the (local, NodeJS-powered) scraper that the person who&#x27;s publishing this data themselves used to fetch extension names.
        • burkaman9 hours ago
          I don&#x27;t see any evidence of this happening in Firefox. Either it&#x27;s more difficult or they just didn&#x27;t bother, either way I&#x27;m happy.<p>Edit: Can&#x27;t find much documentation on exactly how the anti-fingerprinting works, but this page implies that the browser blocks extension detection: <a href="https:&#x2F;&#x2F;support.mozilla.org&#x2F;en-US&#x2F;kb&#x2F;trackers-and-scripts-firefox-blocks-enhanced-track#w_fingerprinters" rel="nofollow">https:&#x2F;&#x2F;support.mozilla.org&#x2F;en-US&#x2F;kb&#x2F;trackers-and-scripts-fi...</a>
          • Wicher4 hours ago
            From memory from working with these a couple of years ago:<p>Firefox extension asset URLs are random and long (there&#x27;s a UUID in there iirc). The extension itself can discover its randomized base so that it can output its asset URLs, but webpage code can&#x27;t.
      • MrGilbert10 hours ago
        I&#x27;m not sure how you&#x27;d patch that. Any request that’s made from the current open tab &#x2F; window is made on behalf of the user. From my point of view, it&#x27;s impossible for the browser to know, if the request is legit or not.
        • ronsor10 hours ago
          An ideal implementation of the same origin policy would make it impossible for a site (through a <i>fetch</i> call or otherwise) to determine whether an extension resource exists&#x2F;is installed or the site simply lacks permission to access it.
      • toomuchtodo10 hours ago
        Is there no browser setting to defend against this attack? If not, there should be, versus relying on extension authors to configure or enable such a setting.
        • zahlman10 hours ago
          I imagine that it would require browsers to treat web requests from JS differently from those initiated by the user, specifically pretending the JS-originating requests are by logged-out or &quot;incognito&quot; users (by, I suppose, simply not forwarding any local credentials along, but maybe there&#x27;s more to it than that).<p>Which would probably wreak havoc with a lot of web apps, at least requiring some kind of same-origin policy. And maybe it messes with OAuth or something. But it does seem at least feasible.
          • circuit109 hours ago
            As people have said it’s not making requests to web store, that’s just part of this repository looking for what extensions it’s blocking via nodejs<p>Browsers already have strong protections against that sort of thing, look up the same-origin policy and CORS
            • zahlman9 hours ago
              I see, I was too credulous.
    • jsheard10 hours ago
      Looks to me like LinkedIn is fetching chrome-extension:&#x2F;&#x2F;{extension id}&#x2F;{known filename} and seeing if it succeeds, not pinging the web store.<p>Should be patched nonetheless though, that&#x27;s a pretty obscene fingerprinting vector.
      • what9 hours ago
        How do you patch it? The extensions themselves (presumably) need to access the same web accessible resources from their content scripts. How do you differentiate between some extension’s content script requesting the resource and LinkedIn requesting it?
        • jsheard9 hours ago
          Firefox already mitigates this by randomizing the extension path: <a href="https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;WebExtensions&#x2F;manifest.json&#x2F;web_accessible_resources" rel="nofollow">https:&#x2F;&#x2F;developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Mozilla&#x2F;Add-ons&#x2F;Web...</a><p><pre><code> The file is then available using a URL like: moz-extension:&#x2F;&#x2F;&lt;extension-UUID&gt;&#x2F;images&#x2F;my-image.png&quot; &lt;extension-UUID&gt; is not your extension&#x27;s ID. This ID is randomly generated for every browser instance. This prevents websites from fingerprinting a browser by examining the extensions it has installed.</code></pre>
          • zahlman9 hours ago
            Doesn&#x27;t the browser know which script it&#x27;s running?<p>Why can&#x27;t it just deny access to the specified path, except to the extension itself?
            • cxr9 hours ago
              It does by default, except for the files from the extension that the extension author has explicitly designated as content-accessible. It&#x27;s explained (&quot;Using web_accessible_resources&quot;) at the other end of the link.
    • cobertos10 hours ago
      Wouldn&#x27;t that mean 2900 requests from fingerprint.js??
    • halapro10 hours ago
      If this is true, it&#x27;s insane that this would work:<p>- why does CWS respond to cross-site requests?<p>- why is chrome sending the credentials (or equivalent) in these requests?<p>- why is the button enabled server-side and not via JS? Google must be confident in knowing the exact and latest state of your installed extensions enough to store it on their servers, I guess
      • cxr9 hours ago
        It&#x27;s not true. The person you&#x27;re responding to has a habit of posting implausible-but-plausibly-plausible nonsense, and it&#x27;s not how this works at all.
        • lapcat8 hours ago
          I made the mistake of trying to skim the code hastily before I had to leave to run an errand, and yes it turns out I was wrong, but please refrain from the personal comments, and no, I don&#x27;t have any such &quot;habit.&quot;
          • cxr8 hours ago
            Wrong again. (PS: The fact that you have now replied—which automatically disables comment deletion—is the only thing that prevented my removing it just now. So great job.)
            • lapcat8 hours ago
              &gt; The fact that you have now replied—which automatically disables comment deletion—is the only thing that prevented my removing it just now. So great job.<p>How was I supposed to know that you intended to delete it?<p>In any case, you may still have time to edit your comment, as I did with my erroneous root-level comment, since I can&#x27;t delete that either, for the same reason.
              • cxr8 hours ago
                Not interested. You also shouldn&#x27;t have done that. You broke the thread—exactly what HN&#x27;s no-deleting-comments-that-have-replies check was created to prevent.<p>Consider this: just stop being reckless.
    • usefulposter10 hours ago
      Isn&#x27;t it enumerating web_accessible_resources? Below <i>static collectFeatures(e, t)</i> there is a mapping of extension IDs to files in the <i>const r</i> (Minified JS, obviously.)<p>Edit: Confirmed. It&#x27;s not pinging the Chrome Web Store. <a href="https:&#x2F;&#x2F;blog.castle.io&#x2F;detecting-browser-extensions-for-bot-detection-lessons-from-linkedin-and-castle&#x2F;" rel="nofollow">https:&#x2F;&#x2F;blog.castle.io&#x2F;detecting-browser-extensions-for-bot-...</a>
  • iLoveOncall10 hours ago
    [flagged]
  • DrStartup9 hours ago
    Setup a quick CDP connection. Have Claude Code attach and inject JS into Page.addScriptToEvaluateOnNewDocument. Loads before the page.<p>Typical early hooks: • fetch wrapper • XMLHttpRequest.prototype.open&#x2F;send wrapper • WebSocket constructor wrapper • history.pushState&#x2F;replaceState wrapper • EventTarget.addEventListener wrapper (optional, heavy) • MutationObserver for DOM diffs • Error + unhandledrejection capture
    • userbinator5 hours ago
      Looks like whatever LLM you used is not doing a very good job.
    • HumanOstrich8 hours ago
      This is irrelevant to the article and discussions here. Weird copypasta bullet points too.
    • shj21059 hours ago
      what would this do?