<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://consumerrights.wiki/index.php?action=history&amp;feed=atom&amp;title=Stylish_%28Chrome_extension%29</id>
	<title>Stylish (Chrome extension) - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://consumerrights.wiki/index.php?action=history&amp;feed=atom&amp;title=Stylish_%28Chrome_extension%29"/>
	<link rel="alternate" type="text/html" href="https://consumerrights.wiki/index.php?title=Stylish_(Chrome_extension)&amp;action=history"/>
	<updated>2026-05-29T20:10:10Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://consumerrights.wiki/index.php?title=Stylish_(Chrome_extension)&amp;diff=55139&amp;oldid=prev</id>
		<title>82.3.220.102: Edits by James Arnott. I&#039;ve removed the &quot;This has not been independently validated&quot; just because I&#039;ve personally confirmed their obfuscation scheme by decoding the payloads and it can be easily confirmed by others using the given script.</title>
		<link rel="alternate" type="text/html" href="https://consumerrights.wiki/index.php?title=Stylish_(Chrome_extension)&amp;diff=55139&amp;oldid=prev"/>
		<updated>2026-05-29T14:40:35Z</updated>

		<summary type="html">&lt;p&gt;Edits by James Arnott. I&amp;#039;ve removed the &amp;quot;This has not been independently validated&amp;quot; just because I&amp;#039;ve personally confirmed their obfuscation scheme by decoding the payloads and it can be easily confirmed by others using the given script.&lt;/p&gt;
&lt;a href=&quot;https://consumerrights.wiki/index.php?title=Stylish_(Chrome_extension)&amp;amp;diff=55139&amp;amp;oldid=55131&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>82.3.220.102</name></author>
	</entry>
	<entry>
		<id>https://consumerrights.wiki/index.php?title=Stylish_(Chrome_extension)&amp;diff=55131&amp;oldid=prev</id>
		<title>Louis: add verbatim json payload sample and decodestylish javascript decoder from arnott&#039;s feb 2026 post</title>
		<link rel="alternate" type="text/html" href="https://consumerrights.wiki/index.php?title=Stylish_(Chrome_extension)&amp;diff=55131&amp;oldid=prev"/>
		<updated>2026-05-29T13:31:45Z</updated>

		<summary type="html">&lt;p&gt;add verbatim json payload sample and decodestylish javascript decoder from arnott&amp;#039;s feb 2026 post&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 13:31, 29 May 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l68&quot;&gt;Line 68:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 68:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In February 2026, James Arnott, founder of Bay Area Labs (&amp;quot;Am I Being Pwned?&amp;quot;), revisited the extension. In a February 26, 2026 post titled &amp;#039;&amp;#039;&amp;quot;Stylish is Back, Back again!&amp;quot;&amp;#039;&amp;#039;, Arnott reported that Stylish was still sending a POST request for every page visit, with the same payload structure as in 2018, but now wrapped in a far more elaborate obfuscation scheme.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;In February 2026, James Arnott, founder of Bay Area Labs (&amp;quot;Am I Being Pwned?&amp;quot;), revisited the extension. In a February 26, 2026 post titled &amp;#039;&amp;#039;&amp;quot;Stylish is Back, Back again!&amp;quot;&amp;#039;&amp;#039;, Arnott reported that Stylish was still sending a POST request for every page visit, with the same payload structure as in 2018, but now wrapped in a far more elaborate obfuscation scheme.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Arnott listed five 2018 press articles confirming the original takedown, then noted that the current version of the extension carries both Google&#039;s &#039;&#039;&quot;Verified Publisher&quot;&#039;&#039; &amp;amp; &#039;&#039;&quot;Featured&quot;&#039;&#039; badges on the Chrome Web Store.&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt; A sample payload he captured contains the fields &#039;&#039;gp&#039;&#039; (current URL), &#039;&#039;klm&#039;&#039; (previous URL), &amp;amp; &#039;&#039;pxe&#039;&#039; (per-user identifier), among others.&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt; Arnott wrote:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Arnott listed five 2018 press articles confirming the original takedown, then noted that the current version of the extension carries both Google&#039;s &#039;&#039;&quot;Verified Publisher&quot;&#039;&#039; &amp;amp; &#039;&#039;&quot;Featured&quot;&#039;&#039; badges on the Chrome Web Store.&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt; A sample payload he captured contains the fields &#039;&#039;gp&#039;&#039; (current URL), &#039;&#039;klm&#039;&#039; (previous URL), &amp;amp; &#039;&#039;pxe&#039;&#039; (per-user identifier), among others.&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The payload Arnott published, captured from a single page visit, was:&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;gp&quot;: &quot;https://userstylesapi.com/top/styles&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;klm&quot;: &quot;https://www.google.com/search?q=test+google&amp;amp;rlz=1C5OZZY_enGB1156GB1156&amp;amp;oq=test&amp;amp;gs_lcrp=Eg...&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;ver&quot;: &quot;https://www.google.com/search?q=test+google&amp;amp;rlz=1C5OZZY_enGB1156GB1156&amp;amp;oq=test&amp;amp;gs_lcrp=Eg...&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;knl&quot;: &quot;&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;dig&quot;: &quot;2008511158&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;tmg&quot;: &quot;link&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;trp&quot;: &quot;exthead&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;st&quot;: &quot;1772053130391&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;ch&quot;: &quot;9&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;di&quot;: &quot;a3e3e2a81&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;pxe&quot;: &quot;Lk85G2SeiETEPNOWlrR15mLsZDsC&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;vmt&quot;: &quot;6&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;lav&quot;: &quot;21&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;wv&quot;: &quot;1&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;gr&quot;: &quot;3.4.10&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    &quot;craz&quot;: &quot;AAEAAAAAAG0RCwIRdAAAAAAAAAAAAAAAAAAAAAAAAAA=&quot;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Arnott wrote:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;Where gp is your current URL, klm was your previous URL and pxe is your unique identifier, amongst other data.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;Where gp is your current URL, klm was your previous URL and pxe is your unique identifier, amongst other data.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l86&quot;&gt;Line 86:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 109:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;URL encoding to a query string... Double base64 encoded JSON stringified, then base64 again... Columnar transposition cipher, the base64 string is split into 48-character rows, then read column-by-column instead of row-by-row, scrambling the text... AES-256-CBC encrypted using a symmetric key hardcoded in the extension source code... Base64 encoded one final time.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;URL encoding to a query string... Double base64 encoded JSON stringified, then base64 again... Columnar transposition cipher, the base64 string is split into 48-character rows, then read column-by-column instead of row-by-row, scrambling the text... AES-256-CBC encrypted using a symmetric key hardcoded in the extension source code... Base64 encoded one final time.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Arnott characterized the construction as more elaborate than its purpose required. On the AES-256-CBC stage, he commented that a hardcoded symmetric key offers no real confidentiality against anyone who can read the extension&#039;s JavaScript, &amp;amp; noted that asymmetric encryption would have avoided shipping the key inside the extension at all.&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt; He published &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;a working &lt;/del&gt;decode &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;script demonstrating &lt;/del&gt;that the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;entire chain can be reversed using &lt;/del&gt;the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;embedded &lt;/del&gt;key.&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt; Arnott summarized his read of the chain&#039;s motive:&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Arnott characterized the construction as more elaborate than its purpose required. On the AES-256-CBC stage, he commented that a hardcoded symmetric key offers no real confidentiality against anyone who can read the extension&#039;s JavaScript, &amp;amp; noted that asymmetric encryption would have avoided shipping the key inside the extension at all.&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt; He published &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;the following JavaScript decoder, which uses the symmetric key extracted from the extension to reverse the entire chain &amp;amp; recover the original URL payload:&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;async function decodeStylish(blob) {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    const key = await crypto.subtle.importKey(&quot;jwk&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      {alg:&quot;A256CBC&quot;,ext:true,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;k:&quot;MaQ2KBEEiYcOcSCfszxMBVrKsXK3hxGmxZ8Zjq50KZg&quot;,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;key_ops:[&quot;decrypt&quot;],kty:&quot;oct&quot;},&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &quot;AES-CBC&quot;,false,[&quot;decrypt&quot;]);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    const raw = Uint8Array.from(atob(blob), c =&amp;amp;gt; c.charCodeAt(0));&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    const dec = await crypto.subtle.decrypt({name:&quot;AES-CBC&quot;,iv:raw.slice(0,16)}, key, raw.slice(16));&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    const rows = new TextDecoder().&lt;/ins&gt;decode&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;(dec).split(&quot;\n&quot;);&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    let b64 = &quot;&quot;;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    for (let col = 0; col &amp;amp;lt; rows[0].length; col++)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      for (const row of rows) { const ch = row[col]; if (ch &amp;amp;amp;&amp;amp;amp; ch !== &quot; &quot;) b64 += ch; }&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    const obj = JSON.parse(atob(b64));&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    const once = atob(obj.e.replace(/-/g,&quot;+&quot;).replace(/_/g,&quot;/&quot;));&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    const qs = atob(once.replace(/-/g,&quot;+&quot;).replace(/_/g,&quot;/&quot;));&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;    return Object.fromEntries(new URLSearchParams(qs));&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  }&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;/pre&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;The key string &amp;lt;code&amp;gt;MaQ2KBEEiYcOcSCfszxMBVrKsXK3hxGmxZ8Zjq50KZg&amp;lt;/code&amp;gt; is the AES-256-CBC symmetric key &lt;/ins&gt;that &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;ships inside &lt;/ins&gt;the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;extension&#039;s own JavaScript bundle, which is what Arnott meant when he commented that &lt;/ins&gt;the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;hardcoded &lt;/ins&gt;key &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;makes his job as an outside reviewer &#039;&#039;&quot;so much easier&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot;&#039;&#039;&lt;/ins&gt;&amp;lt;ref name=&quot;aibp-stylish&quot; /&amp;gt; Arnott summarized his read of the chain&#039;s motive:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;This POST request is obfuscated, which in my opinion is to make it harder for people to see what it&amp;#039;s doing or to get around the Chrome Web Store publishing review process, or perhaps even both.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;This POST request is obfuscated, which in my opinion is to make it harder for people to see what it&amp;#039;s doing or to get around the Chrome Web Store publishing review process, or perhaps even both.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wiki:diff:1.41:old-55129:rev-55131:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Louis</name></author>
	</entry>
	<entry>
		<id>https://consumerrights.wiki/index.php?title=Stylish_(Chrome_extension)&amp;diff=55129&amp;oldid=prev</id>
		<title>Louis: new product article on the stylish chrome extension. covers the 2017 similarweb acquisition, robert heaton&#039;s 2018 url-exfiltration disclosure and the two-day chrome and firefox takedowns, arnott&#039;s 2026 wall-of-shame entry, the five-stage obfuscation chain, the privacy-policy contradiction, and the stylus fork as the practical alternative.</title>
		<link rel="alternate" type="text/html" href="https://consumerrights.wiki/index.php?title=Stylish_(Chrome_extension)&amp;diff=55129&amp;oldid=prev"/>
		<updated>2026-05-29T13:23:25Z</updated>

		<summary type="html">&lt;p&gt;new product article on the stylish chrome extension. covers the 2017 similarweb acquisition, robert heaton&amp;#039;s 2018 url-exfiltration disclosure and the two-day chrome and firefox takedowns, arnott&amp;#039;s 2026 wall-of-shame entry, the five-stage obfuscation chain, the privacy-policy contradiction, and the stylus fork as the practical alternative.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{ProductCargo&lt;br /&gt;
|ArticleType=Product&lt;br /&gt;
|Category=Browser extension&lt;br /&gt;
|Company=SimilarWeb&lt;br /&gt;
|Description=Browser extension that exfiltrates every URL its users visit &amp;amp; their AI chat content to SimilarWeb&amp;#039;s servers&lt;br /&gt;
|InProduction=Yes&lt;br /&gt;
|ReleaseYear=2006&lt;br /&gt;
|Website=https://userstyles.org/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Stylish&amp;#039;&amp;#039;&amp;#039; is a Chrome &amp;amp; Firefox browser extension for applying user-written CSS skins to websites, originally written by Jason Barnabe as an open-source project &amp;amp; in circulation by January 2006 when Jesse Ruderman reviewed it.&amp;lt;ref name=&amp;quot;ruderman&amp;quot;&amp;gt;{{Cite web |title=Stylish |url=https://www.squarefree.com/2006/01/15/stylish/ |first=Jesse |last=Ruderman |date=2006-01-15 |website=squarefree.com}}&amp;lt;/ref&amp;gt; It has been owned since January 2017 by the digital-market-intelligence firm [[SimilarWeb]],&amp;lt;ref name=&amp;quot;bc-2017&amp;quot;&amp;gt;{{Cite web |title=2 Million Users Impacted by New Data Collection Policy in Stylish Browser Add-On |url=https://www.bleepingcomputer.com/news/software/2-million-users-impacted-by-new-data-collection-policy-in-stylish-browser-add-on/ |first=Catalin |last=Cimpanu |date=2017-01-04 |website=BleepingComputer}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt; which uses the extension to record every URL its users visit. Security researcher Robert Heaton documented the full-URL exfiltration on July 2, 2018,&amp;lt;ref name=&amp;quot;heaton1&amp;quot;&amp;gt;{{Cite web |title=&amp;quot;Stylish&amp;quot; browser extension steals all your internet history |url=https://robertheaton.com/2018/07/02/stylish-browser-extension-steals-your-internet-history/ |first=Robert |last=Heaton |date=2018-07-02 |website=robertheaton.com}}&amp;lt;/ref&amp;gt; after which Google &amp;amp; Mozilla removed Stylish from both stores within two days;&amp;lt;ref name=&amp;quot;heaton1&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;bc-2018&amp;quot;&amp;gt;{{Cite web |title=Chrome and Firefox Pull Stylish Add-On After Report It Logged Browser History |url=https://www.bleepingcomputer.com/news/software/chrome-and-firefox-pull-stylish-add-on-after-report-it-logged-browser-history/ |first=Catalin |last=Cimpanu |date=2018-07-04 |website=BleepingComputer}}&amp;lt;/ref&amp;gt; the extension was back in the Firefox add-on store by August 16, 2018 behind an opt-in startup screen.&amp;lt;ref name=&amp;quot;heaton2&amp;quot;&amp;gt;{{Cite web |title=&amp;quot;Stylish&amp;quot; is back, and you still shouldn&amp;#039;t use it |url=https://robertheaton.com/2018/08/16/stylish-is-back-and-you-still-shouldnt-use-it/ |first=Robert |last=Heaton |date=2018-08-16 |website=robertheaton.com}}&amp;lt;/ref&amp;gt; In February 2026, security researcher James Arnott of Bay Area Labs reported that Stylish was still exfiltrating every visited URL through a five-stage obfuscation chain ending in AES-256-CBC encryption with a symmetric key hardcoded in the extension&amp;#039;s own source code,&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot;&amp;gt;{{Cite web |title=Stylish is Back, Back again! |url=https://amibeingpwned.com/blog/stylish-is-back-back-again/ |first=James |last=Arnott |date=2026-02-26 |website=Am I Being Pwned?}}&amp;lt;/ref&amp;gt; and in May 2026 Arnott ranked Stylish first on his &amp;#039;&amp;#039;&amp;quot;AI Chat Scraping Extension Wall of Shame,&amp;quot;&amp;#039;&amp;#039; reporting it also exfiltrates user conversations with Character.AI, ChatGPT, &amp;amp; Claude.&amp;lt;ref name=&amp;quot;aibp-wall&amp;quot;&amp;gt;{{Cite web |title=The AI Chat Scraping Extension Wall of Shame |url=https://amibeingpwned.com/blog/ai-chat-scraper-wall-of-shame |first=James |last=Arnott |date=2026-05-11 |website=Am I Being Pwned?}}&amp;lt;/ref&amp;gt; As of May 2026, the Chrome Web Store lists Stylish with 2,000,000 users &amp;amp; displays both Google&amp;#039;s &amp;#039;&amp;#039;&amp;quot;Featured&amp;quot;&amp;#039;&amp;#039; badge &amp;amp; a &amp;#039;&amp;#039;&amp;quot;Verified Publisher&amp;quot;&amp;#039;&amp;#039; badge on its listing.&amp;lt;ref name=&amp;quot;cws-stylish&amp;quot;&amp;gt;{{Cite web |title=Stylish - Custom themes for any website |url=https://chromewebstore.google.com/detail/stylish-custom-themes-for/fjnbnpbmkenffdnngjfgmeleoegfcffe |publisher=Google / Similarweb LTD |date=2026-03-19 |website=Chrome Web Store}}&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;aibp-wall&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Consumer-impact summary ==&lt;br /&gt;
&lt;br /&gt;
* Records the full URL of every page the user visits &amp;amp; sends it to SimilarWeb&amp;#039;s servers, including the query string of every Google search, password-reset links sent by email, &amp;amp; one-time medical-record links.&amp;lt;ref name=&amp;quot;heaton1&amp;quot; /&amp;gt;&lt;br /&gt;
* Sends the captured URLs together with a per-user identifier that can be tied to a real-world identity through the userstyles.org login cookie, which is scoped to all userstyles.org subdomains.&amp;lt;ref name=&amp;quot;heaton1&amp;quot; /&amp;gt;&lt;br /&gt;
* As of 2026, also captures user conversations with hosted AI assistants such as Character.AI, ChatGPT, &amp;amp; Claude.&amp;lt;ref name=&amp;quot;aibp-wall&amp;quot; /&amp;gt;&lt;br /&gt;
* Wraps the captured data in a five-stage encoding chain ending in AES-256-CBC encryption whose key is hardcoded in the extension&amp;#039;s own JavaScript, so the encryption protects the data only from outside observers, not from SimilarWeb.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
* Carries Google&amp;#039;s &amp;#039;&amp;#039;&amp;quot;Featured&amp;quot;&amp;#039;&amp;#039; &amp;amp; &amp;#039;&amp;#039;&amp;quot;Verified Publisher&amp;quot;&amp;#039;&amp;#039; badges on the Chrome Web Store despite the documented behavior.&amp;lt;ref name=&amp;quot;cws-stylish&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;aibp-wall&amp;quot; /&amp;gt;&lt;br /&gt;
* The open-source fork [[Stylus]], maintained by the community after the 2017 SimilarWeb acquisition, is a drop-in replacement that caches styles locally &amp;amp; sends nothing to a server.&amp;lt;ref name=&amp;quot;cws-stylus&amp;quot;&amp;gt;{{Cite web |title=Stylus |url=https://chromewebstore.google.com/detail/stylus/clngdbkpkpeebahjckkjfobafhncgmne |publisher=Google / stylus.openstyles |date=2026-05-26 |website=Chrome Web Store}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
Stylish lets users apply user-written CSS to any website, replacing fonts, colors, &amp;amp; layouts with community-contributed &amp;quot;skins.&amp;quot; It was created by Jason Barnabe as a Firefox extension; the earliest contemporaneous record in the source set is Jesse Ruderman&amp;#039;s January 15, 2006 review on squarefree.com, which described it as &amp;#039;&amp;#039;&amp;quot;a Firefox extension by Jason Barnabe&amp;quot;&amp;#039;&amp;#039; that &amp;#039;&amp;#039;&amp;quot;lets you manage CSS rules to change the appearance of web sites.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;ruderman&amp;quot; /&amp;gt; Barnabe also operated the userstyles.org community site where users uploaded &amp;amp; shared their styles.&amp;lt;ref name=&amp;quot;ghacks&amp;quot;&amp;gt;{{Cite web |title=Stylish and userstyles.org have a new owner |url=https://www.ghacks.net/2016/10/09/stylish-and-userstyles-org-have-a-new-owner/ |first=Martin |last=Brinkmann |date=2016-10-09 |website=gHacks Tech News}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For about a decade, Stylish operated as a small open-source project with no server-side telemetry: the extension fetched styles when the user asked for them &amp;amp; otherwise ran entirely locally. That changed when Barnabe stepped back from the project. In late September &amp;amp; early October 2016, ownership of both the Stylish extension &amp;amp; userstyles.org was transferred from Barnabe to a new operator named Justin Hindman.&amp;lt;ref name=&amp;quot;ghacks&amp;quot; /&amp;gt; Three months later, Hindman announced that he had sold or partnered the project to SimilarWeb.&amp;lt;ref name=&amp;quot;bc-2017&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SimilarWeb acquisition ==&lt;br /&gt;
&lt;br /&gt;
On January 4, 2017, BleepingComputer reported that Stylish &amp;#039;&amp;#039;&amp;quot;announced this week through the voice of its new owner a new data collection partnership with SimilarWeb, a digital market intelligence company,&amp;quot;&amp;#039;&amp;#039; with Hindman explaining the deal as a resource problem.&amp;lt;ref name=&amp;quot;bc-2017&amp;quot; /&amp;gt; In a statement to the publication, Hindman wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;When I first started working on Stylish, I understood that this product is incredible, but in order to bring it to its full potential, it would require a tremendous amount of resources I just don&amp;#039;t have.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;bc-2017&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The new privacy policy added a data-collection feature labeled the &amp;#039;&amp;#039;&amp;quot;Suggested Web Styles&amp;quot;&amp;#039;&amp;#039; system. SimilarWeb&amp;#039;s stated rationale was that recording each user&amp;#039;s visited URLs let the extension recommend matching community styles. An opt-out toggle existed in the extension&amp;#039;s settings panel, but BleepingComputer noted &amp;#039;&amp;#039;&amp;quot;[t]he anonymous data collection system comes turned on by default in all new installations&amp;quot;&amp;#039;&amp;#039;; unchecking it disabled the suggestion feature &amp;amp; excluded the user from the displayed install counts.&amp;lt;ref name=&amp;quot;bc-2017&amp;quot; /&amp;gt; At the time, Stylish had nearly two million users across Chrome &amp;amp; Firefox.&amp;lt;ref name=&amp;quot;bc-2017&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018 disclosure &amp;amp; takedown ==&lt;br /&gt;
&lt;br /&gt;
=== Heaton&amp;#039;s findings ===&lt;br /&gt;
&lt;br /&gt;
On July 2, 2018, software engineer Robert Heaton published a technical write-up titled &amp;#039;&amp;#039;&amp;quot;&amp;#039;Stylish&amp;#039; browser extension steals all your internet history.&amp;quot;&amp;#039;&amp;#039; Working with the Burp Suite proxy, he had noticed that his browser was sending a steady stream of obfuscated POST requests to &amp;#039;&amp;#039;api.userstyles.org/stats.&amp;#039;&amp;#039; He described the encoding as plain base64 wrapped twice:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;I noticed that the data blob contained only letters and numbers and ended in %3D, the URL encoding for an = sign. This made me suspect that the blob had been Base64 encoded. I tried Base64 decoding it... Still nonsense. But the decoded string also contained only letters and numbers, and also ended in an = sign. I tried Base64 decoding it a second time... Pyrrhic victory. When I looked at the contents of the decoded payload, I realized that Stylish was exfiltrating all my browsing data.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;heaton1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Inside the decoded payload Heaton found a unique tracking identifier attached to each request. Because the same browser also held a userstyles.org login session, the tracking identifier could be linked to a registered account. As Heaton put it, &amp;#039;&amp;#039;&amp;quot;Stylish&amp;#039;s session cookie is scoped to *.userstyles.org, so it gets sent to every userstyles.org sub-domain as well.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;heaton1&amp;quot; /&amp;gt; He noted that the cookie expired at the end of each browser session, but pointed out that &amp;#039;&amp;#039;&amp;quot;it only takes one tracking request containing one session cookie to permanently associate a user account with a Stylish tracking identifier.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;heaton1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Heaton walked through the consumer-harm implications of recording full URLs rather than only domain names. Password-reset emails, one-time login tokens, &amp;amp; short-lived medical-record links from Amazon S3 all live inside URLs; capturing the full path &amp;amp; query string captures all of those secrets too.&amp;lt;ref name=&amp;quot;heaton1&amp;quot; /&amp;gt; He also rejected the company&amp;#039;s stated rationale, writing that if SimilarWeb only needed to suggest matching styles, &amp;#039;&amp;#039;&amp;quot;then they would only need to send themselves the current page&amp;#039;s domain, not the full URL.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;heaton1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Press coverage &amp;amp; store removal ===&lt;br /&gt;
&lt;br /&gt;
The disclosure was picked up by The Register on July 5, 2018, which independently summarized Heaton&amp;#039;s findings &amp;amp; noted the gap between the privacy policy &amp;amp; the observed behavior: &amp;#039;&amp;#039;&amp;quot;While the SimilarWeb privacy policy for Stylish says it only collects anonymous data, Heaton found it was attaching an identifier to the data returned to the company.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;register&amp;quot;&amp;gt;{{Cite web |title=Chrome, Firefox pull very unstylish Stylish invasive browser plugin |url=https://www.theregister.com/2018/07/05/browsers_pull_stylish_but_invasive_browser_extension/ |first=Richard |last=Chirgwin |date=2018-07-05 |website=The Register}}&amp;lt;/ref&amp;gt; KitGuru ran a similar story the same day.&amp;lt;ref name=&amp;quot;kitguru&amp;quot;&amp;gt;{{Cite web |title=Stylish browser extension found stealing user&amp;#039;s internet browsing history |url=https://www.kitguru.net/tech-news/featured-tech-news/ryan-burgess/stylish-browser-extension-found-stealing-users-internet-browsing-history/ |first=Ryan |last=Burgess |date=2018-07-05 |website=KitGuru}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By July 4, 2018, both stores had pulled the extension. BleepingComputer reported that day:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;Google and Mozilla have removed the Stylish browser extension from their respective add-on stores after the publication of a report this week that accused the extension of logging users&amp;#039; browser histories and sending the data to remote servers.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;bc-2018&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
BleepingComputer quoted Mozilla software engineer Andreas Wagner&amp;#039;s bug-report comment: &amp;#039;&amp;#039;&amp;quot;We decided to block [Stylish] because of violation of data practices outlined in the review policy.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;bc-2018&amp;quot; /&amp;gt; Google did not issue a public explanation, but the Chrome Web Store listing began returning a 404 error.&amp;lt;ref name=&amp;quot;bc-2018&amp;quot; /&amp;gt; Heaton&amp;#039;s own post records the same two-day window in an update line: &amp;#039;&amp;#039;&amp;quot;2 days after publication of this post, Stylish was removed from the Chrome and Firefox stores. 3 weeks later, a new version is back in the Firefox store.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;heaton1&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Return to Firefox ===&lt;br /&gt;
&lt;br /&gt;
Stylish v3.1.8 was visible in the Firefox add-on store by August 16, 2018. Heaton published a follow-up the same day. The new build had not removed the tracking; it had moved the tracking behind a startup screen. Heaton wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;It comes with a tastefully designed startup screen asking whether you would like to opt-in to having all your browsing history sent to the SimilarWeb servers. If you tick the boxes saying &amp;quot;no, obviously not&amp;quot; then it also features an aesthetically pleasing design dark pattern designed to trick you into accidentally changing your mind.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;heaton2&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
His recommended response was unchanged from the original post: switch to the open-source fork. &amp;#039;&amp;#039;&amp;quot;[T]he Stylus browser extension is an exact substitute for Stylish,&amp;quot;&amp;#039;&amp;#039; he wrote.&amp;lt;ref name=&amp;quot;heaton2&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2026 Am I Being Pwned investigation ==&lt;br /&gt;
&lt;br /&gt;
In February 2026, James Arnott, founder of Bay Area Labs (&amp;quot;Am I Being Pwned?&amp;quot;), revisited the extension. In a February 26, 2026 post titled &amp;#039;&amp;#039;&amp;quot;Stylish is Back, Back again!&amp;quot;&amp;#039;&amp;#039;, Arnott reported that Stylish was still sending a POST request for every page visit, with the same payload structure as in 2018, but now wrapped in a far more elaborate obfuscation scheme.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arnott listed five 2018 press articles confirming the original takedown, then noted that the current version of the extension carries both Google&amp;#039;s &amp;#039;&amp;#039;&amp;quot;Verified Publisher&amp;quot;&amp;#039;&amp;#039; &amp;amp; &amp;#039;&amp;#039;&amp;quot;Featured&amp;quot;&amp;#039;&amp;#039; badges on the Chrome Web Store.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt; A sample payload he captured contains the fields &amp;#039;&amp;#039;gp&amp;#039;&amp;#039; (current URL), &amp;#039;&amp;#039;klm&amp;#039;&amp;#039; (previous URL), &amp;amp; &amp;#039;&amp;#039;pxe&amp;#039;&amp;#039; (per-user identifier), among others.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt; Arnott wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;Where gp is your current URL, klm was your previous URL and pxe is your unique identifier, amongst other data.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On May 11, 2026, Arnott published &amp;#039;&amp;#039;&amp;quot;The AI Chat Scraping Extension Wall of Shame,&amp;quot;&amp;#039;&amp;#039; a ranked list of seven Chrome extensions he observed scraping user conversations with hosted AI assistants. Stylish was entry #1, classified as &amp;#039;&amp;#039;&amp;quot;Confirmed&amp;quot;&amp;#039;&amp;#039; with &amp;#039;&amp;#039;&amp;quot;Extensive&amp;quot;&amp;#039;&amp;#039; obfuscation, &amp;amp; listed at 2,000,000 users. Arnott wrote:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;Stylish has the most extensive obfuscation we&amp;#039;ve seen, as we covered here. They exfiltrate all URLs and AI chats from providers like Character AI, ChatGPT, Claude, etc.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-wall&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
He noted that Stylish&amp;#039;s Chrome Web Store listing prominently displays the line &amp;#039;&amp;#039;&amp;quot;We care about your privacy.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;aibp-wall&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;cws-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Five-stage obfuscation chain ===&lt;br /&gt;
&lt;br /&gt;
Plain English: the extension takes the URL of every page the user visits, scrambles it five different ways one after the other, &amp;amp; only then sends it to SimilarWeb&amp;#039;s servers. The point of the scrambling is not to keep the data secret; SimilarWeb can unscramble it because the unscrambling instructions are inside the extension itself. The point is to make it hard for outside reviewers, including the Chrome Web Store&amp;#039;s automated review process, to recognize what is leaving the browser.&lt;br /&gt;
&lt;br /&gt;
According to Arnott&amp;#039;s reverse engineering, which has not been independently reproduced, the payload passes through these five stages in order:&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;URL encoding to a query string... Double base64 encoded JSON stringified, then base64 again... Columnar transposition cipher, the base64 string is split into 48-character rows, then read column-by-column instead of row-by-row, scrambling the text... AES-256-CBC encrypted using a symmetric key hardcoded in the extension source code... Base64 encoded one final time.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arnott characterized the construction as more elaborate than its purpose required. On the AES-256-CBC stage, he commented that a hardcoded symmetric key offers no real confidentiality against anyone who can read the extension&amp;#039;s JavaScript, &amp;amp; noted that asymmetric encryption would have avoided shipping the key inside the extension at all.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt; He published a working decode script demonstrating that the entire chain can be reversed using the embedded key.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt; Arnott summarized his read of the chain&amp;#039;s motive:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&amp;#039;&amp;#039;This POST request is obfuscated, which in my opinion is to make it harder for people to see what it&amp;#039;s doing or to get around the Chrome Web Store publishing review process, or perhaps even both.&amp;#039;&amp;#039;&amp;lt;/blockquote&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Privacy-policy contradiction ==&lt;br /&gt;
&lt;br /&gt;
Stylish&amp;#039;s current Chrome Web Store listing carries Google&amp;#039;s standard data-handling disclosure block. Under that block, the developer has declared that the extension&amp;#039;s collected data is &amp;#039;&amp;#039;&amp;quot;Not being sold to third parties, outside of the approved use cases&amp;quot;&amp;#039;&amp;#039; &amp;amp; &amp;#039;&amp;#039;&amp;quot;Not being used or transferred for purposes that are unrelated to the item&amp;#039;s core functionality.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;cws-stylish&amp;quot; /&amp;gt; The listing also states: &amp;#039;&amp;#039;&amp;quot;we collect anonymous browsing data as described in our privacy policy https://userstyles.org/privacy-policy.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;cws-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arnott reports that the linked userstyles.org privacy policy says the opposite. In his February 2026 post he wrote that the policy &amp;#039;&amp;#039;&amp;quot;states that they explicitly do sell personal data,&amp;quot;&amp;#039;&amp;#039; contradicting the larger-font Chrome Web Store declaration on the same product.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt; He further observed that the Chrome Web Store&amp;#039;s &amp;#039;&amp;#039;&amp;quot;approved use cases&amp;quot;&amp;#039;&amp;#039; list does not include selling user data for business purposes &amp;amp; in fact prohibits it.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Chrome Web Store&amp;#039;s own User Data FAQ, which governs what extensions are allowed to do with user data, states that &amp;#039;&amp;#039;&amp;quot;Ad targeting or other monetization of this data isn&amp;#039;t for a user-facing feature&amp;quot;&amp;#039;&amp;#039; &amp;amp; that a product collecting browsing activity for any non-user-facing purpose is not permitted.&amp;lt;ref name=&amp;quot;cws-faq&amp;quot;&amp;gt;{{Cite web |title=User Data FAQ |url=https://developer.chrome.com/docs/webstore/program-policies/user-data-faq |publisher=Google / Chrome for Developers |website=Chrome for Developers |access-date=2026-05-29}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Stylus ==&lt;br /&gt;
&lt;br /&gt;
[[Stylus]] is the open-source fork of Stylish maintained by the community after the SimilarWeb acquisition. It was forked from Stylish v1.5.2 with the stated goal of removing all tracking &amp;amp; restoring a simpler user interface.&amp;lt;ref name=&amp;quot;add0n&amp;quot;&amp;gt;{{Cite web |title=Stylus :: add0n.com |url=https://add0n.com/stylus.html |publisher=Stylus Team |website=add0n.com}}&amp;lt;/ref&amp;gt; Both Heaton (in 2018) &amp;amp; Arnott (in 2026) recommended Stylus as the practical mitigation for Stylish users.&amp;lt;ref name=&amp;quot;heaton2&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As of May 2026, the Stylus Chrome Web Store listing shows 1,000,000 users, version 2.3.28, updated May 26, 2026, with publisher &amp;#039;&amp;#039;stylus.openstyles@gmail.com.&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;cws-stylus&amp;quot; /&amp;gt; The listing describes its data practices in plain language: &amp;#039;&amp;#039;&amp;quot;Unlike other similar extensions, we don&amp;#039;t find you to be all that interesting. Your questionable browsing history should remain between you and the NSA. Stylus collects nothing. Period.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;cws-stylus&amp;quot; /&amp;gt; Chrome Web Store displays the disclosure &amp;#039;&amp;#039;&amp;quot;[t]he developer has disclosed that it will not collect or use your data.&amp;quot;&amp;#039;&amp;#039;&amp;lt;ref name=&amp;quot;cws-stylus&amp;quot; /&amp;gt; Functionally, Stylus reads userstyles.org&amp;#039;s style libraries the same way the old version of Stylish did, caches the styles locally on the user&amp;#039;s machine, &amp;amp; does not contact a server for each page visit.&amp;lt;ref name=&amp;quot;aibp-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Chrome Web Store status ==&lt;br /&gt;
&lt;br /&gt;
As of May 2026, the Stylish Chrome Web Store listing (extension ID &amp;#039;&amp;#039;fjnbnpbmkenffdnngjfgmeleoegfcffe&amp;#039;&amp;#039;) shows:&amp;lt;ref name=&amp;quot;cws-stylish&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Publisher: &amp;#039;&amp;#039;Similarweb LTD,&amp;#039;&amp;#039; 33 Itzhak Rabin Rd., Givatayim 5348303, Israel; D-U-N-S 533122482; trader status declared for the European Union.&lt;br /&gt;
* User count: 2,000,000.&lt;br /&gt;
* Rating: 4.3 out of 5 from 22,200 ratings.&lt;br /&gt;
* Version: 3.4.14, updated March 19, 2026.&lt;br /&gt;
* Badges: &amp;#039;&amp;#039;&amp;quot;Featured&amp;quot;&amp;#039;&amp;#039; &amp;amp; a &amp;#039;&amp;#039;&amp;quot;Verified Publisher&amp;quot;&amp;#039;&amp;#039; indicator (&amp;#039;&amp;#039;&amp;quot;The publisher has a good record with no history of violations&amp;quot;&amp;#039;&amp;#039;).&lt;br /&gt;
* Declared data collected: web history.&lt;br /&gt;
* Declared data uses: &amp;#039;&amp;#039;&amp;quot;Not being sold to third parties, outside of the approved use cases&amp;quot;&amp;#039;&amp;#039;; &amp;#039;&amp;#039;&amp;quot;Not being used or transferred for purposes that are unrelated to the item&amp;#039;s core functionality.&amp;quot;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Google describes the Featured badge as recognizing extensions that &amp;#039;&amp;#039;&amp;quot;follow our technical best practices and meet a high standard of user experience and design,&amp;quot;&amp;#039;&amp;#039; including &amp;#039;&amp;#039;&amp;quot;respecting the privacy of end-users,&amp;quot;&amp;#039;&amp;#039; with each badge assigned after manual review by Chrome staff.&amp;lt;ref name=&amp;quot;google-badge&amp;quot;&amp;gt;{{Cite web |title=Find great extensions with new Chrome Web Store badges |url=https://blog.google/products-and-platforms/products/chrome/find-great-extensions-new-chrome-web-store-badges/ |first=Debbie |last=Kim |date=2022-04-20 |publisher=Google}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[SimilarWeb]]&lt;br /&gt;
* [[Stylus]]&lt;br /&gt;
* [[Browser extension AI chat exfiltration]]&lt;br /&gt;
* [[Chrome Web Store]]&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
{{reflist}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Browser extensions]]&lt;br /&gt;
[[Category:Privacy incidents]]&lt;br /&gt;
[[Category:SimilarWeb]]&lt;/div&gt;</summary>
		<author><name>Louis</name></author>
	</entry>
</feed>