<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>Responsible Disclosure &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/responsible-disclosure/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Tue, 10 Feb 2026 15:32:00 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>Responsible Disclosure &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Responsible Disclosure: Chimoney Android App and KYCaid]]></title>
		<link>https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/</link>
					<comments>https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 14 Jan 2026 12:34:52 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[WebMonetization]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=64849</guid>

					<description><![CDATA[Chimoney is a new &#34;multi-currency wallet&#34; provider. Based out of Canada, it allows users to send money to and from a variety of currencies. It also supports the new Interledger protocol for WebMonetization.  It is, as far as I can tell, unregulated by any financial institution. Nevertheless, it performs a &#34;Know Your Customer&#34; (KYC) check on all new account in order to prevent fraud.  To do this,…]]></description>
										<content:encoded><![CDATA[<p><a href="https://chimoney.app/">Chimoney</a> is a new "multi-currency wallet" provider. Based out of Canada, it allows users to send money to and from a variety of currencies. It also supports the new Interledger protocol for <a href="https://shkspr.mobi/blog/2025/08/security-flaws-in-the-webmonetization-site/">WebMonetization</a>.</p>

<p>It is, as far as I can tell, unregulated by any financial institution. Nevertheless, it performs a "Know Your Customer" (KYC) check on all new account in order to prevent fraud.  To do this, it uses the Ukranian <a href="https://kycaid.com/">KYCaid</a> platform.</p>

<p>So far, so standard. But there's a small problem with how they both integrate.</p>

<p>I installed Chimoney's Android app and attempted to go through KYCaid's verification process. For some reason it hit me with this error message.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/error.webp" alt="Screenshot. An error occurred and an email address." width="504" class="aligncenter size-full wp-image-64856">

<p>Well, I'd better click that email and report the problem.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/email-protected.webp" alt="Screenshot. The email is protected, but clickable." width="504" height="240" class="aligncenter size-full wp-image-64855">

<p>Oh, that's odd. What happens if I click the protected link?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/Cloudflare.webp" alt="Screenshot. Cloudflare's email protection screen." width="504" height="625" class="aligncenter size-full wp-image-64854">

<p>Huh! I guess I've been taken to Cloudflare's website. What happens if I click on the links on their page?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/discord.webp" alt="Screenshot. Invitation to join Cloudflare's Discord." width="504" height="606" class="aligncenter size-full wp-image-64853">

<p>Looks like I can now visit any site on the web. If Cloudflare has a link to it, I can go there. For example, GitHub.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/github.webp" alt="Screenshot. GitHub page still within the Chimoney app." width="504" height="499" class="aligncenter size-full wp-image-64852">

<h2 id="why-is-this-a-problem"><a href="https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#why-is-this-a-problem">Why is this a problem?</a></h2>

<blockquote><p><a href="https://mas.owasp.org/MASTG/knowledge/android/MASVS-PLATFORM/MASTG-KNOW-0018/">MASTG-KNOW-0018: WebViews</a></p>

<p>One of the most important things to do when testing WebViews is to make sure that only trusted content can be loaded in it. Any newly loaded page could be potentially malicious, try to exploit any WebView bindings or try to phish the user. <strong>Unless you're developing a browser app, usually you'd like to restrict the pages being loaded to the domain of your app.</strong> A good practice is to prevent the user from even having the chance to input any URLs inside WebViews (which is the default on Android) nor navigate outside the trusted domains. Even when navigating on trusted domains there's still the risk that the user might encounter and click on other links to untrustworthy content</p>

<p><small>Emphasis added</small></p></blockquote>

<p>A company's app is its sacred space. It shouldn't let anyone penetrate its inner sanctum because it has no control over what that 3rd party shows its customers.</p>

<p>There's nothing stopping an external service displaying a message like "To continue, please transfer 0.1 Bitcon to …"</p>

<p>(Of course, if your KYC provider - or their CDN - decides to turn evil then you probably have bigger problems!)</p>

<p>There are some other problems. It has long been known that <a href="https://discussions.apple.com/thread/7918307?sortBy=rank">people can use in-app browsers to circumvent restrictions</a>.  Some in-app browsers have <a href="https://medium.com/%40youssefhussein212103168/exploiting-insecure-android-webview-with-setallowuniversalaccessfromfileurls-c7f4f7a8db9c">insecure configurations which can be used for exploits</a>.  These sorts of "accidentally open" browsers <a href="https://matan-h.com/google-has-a-secret-browser-hidden-inside-the-settings/">are often considered to be a security vulnerability</a>.</p>

<h2 id="the-fix"><a href="https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#the-fix">The Fix</a></h2>

<p>Ideally, an Android app like this wouldn't use a web view. It should use a KYC provider's API rather than giving them wholesale control of the user experience.</p>

<p>But, suppose you do need a webview. What's the recommendation?</p>

<p>Boring old <a href="https://blog.oversecured.com/Android-security-checklist-webview/#insufficient-url-validation">URl validation</a> using <a href="https://developer.android.com/reference/android/webkit/WebViewClient#shouldOverrideUrlLoading(android.webkit.WebView,%20android.webkit.WebResourceRequest)">Android's <code>shouldOverrideUrlLoading()</code> method</a>.</p>

<p>Essentially, your app restricts what can be seen in the webview and rejects anything else.</p>

<h2 id="risk"><a href="https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#risk">Risk</a></h2>

<p>Look, this is pretty low risk. A user would have to take several deliberate steps to find themselves in a place of danger.</p>

<p>Ultimately, it is "<a href="https://wiki.c2.com/?CodeSmell">Code Smell</a>" - part of the app is giving off a noxious whiff. That's something you cannot afford to have on a money transfer app. If this simple security fix wasn't implemented, what other horrors are lurking in the source code?</p>

<h2 id="contacting-the-company"><a href="https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/#contacting-the-company">Contacting the company</a></h2>

<p>There was no <a href="https://securitytxt.org/">security.txt</a> contact - nor anything on their website about reporting security bugs. I reached out to the CEO by email, but didn't hear back.</p>

<p>In desperation, I went on to Discord and asked in their support channel for help.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/send-an-email.webp" alt="Screenshot. Someone advising me on who to email." width="504" class="aligncenter size-full wp-image-64857">

<p>Unfortunately, that email address didn't exist.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/11/email-chimoney.webp" alt="Bounce message." width="504" class="aligncenter size-full wp-image-64851">

<p>I also tried contacting KYCaid, but they seemed unable or unwilling to help - and redirected me back to Chimoney.</p>

<p>As it has been over two month since I sent them video of this bug, I'm performing a responsible disclosure to make people aware of the problem.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=64849&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2026/01/responsible-disclosure-chimoney-android-app-and-kycaid/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Responsible Disclosure: Joiners, Movers, and Leavers in NHS BSA]]></title>
		<link>https://shkspr.mobi/blog/2025/12/responsible-disclosure-joiners-movers-and-leavers-in-nhs-bsa/</link>
					<comments>https://shkspr.mobi/blog/2025/12/responsible-disclosure-joiners-movers-and-leavers-in-nhs-bsa/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 02 Dec 2025 12:34:08 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[nhs]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=64236</guid>

					<description><![CDATA[Many many years ago, I did some work for the NHS. As part of that, I was given access to certain GitHub organisations so that I could contribute to various projects. Once I left that job my access was revoked.  Mostly.  A few weeks ago, I received this email from GitHub.    On the surface, this is a sensible email. They want all their members to only have strong 2FA and I still had SMS configured …]]></description>
										<content:encoded><![CDATA[<p>Many many years ago, I did some work for the NHS. As part of that, I was given access to certain GitHub organisations so that I could contribute to various projects. Once <a href="https://shkspr.mobi/blog/2020/07/all-good-things/">I left that job</a> my access was revoked.</p>

<p>Mostly.</p>

<p>A few weeks ago, I received this email from GitHub.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/NHS-BSA-Github.webp" alt="Your organization, NHS Business Services Authority that you are a member of, now requires all users to only have secure two-factor authentication (2FA) methods. You currently have SMS/Text message configured as a 2FA method, which is not considered secure. To access NHS Business Services Authority resources, remove SMS/Text message as a 2FA method. " width="512" height="464" class="aligncenter size-full wp-image-64237">

<p>On the surface, this is a sensible email. They want all their members to only have strong 2FA and I still had SMS configured as a fallback method. Except, of course, I should <em>not</em> be a member. I should have been kicked out when I handed back my laptop and lanyard. There was still a bit of pandemic pandemonium about - but surely in the last few years someone should have audited the organisation's membership?</p>

<p>The <abbr title="Joiners, Movers, Leavers">JML</abbr> process is critical to cybersecurity. There's no point having fancy controls if you don't revoke the permissions of people who are no longer entitled to access.  On a fully integrated system this is (usually) easy - untick a box on Active Directory or whatever and  <em>*poof*</em> the user is banned.</p>

<p>But with <em>external</em> systems the problem is harder. You now need to keep track of external usernames, synchronise them with internal names, periodically check them for updates, integrate with an API, and - in some cases - take manual action.  It's clear that this particular bit of the NHS had slipped up. Looking through the private list of collaborators, there were <em>many</em> old accounts.</p>

<p>I was able to see all private collaborators:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/view_private_members.webp" alt="Screenshot showing a redacted list of members." width="1920" height="1080" class="aligncenter size-full wp-image-64239">

<p>I could see all private repositories:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/Private-Repos.webp" alt="Screenshot showing a redacted list of private repositories." width="1920" height="1080" class="aligncenter size-full wp-image-64240">

<p>I even had access to create new repositories - including special ones:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/Create-New-Repo.webp" alt="Screenshot showing the ability to create new special repositories." width="1920" height="1080" class="aligncenter size-full wp-image-64241">

<p>To be abundantly clear, there was no medical data on GitHub. There was no patient data available for me to view. Absolutely nothing medically sensitive was stored there. This isn't a GDPR or medical privacy issue.  If I had made any changes to the code stored on there, it would never have made it to production. There were no API keys or sensitive data or passwords for me to exfiltrate. The <a href="https://www.nhsbsa.nhs.uk/">NHS BSA</a> is a business unit - not a medical unit.</p>

<p>Nevertheless, it is important that <em>all</em> parts of a large organisation are able to quickly and competently remove users once they have left.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2025/12/responsible-disclosure-joiners-movers-and-leavers-in-nhs-bsa/#timeline">Timeline</a></h2>

<ul>
<li>2025-10-17

<ul>
<li>Received GitHub email.</li>
<li>Visited <a href="https://www.nhs.uk/.well-known/security.txt">https://www.nhs.uk/.well-known/security.txt</a> to get details of how to raise security issues.</li>
<li>Raised the issue on <a href="https://hackerone.com/edent?type=user">HackerOne</a></li>
</ul></li>
<li>2025-10-21

<ul>
<li>After triage, the issue was assigned directly to the BSA.</li>
</ul></li>
<li>2025-10-31

<ul>
<li>I was removed from the organisation.</li>
<li><img src="https://shkspr.mobi/blog/wp-content/uploads/2025/10/removed.webp" alt="You’ve been removed from the &quot;NHS Business Services Authority&quot; organization. " width="1024" height="490" class="aligncenter size-full wp-image-64238"></li>
<li>Requested permission to publish this post. No objection received.</li>
</ul></li>
<li>2025-12-02

<ul>
<li>Published</li>
</ul></li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=64236&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/12/responsible-disclosure-joiners-movers-and-leavers-in-nhs-bsa/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Security Flaws in the WebMonetization Site]]></title>
		<link>https://shkspr.mobi/blog/2025/08/security-flaws-in-the-webmonetization-site/</link>
					<comments>https://shkspr.mobi/blog/2025/08/security-flaws-in-the-webmonetization-site/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 26 Aug 2025 11:34:33 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Bug Bounty]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[WebMonetization]]></category>
		<category><![CDATA[xss]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=62468</guid>

					<description><![CDATA[I&#039;ve written before about the nascent WebMonetization Standard. It is a proposal which allows websites to ask users for passive payments when they visit. A visitor to this site could, if this standard is widely adopted, opt to send me cash for my very fine blog posts.  All I need to do is add something like this into my site&#039;s source code:  &#60;link rel=&#34;monetization&#34;…]]></description>
										<content:encoded><![CDATA[<p>I've written before about <a href="https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/">the nascent WebMonetization Standard</a>. It is a proposal which allows websites to ask users for passive payments when they visit. A visitor to this site could, if this standard is widely adopted, opt to send me cash for my very fine blog posts.</p>

<p>All I need to do is add something like this into my site's source code:</p>

<pre><code class="language-html">&lt;link rel="monetization" href="https://wallet.example.com/edent"&gt;
</code></pre>

<p>A user who has a WebMonetization plugin can then easily pay me for my content.</p>

<p>But not every website is created by an individual or a single entity. Hence, the creation of the "<a href="https://webmonetization.org/tools/prob-revshare/">Probabilistic Revenue Share Generator</a>".</p>

<blockquote><p>Probabilistic revenue sharing is a way to share a portion of a web monetized page's earnings between multiple wallet addresses. Each time a web monetized user visits the page, a recipient will be chosen at random. Payments will go to the chosen recipient until the page is closed or reloaded.</p></blockquote>

<p>Nifty! But how does it work?</p>

<p>Let's say a website is created by Alice and Bob. Alice does most of the work and is to receive 70% of the revenue. Bob is to get the remaining 30%.  Within the web page's head, the following meta element is inserted:</p>

<pre><code class="language-html">&lt;link
   rel="monetization"
   href="https://webmonetization.org/api/revshare/pay/W1siaHR0cHM6Ly9leGFtcGxlLmNvbS8iLDcwLCJBbGljZSJdLFsiaHR0cHM6Ly93aGF0ZXZlci50ZXN0LyIsMzAsIkJvYiJdXQ"
/&gt;
</code></pre>

<p>The visitor's WebMonetization plugin will visit that URl and be redirected to Alice's site 70% of time and Bob's 30%.</p>

<p>If we Base64 decode that weird looking URl, we get:</p>

<pre><code class="language-json">[
   [
      "https://example.com/",
       70,
      "Alice"
   ],
   [
      "https://whatever.test/",
       30,
      "Bob"
   ]
]
</code></pre>

<p>Rather than adding multiple URls in the head, the site points to one resource and lets that pick who receives the funds.</p>

<p>There are two small problems with this.</p>

<p>The first is that you have to trust the WebMonetization.org website. If it gets hijacked or goes rogue then all your visitors will be paying someone else. But let's assume they're secure and trustworthy. There's a slightly more insidious threat.</p>

<p>Effectively, this allows an untrusted 3rd party to use the WebMonetization.org domain as an open redirect. That's useful for phishing and other abuses.</p>

<p>For example, an attacker could send messages encouraging people to visit:</p>

<p><a href="https://webmonetization.org/api/revshare/pay/W1siaHR0cHM6Ly9leGFtcGxlLmNvbS8iLDk5LCJpbWciXV0">https://webmonetization.org/api/revshare/pay/W1siaHR0cHM6Ly9leGFtcGxlLmNvbS8iLDk5LCJpbWciXV0</a></p>

<p>Click that and you'll instantly be redirected to a domain under the attacker's control. This could be particularly bad if the domain encouraged users to share passwords or other sensitive information.</p>

<p>If the Base64 data cannot be decoded to valid JSON, the API will echo back any Base64 encoded text sent to it. This means an attacker could use it to send obfuscated messages. Consider, tor example:</p>

<p><a href="https://webmonetization.org/api/revshare/pay/W1siUGxlYXNlIHZpc2l0IFJlYWxfZ29vZF9DYXNpbm9zLmJpeiBmb3IgbG90cyBvZiBDcnlwdG8gZnVuISEhIiwxMjM0NTYsImltZyJdXQ==">https://webmonetization.org/api/revshare/pay/W1siUGxlYXNlIHZpc2l0IFJlYWxfZ29vZF9DYXNpbm9zLmJpeiBmb3IgbG90cyBvZiBDcnlwdG8gZnVuISEhIiwxMjM0NTYsImltZyJdXQ==</a></p>

<p>Visit that and you'll see a message. With a bit of effort, it could be crafted to say something to encourage a visitor to enter their credentials elsewhere.</p>

<p>When I originally reported this, the site could be used to to smuggle binary payloads. For example, <a href="https://webmonetization.org/api/revshare/pay/W1siZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmtnQkFBQlhSVUpRVmxBNElEd0JBQUNRQ0FDZEFTb3dBREFBUHJWUW4weW5KQ0tpSnl0bzRCYUphUUFJSXN4NEF1OWRoRHFWQTFpMVJvUlRPN25iZHl5MDNuTTVGaHZWNjJnb1VqMzd0dXhxcGZwUGVUQlp2cko3OHcwcUFBRCsvaFZ5Rkh2WVhJck1Dam55MHo3d3FzQjkvUUUwOHhscy9BUWRYSkZYMGFkRzlsSVNzbTZrVjk2SjVGSU5CRlh6SHdmek1DcjRONnIzejUvQWEvd2ZFb1ZHWDNIOTc2c2hlM2p5UzhScUp2N0p3N2JPeG9UU1BsdTRnTmJmWFlaOVRuYmRRME1Obk1PYnlhUlFMSXU1NTZqSWowM3pmSnJWZ3FSTThHUHdSb1diMU05QWZ6RmU2TXRnMTN1RUlxclRIbWl1QnBIK2JUVkI1RUVRM3VieTBDLy9YT0FQSk9GdjRRVjhSWkRQUWQ1MTdLaHliYThKbHI5N2oya0lCSkQ5SzNtYk9IU0hpUURhc2o2WTNmb3JBVGJJZzRRWkh4V25DZXFxTWtWWWZVQWl2dUwwTC82OG1NbmFnQUFBIiw4OCwiaW1nIl1d">this URl would display an image</a> - however, it seems to have been fixed.</p>

<p>Nevertheless, it is important to recognise that the WebMonetization.org domain contains an <a href="https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html">unvalidated redirect and forwarding</a> vulnerability.</p>

<p>I recommended that they ensured that the only URls which contain legitimate payment pointers should be returned. I also suggested setting a maximum limit for URl size.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2025/08/security-flaws-in-the-webmonetization-site/#timeline">Timeline</a></h2>

<ul>
<li>2025-03-27 - Discovered and disclosed.</li>
<li>2025-08-05 - Remembered I'd submitted it and sent a follow up.</li>
<li>2025-08-26 - Automatically published.</li>
<li><ins datetime="2025-08-27T15:37:49+00:00">2025-08-27</ins> - A day after this post was published, <a href="https://github.com/interledger/publisher-tools/issues/85">the issue was made public on their repo</a>.</li>
<li><ins datetime="2025-09-11T12:25:32+00:00">2025-09-10</ins> - <a href="https://github.com/interledger/publisher-tools/issues/85#issuecomment-3274623144">Confirmed fixed</a>.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=62468&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/08/security-flaws-in-the-webmonetization-site/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[An open(ish) redirect on Mastodon]]></title>
		<link>https://shkspr.mobi/blog/2023/10/an-openish-redirect-on-mastodon/</link>
					<comments>https://shkspr.mobi/blog/2023/10/an-openish-redirect-on-mastodon/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 30 Oct 2023 12:34:51 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[ActivityPub]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[mastodon]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=47287</guid>

					<description><![CDATA[I&#039;ve responsibly disclosed a small security issue with Mastodon (GHSA-8982-p7pm-7mqw). It allows a sufficiently determined attacker to use any Mastodon instance to redirect unwary users to a malicious site.  What do you think happens if you visit: https://mastodon.social/@PasswordReset/111285045683598517/admin?  If you aren&#039;t logged in to that instance, it will redirect you to a 3rd party site.…]]></description>
										<content:encoded><![CDATA[<p>I've responsibly disclosed a small security issue with Mastodon (<a href="https://github.com/mastodon/mastodon/security/advisories/GHSA-8982-p7pm-7mqw">GHSA-8982-p7pm-7mqw</a>). It allows a sufficiently determined attacker to use <em>any</em> Mastodon instance to redirect unwary users to a malicious site.</p>

<p>What do you think happens if you visit:
<a href="https://mastodon.social/@PasswordReset/111285045683598517/admin"></a><a href="https://mastodon.social/@PasswordReset/111285045683598517/admin">https://mastodon.social/@PasswordReset/111285045683598517/admin</a>?</p>

<p>If you aren't logged in to that instance, it will redirect you to a 3rd party site. Try opening it in a private browser window.</p>

<p>Here's another, less convincing, demo:</p>

<p><a href="https://mastodon.social/@mastodonopenredirect.wordpress.com@mastodonopenredirect.wordpress.com"></a><a href="https://mastodon.social/@mastodonopenredirect.wordpress.com@mastodonopenredirect.wordpress.com">https://mastodon.social/@mastodonopenredirect.wordpress.com@mastodonopenredirect.wordpress.com</a>
(You will need to not be logged in to Mastodon.Social for this to work.</p>

<p>It is possible to craft a URl which will redirect any visitor who isn't logged in. Attackers can use this as an open redirect for phishing, spam, and other attacks.</p>

<h2 id="remediation"><a href="https://shkspr.mobi/blog/2023/10/an-openish-redirect-on-mastodon/#remediation">Remediation</a></h2>

<p>This will likely be fixed by <a href="https://github.com/mastodon/mastodon/pull/26917">#26917</a>. But, in the meantime, administrators of Mastodon instances should be aware that their site could be used as an open redirect.</p>

<p>If you do spot any accounts which appear to be dodgy, admins can either block the account or the entire domain.</p>

<h2 id="background"><a href="https://shkspr.mobi/blog/2023/10/an-openish-redirect-on-mastodon/#background">Background</a></h2>

<p>Here's how it works - which involves some necessary background detail.</p>

<p>I am user <code>@edent</code> on Mastodon.social.  I can send you a URl of <a href="https://Mastodon.Social/@edent"></a><a href="https://Mastodon.Social/@edent">https://Mastodon.Social/@edent</a> and you will see my profile.  Nice!</p>

<p>But there are lots of Fediverse servers out there.  For example, I run a little bot called <code>@colours</code> on the BotsIn.Space instance.  Its URl is <a href="https://BotsIn.Space/@colours"></a><a href="https://BotsIn.Space/@colours">https://BotsIn.Space/@colours</a> - simple.</p>

<p>But what happens if I am viewing the Colours bot while on Mastodon.Social?</p>

<p>The interface shows <a href="https://Mastodon.Social/@colours@BotsIn.Space"></a><a href="https://Mastodon.Social/@colours@BotsIn.Space">https://Mastodon.Social/@colours@BotsIn.Space</a> - if you are logged in to Mastodon.Social, you will see the colours account, you can follow it, reply to it, and interact with it as though it were a user on your home instance.</p>

<p>But what if you're <em>not</em> logged in?</p>

<p>If you visit <a href="https://Mastodon.Social/@colours@BotsIn.Space"></a><a href="https://Mastodon.Social/@colours@BotsIn.Space">https://Mastodon.Social/@colours@BotsIn.Space</a> you will be <em>immediately</em> redirected to <a href="https://BotsIn.Space/@colours"></a><a href="https://BotsIn.Space/@colours">https://BotsIn.Space/@colours</a></p>

<p>In theory, this is a good thing! You get taken to their home server and you can see their latest updates etc.</p>

<p>Unfortunately, this can be abused.</p>

<p>Try and visit <a href="https://botsin.space/@blog@shkspr.mobi"></a><a href="https://botsin.space/@blog@shkspr.mobi">https://botsin.space/@blog@shkspr.mobi</a> - if you are not logged in to BotsIn.Space, you will be automatically redirected to my blog.</p>

<p>In addition, Mastodon <em>ignores</em> the <code>@username</code> when it sees a local status ID which references an external status. For example, both of these URls will go to the same place:</p>

<ul>
<li><a href="https://mastodon.social/@colours@botsin.space/111323978746693908"></a><a href="https://mastodon.social/@colours@botsin.space/111323978746693908">https://mastodon.social/@colours@botsin.space/111323978746693908</a></li>
<li><a href="https://mastodon.social/@RandomLettersAnd1234/111323978746693908"></a><a href="https://mastodon.social/@RandomLettersAnd1234/111323978746693908">https://mastodon.social/@RandomLettersAnd1234/111323978746693908</a></li>
</ul>

<h2 id="impact"><a href="https://shkspr.mobi/blog/2023/10/an-openish-redirect-on-mastodon/#impact">Impact</a></h2>

<p>A malicious user could do a few things.</p>

<p>The first is spam evasion. Email out a link to <code>mastodon.social/@user@buy_illegal_puppies.com</code> and it might skip spam filters, or confuse the user about the true destination.</p>

<p>The second is phishing. Is a user going to notice that they've been silently redirected to <code>nnast0d0n.social</code>? Stick up a convincing "Please log in again" page and you can steal their credentials.</p>

<h2 id="why-this-works"><a href="https://shkspr.mobi/blog/2023/10/an-openish-redirect-on-mastodon/#why-this-works">Why This Works</a></h2>

<p>ActivityPub uses the Well-Known / WebFinger specification.  Mastodon will use this to find data on anything which looks like a username.</p>

<p>For example, here's what my blog's account looks like in WebFinger:
<a href="https://shkspr.mobi/blog/.well-known/webfinger?resource=acct:blog@shkspr.mobi"></a><a href="https://shkspr.mobi/blog/.well-known/webfinger?resource=acct:blog@shkspr.mobi">https://shkspr.mobi/blog/.well-known/webfinger?resource=acct:blog@shkspr.mobi</a>:</p>

<pre><code class="language-json">{
  "subject": "acct:blog@shkspr.mobi",
  "aliases": [
    "https://shkspr.mobi/blog/@blog"
  ],
  "links": [
    {
      "rel": "self",
      "type": "application/activity+json",
      "href": "https://shkspr.mobi/blog/@blog"
    },
    {
      "rel": "http://webfinger.net/rel/profile-page",
      "type": "text/html",
      "href": "https://shkspr.mobi/blog/@blog"
    }
  ]
}
</code></pre>

<p>Mastodon will check that account exists, and then redirect a non-logged-in user to the "profile-page" of an account that it finds.</p>

<p>So a malicious user can create a WebFinger at <code>evil.com</code>, then send out links to <code>mastodon.example/@SexyFunTimes@evil.com</code>, and have users instantly redirected to their site.</p>

<p>Most ActivityPub instances won't do this unless they've <em>already</em> seen the user being referenced. This can be achieved by sending a private message to a user on that server which mentions the redirection account.</p>

<h2 id="remediation"><a href="https://shkspr.mobi/blog/2023/10/an-openish-redirect-on-mastodon/#remediation">Remediation</a></h2>

<p>Given that it is sensible to redirect users to an account's home instance, I think there's really only one way to solve this. An annoying interstitial.</p>

<blockquote><p>You are leaving XYZ.social. We do not control the page Illegal_Ivory_Smuggling.com. If you are sure you want to proceed, click here. Do not share your username and password with 3rd party sites etc etc etc.</p></blockquote>

<p>I reported this to Mastodon on 2023-09-20. Apparently a number of other people have also reported it. While they work on how to fix the problem, I thought it was sensible to let people know that this attack was possible.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2023/10/an-openish-redirect-on-mastodon/#timeline">Timeline</a></h2>

<ul>
<li>2023-09-20 Disclosed on GitHub</li>
<li>2023-10-22 Added more details and sought agreement to publish</li>
<li>2023-10-29 Checked with various independent Mastodon server admins to see if they were aware of this behaviour - most were not</li>
<li>2023-10-30 Published</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=47287&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/10/an-openish-redirect-on-mastodon/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Responsible Disclosure: arXiv - redirect on login]]></title>
		<link>https://shkspr.mobi/blog/2023/05/responsible-disclosure-arxiv-redirect-on-login/</link>
					<comments>https://shkspr.mobi/blog/2023/05/responsible-disclosure-arxiv-redirect-on-login/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 19 May 2023 11:34:39 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[phishing]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=45627</guid>

					<description><![CDATA[Suppose you are sent a link to a website - e.g. https://example.com/page/1234  But, before you can access it, you need to log in. So the website redirects you to:  https://example.com/login?on_success=/page/1234  If you get the password right, you go to the original page you requested. Nice!  But what happens if someone manipulates that query string?  Suppose an adversary sends you a link like…]]></description>
										<content:encoded><![CDATA[<p>Suppose you are sent a link to a website - e.g. <code>https://example.com/page/1234</code></p>

<p>But, before you can access it, you need to log in. So the website redirects you to:</p>

<p><code>https://example.com/login?on_success=/page/1234</code></p>

<p>If you get the password right, you go to the original page you requested. Nice!</p>

<p>But what happens if someone manipulates that query string?  Suppose an adversary sends you a link like this:</p>

<p><code>https://example.com/login?on_success=https://evil.com</code></p>

<p>A sensible redirection system should say "Hang on a minute! Only <em>internal</em> redirections are allowed. I'd better stop this tomfoolery."</p>

<p>Sadly, that's not always the case. Take, for example, <a href="https://arXiv.org">arXiv.org</a> - a website for academics and researchers to share papers.</p>

<p>I discovered that a URl like this - <code>https://arxiv.org/login?next_page=https://example.com/</code> - would redirect a logged in user to <em>any</em> external site.</p>

<p>A malicious user could redirect users to a phishing page <code>https://arxiv.org/login?next_page=http://arxiv-login-info.xyz/</code> - and steal their credentials. Or send them to a site with malware etc.</p>

<p>The fix is pretty simple. Any redirection logic should ensure that users can only be redirected to an <em>internal</em> page not an external site.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2023/05/responsible-disclosure-arxiv-redirect-on-login/#timeline">Timeline</a></h2>

<ul>
<li>2023-04-18 - discovered. <a href="https://github.com/arXiv/arxiv-auth/issues/89">Opened a bug on GitHub</a> asking for a way to privately disclose. Shortly afterwards, I received an email address and sent my findings.</li>
<li>2023-04-19 - Sent a screencast showing the open redirect. Issue confirmed by the developer.</li>
<li>2023-04-24 - a <a href="https://github.com/arXiv/arxiv-auth/pull/90">fix was proposed</a> which solved some of the issues but not all of them.</li>
<li>2023-05-02 - <a href="https://github.com/arXiv/arxiv-auth/pull/90#issuecomment-1531462468">final fix pushed</a></li>
<li>2023-05-19 - this post automatically published.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=45627&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/05/responsible-disclosure-arxiv-redirect-on-login/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Responsible Disclosure: Abandoned Buckets and Billing Emails]]></title>
		<link>https://shkspr.mobi/blog/2023/02/responsible-disclosure-abandoned-buckets-and-billing-emails/</link>
					<comments>https://shkspr.mobi/blog/2023/02/responsible-disclosure-abandoned-buckets-and-billing-emails/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 27 Feb 2023 12:34:21 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[o2]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[telefonica]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=44772</guid>

					<description><![CDATA[A few weeks ago, I received a billing email from my phone provider O2. While glancing at it, I noticed all the images were broken.    Viewing the source of the email showed that they were all coming from http:// mcsaatchi-email-preview.s3.amazonaws.com/o2/...    What happens if we visit that domain?    Ah, the dreaded &#34;The specified bucket does not exist&#34; error. At some point the images were…]]></description>
										<content:encoded><![CDATA[<p>A few weeks ago, I received a billing email from my phone provider O2<sup id="fnref:o2"><a href="https://shkspr.mobi/blog/2023/02/responsible-disclosure-abandoned-buckets-and-billing-emails/#fn:o2" class="footnote-ref" title="My (very) former employer." role="doc-noteref">0</a></sup>. While glancing at it, I noticed all the images were broken.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/01/broken-images.png" alt="Screenshot of an email - all the images are broken. There is no alt-text." width="640" height="318" class="aligncenter size-full wp-image-44775">

<p>Viewing the source of the email showed that they were all coming from <code>http:// mcsaatchi-email-preview.s3.amazonaws.com/o2/...</code></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/01/email-code.png" alt="Source code of an email showing the links." width="1024" height="428" class="aligncenter size-full wp-image-44774">

<p>What happens if we visit that domain?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/01/nosuchbucket.png" alt="Error saying the bucket does not exit." width="1024" height="263" class="aligncenter size-full wp-image-44773">

<p>Ah, the dreaded "The specified bucket does not exist" error. At some point the images were served from that domain but someone deleted the bucket.</p>

<p>This is a problem. Amazon doesn't reserve bucket names after they're abandoned.  Which means digital miscreants can claim them.</p>

<p>Imagine if, say, Vodafone<sup id="fnref:voda"><a href="https://shkspr.mobi/blog/2023/02/responsible-disclosure-abandoned-buckets-and-billing-emails/#fn:voda" class="footnote-ref" title="Another of my (very) former employers." role="doc-noteref">1</a></sup> registered that bucket name. All of a sudden they could inject their logos or adverts into their rival's billing emails.</p>

<p>An attacker could go further. They could replace the images with ones saying "Please note our bank details have changed, send BitCoin to...."</p>

<p>It gets worse. The emails contain a link to an external font.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2023/01/font.png" alt="Screenshot showing the font being loaded in code." width="1024" height="292" class="aligncenter size-full wp-image-44776">

<p>An attacker could craft <a href="https://pixelambacht.nl/2015/sans-bullshit-sans/">a font with specific ligatures</a> which would <em>replace the text of the email!</em></p>

<p>I quickly defensively registered the bucket on AWS and sent an email telling O2's security team about the problem. I suggested they update their future emails.  Of course, that doesn't help all the emails which have been already been sent and are lingering in their customers' inboxes. So I offered to transfer the bucket name back.</p>

<p>I received an automated response saying they'd look in to it.</p>

<h2 id="lessons-you-should-learn"><a href="https://shkspr.mobi/blog/2023/02/responsible-disclosure-abandoned-buckets-and-billing-emails/#lessons-you-should-learn">Lessons you should learn</a></h2>

<p>You should be very wary about hosting your critical infrastructure on a sub-domain outside of your control.  And you should never point directly to an S3 bucket if you can help it.</p>

<p>Ideally, O2 would have spun up a domain like <code>images.billing-emails.o2.com</code>, pointed it to S3, and used that in their emails.  That way, if they decided not to continue using Amazon's services, all their existing billing emails would be unaffected.</p>

<p>If an attacker gets control of a domain used to show images in emails, the can directly target your customers.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2023/02/responsible-disclosure-abandoned-buckets-and-billing-emails/#timeline">Timeline</a></h2>

<ul>
<li>2023-01-26 Issue detected. Defensively registered. Email sent.</li>
<li>2023-02-21 Reminder email sent informing them that I'd be publishing this post.</li>
<li>2023-02-22 O2 said they were investigating and asked me to delete the bucket, which I did. They swiftly reclaimed the bucket and repopulated its content.</li>
<li>2023-02-27 Blog post automatically published.</li>
</ul>

<p>No bug bounty, but <a href="https://www.which.co.uk/news/article/mobile-customers-facing-excessive-price-rises-trapped-by-contracts-aYTVe9B4hJgv">O2 did raise my bill by 17.3%</a>…</p>

<div id="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:o2">
<p>My (very) former employer.&nbsp;<a href="https://shkspr.mobi/blog/2023/02/responsible-disclosure-abandoned-buckets-and-billing-emails/#fnref:o2" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:voda">
<p>Another of my (very) former employers.&nbsp;<a href="https://shkspr.mobi/blog/2023/02/responsible-disclosure-abandoned-buckets-and-billing-emails/#fnref:voda" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=44772&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/02/responsible-disclosure-abandoned-buckets-and-billing-emails/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Responsible Disclosure: XSS in Codeberg Pages]]></title>
		<link>https://shkspr.mobi/blog/2023/01/responsible-disclosure-xss-in-codeberg-pages/</link>
					<comments>https://shkspr.mobi/blog/2023/01/responsible-disclosure-xss-in-codeberg-pages/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 02 Jan 2023 12:34:07 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[xss]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=44342</guid>

					<description><![CDATA[Codeberg is a hip new code hosting site - similar to GitHub and GitLab.  And, much like Gits Hub &#38; Lab, users can serve static content through Codeberg pages.  Somehow I screwed up my configuration, and when I visited edent.codeberg.page/abc123 I got this error:    Now, whenever I see something from the request echoed into the page&#039;s source, my hacker-sense starts tingling.  What happens if I…]]></description>
										<content:encoded><![CDATA[<p><a href="https://codeberg.org/">Codeberg</a> is a hip new code hosting site - similar to GitHub and GitLab.  And, much like Gits Hub &amp; Lab, users can serve static content through Codeberg pages.</p>

<p>Somehow I screwed up my configuration, and when I visited <code>edent.codeberg.page/abc123</code> I got this error:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/12/Not-Found.png" alt="Screenshot of a 404 not found page. The name of the path is displayed on the page." width="480" height="428" class="aligncenter size-full wp-image-44343">

<p>Now, whenever I see something from the request echoed into the page's source, my hacker-sense starts tingling.  What happens if I shove an innocent HTML element into the URl?</p>

<p><code>edent.codeberg.page/abc&lt;em&gt;123</code></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/12/Italics.png" alt="Screenshot of the same page. Half the text is italic." width="480" height="428" class="aligncenter size-full wp-image-44344">

<p>Aha! It lets through some HTML. I wonder which other elements it lets through? Let's try...</p>

<p><code>edent.codeberg.page/abc&lt;img src="https://placecats.com/640/640"&gt;123</code></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/12/img.png" alt="Screenshot showing a broken image icon." width="480" height="428" class="aligncenter size-full wp-image-44345">

<p>Ah nuts! Let's look in to the source code to see what went wrong:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/12/code.png" alt="Screenshot of HTML code. The URl is truncated at the colon." width="1024" height="251" class="aligncenter size-full wp-image-44346">

<p>It seems that the back end code has <em>some</em> protection. It strips all <code>/</code> characters. That makes it impossible to inject a working <code>&lt;script&gt;</code> element because there will never be a <code>&lt;/script&gt;</code> to close it.</p>

<p>We can't even use my favourite little trick of Base64 encoding the contents of an <code>&lt;iframe&gt;</code>:</p>

<pre><code class="language-html">&lt;iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTISIpOzwvc2NyaXB0Pg=="&gt;
</code></pre>

<p>Manually removing the <code>/</code> led to this:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/12/iframe.png" alt="Screenshot of a page with an iframe. It displays some Javascript in plain text." width="480" height="420" class="aligncenter size-full wp-image-44347"></p>

<p>No forward slashes makes things like <code>&lt;svg&gt;</code> injection difficult - if not impossible.  Hmmm... what can we do...? I know!</p>

<p>The <a href="https://developer.mozilla.org/en-US/docs/Web/API/Window/error_event"><code>onerror</code> event handler</a>.</p>

<p><code>test.codeberg.page/abc&lt;img src=1 onerror=alert("xss") ;</code></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/12/xss.png" alt="An XSS pop up alert on a webpage." width="540" height="482" class="aligncenter size-full wp-image-44348">

<p>Boom!</p>

<p>Let this be a lesson to you - <em>always</em> sanitised user-supplied content, no matter how innocuous it seems.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2023/01/responsible-disclosure-xss-in-codeberg-pages/#timeline">Timeline</a></h2>

<ul>
<li>2022-12-02 Discovered. Emailed support, got a secure address to email, sent disclosure.</li>
<li>2022-12-05 Tested and discovered that it had been fixed.</li>
<li>2023-01-02 Blog post automatically published.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=44342&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/01/responsible-disclosure-xss-in-codeberg-pages/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[What's the most malicious thing you can do with an injected HTML heading element?]]></title>
		<link>https://shkspr.mobi/blog/2022/08/whats-the-most-malicious-thing-you-can-do-with-an-injected-html-heading-element/</link>
					<comments>https://shkspr.mobi/blog/2022/08/whats-the-most-malicious-thing-you-can-do-with-an-injected-html-heading-element/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 30 Aug 2022 11:34:39 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=42759</guid>

					<description><![CDATA[A bit of a thought experiment - similar to my Minimum Viable XSS and SVG injection investigations.  I recently found a popular website which echoed back user input. It correctly sanitised &#60; to &#38;lt; to prevent any HTML injection.  Except…  It let through &#60;h2&#62; elements unaltered! Why? I suspect because the output was:  &#60;h2&#62;Your search for ... returned no results&#60;/h2&#62;   And, somehow, the parser was g…]]></description>
										<content:encoded><![CDATA[<p>A bit of a thought experiment - similar to my <a href="https://shkspr.mobi/blog/2016/03/minimum-viable-xss/">Minimum Viable XSS</a> and <a href="https://shkspr.mobi/blog/2019/11/responsible-disclosure-svg-injection-in-three-co-uk/">SVG injection</a> investigations.</p>

<p>I recently found a popular website which echoed back user input. It correctly sanitised <code>&lt;</code> to <code>&amp;lt;</code> to prevent any HTML injection.</p>

<p>Except…</p>

<p>It let through <code>&lt;h2&gt;</code> elements unaltered! Why? I suspect because the output was:</p>

<pre><code class="language-html">&lt;h2&gt;Your search for ... returned no results&lt;/h2&gt;
</code></pre>

<p>And, somehow, the parser was getting confused.  OK, what can we do with this little vector?</p>

<p>The first thought is to use Javascript event handlers like <code>onclick()</code> or <code>onmouseover()</code> - but they were (sensibly) blocked.  The <code>&lt;h2&gt;</code> element only has access to the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes">Global Attributes</a>. So we could inject content which use Right-To-Left text, or add some metadata attributes - but that's not particularly useful.</p>

<p>The most useful Global Attribute is <code>style=""</code>. Yup! Good old CSS!</p>

<p>The limitation of the style attribute is that it only applies to the specific element it is attached to. So you can't rewrite the entire page. You also can't use the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/content"><code>content:</code></a> property - as that only applies to <code>::before</code> and <code>::after</code> directives.</p>

<p>Using normal CSS, we can change the colour and size of our newly injected <code>&lt;h2&gt;</code>, faff around with the background colour, change the font, and move it about the page.  Good for a bit of digital graffiti, but not much else.</p>

<p>Except…</p>

<p>What about using <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/background-image"><code>background-image</code></a>? Using that, we can pull in an <em>external</em> resource.</p>

<pre><code class="language-_">&lt;h2
  style="background-image:url('https://evil.site/whatever.png');
  width:512px;
  height:512px;"&gt; ... &lt;/h2&gt;
</code></pre>

<p>That will load an external picture on the site. It could be an animated GIF saying "You're a winner! Visit www.... to claim your prize!". It wouldn't be clickable, but might catch a few people out.</p>

<p>It is possible to load an SVG. And <a href="https://shkspr.mobi/blog/2018/02/this-svg-always-shows-todays-date/">SVG can contain JS</a>. But - alas and alack - the JS doesn't run in background mode - even if the JS is bundled as Base64.</p>

<p>Changing the <code>content-disposition</code> of the image won't force the browser to download it, either.</p>

<p>And that, I think, is about the limit of it. If Javascript is blocked, the worst you can do is inject a malicious image. Short of finding a zero-day in a browser's codec, all that can happen is a bit of temporary defacement.</p>

<h2 id="but-wait-theres-more"><a href="https://shkspr.mobi/blog/2022/08/whats-the-most-malicious-thing-you-can-do-with-an-injected-html-heading-element/#but-wait-theres-more">But Wait! There's More!</a></h2>

<p>While fuzzing around with the input, I made an interesting mistake.  I mistyped <code>&lt;svg&gt;</code> as <code>&lt;sgv&gt;</code>.  That invalid element <em>was</em> added to the page's HTML!  That means there's a parser somewhere which is stripping out only the elements it knows about.  Browsers typically ignore elements they don't understand - so there's no danger to users there. But it points to the idea that there may be some elements the sanitiser doesn't know about.</p>

<p>And, indeed, there were!  For example, it happily took the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/plaintext">obsolete <code>&lt;plaintext&gt;</code> element</a>, and dumped it into the markup.  Which caused the page to break.</p>

<p>It also, delightfully, took the <code>&lt;marquee&gt;</code> element!</p>

<style>.social-embed{all:unset;display:block;}.social-embed * {all:unset;display:revert;}.social-embed::after{all:unset;}.social-embed::before{all:unset;}blockquote:not(*){all:unset;}.social-embed a{cursor:pointer;}blockquote.social-embed{box-sizing:border-box;border:.5px solid;width:550px;max-width:100%;font-family:sans-serif;margin:auto;margin-bottom:.5em;padding:1em;border-radius:1em;background-color:#FFF;color:#000;display:block;}.social-embed-header{display:flex;justify-content:space-between;}.social-embed-user{display:flex;position:relative;align-items:center;text-decoration:none;color:inherit;}.social-embed-avatar{width:3em;height:3em;margin-right:.5em;}.social-embed-avatar-circle{border-radius:50%;}.social-embed-avatar-square{border-radius:5%;}.social-embed-user-names-name{display:flex;align-items:center;font-weight:bold;margin:0;}.social-embed-text{margin-top:.5em;}.social-embed-footer{display:flex;align-items:center;justify-content:space-between;}.social-embed-logo{width:3em;}.social-embed-hr{border:.1px solid;margin:.5em 0 .5em 0;}.social-embed-meta{text-decoration:none !important;color:unset !important;}.social-embed-reply{display:block;}.social-embed-text a, .social-embed-footer time{color:blue;text-decoration:underline;}.social-embed-media, .social-embed-video{border-radius:1em;max-width:100%;margin:auto;display:block;}.social-embed-reply{font-size:.75em;display:block;}.social-embed-meter{width:100%;background:#0005;}.social-embed-card{text-decoration:none !important;color:unset !important;border:.5px solid;display:block;font-size:.85em;padding:.5em;border-radius:1em;}</style>

<blockquote class="social-embed" id="social-embed-1533201088941285377" lang="en"><header class="social-embed-header"><a href="https://twitter.com/edent" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1533197758299086849">Replying to @edent</a></small>OMG…!<br>I legit did not expect that to work… <a href="https://twitter.com/edent/status/1533201088941285377/video/1">pic.x.com/5q4ymmzjdg</a><video class="social-embed-video" controls="" src="https://video.twimg.com/ext_tw_video/1533201033920450560/pu/vid/1280x718/0Ysl5rTjzywBh64K.mp4?tag=12" poster="data:image/webp;base64,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" width="550"></video></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1533201088941285377" aria-label="10 likes" class="social-embed-meta">❤️ 10</a><a href="https://twitter.com/edent/status/1533201088941285377" aria-label="0 replies" class="social-embed-meta">💬 0</a><a href="https://twitter.com/edent/status/1533201088941285377" aria-label="0 retweets" class="social-embed-meta">♻️ 0</a><a href="https://twitter.com/edent/status/1533201088941285377"><time datetime="2022-06-04T21:36:39.000Z">21:36 - Sat 04 June 2022</time></a></footer></blockquote>

<p>I reported the issue immediately, and got an acknowledgement. But, sadly, after a few months the website was still not fixed.</p>

<p>Take a bow, <a href="https://dl.acm.org/action/doSearch?AllField=%3Cmarquee%3EWhoops%21">ACM Digital Library!</a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=42759&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/08/whats-the-most-malicious-thing-you-can-do-with-an-injected-html-heading-element/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		<enclosure url="https://video.twimg.com/ext_tw_video/1533201033920450560/pu/vid/1280x718/0Ysl5rTjzywBh64K.mp4?tag=12" length="163170" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[Responsible Disclosure: An Exam Board Touting Dodgy PDFs]]></title>
		<link>https://shkspr.mobi/blog/2022/07/responsible-disclosure-an-exam-board-touting-dodgy-pdfs/</link>
					<comments>https://shkspr.mobi/blog/2022/07/responsible-disclosure-an-exam-board-touting-dodgy-pdfs/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 30 Jul 2022 11:34:07 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=42813</guid>

					<description><![CDATA[I hate academic tests. Wouldn&#039;t it be great if you could find the official answer papers?  Oh, cool, the OCR Exam Board is hosting answer sheets for all my classes!    What happens if I click it?    Yeach! It redirects users to a scammy ebook service hosted on an external website. Which, I assume, the exam board does not endorse.  Alongside exam books, textbooks, literary classics - there&#039;s a…]]></description>
										<content:encoded><![CDATA[<p>I hate academic tests. Wouldn't it be great if you could find the official answer papers?</p>

<p>Oh, cool, the OCR Exam Board is hosting answer sheets for all my classes!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/06/Answer-sheets-results.png" alt="Screenshot of Google results showing a bunch of answer books on the OCR page." width="1046" height="671" class="alignnone size-full wp-image-42815">

<p>What happens if I click it?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/06/Scam-PDF-site.png" alt="Dodgy website trying to encourage peoople to sign up for a PDF reading service." width="1024" height="917" class="alignnone size-full wp-image-42817">

<p>Yeach! It redirects users to a scammy ebook service hosted on an external website. Which, I assume, the exam board does <em>not</em> endorse.</p>

<p>Alongside exam books, textbooks, literary classics - there's a bunch of material which probably isn't suitable for school…</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/06/porn-spam-results.png" alt="Screenshot of Google results page showing pornographic content on the OCR page." width="1045" height="638" class="alignnone size-full wp-image-42816">

<p>If you visit the root of the domain, it seems to have a dodgy Javascript trying to redirect you to what is probably a scam site.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/06/dodgy-JS.png" alt="Screenshot of some Javascript embedded in a page." width="1024" height="483" class="alignnone size-full wp-image-42814">

<p>It seems fairly clear to me that this is an abandoned website. Some scammer has hijacked it and is using OCR's good name to launder their reputation.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/07/list-of-spammy-site.png" alt="Search results showing a bunch of dodgy looking pages on that site." width="791" height="614" class="aligncenter size-full wp-image-43211">

<p>Time to contact the exam board and let them know the bad news.</p>

<h2 id="disclosure-timeline"><a href="https://shkspr.mobi/blog/2022/07/responsible-disclosure-an-exam-board-touting-dodgy-pdfs/#disclosure-timeline">Disclosure Timeline</a></h2>

<ul>
<li>2022-06-04 Discovered. No security contact, so sent a brief email to their support address</li>
<li>2022-06-07 <a href="https://twitter.com/edent/status/1534134741552746497">Tried to make contact on Twitter</a> - got redirected to email.</li>
<li>2022-07-13 Asked for an update - but noticed the website had been taken down.</li>
<li>2022-07-30 Blog post automatically published</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=42813&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/07/responsible-disclosure-an-exam-board-touting-dodgy-pdfs/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Responsible Disclosure: Chrome security bug let tabs draw over each other ($1k bounty)]]></title>
		<link>https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/</link>
					<comments>https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 04 Dec 2021 12:34:26 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[Bug Bounty]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=40136</guid>

					<description><![CDATA[Chrome for Android had a flaw which let one tab draw over another - even if the tabs were on completely different domains. A determined attacker might have been able to abuse this to convince a user to download and installed a spoofed app.  See Chrome Bug #1242315 for details.  Demo  Here&#039;s a video of me on one site (Twistory.ml) opening a link to Twitter in a new tab.  Twitter&#039;s mobile site…]]></description>
										<content:encoded><![CDATA[<p>Chrome for Android had a flaw which let one tab draw over another - even if the tabs were on <em>completely different</em> domains. A determined attacker might have been able to abuse this to convince a user to download and installed a spoofed app.</p>

<p>See <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1242315">Chrome Bug #1242315</a> for details.</p>

<h2 id="demo"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#demo">Demo</a></h2>

<p>Here's a video of me on one site (Twistory.ml) opening a link to Twitter in a new tab.  Twitter's mobile site contains a <a href="https://web.dev/add-manifest/">Web Manifest</a> which should prompt the user to install an app. Rather than displaying this pop-up on Twitter's tab, Chrome displays it over the unrelated tab.</p>

<p></p><div style="width: 270px;" class="wp-video"><video class="wp-video-shortcode" id="video-40136-2" width="270" height="540" preload="metadata" controls="controls"><source type="video/webm" src="https://shkspr.mobi/blog/wp-content/uploads/2021/08/Chrome-Bug.webm?_=2"><a href="https://shkspr.mobi/blog/wp-content/uploads/2021/08/Chrome-Bug.webm">https://shkspr.mobi/blog/wp-content/uploads/2021/08/Chrome-Bug.webm</a></video></div><p></p>

<h2 id="why-this-is-a-problem"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#why-this-is-a-problem">Why this is a problem</a></h2>

<p>Here's a (somewhat unlikely) scenario.</p>

<p>You're on, for example, Reddit's website and see an interesting looking link to an external site. You open it in a new tab. All of a sudden, a pop-up appears saying "Reddit is better in the app! Click to download!!"</p>

<p>You download it. Unbeknownst to you, the pop-up was <strong>from the external site</strong>. They saw your <code>referer</code> header and automatically crafted a manifest file which sends you to a malicious copy-cat app. That app steals your password for Reddit, clones your identity, and kills your puppy.</p>

<h2 id="googles-response"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#googles-response">Google's response</a></h2>

<p>I was expecting Google to close this as <code>WONTFIX</code>. In my experience, Google's attitude to lots of bugs is the same as Steve Job's infamous "<a href="https://www.engadget.com/2010-06-24-apple-responds-over-iphone-4-reception-issues-youre-holding-th.html">You're holding it wrong</a>". Blame the user for not understanding how Google's poorly-tested and confusing products work.</p>

<p>But, to be fair, it was taken seriously. I didn't have to provide any extra detail and, while it was low severity, it was fixed promptly. Kudos!</p>

<p>Then came the agonising wait to see whether Google would pay out millions of dollars for this flaw...</p>

<h2 id="bounty"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#bounty">Bounty</a></h2>

<p>For UI bugs like this, Google tends to award $500 - see  <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1136714">1136714</a>, <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1133183">1133183</a>, and <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=841622">841622</a>. Although if you can draw over the security UI, the <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=1162942">rewards are much higher</a>.</p>

<p>So I was pleasantly surprised to win a US$1,000 bounty!</p>

<p>Perhaps I could have sold it on the DarkWeb™ for <del>digital Beanie Babies</del> totally legitimate crypto-currency? Nah. Too much hassle! I'm going to plough the money into our <a href="https://openbenches.org">OpenBenches</a> project.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/#timeline">Timeline</a></h2>

<ul>
<li>2021-08-23 Discovered and <a href="https://twitter.com/edent/status/1429734143974383617">disclosed</a>. Within a few hours it was accepted, and triaged. With the (fair) comment that "This doesn't look very scary to me."</li>
<li>2021-08-26 <a href="https://chromium-review.googlesource.com/c/chromium/src/+/3119088">Marked as fixed by this commit</a></li>
<li>2021-08-27 <a href="https://chromium-review.googlesource.com/c/chromium/src/+/3124684/">Further patches for related issue</a></li>
<li>2021-09-28 Given a gentle nudge, the Reward Panel offered $1k.</li>
<li>2021-10-08 After an annoying amount of back-and-forth, Google accepted my registration on their supplier platform. The cause of the delay? I used the W8 form from the IRS.gov site - and Google wanted me to use an older one 🙄</li>
<li>2021-11-01 After signing up on their supplier payment platform and jumping through yet more hoops, US$992.50 was deposited in my TransferWise account. Where's the missing $7.50? TransferWise fees? Plus, obviously, a fee to transfer it to GBP and then out to my normal bank account. After all the conversion and fees, it came to £722.64. Quite why the international behemoth Google can't pay in a local currency, I've no idea.</li>
<li>2021-12-03 Bug report set to public.</li>
<li>2021-12-04 Blog post published.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=40136&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/12/responsible-disclosure-chrome-security-bug-lets-tabs-draw-over-each-other/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2021/08/Chrome-Bug.webm" length="1679390" type="video/webm" />

			</item>
		<item>
		<title><![CDATA[Full Disclosure: XSS in Getty Images]]></title>
		<link>https://shkspr.mobi/blog/2021/08/full-disclosure-xss-in-getty-images/</link>
					<comments>https://shkspr.mobi/blog/2021/08/full-disclosure-xss-in-getty-images/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 17 Aug 2021 11:39:17 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Bug Bounty]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[xss]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=39358</guid>

					<description><![CDATA[I&#039;ve spent two months trying to report this issue to Getty images. They haven&#039;t responded to my emails, phone calls, Tweets, or LinkedIn messages.  I&#039;ve tried escalating through OpenBugBounty and HackerOne - but still no response.  I&#039;ve taken the decision to fully disclose this XSS because the Getty Images sites accept payments from users - and users need to be aware that the content they see on…]]></description>
										<content:encoded><![CDATA[<p>I've spent two months trying to report this issue to Getty images. They haven't responded to my emails, phone calls, Tweets, or LinkedIn messages.  I've tried escalating through OpenBugBounty and HackerOne - but still no response.  I've taken the decision to fully disclose this XSS because the Getty Images sites accept payments from users - and users need to be aware that the content they see on Getty Images sites may have been tampered with.</p>

<p>This XSS was slightly unusual.  When a user submits HTML to a site search, it should be escaped before echoing it back on the screen. And that's exactly what Getty Images does:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/06/Getty-Images-with-escaped-HTML.png" alt="Getty Images with escaped HTML." width="1024" height="582" class="aligncenter size-full wp-image-39360">

<p>Except!</p>

<p>It <em>only</em> does that if there were <strong>no results</strong> found.</p>

<p>If a malicious user can craft a search term that returns results, then HTML is passed unescaped:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/06/Javascript-popup-on-the-Getty-Images-website.png" alt="Javascript popup on the Getty Images website." width="1024" height="437" class="aligncenter size-full wp-image-39359">

<!--
https://www.gettyimages.no/photos/zzzzzzzzzzzzzzz?family=creative&license=rf&phrase=xy%3C%2Fa%3E%3Cscript%3Ealert(1)%3C%2Fscript%3E
-->

<p>So - take care if you're using the Getty Images websites. Be cautious if it asks you for your financial or personal data. It is possible that the information you're seeing has been manipulated by an adversary.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2021/08/full-disclosure-xss-in-getty-images/#timeline">Timeline</a></h2>

<ul>
<li>2021-06-17 Discovered on the Getty Images Norway site, replicated on the UK site. Contacted via Twitter as they have no publicly listed security contact. Responsibly disclosed via <a href="https://www.openbugbounty.org/reports/2057054/">OpenBugBounty</a></li>
<li>2021-06-23 Used <a href="https://hackerone.com/disclosure-assistance">HackerOne's Disclosure Assistance</a> programme to see if that would prompt a response.</li>
<li>2021-07-12 Tried contacting via LinkedIn and the general contact form on their website. Made several attempts over the month.</li>
<li>2021-07-29 Direct email to security employees at Getty Images.</li>
<li>2021-08-17 Blog post automatically published.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=39358&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/08/full-disclosure-xss-in-getty-images/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Responsible Disclosure: [REDACTED] XSS]]></title>
		<link>https://shkspr.mobi/blog/2021/08/responsible-disclosure-redacted-xss/</link>
					<comments>https://shkspr.mobi/blog/2021/08/responsible-disclosure-redacted-xss/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 07 Aug 2021 11:28:28 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[xss]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=39499</guid>

					<description><![CDATA[Legacy websites are a constant source of vulnerabilities. In a fit of excitement, a team commissions a service and then never bothers updating it. Quite often the original owners leave the business and there&#039;s no-one left who remembers that the service exists. So it sits there, vulnerable, for years.  The [REDACTED] website had a subdomain which was running  KANA&#039;s IQ software which was last…]]></description>
										<content:encoded><![CDATA[<p>Legacy websites are a constant source of vulnerabilities. In a fit of excitement, a team commissions a service and then never bothers updating it. Quite often the original owners leave the business and there's no-one left who remembers that the service exists. So it sits there, vulnerable, for years.</p>

<p>The [REDACTED] website had a subdomain which was running  KANA's IQ software which was last updated in 2010. At least, that's judging by the fact it ran <a href="https://blog.jquery.com/2010/11/11/jquery-1-4-4-release-notes/">jQuery 1.4.4</a>. Most routes into the site redirected properly to their modern website. But a few pages remained accessible.  And, sadly, one of those pages was vulnerable to a rather boring XSS flaw.</p>

<p>Posting <code>'onmouseover="alert('xss')"</code> to a specific page was enough to rewrite its HTML, and produce this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/08/REDACTED-XSS-fs8.png" alt="A pop-up on a website. The HTML code shows the data has been injected." width="785" height="392" class="aligncenter size-full wp-image-39760">

<p>Now, <code>POST</code>ed XSS are harder to exploit, and relying on the user's mouse to interact with the page makes it less likely to trigger. But, with sufficient determination, an attacker could craft malicious content which could phish the user or otherwise display unwanted content.</p>

<p>Unfortunately, that's about all I can say. When I asked to publicly disclose, I got this in response.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/08/policy-fs8.png" alt="Our company policy does not allow us or any of our researchers to disclose or publish any details of any of the vulnerabilities belonging to REDACTED. For this reason, publishing any vulnerability or detail related to the company is STRICTLY NOT PERMITTED and will result in immediate banning from our program. I hope you understand and respect our position as well as our policy." width="540" height="763" class="aligncenter size-full wp-image-51282">

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2021/08/responsible-disclosure-redacted-xss/#timeline">Timeline</a></h2>

<ul>
<li>2021-07-06 Discovered. Asked for a VDP on Twitter and their public security centre.</li>
<li>2021-07-07 [REDACTED]'s CERT invited me to their <a href="https://mobile.twitter.com/edent/status/1412768123837685760">private BugCrowd programme</a>. Bug disclosed.</li>
</ul>

<blockquote class="social-embed" id="social-embed-1412768123837685760" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><blockquote class="social-embed" id="social-embed-1412467093644222467" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Why do I only every find XSS vulnerabilities in websites with no VDP or bug bounty?<br><br>*sigh*<br><br>(I mean, because obviously if they treated security seriously, they wouldn't have these trivial flaws.)</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1412467093644222467"><span aria-label="9 likes" class="social-embed-meta">❤️ 9</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2021-07-06T17:42:52.000Z" itemprop="datePublished">17:42 - Tue 06 July 2021</time></a></footer></blockquote><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1412467093644222467">Replying to @edent</a></small>What's the point of a *private* VDP?<br><br>I looked on HackerOne and BugCrowd, couldn't find anything, so emailed the company's CERT.<br><br>"Oh, you have to be invited to our TOP SECRET programme!"<br><br>Just... why? Why make it harder for people to report problems to you?</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1412768123837685760"><span aria-label="5 likes" class="social-embed-meta">❤️ 5</span><span aria-label="3 replies" class="social-embed-meta">💬 3</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2021-07-07T13:39:03.000Z" itemprop="datePublished">13:39 - Wed 07 July 2021</time></a></footer></blockquote>

<ul>
<li>2021-07-09 Triaged as P4. US$100 bounty and <a href="https://bugcrowd.com/edent">5 BugCrowd points</a></li>
<li>2021-07-13 Payment received. Request to disclose.</li>
<li>2021-07-20 I noticed the vulnerability had been fixed.</li>
<li>2021-07-29 Request to disclose again. Refused!</li>
<li>2021-08-07 Published on this blog</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=39499&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/08/responsible-disclosure-redacted-xss/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Responsible Disclosure - John Lewis]]></title>
		<link>https://shkspr.mobi/blog/2020/02/responsible-disclosure-john-lewis/</link>
					<comments>https://shkspr.mobi/blog/2020/02/responsible-disclosure-john-lewis/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 10 Feb 2020 08:13:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Bug Bounty]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=33730</guid>

					<description><![CDATA[The HTML5 specification is complicated. I&#039;ve been an author on it, and even I couldn&#039;t tell you all the weird little gotchas it contains. Between that and &#34;idiosyncratic&#34; browser engines, it&#039;s a wonder the world wide web works at all.  Let&#039;s talk about the humble &#60;meta&#62; element. As its name suggests, it contains metadata about the document. A typical element might look like this:  &#60;meta…]]></description>
										<content:encoded><![CDATA[<p>The HTML5 specification is <em>complicated.</em> I've been an author on it, and even I couldn't tell you all the weird little gotchas it contains. Between that and "idiosyncratic" browser engines, it's a wonder the world wide web works at all.</p>

<p>Let's talk about <a href="https://twitter.com/edent/status/1213830425866575872">the humble <code>&lt;meta&gt;</code> element</a>. As its name suggests, it contains metadata about the document. A typical element might look like this:</p>

<p><code>&lt;meta name="description" content="Search our shop for great deals!"&gt;</code></p>

<p>What can the <code>content</code> tag contain? Text! Specifically, text where certain characters have to be encoded into their HTML entities. Now, to be fair, neither the <a href="https://www.w3.org/TR/html51/document-metadata.html#description">W3C specification</a> nor the <a href="https://html.spec.whatwg.org/multipage/semantics.html#the-meta-element">WHAT-WG spec</a> mention how text should be encoded. They both just say:</p>

<blockquote><p>The value must be a free-form string that describes the page.</p></blockquote>

<p>Obviously, you should encode a <code>"</code> character to <code>&amp;quot;</code> because otherwise the browser might think that's the end of the string.  But the spec doesn't mention that when talking about meta elements.</p>

<p>Create a document which has this meta element:</p>

<pre><code class="language-html">&lt;meta name="description" content="My name is "Terence &lt;em&gt;Eden&lt;/em&gt;" what's yours?"&gt;
</code></pre>

<p>And you'll see this echoed into the page:</p>

<p><code>Eden" what's yours?"&gt;</code></p>

<p>Most browsers interpret rogue HTML in the <code>&lt;head&gt;</code> as <code>&lt;body&gt;</code> content.</p>

<h2 id="search-for-the-hero-inside-yourself-ukulele-cover"><a href="https://shkspr.mobi/blog/2020/02/responsible-disclosure-john-lewis/#search-for-the-hero-inside-yourself-ukulele-cover">"Search for the hero inside yourself (ukulele cover)"</a></h2>

<p>The John Lewis shop website had this problem.  If you searched for <code>lorem&lt;em&gt;ipsum</code> you saw this:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/01/Lorem-Ipsum.png" alt="Text leaking into a website." width="691" height="257" class="aligncenter size-full wp-image-33740"></p>

<p>The server <em>correctly</em> encodes the text in:</p>

<pre><code class="language-html">&lt;meta name="description" 
      content="Search results for &amp;quot;lorem&amp;amp;lt;em&amp;amp;gt;ipsum&amp;quot; on John Lewis &amp; Partners. Free delivery on orders over £50" /&gt;
</code></pre>

<p>But it <em>incorrectly</em> encoded it in the <a href="https://ogp.me/">OpenGraph meta element</a>:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/01/Broken-meta-element.png" alt="Broken meta element in HTML code." width="1287" height="128" class="aligncenter size-full wp-image-33743"></p>

<p>The server is smart enough to filter out <code>&lt;script&gt;</code> content - so an attacker can't get it to echo malicious JavaScript. But, it was possible to inject SVG content.  This is similar to <a href="https://shkspr.mobi/blog/2019/11/responsible-disclosure-svg-injection-in-three-co-uk/">a disclosure I made last year to Three.co.uk</a>.</p>

<p>Here's a basic circle injected into the page:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/01/John-Lewis-Website-with-a-big-circle-drawn-on-it.png" alt="John Lewis Website with a big circle drawn on it." width="845" height="667" class="aligncenter size-full wp-image-33739">

<p>With a well enough crafted SVG, an attacker can perform a complete site takeover or other malicious activity.  Because the content is sent in the <code>GET</code> request, an attacker can send malicious URl which looks like:</p>

<p><code>https://www.johnlewis.com/search?search-term=%22%3E%3Csvg%20xmlns...</code></p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2020/02/responsible-disclosure-john-lewis/#timeline">Timeline</a></h2>

<p>John Lewis doesn't have a <a href="https://securitytxt.org/">security.txt</a> available, and I couldn't find anything on their website about reporting security issues.</p>

<p><a href="https://twitter.com/edent/status/1213830425866575872">So I sent a Tweet</a>. When that didn't get a response - presumably because it wasn't a complaint about a missing order - I asked my security buddies. They forwarded on a message. That's great for anyone well-connected, but not a long-term solution.</p>

<p>Eventually, Twitter customer service coughed up the security team's email, so I sent them a write up on the 9th of January. I got back a generic and slightly dispiriting response:</p>

<blockquote class="social-embed" id="social-embed-1215685867274166273" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Where can I exchange all this Karma++ for biscuits? <a href="https://x.com/edent/status/1215685867274166273/photo/1">pic.x.com/YUZluHC47z</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/EN772crXkAA9pU_.png" class="social-embed-media-link"><img class="social-embed-media" alt="Thanks for your information. REDACTED takes the security of our websites and information relating to our customers, our suppliers and our own operations very seriously. As such, we shall ensure any vulnerability you have reported is risk assessed and passed to the appropriate team for remediation. We do not offer financial reward for submissions. We are actively working to put in place a bug bounty pr" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1215685867274166273"><span aria-label="4 likes" class="social-embed-meta">❤️ 4</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2020-01-10T17:24:31.000Z" itemprop="datePublished">17:24 - Fri 10 January 2020</time></a></footer></blockquote>

<p>A few days later, it was fixed. That's a pretty good response time!  I understand that John Lewis will be working on a responsible disclosure programme - but until then, reporting via Twitter seems to be the best way to go.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=33730&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/02/responsible-disclosure-john-lewis/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Even Google forgets to renew its domains]]></title>
		<link>https://shkspr.mobi/blog/2020/01/even-google-forgets-to-renew-its-domains/</link>
					<comments>https://shkspr.mobi/blog/2020/01/even-google-forgets-to-renew-its-domains/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 14 Jan 2020 12:17:21 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Bug Bounty]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=33237</guid>

					<description><![CDATA[tl;dr Google forgot to renew a domain used in their documentation. It was mildly embarrassing for them. And possibly a minor security concern for some new G-Suite domain administrators    Background  Choosing a good example domain, to use in documentation, is hard. You want something which is obviously an example, so that users understand they have to substitute it for their own details. But…]]></description>
										<content:encoded><![CDATA[<details open="">
  <summary><strong>tl;dr</strong></summary>
<ol><li>Google forgot to renew a domain used in their documentation.</li>
<li>It was mildly embarrassing for them.</li>
<li>And possibly a minor security concern for some new G-Suite domain administrators</li></ol>

</details>

<h2 id="background"><a href="https://shkspr.mobi/blog/2020/01/even-google-forgets-to-renew-its-domains/#background">Background</a></h2>

<p>Choosing a good example domain, to use in documentation, is hard. You want something which is obviously an example, so that users understand they have to substitute it for their own details. But it also needs to be a validly formatted domain, and shouldn't be used for anything important, and - most importantly - should be under your control.</p>

<p>In most of Google's domain documentation, they used <code>SpottedFig.org</code> - why? Who knows!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/11/GSuite-Admin-showing-the-domain-fs8.png" alt="GSuite Admin showing the domain." width="884" height="438" class="aligncenter size-full wp-image-33240">

<p>They used it across their support platform:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/11/Lots-of-Google-pages-with-the-domain-in-them-fs8.png" alt="Lots of Google pages with the domain in them." width="893" height="611" class="aligncenter size-full wp-image-33242">

<p>Yet, for some reason, they didn't renew it when it expired a couple of months ago.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/11/Domain-showing-as-available-to-purchase-fs8.png" alt="Domain showing as available to purchase." width="1212" height="414" class="aligncenter size-full wp-image-33244">

<p>So I bought it for £10. Cheap!</p>

<h2 id="security"><a href="https://shkspr.mobi/blog/2020/01/even-google-forgets-to-renew-its-domains/#security">Security</a></h2>

<p>Google's documentation said "To view DNS results for a domain already configured to use G Suite, enter spottedfig.org."</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/11/Documentation-showing-the-domain-fs8.png" alt="Documentation showing the domain." width="667" height="495" class="aligncenter size-full wp-image-33243">

<p>As I now have control of the domain, I could have entered malicious DNS information and convinced people to use it. Perhaps redirecting their email to my servers.</p>

<h2 id="impact"><a href="https://shkspr.mobi/blog/2020/01/even-google-forgets-to-renew-its-domains/#impact">Impact</a></h2>

<p>Look, this isn't in the same league as <a href="https://www.linkedin.com/pulse/i-purchased-domain-googlecom-via-google-domains-sanmay-ved/">the chap who bought <code>Google.com</code> for $12</a>. This is a minor domain with probably zero traffic until I stumbled upon it. Looking in the Wayback Machine, it appears that the site never had any meaningful content.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/11/Google-404-error-in-the-wayback-machine-fs8.png" alt="Google branded 404 error in the wayback machine." width="780" height="255" class="aligncenter size-full wp-image-33239"></p>

<p>Because Google specifically advised users to check the DNS entries of <code>SpottedFig.org</code>, I thought there was a minor security risk that Google users could be tricked into entering incorrect DNS information.  So I responsibly disclosed it to them.</p>

<p>Eventually, Google replaced <em>most</em> references to <code>SpottedFig</code> in their documentation. <a href="https://support.google.com/a/answer/2579951?hl=en">They inexplicably left this <code>.com</code> one though</a>:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/01/Screenshot_2020-01-07-Troubleshoot-A-records-G-Suite-Admin-Help.png" alt="Google help page." width="663" height="216" class="aligncenter size-full wp-image-33761">

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2020/01/even-google-forgets-to-renew-its-domains/#timeline">Timeline</a></h2>

<ul>
<li>2019-11-29 Found the domain while reading the documentation close to midnight.</li>
<li>2019-11-30 Purchased the domain. Wrote a badly worded vulnerability report at 1am and sent to Google.</li>
<li>2019-12-02 Marked as "infeasible" by Google. So I wrote a better explanation. Essentially "Google tells G-Suite admins to use my domain as a template for configuration."</li>
<li>2019-12-03 Google reconsidered! Said it probably wasn't eligible for a bounty (drat!) but they'd evaluate it.</li>
<li>2019-12-11 I noticed that Google had rewritten its documentation. All references to <code>SpottedFig.org</code> were removed and replaced with a domain they control - <code>solarmora.com</code></li>
<li>2019-12-18 "As a part of our Vulnerability Reward Program, we decided that it does not meet the bar for a financial reward, but we would like to acknowledge your contribution to Google security in our <a href="https://bughunter.withgoogle.com/profile/daaf885b-933e-4425-8668-d44cca3bc0f1">Hall of Fame</a>"</li>
<li>2020-01-14 Published this blog post.</li>
</ul>

<h2 id="how-to-prevent-this-happening-to-you"><a href="https://shkspr.mobi/blog/2020/01/even-google-forgets-to-renew-its-domains/#how-to-prevent-this-happening-to-you">How to prevent this happening to you?</a></h2>

<p>I recommend using <a href="https://littlewarden.com/">Little Warden</a> to monitor your domains.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=33237&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/01/even-google-forgets-to-renew-its-domains/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[€100 Bug Bounty from Intigriti - please stop tracking your confirmation emails!]]></title>
		<link>https://shkspr.mobi/blog/2019/01/e100-bug-bounty-from-intigriti-please-stop-tracking-your-confirmation-emails/</link>
					<comments>https://shkspr.mobi/blog/2019/01/e100-bug-bounty-from-intigriti-please-stop-tracking-your-confirmation-emails/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 05 Jan 2019 12:06:26 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Bug Bounty]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=30965</guid>

					<description><![CDATA[There&#039;s a new bug bounty provider in town! The Belgian company Intigriti.  This is a quick write-up of how I found a trivial bug in their own system.  The EU has announced that it is providing funding for bug bounties on critical open source projects.  They&#039;ve split the programme between HackerOne and Intigriti.  I signed up to Intigriti, and instantly received a confirmation email.    Can you…]]></description>
										<content:encoded><![CDATA[<p>There's a new bug bounty provider in town! The <a href="https://www.intigriti.com">Belgian company Intigriti</a>.  This is a quick write-up of how I found a trivial bug in their own system.</p>

<p>The <a href="https://juliareda.eu/2018/12/eu-fossa-bug-bounties/">EU has announced that it is providing funding for bug bounties on critical open source projects</a>.  They've split the programme between <a href="https://hackerone.com/edent">HackerOne</a> and <a href="https://app.intigriti.com/profile/edent">Intigriti</a>.</p>

<p>I signed up to Intigriti, and instantly received a confirmation email. 
<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/12/Confirmation-Email.png" alt="Confirmation Email with a big button in the middle." width="540" height="391" class="aligncenter size-full wp-image-30966"></p>

<p>Can you guess where you go if you click the big "Activate Account" button?
<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/12/Weird-confrimation-address.png" alt="Weird confrimation address." width="540" height="464" class="aligncenter size-full wp-image-30967"></p>

<p>I think that's the first time I've ever seen a <code>.lu</code> domain in the wild. Hardly surprising as there's <a href="http://research.domaintools.com/statistics/tld-counts/">fewer than 90,000 of them</a>.</p>

<p>This <em>looks</em> like a phishing URl.  It doesn't use http<strong>s</strong>, it's a random string of gibberish characters, and an obscure domain.</p>

<p>It is happens, the site is legitimate. <a href="http://wtf.omg.bbq.mjt.lu/">MailJet</a> - an email marketing firm - use it as a redirector.  I assume that Intigriti use them as a mailing service, and want to track every single click you make on their emails.</p>

<p>Why are their statistics more important than your privacy and security?</p>

<h2 id="why-is-this-bad"><a href="https://shkspr.mobi/blog/2019/01/e100-bug-bounty-from-intigriti-please-stop-tracking-your-confirmation-emails/#why-is-this-bad">Why is this bad?</a></h2>

<p>Links to http sites are not secure. That means your visit to that URl can be seen by your ISP and anyone else between you and your destination.</p>

<p>A user clicking on that insecure URl risks having their request intercepted. While an attacker can't log in using the data they've captured, they would be able to redirect the user and phish their details.</p>

<h2 id="why-use-a-3rd-party"><a href="https://shkspr.mobi/blog/2019/01/e100-bug-bounty-from-intigriti-please-stop-tracking-your-confirmation-emails/#why-use-a-3rd-party">Why use a 3rd party?</a></h2>

<p>Basically, if Mailjet gets hacked, or goes rogue, they can start phishing all of Intigriti's customers.</p>

<p>Thankfully, Intigriti had the good sense to not use this tracking on their password reset emails.  Indeed, I must commend them on their general security, and their swift responsiveness to this minor security issue.</p>

<p>This isn't the hack of the century - this is low-hanging fruit. I've reported identical issues to <a href="https://shkspr.mobi/blog/2018/11/responsible-disclosure-cloudflare-more-interested-in-tracking-than-security/">CloudFlare</a>, <a href="https://shkspr.mobi/blog/2018/04/udacity-bug-bounty-or-stop-tracking-every-link-in-your-emails/">Udacity</a>, and several others.</p>

<p><strong>PLEASE STOP TRACKING EVERY LINK IN YOUR EMAILS!</strong></p>

<p>Or, if you really have to - make sure your tracking server supports https, is controlled by you, and doesn't have a daft domain name.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2019/01/e100-bug-bounty-from-intigriti-please-stop-tracking-your-confirmation-emails/#timeline">Timeline</a></h2>

<ul>
<li>2018-12-31 - responsibly disclosed.</li>
<li>A few hours later - confirmed fixed and bounty offered. Filled in my IBAN details.</li>
<li>2019-01-02 - £90 deposited in my account.</li>
<li>2019-01-04 - permission given to publish.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=30965&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/01/e100-bug-bounty-from-intigriti-please-stop-tracking-your-confirmation-emails/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Major sites running unauthenticated JavaScript on their payment pages]]></title>
		<link>https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/</link>
					<comments>https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 29 Nov 2018 12:39:41 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sri]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=30747</guid>

					<description><![CDATA[A few months ago, British Airways&#039; customers had their credit card details stolen.  How was this possible?  The best guess goes something like this:   BA had 3rd party JS on its payment page &#60;script src=&#34;https://example.com/whatever.js&#34;&#62;&#60;/script&#62; The 3rd party&#039;s site was hacked, and the JS was changed. BA&#039;s customers ran the script, which then harvested their credit card details as they were…]]></description>
										<content:encoded><![CDATA[<p>A few months ago, British Airways' customers had their credit card details stolen.  How was this possible?  The <a href="https://www.theregister.co.uk/2018/09/12/feedify_magecart_javascript_library_hacked/">best guess goes something like this</a>:</p>

<ol>
<li>BA had 3rd party JS on its payment page <br><code>&lt;script src="https://example.com/whatever.js"&gt;&lt;/script&gt;</code></li>
<li>The 3rd party's site was hacked, and the JS was changed.</li>
<li>BA's customers ran the script, which then harvested their credit card details as they were typed in.</li>
</ol>

<p>This should have been a wake-up call to the industry. Don't load unauthenticated code on your website - and especially not on your payments page.</p>

<p>If you absolutely have to load someone else's code, check to see if it has been altered.  This is done using <a href="https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity">SubResource Integrity</a> (SRI).</p>

<p>SRI tells the user's browser to check that the code hasn't been changed since the website was published. It looks like this:</p>

<pre><code class="language-html">&lt;script src="https://example.com/whatever.js"
        integrity="sha384-eP2mZH+CLyffr1fGYsgMUWJFzVwB9mkUplpx9Y2Y3egTeRlmzD9suNR+56UHKr7v" 
        crossorigin="anonymous"&gt;&lt;/script&gt;
</code></pre>

<p>If even a single bit of the code has changed since it was added to the page, the browser refuses to run it.</p>

<h2 id="who-isnt-using-this"><a href="https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#who-isnt-using-this">Who isn't using this</a></h2>

<h3 id="deliveroo"><a href="https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#deliveroo">Deliveroo</a></h3>

<p>Gig-economy food flingers add in code from <a href="https://cdnjs.com/">CDNJS</a>.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/deliveroo2-fs8.png" alt="HTML source for Deliveroo's payment page." width="758" height="374" class="aligncenter size-full wp-image-30748"></p>

<p>What's especially annoying about this, is that the CDNJS website has a "one-click copy" for SRI.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/cdnjs-fs8.png" alt="A drop-down menu with a highlight on &quot;Click to copy SRI&quot;." width="669" height="286" class="aligncenter size-full wp-image-30750"></p>

<h3 id="spotify"><a href="https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#spotify">Spotify</a></h3>

<p>Their payment page loads code from <code>live.adyen.com</code>
<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/Spotify-fs8.png" alt="HTML code from Spotify." width="769" height="162" class="aligncenter size-full wp-image-30751">
Adyen are their payment provider - so if they get hacked, credit card details are going to get compromised. But how much easier is it for an attacker to subtly change their JavaScript than to hack their entire mainframe?</p>

<h3 id="the-guardian"><a href="https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#the-guardian">The Guardian</a></h3>

<p>Despite being a tofu-knitting member of the bourgeoisie, I am yet to subscribe to teh Gruan.  If I did, I'd risk their affiliate tracker going rogue and stealing my organic credit card details.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/Guardian-fs8.png" alt="HTML source of the Guardian's website." width="649" height="127" class="aligncenter size-full wp-image-30756">
Bonus points for leaving a handy pointer to their internal Google docs...</p>

<h3 id="fanduel"><a href="https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#fanduel">Fanduel</a></h3>

<p>Sports betting site running unverified scripts from external sources.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/Fanduel-fs8.png" alt="HTML source for FanDuel." width="639" height="206" class="aligncenter size-full wp-image-30752">
They've also got external style-sheets</p>

<pre><code class="language-html">&lt;link rel="stylesheet" href="//d2avoc1xjbdrch.cloudfront.net/6.26.0/styles/desktop.css"&gt;
</code></pre>

<p>If an attacker can change the JS or CSS, they could compromise users of the site.</p>

<h3 id="easyjet"><a href="https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#easyjet">EasyJet</a></h3>

<p>I feel a bit conflicted about this one.  You can <em>probably</em> trust Google not to get hacked. <a href="https://thehackernews.com/2018/10/google-plus-shutdown.html">Right</a>?
<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/EasyJet-fs8.png" alt="HTML source of EasyJet's website." width="556" height="94" class="aligncenter size-full wp-image-30758"></p>

<p>Google supports SRI - but <a href="https://developers.google.com/speed/libraries/#jquery">doesn't mention it anywhere on their Hosted Libraries site</a>.</p>

<h3 id="british-airways"><a href="https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#british-airways">British Airways!</a></h3>

<p>Yup! They've not learned their lesson. <strong>Three</strong> pieces of unverified code running on the payment page.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/BA-fs8.png" alt="HTML code." width="824" height="204" class="aligncenter size-full wp-image-30800"></p>

<ul>
<li>Maxymiser is an A/B testing and analytics tool. Run by Oracle now. Most ad-blockers prevent it loading.</li>
<li>Google's reCAPTCHA. If that gets hacked, half the planet is compromised.</li>
<li><a href="https://www.globalsign.com/en/ssl/secure-site-seal/">SiteSeal</a> "proves" your site is secure by displaying a image. No, I don't understand that either.</li>
</ul>

<p></p><div style="width: 610px" class="wp-caption alignnone"><img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/seal_125-50_blue.png" alt="An SSL badge which proves nothing." width="125" height="50" class="aligncenter size-full wp-image-54278"><p class="wp-caption-text">This does not make the site magically secure.</p></div><p></p>

<p>All three of them are highly trustworthy. But if you're BA and you've already been bitten by bad security practices, doesn't it make sense to go full "belt-and-braces"?</p>

<h3 id="and-more"><a href="https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#and-more">...and more?</a></h3>

<p>These are just a small sample of the sites I've found. <a href="https://www.w3.org/TR/SRI/">SRI has been available for two years</a> and it still isn't being used enough.</p>

<h2 id="responsible-disclosure"><a href="https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/#responsible-disclosure">Responsible Disclosure</a></h2>

<p>I've reported this issue to a few sites by using responsible-disclosure aggregator <a href="https://hackerone.com/edent">HackerOne</a>.</p>

<p>Typically, my warning goes unheeded with a response like:</p>

<blockquote><p>Based on your initial description, there do not appear to be any security implications as a direct result of this behavior, this is an Informational issue at best, unless you can prove those third-party domains can be compromised in any way.</p></blockquote>

<p>or</p>

<blockquote><p>This appears to be more of a risk acceptance rather than a vulnerability. Although there is no PoC for this report, I will forward the information to the customer and see where to go from there.</p></blockquote>

<p>That's fair enough. I'm not expecting a huge payout and it is <em>only</em> an informative report; I can't prove that the external sites are vulnerable.  But there really ought to be a concerted effort to make payment sites as secure as possible.</p>

<p>This needs to be taken seriously. If you're handling users' details, you need to take every possible step to keep them secure.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=30747&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2018/11/major-sites-running-unauthenticated-javascript-on-their-payment-pages/feed/</wfw:commentRss>
			<slash:comments>12</slash:comments>
		
		
			</item>
	</channel>
</rss>
