<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/">
  <channel>
    <title>GUYA.NET</title>
    <link>https://guya.net</link>
    <description>Web security, JavaScript, and browser technology</description>
    <language>en</language>
    <lastBuildDate>Tue, 01 Nov 2016 00:00:00 GMT</lastBuildDate>
    <atom:link href="https://guya.net/rss/" rel="self" type="application/rss+xml"/>
    
    <item>
      <title><![CDATA[Tracking an Anonymous Peer Using WebRTC]]></title>
      <link>https://guya.net/2016/11/01/tracking-an-anonymous-peer-using-webrtc/</link>
      <guid isPermaLink="false">d4836ba2-6318-4269-b8b7-749884e9b6f4</guid>
      <pubDate>Tue, 01 Nov 2016 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[It's was about a year ago, someone in my rather big office (100~200 people) started to send annoying emails with cheesy phrases and images regarding the new…]]></description>
      <content:encoded><![CDATA[<p>It&#39;s was about a year ago, someone in my rather big office (100~200 people) started to send annoying emails with cheesy phrases and images regarding the new year resolutions.
These emails were sent from a made-up gmail account.</p>
<p>I&#39;ve realized that this will be a good opportunity to test the privacy issues of WebRTC and to find out who is this despicable person.</p>
<p>As you probably already know - WebRTC has this flaw/feature which allows a website to reveal your local IP address. <a href="https://diafygi.github.io/webrtc-ips/">Check it out.</a></p>
<p>So I made up this quick website with some new-year resolutions images I found on the first page result in Google. Used one of my best domain name with valid HTTPS.
Waited till that horrible person will send a &quot;funny&quot; message which is intended directly at me and replied:
&quot;LoL that was soooo funny, checkout this <a href="https://localip.herokuapp.com/">website</a> with the funniest new year resolutions&quot;. Now, if you&#39;ll go to this website (now with different domain) it&#39;ll send me an email titled &quot;The fish is in the net&quot; with your local IP address.</p>
<p>That doesn&#39;t mean much for you, but for that person it means I&#39;ll know who he is.</p>
<p>Everything was setup perfectly, I set down and waited for that email. Yet... nothing happened there was no click. That was a bummer but I didn&#39;t give up.
As in all successful physhing attacks - it&#39;s important who the message is coming from. So I made up a new message with a new link and asked someone with more prestige in the company, AKA a manager, to send it. And it worked!!!</p>
<p>I now had the precious local IP.</p>
<p>Getting the hostname from this IP is easy using <code>nmap --system-dns &lt;ip&gt;</code> or <code>nslookup &lt;ip&gt;</code> on Windows.
Since it&#39;s a big company the hostname is some kind of generated serial which doesn&#39;t give much information.
Luckily searching the Active Directory is too damn easy.</p>
<p><strong>Busted!!!</strong>
<img src="/images/posts/2016/11/webrtc_active_directory-1.PNG" alt=""></p>
<p>So we found him... that despicible person... finally... actually he&#39;s a nice dude ;)</p>
<p>The website is still here <a href="https://localip.herokuapp.com/">https://localip.herokuapp.com/</a>
Code is here <a href="https://github.com/guy-a/localip">https://github.com/guy-a/localip</a></p>
]]></content:encoded>
      <media:content url="https://guya.net/images/posts/2016/11/02.jpg" medium="image"/>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[Security]]></category>
      <category><![CDATA[webrtc]]></category>
      <category><![CDATA[privacy]]></category>
    </item>
    <item>
      <title><![CDATA[Leeching Streaming Videos With Node.js X-ray and FFmpeg]]></title>
      <link>https://guya.net/2016/08/21/leeching-streaming-videos-with-node-js-x-ray-and-ffmpeg/</link>
      <guid isPermaLink="false">283f72ed-382e-49b5-b42f-0d9629d3cc07</guid>
      <pubDate>Sun, 21 Aug 2016 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[In the last post I've mentioned the The 6th Annual International Cybersecurity Conference and the great videos it have. But, these videos are streamed with…]]></description>
      <content:encoded><![CDATA[<p>In the <a href="/2016/08/19/great-security-videos-you-probably-havent-seen-2/">last post</a> I&#39;ve mentioned the <a href="http://video.tau.ac.il/events/index.php?option=com_k2&view=itemlist&task=category&id=1183:the-6th-annual-international-cybersecurity-conference&Itemid=559">The 6th Annual International Cybersecurity Conference</a> and the great videos it have. But, these videos are streamed with RTSP into a Flash video player (JW-Player) and it&#39;s not fun to watch it this way. It&#39;ll be much better to view it offline in your favorite player. (VLC can play these rtsp directly but does it badly)</p>
<p><a href="https://github.com/guy-a/cyberweek2016">I made a simple node.js script</a> that scraps the page using <a href="https://github.com/lapwinglabs/x-ray">x-ray</a> and download the videos using <a href="https://ffmpeg.org/">ffmpeg</a>.</p>
<p><a href="https://github.com/lapwinglabs/x-ray">X-ray</a> is a powerful and easy to use web-scrapper for node.js.
<a href="https://ffmpeg.org/">FFMPEG</a> is the swiss army knife for everything video.</p>
<p>Here x-ray is used to get all the videos for a certain subject (every page holds videos of 1 subject)</p>
<pre><code>xray(link, &#39;.itemContainer.itemContainerLast h3 &gt; a&#39;,
        [{
            file: &#39;&#39;,
            src: &#39;@href&#39;
        }]
    )
</code></pre>
<p>Than I use the Node&#39;s child-process to spawn the ffmpeg with the right params. Mainly the video source url and the name to save it with:
<code>var cmd = &#39;ffmpeg -i {url} -acodec copy -vcodec copy &quot;{file}&quot;&#39;;</code></p>
<p>I&#39;m sure anyone will enjoy these security videos ;) But, this script can also serve as an example for leeching other types of streaming videos.</p>
<p>Script is in here:
<a href="https://github.com/guy-a/cyberweek2016">https://github.com/guy-a/cyberweek2016</a></p>
]]></content:encoded>

    </item>
    <item>
      <title><![CDATA[Great Security Videos You Probably Have Not Seen]]></title>
      <link>https://guya.net/2016/08/19/great-security-videos-you-probably-havent-seen-2/</link>
      <guid isPermaLink="false">9ebfbd03-4882-4e80-b98e-0fba1e25ae2e</guid>
      <pubDate>Fri, 19 Aug 2016 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[Exactly 2 months ago The 6th Annual International Cybersecurity Conference was held in Tel-Aviv. It was packed with presentations from leading security…]]></description>
      <content:encoded><![CDATA[<p>Exactly 2 months ago <strong><a href="http://video.tau.ac.il/events/index.php?option=com_k2&view=itemlist&task=category&id=1183:the-6th-annual-international-cybersecurity-conference&Itemid=559">The 6th Annual International Cybersecurity Conference</a></strong> was held in Tel-Aviv. It was packed with presentations from leading security researchers. Luckily all of these presentations are in English and available <a href="http://video.tau.ac.il/events/index.php?option=com_k2&view=itemlist&task=category&id=1183:the-6th-annual-international-cybersecurity-conference&Itemid=559">here</a>.</p>
]]></content:encoded>
      <media:content url="https://guya.net/images/posts/2016/08/Screen-Shot-2016-08-19-at-3-20-37-AM.png" medium="image"/>
      <category><![CDATA[Security]]></category>
      <category><![CDATA[Cyber Security]]></category>
      <category><![CDATA[Encryption]]></category>
    </item>
    <item>
      <title><![CDATA[Simple Server Polling in AngularJS Done Right]]></title>
      <link>https://guya.net/2016/08/08/simple-server-polling-in-angularjs-done-right/</link>
      <guid isPermaLink="false">3fd9d645-ece5-4617-a11b-0db5209aed1d</guid>
      <pubDate>Mon, 08 Aug 2016 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[Plunker is here. Syncing with the server these days is much easier with libraries like socket.io and alike. But, even though there is no need to mess with…]]></description>
      <content:encoded><![CDATA[<p>Plunker is [here](<a href="http://plnkr.co/edit/Io7xt2?p=preview">http://plnkr.co/edit/Io7xt2?p=preview</a>&quot; target=&quot;_blank).</p>
<p>Syncing with the server these days is much easier with libraries like socket.io and alike. But, even though there is no need to mess with insane black magic like Comet or Flash-Remoting...
<strong>- Sometimes all you need is just a simple polling.</strong></p>
<p>In this example we&#39;ll see how to implement recursive polling to poll the server for updates. The example is in AngularJS 1.5.x ES5 but the approach is valid for any framework and/or plain javascript.</p>
<p>The key to recursive-polling, and what make it different from just polling, is that we wait for the response before we initiate the next interval. This means that even if we poll the server very fast and the server is slow to response we avoid issues like race-condition and overloading the server.</p>
<p>[Live demo](<a href="http://plnkr.co/edit/Io7xt2?p=preview">http://plnkr.co/edit/Io7xt2?p=preview</a>&quot; target=&quot;_blank)</p>
<pre><code>var app = angular.module(&#39;plunker&#39;, [&#39;ngAnimate&#39;]);

app.controller(&#39;MainCtrl&#39;, function($scope, $http, $timeout) {

  var loadTime = 1000, //Load the data every second
    errorCount = 0, //Counter for the server errors
    loadPromise; //Pointer to the promise created by the Angular $timout service

  var getData = function() {
    $http.get(&#39;http://httpbin.org/delay/1?now=&#39; + Date.now())

    .then(function(res) {
      $scope.data = res.data.args;

      errorCount = 0;
      nextLoad();
    })

    .catch(function(res) {
      $scope.data = &#39;Server error&#39;;
      nextLoad(++errorCount * 2 * loadTime);
    });
  };

  var cancelNextLoad = function() {
    $timeout.cancel(loadPromise);
  };

  var nextLoad = function(mill) {
    mill = mill || loadTime;
    
    //Always make sure the last timeout is cleared before starting a new one
    cancelNextLoad();
    loadPromise = $timeout(getData, mill);
  };


  //Start polling the data from the server
  getData();


  //Always clear the timeout when the view is destroyed, otherwise it will keep polling and leak memory
  $scope.$on(&#39;$destroy&#39;, function() {
    cancelNextLoad();
  });

  $scope.data = &#39;Loading...&#39;;
});
</code></pre>
<p>In the example we load some dummy data from [<a href="http://httpbin.org%5D">http://httpbin.org]</a>(<a href="http://httpbin.org">http://httpbin.org</a>&quot; target=&quot;blank). We try to load it every 1000 milliseconds   (1 second) but the server takes more than a second to respond. Using recursive polling saves us from some issues in this case.</p>
<p>When the server has an error (line 19) we generally wouldn&#39;t want to just stop the polling all together. It might be a just a temporary hiccup. We increase the timeout to the next load based on the count of response errors. <code>nextLoad(++errorCount * 2 * loadTime);</code>
So if the server issues are more serious we won&#39;t be hammering it. Eventually when it&#39;s fixed we&#39;ll go back to normal polling. <code>errorCount = 0;</code></p>
<p>You can put this mechanism into a centralized service but always control it from the controllers. Start polling when the view is initialized and stop when the view is destroyed.</p>
<pre><code>$scope.$on(&#39;$destroy&#39;, function() {
    cancelNextLoad();
  });
</code></pre>
<p>This way every view will be polling the server when it needs to and only then.</p>
]]></content:encoded>
      <category><![CDATA[AngularJS]]></category>
      <category><![CDATA[HTTP]]></category>
    </item>
    <item>
      <title><![CDATA[Webcam spying with Chrome]]></title>
      <link>https://guya.net/2015/08/28/webcam-spying-with-chrome/</link>
      <guid isPermaLink="false">f0bf4672-3b57-4297-aedf-394bf98257f3</guid>
      <pubDate>Fri, 28 Aug 2015 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[tl;dr; Browsers doesn’t handle webcam permissions well enough. Users should be extremely wary about what’s going on in their browser. From a list of 30 bugs…]]></description>
      <content:encoded><![CDATA[<h5>tl;dr;</h5>
<p>Browsers doesn’t handle webcam permissions well enough. Users should be extremely wary about what’s going on in their browser. From a list of 30 bugs submitted to google regarding that issue, most have been fixed, but some are still alive.<br> The most obvious bug which is still live and kicking in all of the browsers is PopJacking which is  – clickjacking using popups. This flaw can be abused to trick users into allowing malicious access to their webcam, for example.</p>
<p><a href="https://www.youtube.com/watch?v=-HJ9OBOv5Tw">Video of the 5 POCs is here</a></p>
<h5>Full text</h5>
<p>More than a year ago (6.6.2014) I submitted a list of ~30 security bugs regarding the way Chrome handle WebCam access . These bugs were also regarding the way Chrome handled almost all other kind of special permissions. From webcam/mic access to location.</p>
<p>Some of these were related to bugs and bad implementation of popups and abusing it in relation to webcam access.</p>
<p>Yesterday Google made my bug report public so I figured it’s about time I’d share my findings (all of these links and info were private until now):</p>
<p><a href="/2014/06/01/cj-sp-pb/">This is the original post I privately sent to Google</a>, it has the info</p>
<p><a href="https://www.youtube.com/watch?v=-HJ9OBOv5Tw">A video with 5 different POCs</a></p>
<p><a href="http://guya.net/security/permission_bar/">The POC and source code</a></p>
<p><a href="https://bugs.chromium.org/p/chromium/issues/detail?id=382081">The bug thread on google</a></p>
<p>While Google fixed most of these bugs some of these are still unfixed. But, even these who were fixed are not fixed good enough and are still vulnerable to PopJacking. Meaning, an attacker can still trick a user to allow webcam access – pretty easily.<br> PopJacking is merely clickjacking using a popup – <strong>probably the most overlooked flaw in browsers since clickjacking.</strong></p>
<p>Another side note here is about Google behaviour regarding this bug:<br> At first they seemed thrilled about it, but than it took them almost a year to fix most of it. Only to eventually declare it as “Wontfix”.<br> One of the bug I submitted was opened as a <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=489470">different private bug </a> but, anyone can easily figure which one it is from the conversation in the <a href="https://bugs.chromium.org/p/chromium/issues/detail?id=382081">currently opened bug thread</a>.</p>
<p>From the way Google dealt with this bug and some other security bugs myself and others have submitted, it’s clear that Google will greatly prefer to dismiss security bugs as “Wontfix” or “not a bug”. Anything other the <a href="https://en.wikipedia.org/wiki/Arbitrary_code_execution">RCE</a> or <a href="https://en.wikipedia.org/wiki/Cross-site_scripting">XSS</a> will have difficulty to fit in.<br> I’m pretty sure that something like Clickjacking would have been immediately dismissed, only to realise afterwards the mistake that has been done.<br> More on that with some examples in a latter post.</p>
<h5>So are we safe now?</h5>
<p>– No.<br> It’s still too damn easy to trick a user to allow something like webcam access, and that’s valid to other browsers not just Chrome. Be extremely wary of where you click and what’s going on in your browser at all times. The indication that a website is accessing your camera is not clear enough – you gotta be wary. (FireFox indication is much better, btw)</p>
<h5>Popups are evil</h5>
<p>Beside the specific security bugs in popups and the way it can be exploited for PopJacking.<br> I would argue that there is not even <strong>one</strong> legitimate use of browser popups in term of user-experience.</p>
<p>Browser vendors should just <strong>kill popups all together</strong>, forever.</p>
]]></content:encoded>
      <category><![CDATA[FireFox]]></category>
      <category><![CDATA[Google Chrome]]></category>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[Javascript]]></category>
      <category><![CDATA[Security]]></category>
    </item>
    <item>
      <title><![CDATA[The never ending browser sessions]]></title>
      <link>https://guya.net/2015/08/25/the-never-ending-browser-sessions/</link>
      <guid isPermaLink="false">bad8f4ac-d8bc-4fd8-bf48-34ccf2dd2dd5</guid>
      <pubDate>Tue, 25 Aug 2015 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[tl;dr; The concept of session memory is not valid anymore in today’s browsers. Even sessionStorage is not cleared after closing the tab. It’s easily revived…]]></description>
      <content:encoded><![CDATA[<h5><strong>tl;dr;</strong></h5>
<p>The concept of session memory is not valid anymore in today’s browsers. Even sessionStorage is <span style="text-decoration: underline;">not</span> cleared after closing the tab. It’s easily revived when clicking on “Reopen closed tab”. That might seem as a bug – not if you look at the <a href="https://w3c.github.io/webstorage/#the-sessionstorage-attribute">spec</a> which is rather permissive, maybe too much.</p>
<h5><strong>So what’s the problem really?</strong></h5>
<p>Imagine you login to your bank website from a trusted 3rd party computer.<br> When you’re done, you simply click the X button to close the site assuming that you’re session will be done. This used to be true for many years, since it was common for critical websites like banks to store the authentication token in a session-cookie.<br> And session cookies, as the name implies are gone when the session is gone. The problem is that with tab browsing, and browsers running in the background that session might end long time after you clicked on the X.<br> This means that most of the time, anyone accessing that computer after you, will be able to continue where you left – logged in as you.</p>
<h5><strong>sessionStorage to the rescue? – not really</strong></h5>
<p>So if session-cookies are not good enough, what about that shiny sessionStorage?<br> It’s isolated per tab and cleared when that tab is closed.<br> It must be good – you click the X and it’s gone.<br> Well almost…<br> In Chrome and Firefox the session storage is easily revived with right click and “Reopen closed tab” and “Undo close tab” respectively.</p>
<p>This strange and unexpected behavior of the sessionStorage is still complying with the <a href="https://w3c.github.io/webstorage/#the-sessionstorage-attribute">spec </a>which is somewhat over permissive:<br><span style="color: #008000;"><strong>“The lifetime of a browsing context can be unrelated to the lifetime of the actual user agent process itself, as the user agent may support resuming sessions after a restart.”</strong></span></p>
<p>We can argue whether this is a bug or not, but it’s definitely a bad feature and should be mitigated. We should have real <strong>session</strong> storage which we can trust to be cleared when we click on the “X”. Without unreliable tricks like onbeforeunload and alike.</p>
<p><a href="http://guya.net/security/browser_session/sessionStorage.html">Here’s a demo</a>, close the tab and reopen it with “Reopen closed tab”  – the sessionStorage will be revived.</p>
<p>While Chrome and FireFox are acting badly and revive the sessionStorage, Safari and IE11 don’t revive it and are the safer browsers in that regard.</p>
<h5><strong>Bottom line</strong></h5>
<p>As a user, always always logout manually, never rely on just closing the tab or the browser.</p>
<p>As a developer, the only way to create real sessions that are gone when the user closes the tab is to keep anything critical in the memory and only in the memory. I’ve written more about it with examples <a href="/2015/06/12/sharing-sessionstorage-between-tabs-for-secure-multi-tab-authentication/">in here</a>.</p>
]]></content:encoded>
      <category><![CDATA[FireFox]]></category>
      <category><![CDATA[Google Chrome]]></category>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[Javascript]]></category>
      <category><![CDATA[Security]]></category>
    </item>
    <item>
      <title><![CDATA[Sharing sessionStorage between tabs for secure multi-tab authentication]]></title>
      <link>https://guya.net/2015/06/12/sharing-sessionstorage-between-tabs-for-secure-multi-tab-authentication/</link>
      <guid isPermaLink="false">3704d3e8-0a97-4d38-aacc-d5f1ad981214</guid>
      <pubDate>Fri, 12 Jun 2015 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[tl;dr; I’ve created mechanism that will leverage the secure nature of the browser sessionStorage or memoryStorage for authentication and will still allow the…]]></description>
      <content:encoded><![CDATA[<p><strong>tl;dr;</strong><br> I’ve created mechanism that will leverage the secure nature of the browser sessionStorage  or memoryStorage for authentication and will still allow the user to open multiple tabs without having to re-login every time.</p>
<p><strong>A refresher about relevant browser storage mechanism</strong></p>
<ol>
<li><strong>localStorage</strong> ~5MB, saved for infinity or until the user manually deletes it.</li>
<li><strong>sessionStorage</strong> ~5MB, saved for the life of the current tab</li>
<li><strong>cookie</strong> ~4KB, can be saved up to infinity</li>
<li><strong>session cookie</strong> ~4KB, deleted when the user closes the browser (not always deleted)</li>
</ol>
<p> </p>
<p><strong>Safe session-token caching</strong></p>
<p>When dealing with critical platforms it is expected that the session is ended when the user closes the tab.<br> In order to support that, one should never use cookies to store any sensitive data like authentication tokens. Even session-cookies will not suffice since it’ll continue to live after closing the tab and even after completely <a href="http://stackoverflow.com/questions/22847629/chrome-not-clearing-session-cookies-on-close-exit">closing the browser.</a><br> (We should anyway consider to not use cookies since these have other problems that are need to be dealt with, i.e. CSRF.)</p>
<p>This leaves us with saving the token in the memory or in the sessionStorage. The benefit of the sessionStorage is that it’ll persist across different pages and browser refreshes. Hence the <span style="line-height: 1.5;">user may navigate to different pages and/or refresh the page and still remain logged-in.</span></p>
<p>Good. We save the token in the sessionStorage, send it as an header with every request to the server in order to authenticate the user. When the user closes the tab – it’s gone.</p>
<p><strong>But what about multiple tabs?</strong></p>
<p>It is pretty common even in single page application that the user will want to use multiple tabs. The afordmentioned security enahncment of saving the token in the sessionStorage will create some bad UX in the form of requesting the user to re-login with every tab he opens. Right, sessionStorage is not shared across tabs.</p>
<p><strong>Share sessionStorage between tabs using localStorage events</strong></p>
<p>The way I solved it is by using localStorage events.<br> When a user opens a new tab, we first ask any other tab that is opened if he already have the sessionStorage for us. If any other tab is opened it’ll send us the sessionStorage through localStorage event, we’ll duplicate that into the sessionStorage.<br> The sessionStorage data will not stay in the localStorage, not even for 1 millisecond as it being deleted in the same call. The data is shared through the event payload and not the localStorage itself.</p>
<p><a href="http://guya.net/security/browser_session/sessionStorage.html">Demo is here</a></p>
<p>Click to “Set the sessionStorage” than open multiple tabs to see the sessionStorage is shared.</p>
<p><strong>Almost perfect</strong></p>
<p>We now have what is probably the most secure way to cache session tokens in the browser and without compromising the multiple tabs user-experience. In this way when the user closes the tab he knows for sure that the session is gone. Or is it?!</p>
<p>Both Chrome and Firefox will revive the sessionStorage when the user selects “Reopen closed tab” and “Undo close tab” respectively.<br><span style="text-decoration: underline;">Damn it!</span></p>
<p>Safari does it right and don’t restore the sessionStorage (tested only with these 3 browsers)</p>
<p>For the user the only way to be completely sure that the sessionStorage is really gone is to reopen the same website directly and without the “reopen closed tab” feature.<br> That until Chrome and Firefox will resolve this bug. (my hunch tells me that they will call it a “<a href="http://dev.w3.org/html5/webstorage/#the-sessionstorage-attribute">feature</a>“)</p>
<p>Even with this bug, using the sessionStorage is still safer than session-cookie or any other alternative.<span style="text-decoration: underline;"> If we’ll want to make it perfect we’ll need to implement the same mechanism using memory instead of sessionStorage.</span> (onbeforeunload and alike can work too, but won’t be as reliable and will clear also on refresh. window.name is almost good , but it’s too old and has no cross-domain protection)</p>
<p><strong>Sharing memoryStorage between tabs for secure multi-tab authentication</strong></p>
<p>So… this will be the only real safe way to keep an authentication token in a browser session and will allow the user to open multiple tabs without having to re-login</p>
<p><span style="text-decoration: underline;">Close the tab and the session is gone – for real this time.</span></p>
<p>The downsides is that when having only one tab, a browser refresh will force the user to re-login. Security comes with a price, obviously this is not recommended for any type of system.</p>
<p><a href="http://guya.net/security/browser_session/memoryStorage.html">Demo is here</a></p>
<p>Set the memoryStorage and open multiple tabs to see it shared between them. Close all related tabs and the token is gone forever (memoryStorage is just a javascript object)</p>
<p>**<br> P.S.** Needless to say that session management and expiration should be handled on the server side as well.</p>
]]></content:encoded>
      <category><![CDATA[Javascript]]></category>
      <category><![CDATA[Security]]></category>
    </item>
    <item>
      <title><![CDATA[Leeching an FTP with Python]]></title>
      <link>https://guya.net/2015/05/03/leeching-an-ftp-with-python/</link>
      <guid isPermaLink="false">b2c8d44a-2cfa-43e3-9793-334aba01b5a8</guid>
      <pubDate>Sun, 03 May 2015 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[TL;DR; This script will leech all the files from a folder in an FTP. It’s especially appropriate for dealing with enormous amount of files – hundreds of…]]></description>
      <content:encoded><![CDATA[<p><strong>TL;DR;</strong></p>
<p><a href="https://gist.github.com/guy-a/6bdc8f530f1b7f392699">This script</a> will leech all the files from a folder in an FTP. It’s especially appropriate for dealing with enormous amount of files – hundreds of thousands or even millions.</p>
<p><strong>My FTP issues</strong></p>
<p>I have set up an IP security camera to save an image to my shared hosted FTP whenever it recognised any movement. The camera was cheap, old and not that accurate, so it saved lost of photos – more than half a million.</p>
<p>I needed to delete most of these photos but not all of it. Some of the photos captured interesting moments and I wanted to save these. I couldn’t just delete the folder, I had to download and check every photo. Checking the photos wasn’t as difficult as it might sound. Most of it were either almost identical or completely empty (zero bytes). Downloading it was the problem.</p>
<p><strong>The 10000 limit</strong><br> If you’re using a shared hosting it’s likely that your FTP server is limited. By default most shared FTP servers are probably running PureFTP and have a default limit of 10,000 files. This means you can only list 10,000 files and you will not even know how much files are in there.<br> You can probably ask your hosting provider to increase the “ftp recursion limit”, but I’m not sure they will be willing to up high enough.<br> Anyway, it’ll be cumbersome to deal with so many files and most FTP clients will freeze even trying to list less the 10k. I’ve tried a few on different OSs, eventually <a href="https://filezilla-project.org/download.php?type=client" title="FillZilla FTP client">FileZilla</a> for Windows seemed to be the best. But still, dealing with so many files was an extremely tedious process. And it’s even worse since I can’t even tell how many files are in that folder and how many times I will have to repeat this tedious process:</p>
<ol>
<li>Connect to the server and list the folder – 10 minutes for listing 10,000 files</li>
<li>Even TranZilla failed to list the files from time to time – try again</li>
<li>Move all the listed files to my local folder – ~1-2 hours for very small files</li>
<li>If it fails for some reason – Repeat all steps</li>
<li>If it succeeded – Repeat  all steps</li>
</ol>
<p>Overall if I wanted to do it manually I would have to repeat that annoying process for hundreds of times (including failures).</p>
<p><strong>Python to the rescue</strong></p>
<p>Obviously python is an amazing scripting language (and beyond). Writing a python script to leech an FTP is very easy and straight forward to create. I was able to PoC with just a few lines of code after looking at the <a href="https://docs.python.org/2/library/ftplib.html">ftplib docs</a>.</p>
<p>Eventually I added a few extra features like logging and retries. But not too much, it was supposed to be quick and save me time – and it definitely did 🙂</p>
<p>In order to make even more robust one would consider adding stuff like full tree traversal (leech the whole FTP and not just one folder),  multithreading to download from multiple connection simultaneously, and more. All were beyond the scope of this script and would be relatively easy to add in Python.</p>
<p><strong>The Supervisor</strong></p>
<p>While the leacher.py script is supposed to run continuously until it leeches the whole folder, it might still break in some cases. And on the Mac the machine goes to sleep and stops the script.</p>
<p>That’s why I added this <a href="https://gist.github.com/guy-a/6bdc8f530f1b7f392699#file-supervisor-py">supervisor.py</a> script which runs the leacher.py again if it breaks and also prevents the system from sleeping on the Mac.</p>
<p><strong>How to</strong></p>
<p><a href="https://gist.github.com/guy-a/6bdc8f530f1b7f392699">Download both leacher.py and supervisor.py from here</a>. Edit the params on the bottom of  leacher.py with your FTP info.</p>
<p>Run like this: <em>python supervisor.py leacher.py</em></p>
<p>Watch it leech. Check leacher.log for more verbose info.</p>
<p>**Summary<br>**</p>
<p>Overall the leacher.py script processed about half a million files and saved me a lot of time and annoyance.</p>
<p><img src="/images/posts/2015/05/leacher_log-1024x242.png" alt="leacher_log"></p>
<p>Python is awesome!</p>
]]></content:encoded>
      <media:content url="https://guya.net/images/posts/2015/05/leacher_log-1024x242.png" medium="image"/>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Security Cameras]]></category>
    </item>
    <item>
      <title><![CDATA[How to know when Chrome console is open]]></title>
      <link>https://guya.net/2014/06/20/how-to-know-when-chrome-console-is-open/</link>
      <guid isPermaLink="false">252b6abd-9387-4c05-8341-cec068af8009</guid>
      <pubDate>Fri, 20 Jun 2014 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[tl;dr; Although it’s not supposed to be supported – it’s possible to know whether the Chrome console is opened or not. Check it out. Reddit discussion. … Ever…]]></description>
      <content:encoded><![CDATA[<p><strong>tl;dr;</strong></p>
<p>Although it’s not supposed to be supported – it’s possible to know whether the Chrome console is opened or not.<br><a href="http://guya.net/chrome/dev_tools/" title="Chrome Developer Tools State">Check it out</a>.</p>
<p><a href="http://www.reddit.com/r/webdev/comments/28pqqs/how_to_know_when_chrome_console_is_open/" title="Ressit.com | How to know when Chrome console is open">Reddit discussion.</a></p>
<p>…<br> Ever wondered if it’s possible to tell whether the browser’s Development-Tools are opened or not. Apparently it’s not possible in Chrome. And that’s a good thing, it’s no website business to know when I inspect their code.</p>
<p>The thing is… it is possible to tell.</p>
<p>When you run console commands it runs slower when the console is opened. That’s it. You simply run console.log and console.clear a few times and if it’s slower – than the console is open.</p>
<p>With this hack you can find out pretty reliably when the console is open and when it is closed.</p>
<p>Frankly, I don’t see how this can be mitigated without harming the performance of the browser. When the console is opened it has to be slower. Hence this hack will most likely continue to work. And I assume it’ll work similarly on other browsers and with other consoles.</p>
<p>Although others will <a href="http://stackoverflow.com/questions/7798748/find-out-whether-chrome-console-is-open/" title="Find out whether Chrome console is open">claim</a> <a href="https://github.com/sindresorhus/devtools-detect" title="devtools-detect">otherwise</a>, the only way I see this hack being used legitimately is by geeks to impress their peers.<br> Other than that the only valid reasons that I can think of are malicious, but I’m not gonna tell you how 😉</p>
<p>**<br> Making it perfectly accurate**</p>
<p>In <a href="http://guya.net/chrome/dev_tools/" title="Chrome Developer Tools State">the demo</a> I’ve used a benchmark ratio of 1.6 to determine if the console is open or not. In a perfect implementation the ratio will be dynamic and will change between environments.</p>
<p>Currently if a user will open the page with the console already opened it’ll be detected only after the user will close it at least once.</p>
<p>It’ll be possible to create another independent benchmark to tell whether the console was opened when the page first loaded.</p>
<p><a href="http://guya.net/chrome/dev_tools/" title="Chrome Developer Tools State">Demo is here</a></p>
]]></content:encoded>
      <category><![CDATA[Google]]></category>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[Javascript]]></category>
    </item>
    <item>
      <title><![CDATA[cj-sp-pb]]></title>
      <link>https://guya.net/2014/06/01/cj-sp-pb/</link>
      <guid isPermaLink="false">7c525e5b-08e8-4e01-abdc-393b6fa9102a</guid>
      <pubDate>Sun, 01 Jun 2014 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[This post was made public on 27.8.2015. It was previously disclosed privately to Google. More info: Webcam spying with Chrome…]]></description>
      <content:encoded><![CDATA[<h3>This post was made public on 27.8.2015. It was previously disclosed privately to Google.</h3>
<p>More info: <a href="/2015/08/28/webcam-spying-with-chrome/">Webcam spying with Chrome</a></p>
<p>———————————————————————————————————–</p>
<p><strong>Clickjacking and Spoofing the Google Chrome Permission Bar is Too Damn Easy</strong></p>
<p><span style="line-height: 1.5;">The permission bar in Chrome suffers from a list of bugs that can be combined in multiple ways in order to trick the user into granting access to privacy related features without being aware of it.</span></p>
<p>In some situations the user might realize that something bad just happened, but until he’ll take action to reverse it – his privacy will already be compromised. I.e. his camera will photograph him, his location will be revealed, etc’.</p>
<p>**<br> The Demos:**</p>
<p>The demos are targeting for full access to the user’s camera and microphone, which are probably the most privacy related features.</p>
<ol>
<li><p>Wearing With Bars.<br> This demo abuses the fact that it’s possible to create a completely identical fake permission bar. And that the real bar can be altered to show merely “http://” instead of the full text.<br> The user will be tired will multiple fake bars until the real bar will appear.</p>
</li>
<li><p>Clickjacking using popups<br> Using 2 popups, and the way popups can be controlled, to clickjack the user to “Allow” the access to his camera. Even if the user will notice something phishy happened, and will take immediate action. It’s likely that his privacy was already compromised.<br> Clickjacking using popup (Popjacking) is extremely overlooked by all browsers.</p>
</li>
<li><p>Ubuntu.<br> Chrome renders the permission bars differently on every OS. This is an example of how to mess with it in Ubuntu. This demo is not fully functional, just shows an example of what can be done.<br> This flaw was mitigated in Chrome 35 thanx to the move to the Aura UI. But still, the permission bars renders and behave slightly different in Ubuntu.</p>
</li>
<li><p>None Closable Popup.<br> While this is more of a popup bug, it shows how this can be leverage to trick the user into allowing access to his camera.<br> The permission bar should not be functional under extreme condition. In this case the popup is almost frozen but the “Allow” button is still functional.</p>
</li>
<li><p>Over And Switch.<br> The most basic clickjacking attack on the permission bar.<br> The time it takes for the real bar to appear is probably the best time for clickjacking. (~130 milliseconds)</p>
</li>
</ol>
<p>These are just a few examples, these flaws can be combined in multiple other ways.</p>
<p>**<br> The List of Flaws:**</p>
<p>The list is not the most organised list; I basically threw-in most of the stuff I’ve stumbled into. The video is more explanatory.<br> Some of the items in the list are objectively bugs, and some may be considered as “by-design”. The by-design features or bugs should be mostly mitigated, though some of it is not harmful on its own.</p>
<ol>
<li>It’s easy to create a fake identical permission bar.</li>
<li>Permission bars act and render differently between OSs each with it’s own flaws.</li>
<li>Different types of permission-bars act and render differently.</li>
<li>It’s possible to tell when the permission bar is opened and when it’s closed – using the content height (resize event is fired).</li>
<li>Permission bars are not accessible. When enlarging fonts/zooming – permission-bars stay the same.</li>
<li>Use window focus and blur events to tell when the window is clickable.</li>
<li>The permission bar doesn’t have “the arrow” when opened in a popup (Mac only)</li>
<li>The permission bar can be made to reopen constantly requesting it multiple times. Requesting the same permission multiple times will show the bar multiple times when clicking on “x” (infinitely)</li>
<li>It’s easy to control the existent of the permission bar. Showing is obvious, hiding it using refresh and/or sub-domains.</li>
<li>When using a very long subdomain the message will be turned into merely “http://“ (MAC only). Other OSs bar are truncated differently.</li>
<li>Use staggering permission (multiple tries) – ask for camera if decline ask for microphone if declined ask for speech etc’.</li>
<li>Infinite tries using infinite subdomains (if the user “Deny” simply redirect to another subdomain and try again)</li>
<li>Resize the popup to show only the “Allow” button (Windows only)</li>
<li>Resizing the popup smaller and than bigger – the Permission Bar UI will not revert itself. It’s possible to leave only the Camera Icons and the “Allow” button (Ubuntu)</li>
<li>Inconsistency between OSs (MAC, Windows 7, Ubuntu)</li>
<li>Information popover (when clicking on the camera icon in the address bar) can be messed-up. Especially on windows when the popup is small. On the mac it can be slightly messed using a long subdomain / domain.</li>
<li>The “Allow” button can be clicked in a window, which is out of focus. Optimally the buttons in the permission bar will be functional only a second or so after the window received focus. This will mitigate clickjacking using popups.</li>
<li>After the user approve, the camera icon in the address bar is not clear enough, will be missed by most users. It should be clear “Website attacker.com is accessing your webcam and microphone!”</li>
<li>On the MAC refresh remove the bar on win7 the bar stays after refresh. It can be removed using a redirect to a different subdomain.</li>
<li>The red circle in the tab that indicates that the camera is being access is not existant in popups and hidden on a normal window when multiple tabs are opened.</li>
<li>On HTTPS permission is sticky even if the SSL certificate is not valid.</li>
<li>POPUPS flaws -&gt;</li>
<li>These are flaws on its own but are very helpful for jacking the permission bar.</li>
<li>Tell the mouse location also from the parent window.</li>
<li>Enforcing the size and position of the popup.</li>
<li>Popups can be made un-closable using a while loop, resizing or moving (works only after the Dev tools were opened at least once) (might be possible without opening the dev tools)(easy to trick the user to open the dev-tools by asking him to type the shortcut)</li>
<li>Clicking multiple times will open multiple popups- there is absolutely no delay. For example, tricking the user to click 10 times in a second during a game is pretty easy – it will result in 10 popups opening together (windows)</li>
<li>Popups opening can be delayed for second, it may look like the popup was not generated from the click. This goes well with the previous flaw – the user will click multiple times before noticing anything wrong and multiple popups are scatter all over the screen. (windows)</li>
<li>Using double-click its possible to calculate the different between 2 clicks and make the 2 popups open together. (windows)</li>
<li>You can still do popunders in Chrome, jquery-popunder is a good example. (the user will be able to notice it openeing though)</li>
<li>You can make a popup open on another screen, messing with moveTo. A small popup that is located on the far bottom of the other screen can go unnoticed.</li>
<li>A popup can be made to jump between screen, stucking (no close). This is very annoying and confusing to the user. The popup will become semi transparent and very difficult to interact with.</li>
</ol>
<p>**<br> Mitigation**</p>
<p>The fastest mitigation might be to simply add 1 second where the buttons are disabled. It should happen every time the permission bar is opened or when the window is gaining focus. That will mitigate all the clickjacking attacks, but it won’t help other kinds of attacks (tricking the user to click allow using fake bars, for example)</p>
<p>The current permission bar is subtle and elegant, it looks great. But, it doesn’t serve it’s purpose. The Permission-bar should be bigger, clearer and completely separated from the content area.</p>
<p>An extreme mitigation will also eliminate popups completely. Popups are bad for the user experience even when used legitimately.<br> Obviously, popups can be abused for clickjacking of any web content and not only the permission-bars – this is extremely overlooked by all browsers.</p>
<p>The best solution for this problem is probably OS level permissions that will stay the same across browsers and OSs.</p>
]]></content:encoded>

    </item>
    <item>
      <title><![CDATA[To Listen Without Consent – Abusing the HTML5 Speech]]></title>
      <link>https://guya.net/2014/04/07/to-listen-without-consent-abusing-the-html5-speech/</link>
      <guid isPermaLink="false">34f6bd69-7e78-4b0e-a5f3-cf862d11b534</guid>
      <pubDate>Mon, 07 Apr 2014 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[tl;dr; I found a bug in Google Chrome that allows an attacker to listen on the user speech without any consent from the user and without any indication. Even…]]></description>
      <content:encoded><![CDATA[<p><strong>tl;dr;</strong><br> I found a bug in Google Chrome that allows an attacker to listen on the user speech without any consent from the user and without any indication. Even blocking any access to the microphone under <strong>chrome://settings/content</strong> will not remedy this flaw.</p>
<p><a href="http://guya.net/security/speech/" title="POC: To Listen Without Consent - Abusing the HTML5 Speech">Try the live demo…</a> (Designed for Mac  though it will work similarly on any other OS)</p>
<p><a href="http://youtu.be/K1BbPLkN-hg" title="youtube - To Listen Without Consent -- Abusing the HTML5 Speech ">Watch the video…</a></p>
<iframe allowfullscreen="" frameborder="0" height="339" src="//www.youtube.com/embed/K1BbPLkN-hg" width="604"></iframe>

<p>**<br> The Sisyphus of computer science**</p>
<p>Speech recognition is like the Sisyphus of computer science. We came a long way but still haven’t reached the top of that hill. With all that crunching power and sophisticated algorithms, computers still can’t recognise some basic words and sentences, the kinds that the average human digest without breaking a sweat. This is still one of the areas that humans easily win over computers. Savor these wins, as it will not last much longer;)</p>
<p>One must appreciate Google for pushing this area forward and introducing speech recognition into the Chrome browser. The current level of speech support in Chrome allows us to create application and websites that are completely controlled form speech. It open vast possibilities – form general improved accessibility to email dictation and even games.</p>
<p>The current speech API is pretty decent. It works by sending the audio to Google’s servers and returns the recognised text. The fact that it sends the audio to Google has some benefits, but from applicative point of view it will always suffer from latency and will not work offline. I believe that the current speech support was introduced with Chrome 25. From Chrome 33 one can also use Speech Synthesis API. – Amazing!</p>
<p>But…<br> Before this fine API we currently have, Google experimented with an earlier version of the API. It works quite the same, the main difference is that the older API doesn’t work continuously and needs to start after every sentence. Still, it’s powerful enough and it has some flaws that enable it to be abused. I believe this API was introduced with Chrome 11 and I have a good reason to believe it was flawed since than.</p>
<p>**<br> More Technical Details**</p>
<p>Basically, this attack is abusing Chrome’s old speech API, the <strong>-x-webkit-speech</strong> feature.<br> What enable this attack are these 3 issues:</p>
<ol>
<li>The speech element visibility can be altered to any size and opacity, and still stay fully functional.</li>
<li>The speech element can be made to take over all clicks on the page while staying completely invisible. (No need to mess with z-indexes)</li>
<li>The indication box (shows you that you’re being recorded) can be obfuscated and/or be rendered outside of the screen.</li>
</ol>
<p><a href="http://guya.net/security/speech/" title="POC: To Listen Without Consent - Abusing the HTML5 Speech">The  POC</a> is designed to work on Chrome for Mac, but, the same attack can be conducted to work on any Chrome on any OS.</p>
<p>This POC is using the full-screen mode to make it easier to hide the “indication box” outside of the screen.<br> It is not mandatory to use the HTML5 full-screen; it’s just easier for this demo.</p>
<p>As you can see in the demo and video there is absolutely no indication that anything is going-on. There are no other windows or tabs, and no some kind of hidden popup or pop-under.<br> The user will never know this website is eavesdropping.</p>
<p>In Chrome all one need in order to access the user’s speech is to use this <a href="http://guya.net/security/speech/input.html">line of HTML5</a> code:<br> &lt;input -x-webkit-speech /&gt;</p>
<p>That’s all; there will be no fancy confirmation screens. When the user clicks on that little grey microphone he will be recorded. The user will see the “indication box” telling him to “Speak now” but that can be pushed out of the screen and / or obfuscated.</p>
<p>That is enough in order to listen to the user speech without any consent and without giving him any indication. The other bugs just make it easier but are not mandatory.</p>
<p>(For the tree in the demo I have used a slightly altered version of the beautiful <a href="http://kennethjorgensen.com/blog/2014/canvas-trees/" title="Canvas Trees">canvas tree</a> from Kenneth Jorgensen)</p>
<p>— The <a href="https://code.google.com/p/chromium/issues/detail?id=360448" title="Chromium Issues - Eavesdrop on the user speech - abusing the old speech API">bug</a> was reported to Google.</p>
<p><strong><a href="http://guya.net/security/speech" title="POC: To Listen Without Consent - Abusing the HTML5 Speech"><img src="/images/posts/2014/04/grey_mic-1024x651.png" alt="grey_mic"></a></strong></p>
]]></content:encoded>
      <media:content url="https://guya.net/images/posts/2014/04/grey_mic-1024x651.png" medium="image"/>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[Javascript]]></category>
      <category><![CDATA[Security]]></category>
    </item>
    <item>
      <title><![CDATA[Found a CSRF Flaw in a Big E-Commerce Website]]></title>
      <link>https://guya.net/2014/02/25/found-a-csrf-flaw-in-a-big-e-commerce-website/</link>
      <guid isPermaLink="false">46ed67a8-e6e6-469a-a8a6-30c11c3f9be0</guid>
      <pubDate>Tue, 25 Feb 2014 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[tl;dr I stumbled upon some CSRF flaws in a very popular e-commerce website. CSRF flaws are generally overlooked and the only way for you as the user to…]]></description>
      <content:encoded><![CDATA[<p><strong>tl;dr</strong></p>
<p>I stumbled upon some CSRF flaws in a very popular e-commerce website. CSRF flaws are generally overlooked and the only way for you as the user to minimize the risk is to logout from a website after you finished using it. This will limit the window of being vulnerable to attacks to the time you spend on a website. I have disclosed my finding to the e-commerce website and will post it here after they’ll finish fixing it.  </p>
<p><strong>This is how these CSRF flaws generally works</strong></p>
<p>When you login to a website you get back a cookie that indicates who you are and the fact that you are authenticated.<br> Now, for better user experience and so you won’t need to re-login, most websites tell your browser to keeps the cookie for very very long time (up to 10 years is considered safe).<br> The problem is that if a website suffers from any CSRF flaws, and many still do, from now-on every-time you visit any unrelated internet content it may be attacking you. Think of all these slightly phishy content you stumbled upon over the past years, some of it could have been attacking you.</p>
<p>A famous case of CSRF attack against a bank was using a legitimate AD and abused a flaw in the bank website to transfer user’s money. Gmail suffered from a CSRF flaw in its early days, leaking all of its user’s contacts.</p>
<p>CSRF flaws are used to steal sensitive data from users and to perform actions on the user’s behalf. The flaw I found enables both – an attacker can steal user’s personal data and also mess with his assets.  </p>
<p><strong>How I stumbled upon it</strong></p>
<p>****I was surfing on an open public WiFi – generally a bad thing to do but I needed to. This public WiFi had a phishy name “eyes2” and there are few other “eyes” circling around – “eyes1”, “eyes2”, “eyes3”, etc’. Call me paranoid but it seems to me that these access points were put there in order to eavesdrop. Might be just for fun might be more. Anyhow, I generally don’t care as long as I keep all of my traffic in SSL. I don’t care them getting my metadata. So I went to this huge e-commerce website just to check something and was amazed it’s not all SSLed. Wow… I wondered… what kind of data have I just leaked to the MITM from the “eyes2” access point?! Apparently, if someone is eavesdropping on my connection he now knew exactly who I am and more.</p>
<p>The fact that any website that deals with even slightly sensitive data, and doesn’t use SSL for all of its traffic is a flaw on its own. But SSL is not related to these specific flaws, in fact using SSL doesn’t help to prevent CSRF flaws. It’s only because I wanted to know exactly what kind of data this website leaked by using plain http and not https (SSL), I found out it’s also vulnerable to CSRF attacks.  </p>
<p><strong>Where are all the details?</strong></p>
<p>****I reported my finding to the e-commerce website. It took me way longer to find the appropriate way to contact them than to find the flaws and PoC it. I did eventually managed to report it and they were very responsive about it and seemed like they already started to fix it. I will post all the details after they’ll finish fixing it.</p>
<p>As a website owner it’s important to remember to implement CSRF prevention from the get go. Most web frameworks have their own solutions already. It’s very easy to overlook it. It’s very easy to use something like JSONP and to forget how vulnerable it can be, for example.  </p>
<p><strong>How to protect yourself</strong></p>
<p><span style="line-height: 1.5;">CSRF is generally based on cookies, what you can do to protect yourself is to logout or delete your cookies after you finished using a certain website. That won’t be bulletproof since you’ll still be vulnerable to </span>attacks<span style="line-height: 1.5;"> while you’re </span>logged-in<span style="line-height: 1.5;">. The only way to be completely safe is to use only 1 window with only 1 tab while you are logged-in.</span></p>
<p><span style="line-height: 1.5;">Obviously all of this is a complete hassle, and website owners should be the ones responsible for their CSRF flaws. The user can’t be </span>expected<span style="line-height: 1.5;"> to do it.<br></span><br><span style="line-height: 1.5;"> If your using firefox you may use something like </span><a href="https://addons.mozilla.org/en-US/firefox/addon/noscript/" title="NoScript">noscript</a>, which also involve some level of annoyance.</p>
]]></content:encoded>
      <category><![CDATA[csrf]]></category>
      <category><![CDATA[https]]></category>
      <category><![CDATA[Security]]></category>
      <category><![CDATA[ssl]]></category>
    </item>
    <item>
      <title><![CDATA[Abusing The HTML5 Data-URI]]></title>
      <link>https://guya.net/2014/02/17/abusing-the-html5-data-uri/</link>
      <guid isPermaLink="false">81d00df9-20fa-428c-be55-e4c1a0788c8a</guid>
      <pubDate>Mon, 17 Feb 2014 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[After seeing in the previous post how Data-URIs can be used as a mechanism to easily carry malicious code, I’ll elaborate more about the issues it presents.…]]></description>
      <content:encoded><![CDATA[<p><strong>[Update:</strong> Some of these examples were mitigated in Chrome 38 and 39]</p>
<p>After seeing in <a href="/2014/02/17/svg-for-fun-and-phishing/" title="SVG For Fun and Phishing">the previous post</a> how Data-URIs can be used as a mechanism to easily carry malicious code, I’ll elaborate more about the issues it presents.</p>
<p>Some of it merely exists from the way Data-URIs are designed and implemented, and some of it might be considered as security bugs in the browsers.</p>
<p><strong>Using Data-URI to manipulate the address bar</strong></p>
<p>The simplest thing an attacker can do is to add spaces after the “data:” in the URI and by that it can make it look like it some kind of a Chrome internal page.</p>
<p>It will also change the link status in the bottom of the browser. The link will show “data:” hiding all the base64 code that is there. It’s a way to manipulate the status bar without the need of JavaScript. Hence the link will be manipulated even in an environment that doesn’t allow JavaScript.</p>
<p>Combine that attack with the previous example of the phishing SVG and you can get catastrophic results. Lots of users might believe this is an internal Chrome page.</p>
<p>[Live example (Open in Chrome)](data:                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgIHhtbG5zOmV2PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC1ldmVudHMiCiAgICB2ZXJzaW9uPSIxLjEiCiAgICBiYXNlUHJvZmlsZT0iZnVsbCIKICAgIHdpZHRoPSIxMDAlIgogICAgaGVpZ2h0PSIxMDAlIj4KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CjwhW0NEQVRBWwouaW5wdXQgewogICAgZmlsbDogI2ZmZjsKICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7CiAgICBzdHJva2U6ICNkOWQ5ZDk7CiAgICBzdHJva2Utd2lkdGg6IDE7CiAgICBjdXJzb3I6IHRleHQ7Cn0KLmlucHV0OmhvdmVyIHsKICAgIHN0cm9rZTogI2EwYTBhMDsKICAgIGZpbHRlcjogdXJsKCNpbm5lcnNoYWRvdyk7Cn0KCi5sYWJlbCB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmdyYXktYm94IHsKICAgIGZpbGw6ICNmMWYxZjE7CiAgICBzdHJva2U6ICNlNWU1ZTU7CiAgICBzdHJva2Utd2lkdGg6IDE7Cn0KCnRleHQgewogICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cn0KCi5nb29nbGUgewogICAgZmlsbDogI2FjYWNhYzsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtZmFtaWx5OiBnZW9yZ2lhOwp9CgouaDEgewogICAgZm9udC1zaXplOiAzNnB4Owp9CgouaDQgewogICAgZm9udC1zaXplOiAxM3B4Owp9CgphIHsKICAgIGZpbGw6ICMxNWM7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCmE6aG92ZXIgewogICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLmJ1dHRvbiB7CiAgICBzdHJva2U6ICMzMDc5ZWQ7CiAgICBzdHJva2Utd2lkdGg6IDE7CiAgICBmaWxsOiAjNGQ5MGZlOwp9CgouYnV0dG9uOmhvdmVyIHsKICAgIHN0cm9rZTogIzJmNWJiNzsKICAgIGZpbGw6ICMzNTdhZTg7Cn0KCi5idXR0b24tdGV4dCB7CiAgICBmaWxsOiAjZmZmOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBrZXJuaW5nOiAwLjU7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tc2cgewogICAgZmlsbDogcmVkOwogICAgZmlsbC1vcGFjaXR5OiAwLjg7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogYWxsIDFzOwogICAgZmlsdGVyOiB1cmwoI2Ryb3BzaGFkb3cpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tc2ctdGV4dCB7CiAgICBmaWxsOiAjZmZmOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1zaGFkb3c6IDJweCAycHggMXB4ICM2NjY7Cn0KXV0+Cjwvc3R5bGU+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgIGZ1bmN0aW9uIGF0dGFjayhlKSB7CiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zZycpOwoKICAgICAgICBpZiAoIStlbC5zdHlsZS5vcGFjaXR5KSB7CiAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAxOwogICAgICAgICAgICBlbC5zdHlsZVsncG9pbnRlci1ldmVudHMnXSA9ICdhbGwnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAwOwogICAgICAgICAgICBlbC5zdHlsZVsncG9pbnRlci1ldmVudHMnXSA9ICdub25lJzsKICAgICAgICB9CiAgICB9Cjwvc2NyaXB0PgoKICAgIDxzdmcgdmlld0JveD0iMCAwIDMwMCA5MDAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjkwMHB4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0Ij4KICAgIDxkZWZzIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgPGZpbHRlciBpZD0iZHJvcHNoYWRvdyIgaGVpZ2h0PSIxMzAlIj4KICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMyIvPgogICAgICAgICAgPGZlT2Zmc2V0IGR4PSIyIiBkeT0iMiIgcmVzdWx0PSJvZmZzZXRibHVyIi8+CiAgICAgICAgICA8ZmVNZXJnZT4KICAgICAgICAgICAgPGZlTWVyZ2VOb2RlLz4KICAgICAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIi8+CiAgICAgICAgICA8L2ZlTWVyZ2U+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGZpbHRlciBpZD0iaW5uZXJzaGFkb3ciIHgwPSItNTAlIiB5MD0iLTUwJSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSI+CiAgICAgICAgCQkJPGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VBbHBoYSIgc3RkRGV2aWF0aW9uPSIyIiByZXN1bHQ9ImJsdXIiLz4KICAgICAgICAJCQk8ZmVPZmZzZXQgZHk9IjEiIGR4PSIxIi8+CiAgICAgICAgCQkJPGZlQ29tcG9zaXRlIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJhcml0aG1ldGljIgogICAgICAgIAkJCQkJazI9Ii0xIiBrMz0iMSIgcmVzdWx0PSJzaGFkb3dEaWZmIi8+CiAgICAgICAgCQkJPGZlRmxvb2QgZmxvb2QtY29sb3I9ImJsYWNrIiBmbG9vZC1vcGFjaXR5PSIwLjQiLz4KICAgICAgICAJCQk8ZmVDb21wb3NpdGUgaW4yPSJzaGFkb3dEaWZmIiBvcGVyYXRvcj0iaW4iLz4KICAgICAgICAJCQk8ZmVDb21wb3NpdGUgaW4yPSJTb3VyY2VHcmFwaGljIiBvcGVyYXRvcj0ib3ZlciIvPgogICAgICAgIAkJPC9maWx0ZXI+CiAgICAgIDwvZGVmcz4KICAgICAgPGc+CiAgICAgICA8dGV4dCBjbGFzcz0iaDEiIHg9IjEiIHk9IjY3Ij5TaWduIGluIHRvIENocm9tZTwvdGV4dD4KICAgICAgIDx0ZXh0IGNsYXNzPSJoNCIgeD0iLTEwNSIgeT0iMTE1Ij5TaWduIGluIHRvIGdldCB5b3VyIGJvb2ttYXJrcywgaGlzdG9yeSwgYW5kIHNldHRpbmdzIG9uIGFsbCB5b3VyIGRldmljZXMuPC90ZXh0PgogICAgICAgPGEgeGxpbms6aHJlZj0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9jaHJvbWUvaW50bC9lbi9tb3JlL3NpZ24taW4uaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICA8dGV4dCBjbGFzcz0iaDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNWMiIHg9IjM1MCIgeT0iMTE1Ij5MZWFybiBtb3JlLjwvdGV4dD4KICAgICAgIDwvYT4KICAgICAgIDxyZWN0IGNsYXNzPSJncmF5LWJveCIgd2lkdGg9IjM2MCIgaGVpZ2h0PSIzNTQiIHg9Ii0zNCIgeT0iMTU2Ii8+CiAgICAgICAgIDxnPgogICAgICAgICAgPHRleHQgY2xhc3M9Imdvb2dsZSIgeD0iMjU1IiB5PSIxOTAiPkdvb2dsZTwvdGV4dD4KICAgICAgICAgIDx0ZXh0IHg9Ii0xMCIgeT0iMTkwIiBzdHlsZT0iZm9udC1zaXplOjE3cHg7Ij5TaWduIEluPC90ZXh0PgogICAgICAgICAgPHRleHQgY2xhc3M9ImxhYmVsIiB4PSItMTAiIHk9IjIyNiI+RW1haWw8L3RleHQ+CiAgICAgICAgICA8cmVjdCBjbGFzcz0iaW5wdXQiIHg9Ii0xMCIgeT0iMjM0IiB3aWR0aD0iMzA4IiBoZWlnaHQ9IjM3IiBvbmNsaWNrPSJhdHRhY2soKTsiLz4KICAgICAgICAgIDxsaW5lIHgxPSItMTAiIHkxPSIyMzQiIHgyPSIyOTgiIHkyPSIyMzQiIHN0cm9rZT0iI2MwYzBjMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2Utb3BhY2l0eT0iMC40Ii8+CiAgICAgICAgICA8dGV4dCBjbGFzcz0ibGFiZWwiIHg9Ii0xMCIgeT0iMzAyIj5QYXNzd29yZDwvdGV4dD4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJpbnB1dCIgeD0iLTEwIiB5PSIzMTAiIHdpZHRoPSIzMDgiIGhlaWdodD0iMzciIG9uY2xpY2s9ImF0dGFjaygpOyIvPgogICAgICAgICAgPGxpbmUgeDE9Ii0xMCIgeTE9IjMxMCIgeDI9IjI5OCIgeTI9IjMxMCIgc3Ryb2tlPSIjYzBjMGMwIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1vcGFjaXR5PSIwLjQiLz4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJidXR0b24iIHg9Ii0xMCIgeT0iMzY2IiB3aWR0aD0iNzUiIGhlaWdodD0iMzciIHJ4PSIyIiBvbmNsaWNrPSJhdHRhY2soKTsiLz4KICAgICAgICAgIDx0ZXh0IGNsYXNzPSJidXR0b24tdGV4dCIgeD0iNCIgeT0iMzkwIj5TaWduIGluPC90ZXh0PgogICAgICAgICAgPGEgeGxpbms6aHJlZj0iaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL1JlY292ZXJBY2NvdW50IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJoNCIgdGV4dC1hbmNob3I9ImxlZnQiIGZpbGw9IiMxNWMiIHg9Ii0xMCIgeT0iNDQwIj5DYW4ndCBhY2Nlc3MgeW91ciBhY2NvdW50PzwvdGV4dD4KICAgICAgICAgIDwvYT4KICAgICAgICAgIDxhIHhsaW5rOmhyZWY9Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9TaWduVXAiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgPHRleHQgY2xhc3M9Img0IiB0ZXh0LWFuY2hvcj0ibGVmdCIgZmlsbD0iIzE1YyIgeD0iLTEwIiB5PSI0NzIiPkNyZWF0ZSBhIEdvb2dsZSBhY2NvdW50PC90ZXh0PgogICAgICAgICAgPC9hPgogICAgICAgICAgPGc+CiAgICAgICAgICAgIDxzdmcgaWQ9Im1zZyIgY2xhc3M9Im1zZyIgeD0iMjAiIHk9IjIwMCIgb25jbGljaz0iYXR0YWNrKCk7Ij4KICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPSIyNTAiIGhlaWdodD0iMjAwIiByeD0iMTAiLz4KICAgICAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJtc2ctdGV4dCIgeD0iMTAiIHk9IjMwIj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiPlRoaXMgaXMgYSBkZW1vbnN0cmF0aW9uIG9mPC90c3Bhbj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiIGR5PSIxLjJlbSI+aG93IFNWRyBjYW4gYmUgYWJ1c2VkPC90c3Bhbj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiIGR5PSIxLjJlbSI+Zm9yIFBoaXNoaW5nIGF0dGFja3MuPC90c3Bhbj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiIGR5PSIyLjVlbSI+Rm9yIG1vcmUgaW5mbyB2aXNpdDo8L3RzcGFuPgogICAgICAgICAgICAgICAgPC90ZXh0PgogICAgICAgICAgICAgICAgPGEgeGxpbms6aHJlZj0iaHR0cDovL2d1eWEubmV0IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibGVmdCIgeD0iMTAiIHk9IjE2MCIgc3R5bGU9ImZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7Ij5odHRwOi8vZ3V5YS5uZXQ8L3RleHQ+CiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgPC9nPgoKICAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L3N2Zz4KPC9zdmc+)</p>
<p><a href="/images/posts/2014/02/data_address_bar.png"><img src="/images/posts/2014/02/data_address_bar.png" alt="data_address_bar"></a></p>
<p>While in the above example the user will see only “data:..” in the address bar. If he’ll feel uncomfortable the user can still examine the address bar and might find the hidden base64 code.</p>
<p>The next example will show how to prevent the user from examining the address bar at all, and it’ll always show “data:” The 3 dots indicating there might be more to it – will be removed as well.</p>
<p>By making the original content larger than ~28KB the address-bar will always show “data:” and only data.</p>
<p><a href="/images/posts/2014/02/data_status_bar.png"><img src="/images/posts/2014/02/data_status_bar.png" alt="data_status_bar"></a></p>
<p>[Live example of only data in the address-bar (Open in Chrome)](data:                                                                                                                                                                                                                                             image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgIHhtbG5zOmV2PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC1ldmVudHMiCiAgICB2ZXJzaW9uPSIxLjEiCiAgICBiYXNlUHJvZmlsZT0iZnVsbCIKICAgIHdpZHRoPSIxMDAlIgogICAgaGVpZ2h0PSIxMDAlIj4KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CjwhW0NEQVRBWwouaW5wdXQgewogICAgZmlsbDogI2ZmZjsKICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7CiAgICBzdHJva2U6ICNkOWQ5ZDk7CiAgICBzdHJva2Utd2lkdGg6IDE7CiAgICBjdXJzb3I6IHRleHQ7Cn0KLmlucHV0OmhvdmVyIHsKICAgIHN0cm9rZTogI2EwYTBhMDsKICAgIGZpbHRlcjogdXJsKCNpbm5lcnNoYWRvdyk7Cn0KCi5sYWJlbCB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmdyYXktYm94IHsKICAgIGZpbGw6ICNmMWYxZjE7CiAgICBzdHJva2U6ICNlNWU1ZTU7CiAgICBzdHJva2Utd2lkdGg6IDE7Cn0KCnRleHQgewogICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cn0KCi5nb29nbGUgewogICAgZmlsbDogI2FjYWNhYzsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtZmFtaWx5OiBnZW9yZ2lhOwp9CgouaDEgewogICAgZm9udC1zaXplOiAzNnB4Owp9CgouaDQgewogICAgZm9udC1zaXplOiAxM3B4Owp9CgphIHsKICAgIGZpbGw6ICMxNWM7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCmE6aG92ZXIgewogICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLmJ1dHRvbiB7CiAgICBzdHJva2U6ICMzMDc5ZWQ7CiAgICBzdHJva2Utd2lkdGg6IDE7CiAgICBmaWxsOiAjNGQ5MGZlOwp9CgouYnV0dG9uOmhvdmVyIHsKICAgIHN0cm9rZTogIzJmNWJiNzsKICAgIGZpbGw6ICMzNTdhZTg7Cn0KCi5idXR0b24tdGV4dCB7CiAgICBmaWxsOiAjZmZmOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBrZXJuaW5nOiAwLjU7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tc2cgewogICAgZmlsbDogcmVkOwogICAgZmlsbC1vcGFjaXR5OiAwLjg7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogYWxsIDFzOwogICAgZmlsdGVyOiB1cmwoI2Ryb3BzaGFkb3cpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tc2ctdGV4dCB7CiAgICBmaWxsOiAjZmZmOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1zaGFkb3c6IDJweCAycHggMXB4ICM2NjY7Cn0KXV0+Cjwvc3R5bGU+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgIGZ1bmN0aW9uIGF0dGFjayhlKSB7CiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zZycpOwoKICAgICAgICBpZiAoIStlbC5zdHlsZS5vcGFjaXR5KSB7CiAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAxOwogICAgICAgICAgICBlbC5zdHlsZVsncG9pbnRlci1ldmVudHMnXSA9ICdhbGwnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAwOwogICAgICAgICAgICBlbC5zdHlsZVsncG9pbnRlci1ldmVudHMnXSA9ICdub25lJzsKICAgICAgICB9CiAgICB9Cjwvc2NyaXB0PgoKICAgIDxzdmcgdmlld0JveD0iMCAwIDMwMCA5MDAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjkwMHB4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0Ij4KICAgIDxkZWZzIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgPGZpbHRlciBpZD0iZHJvcHNoYWRvdyIgaGVpZ2h0PSIxMzAlIj4KICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMyIvPgogICAgICAgICAgPGZlT2Zmc2V0IGR4PSIyIiBkeT0iMiIgcmVzdWx0PSJvZmZzZXRibHVyIi8+CiAgICAgICAgICA8ZmVNZXJnZT4KICAgICAgICAgICAgPGZlTWVyZ2VOb2RlLz4KICAgICAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIi8+CiAgICAgICAgICA8L2ZlTWVyZ2U+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGZpbHRlciBpZD0iaW5uZXJzaGFkb3ciIHgwPSItNTAlIiB5MD0iLTUwJSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSI+CiAgICAgICAgCQkJPGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VBbHBoYSIgc3RkRGV2aWF0aW9uPSIyIiByZXN1bHQ9ImJsdXIiLz4KICAgICAgICAJCQk8ZmVPZmZzZXQgZHk9IjEiIGR4PSIxIi8+CiAgICAgICAgCQkJPGZlQ29tcG9zaXRlIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJhcml0aG1ldGljIgogICAgICAgIAkJCQkJazI9Ii0xIiBrMz0iMSIgcmVzdWx0PSJzaGFkb3dEaWZmIi8+CiAgICAgICAgCQkJPGZlRmxvb2QgZmxvb2QtY29sb3I9ImJsYWNrIiBmbG9vZC1vcGFjaXR5PSIwLjQiLz4KICAgICAgICAJCQk8ZmVDb21wb3NpdGUgaW4yPSJzaGFkb3dEaWZmIiBvcGVyYXRvcj0iaW4iLz4KICAgICAgICAJCQk8ZmVDb21wb3NpdGUgaW4yPSJTb3VyY2VHcmFwaGljIiBvcGVyYXRvcj0ib3ZlciIvPgogICAgICAgIAkJPC9maWx0ZXI+CiAgICAgIDwvZGVmcz4KICAgICAgPGc+CiAgICAgICA8dGV4dCBjbGFzcz0iaDEiIHg9IjEiIHk9IjY3Ij5TaWduIGluIHRvIENocm9tZTwvdGV4dD4KICAgICAgIDx0ZXh0IGNsYXNzPSJoNCIgeD0iLTEwNSIgeT0iMTE1Ij5TaWduIGluIHRvIGdldCB5b3VyIGJvb2ttYXJrcywgaGlzdG9yeSwgYW5kIHNldHRpbmdzIG9uIGFsbCB5b3VyIGRldmljZXMuPC90ZXh0PgogICAgICAgPGEgeGxpbms6aHJlZj0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9jaHJvbWUvaW50bC9lbi9tb3JlL3NpZ24taW4uaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICA8dGV4dCBjbGFzcz0iaDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNWMiIHg9IjM1MCIgeT0iMTE1Ij5MZWFybiBtb3JlLjwvdGV4dD4KICAgICAgIDwvYT4KICAgICAgIDxyZWN0IGNsYXNzPSJncmF5LWJveCIgd2lkdGg9IjM2MCIgaGVpZ2h0PSIzNTQiIHg9Ii0zNCIgeT0iMTU2Ii8+CiAgICAgICAgIDxnPgogICAgICAgICAgPHRleHQgY2xhc3M9Imdvb2dsZSIgeD0iMjU1IiB5PSIxOTAiPkdvb2dsZTwvdGV4dD4KICAgICAgICAgIDx0ZXh0IHg9Ii0xMCIgeT0iMTkwIiBzdHlsZT0iZm9udC1zaXplOjE3cHg7Ij5TaWduIEluPC90ZXh0PgogICAgICAgICAgPHRleHQgY2xhc3M9ImxhYmVsIiB4PSItMTAiIHk9IjIyNiI+RW1haWw8L3RleHQ+CiAgICAgICAgICA8cmVjdCBjbGFzcz0iaW5wdXQiIHg9Ii0xMCIgeT0iMjM0IiB3aWR0aD0iMzA4IiBoZWlnaHQ9IjM3IiBvbmNsaWNrPSJhdHRhY2soKTsiLz4KICAgICAgICAgIDxsaW5lIHgxPSItMTAiIHkxPSIyMzQiIHgyPSIyOTgiIHkyPSIyMzQiIHN0cm9rZT0iI2MwYzBjMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2Utb3BhY2l0eT0iMC40Ii8+CiAgICAgICAgICA8dGV4dCBjbGFzcz0ibGFiZWwiIHg9Ii0xMCIgeT0iMzAyIj5QYXNzd29yZDwvdGV4dD4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJpbnB1dCIgeD0iLTEwIiB5PSIzMTAiIHdpZHRoPSIzMDgiIGhlaWdodD0iMzciIG9uY2xpY2s9ImF0dGFjaygpOyIvPgogICAgICAgICAgPGxpbmUgeDE9Ii0xMCIgeTE9IjMxMCIgeDI9IjI5OCIgeTI9IjMxMCIgc3Ryb2tlPSIjYzBjMGMwIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1vcGFjaXR5PSIwLjQiLz4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJidXR0b24iIHg9Ii0xMCIgeT0iMzY2IiB3aWR0aD0iNzUiIGhlaWdodD0iMzciIHJ4PSIyIiBvbmNsaWNrPSJhdHRhY2soKTsiLz4KICAgICAgICAgIDx0ZXh0IGNsYXNzPSJidXR0b24tdGV4dCIgeD0iNCIgeT0iMzkwIj5TaWduIGluPC90ZXh0PgogICAgICAgICAgPGEgeGxpbms6aHJlZj0iaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL1JlY292ZXJBY2NvdW50IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJoNCIgdGV4dC1hbmNob3I9ImxlZnQiIGZpbGw9IiMxNWMiIHg9Ii0xMCIgeT0iNDQwIj5DYW4ndCBhY2Nlc3MgeW91ciBhY2NvdW50PzwvdGV4dD4KICAgICAgICAgIDwvYT4KICAgICAgICAgIDxhIHhsaW5rOmhyZWY9Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9TaWduVXAiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgPHRleHQgY2xhc3M9Img0IiB0ZXh0LWFuY2hvcj0ibGVmdCIgZmlsbD0iIzE1YyIgeD0iLTEwIiB5PSI0NzIiPkNyZWF0ZSBhIEdvb2dsZSBhY2NvdW50PC90ZXh0PgogICAgICAgICAgPC9hPgogICAgICAgICAgPGc+CiAgICAgICAgICAgIDxzdmcgaWQ9Im1zZyIgY2xhc3M9Im1zZyIgeD0iMjAiIHk9IjIwMCIgb25jbGljaz0iYXR0YWNrKCk7Ij4KICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPSIyNTAiIGhlaWdodD0iMjAwIiByeD0iMTAiLz4KICAgICAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJtc2ctdGV4dCIgeD0iMTAiIHk9IjMwIj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiPlRoaXMgaXMgYSBkZW1vbnN0cmF0aW9uIG9mPC90c3Bhbj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiIGR5PSIxLjJlbSI+aG93IFNWRyBjYW4gYmUgYWJ1c2VkPC90c3Bhbj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiIGR5PSIxLjJlbSI+Zm9yIFBoaXNoaW5nIGF0dGFja3MuPC90c3Bhbj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiIGR5PSIyLjVlbSI+Rm9yIG1vcmUgaW5mbyB2aXNpdDo8L3RzcGFuPgogICAgICAgICAgICAgICAgPC90ZXh0PgogICAgICAgICAgICAgICAgPGEgeGxpbms6aHJlZj0iaHR0cDovL2d1eWEubmV0IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibGVmdCIgeD0iMTAiIHk9IjE2MCIgc3R5bGU9ImZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7Ij5odHRwOi8vZ3V5YS5uZXQ8L3RleHQ+CiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgPC9nPgoKICAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICAgIDxnIHN0eWxlPSJkaXNwbGF5OiBub25lIj4KICAgICAgICAgIDx0ZXh0PgogICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXkKICAgICAgICAgICAgICAgICAgZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teQogICAgICAgICAgICAgICAgICBkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICAgICAgICAgIGR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15ZHVtbXlkdW1teWR1bW15CiAgICAgICAgICA8L3RleHQ+CiAgICAgIDwvZz4KICAgIDwvc3ZnPgo8L3N2Zz4=)</p>
<p><a href="/images/posts/2014/02/data_big_address_bar.png"><img src="/images/posts/2014/02/data_big_address_bar.png" alt="data_big_address_bar"></a></p>
<p>While Chrome is the most vulnerable to the Space attack, other browsers will fall for it too.</p>
<p><strong>FireFox</strong> trim the spaces when you click on the link, but an attacker will still be able to manipulate the status-bar (at the bottom of the browser). As we’ll see in the next vector.</p>
<p>**Safari **doesn’t trim the spaces but instead convert it to %20 or any other Unicode escaped representation of a space. It’ll work with any combination of <a href="https://www.cs.tut.fi/~jkorpela/chars/spaces.html" title="Unicode space characters">unicode spaces</a>.</p>
<p><a href="/images/posts/2014/02/data_safari_address_bar.png"><img src="/images/posts/2014/02/data_safari_address_bar.png" alt="data_safari_address_bar"></a></p>
<p>**Mobile Chrome for iOS. ** It was a bit surprising to see that the Chrome version for iOS will fall for the “Over 28KB base64” attack.</p>
<p><a href="/images/posts/2014/02/data_chrome_iphone1.png"><img src="/images/posts/2014/02/data_chrome_iphone1.png" alt="data_chrome_iphone"></a></p>
<p>It interesting to see that even Chrome for iOS which is very different environment, share the shell code with all of the other Chrome browsers.</p>
<p>**<br> Tricking the user to download malicious content using the DATA URI**</p>
<p>We already seen how one can abuse the browser’s address-bar and the status-bar by simply adding spaces after the “data:” in the link.</p>
<p>But what if we add any other character, other than space.  In that case, the users will be prompted to download a file (by default the user won’t be prompted and the file will just download)</p>
<p>How convenient for an evil one. Combining that with the previous stuff…</p>
<p>The user will see data:<a href="http://google.com/graphics/doodle.svg">http://google.com/graphics/doodle.svg</a> in the status-bar, clicking the link will automatically download the attacker’s malicious SVG file that is hiding in the base64 code inside the link.</p>
<p><a href="/images/posts/2014/02/data_doodle_chrome.png"><img src="/images/posts/2014/02/data_doodle_chrome.png" alt="data_doodle_chrome"></a></p>
<p><a href="">Click to download doodle.svg</a> (not really a doodle)</p>
<p>As noted before, FireFox trim the spaces after the “data:”, but one can use %20 instead. Also, FireFox does a good job and put an ellipsis in the middle of the link in the status-bar. So the user will see the suspicious gibberish base64 at the end, <span style="line-height: 1.5;">But that can easily overcome with simply adding spaces at the end of the link as well.</span></p>
<p><a href="/images/posts/2014/02/data_doodle_firefox.png"><img src="/images/posts/2014/02/data_doodle_firefox.png" alt="data_doodle_firefox"></a></p>
<p><a href="">Click to download doodle.svg</a> (FireFox version)</p>
<p>The interesting thing is that this kind of attack doesn’t limit us to SVG, any kind of file can be downloaded this way, any kind of binary file as well.</p>
<p>How about an EXE (that EXE does nothing but to echo some text to the terminal)<br> (Will add it latter)</p>
<p>Remember COM executables? Only few bytes, 32bit windows will still run it, still many of these are out there.</p>
<p><a href="">COM executable</a></p>
<p>ZIP is a <del>great</del> bad vector IMHO</p>
<p><a href="">ZIP with badies inside</a> (not real badies just text files)</p>
<p><a href="/images/posts/2014/02/chrome_zip_download.png"><img src="/images/posts/2014/02/chrome_zip_download.png" alt="chrome_zip_download"></a></p>
<p>While on windows an attacker will also need to trick the user to change the extension of the file or to make him “Open With…” the file with a certain app. On the MAC these extension doesn’t matter much.</p>
<p>The file will be opened or executed according to its real type.</p>
<p>The new Mac OSes have this great feature called Gatekeeper that makes running applications way more secure in general.</p>
<p>The default settings is “from app-store AND identified developers”. How difficult is it for a motivated attacker to become an “Identified Developer”?</p>
<p>If the user have disabled Gatekeeper the app will just run when clicked.</p>
<p>It will probably work on old macs, but anyway I think that the most dangerous attack will be using just a zip file with all kind of badies inside.</p>
<p>The user flow might be:</p>
<ol>
<li>Click on a link -&gt; File is immediately downloaded (there is no wait as the file is already embedded no the page)</li>
<li>Click on the downloaded file -&gt; file is automatically extracted (if the zip is small enough the user won’t notice much going on as the extraction will be fast)</li>
<li>Malicious apps will be spread all over the user’s Downloads folder.</li>
<li>“Hopefully” one day the user will notice these apps and its inviting names and will run one of these – thinking he downloaded it himself.</li>
</ol>
<p>These are most of the browsers I’ve tested on, other browser may behave differently, generally it works the same on ubuntu as well.</p>
<p>IE (Internet Explorer) – does not suffer form most Data-URIs flaws, it does it by not supporting most of its features.  I don’t think that getting away with it by not supporting it is generally a good thing.</p>
<p>**Final notes about these vectors: **(repeating some from the previous post)</p>
<ol>
<li>Remember that no JavaScript is needed for any of this, all that is needed is a link. It’ll work just the same with JavaScript disabled.</li>
<li>No server is involved either.</li>
<li>All an attacker need is a bunch of strings and the user’s browser will do all the rest.</li>
<li>AV won’t scan these links.</li>
<li>Not easily blockable – no domain to block.</li>
<li>More easily shared and distributed.</li>
<li>The attack is also cached in the browser history and doesn’t need Internet connection to be present at the moment of the attack.</li>
<li>Will propagate across devices. For example, if you’re signed-in into Chrome the attack will propagate to all of your devices. (You’ll still have to run it on each device though, just type data in the address bar).</li>
<li>Can be easily embedded in the naively looking *.URL file. Who doesn’t click on these? It always felt safe.</li>
</ol>
<p> </p>
<p>— Reported the <a href="https://code.google.com/p/chromium/issues/detail?id=344276">bug</a> to Google.</p>
]]></content:encoded>
      <media:content url="https://guya.net/images/posts/2014/02/data_address_bar.png" medium="image"/>
      <category><![CDATA[Google Chrome]]></category>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[Security]]></category>
    </item>
    <item>
      <title><![CDATA[SVG For Fun and Phishing]]></title>
      <link>https://guya.net/2014/02/17/svg-for-fun-and-phishing/</link>
      <guid isPermaLink="false">fc4d0caf-2a49-43c7-a282-5bba98a8de6f</guid>
      <pubDate>Mon, 17 Feb 2014 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[What an awesome format is SVG, so powerful and so well supported by browsers. And yet it is barely being used, it’s not getting the love it deserves. Well,…]]></description>
      <content:encoded><![CDATA[<p>What an awesome format is SVG, so powerful and so well supported by browsers. And yet it is barely being used, it’s not getting the love it deserves. Well, browsers love SVG, perhaps too much…</p>
<p>SVG files are like little bundles of joy. Encapsulating graphics, animations and logic. One can write a full app or game all encapsulate in one SVG file. That SVG file can be compressed into a binary file with the extension of SVGZ and browsers will still accept it.</p>
<p>Its way less powerful than Flash but the concept is similar – vector graphics and logic in one binary file. And like Flash SWF files – these files tend to get viral and to be re-distributed. And by that I mean, once you release your attack in the wild it can get hosted from many other servers. A good example would be, <a href="https://www.google.co.il/search?q=tiger.svg" title="https://www.google.co.il/search?q=tiger.svg">tiger.svg</a>.</p>
<p>Remember the <a href="/2008/09/14/encapsulating-csrf-attacks-inside-massively-distributed-flash-movies-real-world-example/" title="Encapsulating CSRF attacks inside massively distributed Flash movies – Real world example">lovely Flash dog</a>?  It can work just the same and even worse.</p>
<p>SVG also run from local files. By default, on Windows, SVG files are opened in IE, which will run the script with local privileges when it’s double clicked.<span style="line-height: 1.5;"> </span></p>
<p>Anyhow, SVGs have some flaws built in into them; many are known some are new. I will argue that even without the new flaws an SVG file is somewhat dangerous by-design. I wanted to see how easy it would be to abuse SVG for phishing. I picked an easy target – Chrome’s “Sign In” page. It was pretty easy to create an almost fully functional version of the Chrome Sign In page.</p>
<p><a href="http://guya.net/security/svg/chrome_login.svg" title="POC of SVG as a phishing attack">Check it out only 5kb of SVG “Image”</a></p>
<p><a href="http://guya.net/security/svg/chrome_login.svgz" title="POC of binary SVGZ as a phishing attack">Compressed as an SVGZ, only 2kb (Chrome will run it just fine)</a><span style="line-height: 1.5;"> </span></p>
<p>Note: Google already changed the appearance of this page, but it almost identical to the previous version.</p>
<p>This page is generally <a href="https://accounts.google.com/ServiceLogin" title="Google Service Login">here</a>  (google already changed the way it looks)</p>
<p>Letting SVG files execute JavaScript is actually the root of the problem. I’m not sure it serves any real purpose in today’s web.</p>
<p>A simple attack might goes like this:</p>
<ul>
<li>The attacker will send the victim an email with a malicious SVG file “Checkout this cool image / animation”.</li>
<li>The victim will downloads the SVG and click / double click on it.</li>
<li>SVG is opened in the browser.</li>
<li>Attack taking place.</li>
</ul>
<p>The JavaScript that will run will have local privileges and can easily attack the user (limited to the browser sandbox of course). It can for example – execute multiple cross-domain CSRF attacks (cookies are sent normally with every requests) and/or load multiple other attack vectors. Can be abused for spam, and that is not even illegal as long as long as the attacker doesn’t do anything too malicious.</p>
<p>You may be thinking “so what?!” you can script the user from an html page just as well.</p>
<p>There are few differences, as most users will look at SVG file as just another image.</p>
<ol>
<li>When you double click on an image to view it can’t execute anything –SVG can.</li>
<li>SVG files get redistributed – there are numerous clip art sites that will host the evil SVG for the attacker.</li>
<li>The malicious code embedded in SVG files will sustain after editing the file in graphic editors like Adobe Illustrator and Inkscape.</li>
</ol>
<p>I would say that the main problem here is not what SVG files are capable of doing, and it’s more about the way they can get malicious code slip through the user’s normal defenses.</p>
<p>Wait there is more…</p>
<p>**<br> Even more fun with SVG and HTML5 Data-URI**</p>
<p>Another great feature of HTML5 is Data-URI. Now, SVG is working great with Data-URI. Malicious SVG works amazingly great with data-URIs.</p>
<p>SVG encoded, as Base64 will run directly from a link.<br> Some might call this a feature but it can be exploited for phishing attacks.<br><span style="line-height: 1.5;"><br><a href="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgIHhtbG5zOmV2PSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC1ldmVudHMiCiAgICB2ZXJzaW9uPSIxLjEiCiAgICBiYXNlUHJvZmlsZT0iZnVsbCIKICAgIHdpZHRoPSIxMDAlIgogICAgaGVpZ2h0PSIxMDAlIj4KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CjwhW0NEQVRBWwouaW5wdXQgewogICAgZmlsbDogI2ZmZjsKICAgIHBvaW50ZXItZXZlbnRzOiBhbGw7CiAgICBzdHJva2U6ICNkOWQ5ZDk7CiAgICBzdHJva2Utd2lkdGg6IDE7CiAgICBjdXJzb3I6IHRleHQ7Cn0KLmlucHV0OmhvdmVyIHsKICAgIHN0cm9rZTogI2EwYTBhMDsKICAgIGZpbHRlcjogdXJsKCNpbm5lcnNoYWRvdyk7Cn0KCi5sYWJlbCB7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLmdyYXktYm94IHsKICAgIGZpbGw6ICNmMWYxZjE7CiAgICBzdHJva2U6ICNlNWU1ZTU7CiAgICBzdHJva2Utd2lkdGg6IDE7Cn0KCnRleHQgewogICAgZm9udC1mYW1pbHk6IGFyaWFsLCBoZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Cn0KCi5nb29nbGUgewogICAgZmlsbDogI2FjYWNhYzsKICAgIGZvbnQtc2l6ZTogMTZweDsKICAgIGZvbnQtZmFtaWx5OiBnZW9yZ2lhOwp9CgouaDEgewogICAgZm9udC1zaXplOiAzNnB4Owp9CgouaDQgewogICAgZm9udC1zaXplOiAxM3B4Owp9CgphIHsKICAgIGZpbGw6ICMxNWM7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCmE6aG92ZXIgewogICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLmJ1dHRvbiB7CiAgICBzdHJva2U6ICMzMDc5ZWQ7CiAgICBzdHJva2Utd2lkdGg6IDE7CiAgICBmaWxsOiAjNGQ5MGZlOwp9CgouYnV0dG9uOmhvdmVyIHsKICAgIHN0cm9rZTogIzJmNWJiNzsKICAgIGZpbGw6ICMzNTdhZTg7Cn0KCi5idXR0b24tdGV4dCB7CiAgICBmaWxsOiAjZmZmOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBrZXJuaW5nOiAwLjU7CiAgICB0ZXh0LXNoYWRvdzogMCAxcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tc2cgewogICAgZmlsbDogcmVkOwogICAgZmlsbC1vcGFjaXR5OiAwLjg7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogYWxsIDFzOwogICAgZmlsdGVyOiB1cmwoI2Ryb3BzaGFkb3cpOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5tc2ctdGV4dCB7CiAgICBmaWxsOiAjZmZmOwogICAgZm9udC1zaXplOiAyMHB4OwogICAgdGV4dC1zaGFkb3c6IDJweCAycHggMXB4ICM2NjY7Cn0KXV0+Cjwvc3R5bGU+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgIGZ1bmN0aW9uIGF0dGFjayhlKSB7CiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zZycpOwoKICAgICAgICBpZiAoIStlbC5zdHlsZS5vcGFjaXR5KSB7CiAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAxOwogICAgICAgICAgICBlbC5zdHlsZVsncG9pbnRlci1ldmVudHMnXSA9ICdhbGwnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLm9wYWNpdHkgPSAwOwogICAgICAgICAgICBlbC5zdHlsZVsncG9pbnRlci1ldmVudHMnXSA9ICdub25lJzsKICAgICAgICB9CiAgICB9Cjwvc2NyaXB0PgoKICAgIDxzdmcgdmlld0JveD0iMCAwIDMwMCA5MDAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjkwMHB4IiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0Ij4KICAgIDxkZWZzIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICAgICAgPGZpbHRlciBpZD0iZHJvcHNoYWRvdyIgaGVpZ2h0PSIxMzAlIj4KICAgICAgICAgIDxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMyIvPgogICAgICAgICAgPGZlT2Zmc2V0IGR4PSIyIiBkeT0iMiIgcmVzdWx0PSJvZmZzZXRibHVyIi8+CiAgICAgICAgICA8ZmVNZXJnZT4KICAgICAgICAgICAgPGZlTWVyZ2VOb2RlLz4KICAgICAgICAgICAgPGZlTWVyZ2VOb2RlIGluPSJTb3VyY2VHcmFwaGljIi8+CiAgICAgICAgICA8L2ZlTWVyZ2U+CiAgICAgICAgPC9maWx0ZXI+CiAgICAgICAgPGZpbHRlciBpZD0iaW5uZXJzaGFkb3ciIHgwPSItNTAlIiB5MD0iLTUwJSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSI+CiAgICAgICAgCQkJPGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VBbHBoYSIgc3RkRGV2aWF0aW9uPSIyIiByZXN1bHQ9ImJsdXIiLz4KICAgICAgICAJCQk8ZmVPZmZzZXQgZHk9IjEiIGR4PSIxIi8+CiAgICAgICAgCQkJPGZlQ29tcG9zaXRlIGluMj0iU291cmNlQWxwaGEiIG9wZXJhdG9yPSJhcml0aG1ldGljIgogICAgICAgIAkJCQkJazI9Ii0xIiBrMz0iMSIgcmVzdWx0PSJzaGFkb3dEaWZmIi8+CiAgICAgICAgCQkJPGZlRmxvb2QgZmxvb2QtY29sb3I9ImJsYWNrIiBmbG9vZC1vcGFjaXR5PSIwLjQiLz4KICAgICAgICAJCQk8ZmVDb21wb3NpdGUgaW4yPSJzaGFkb3dEaWZmIiBvcGVyYXRvcj0iaW4iLz4KICAgICAgICAJCQk8ZmVDb21wb3NpdGUgaW4yPSJTb3VyY2VHcmFwaGljIiBvcGVyYXRvcj0ib3ZlciIvPgogICAgICAgIAkJPC9maWx0ZXI+CiAgICAgIDwvZGVmcz4KICAgICAgPGc+CiAgICAgICA8dGV4dCBjbGFzcz0iaDEiIHg9IjEiIHk9IjY3Ij5TaWduIGluIHRvIENocm9tZTwvdGV4dD4KICAgICAgIDx0ZXh0IGNsYXNzPSJoNCIgeD0iLTEwNSIgeT0iMTE1Ij5TaWduIGluIHRvIGdldCB5b3VyIGJvb2ttYXJrcywgaGlzdG9yeSwgYW5kIHNldHRpbmdzIG9uIGFsbCB5b3VyIGRldmljZXMuPC90ZXh0PgogICAgICAgPGEgeGxpbms6aHJlZj0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9jaHJvbWUvaW50bC9lbi9tb3JlL3NpZ24taW4uaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICA8dGV4dCBjbGFzcz0iaDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZpbGw9IiMxNWMiIHg9IjM1MCIgeT0iMTE1Ij5MZWFybiBtb3JlLjwvdGV4dD4KICAgICAgIDwvYT4KICAgICAgIDxyZWN0IGNsYXNzPSJncmF5LWJveCIgd2lkdGg9IjM2MCIgaGVpZ2h0PSIzNTQiIHg9Ii0zNCIgeT0iMTU2Ii8+CiAgICAgICAgIDxnPgogICAgICAgICAgPHRleHQgY2xhc3M9Imdvb2dsZSIgeD0iMjU1IiB5PSIxOTAiPkdvb2dsZTwvdGV4dD4KICAgICAgICAgIDx0ZXh0IHg9Ii0xMCIgeT0iMTkwIiBzdHlsZT0iZm9udC1zaXplOjE3cHg7Ij5TaWduIEluPC90ZXh0PgogICAgICAgICAgPHRleHQgY2xhc3M9ImxhYmVsIiB4PSItMTAiIHk9IjIyNiI+RW1haWw8L3RleHQ+CiAgICAgICAgICA8cmVjdCBjbGFzcz0iaW5wdXQiIHg9Ii0xMCIgeT0iMjM0IiB3aWR0aD0iMzA4IiBoZWlnaHQ9IjM3IiBvbmNsaWNrPSJhdHRhY2soKTsiLz4KICAgICAgICAgIDxsaW5lIHgxPSItMTAiIHkxPSIyMzQiIHgyPSIyOTgiIHkyPSIyMzQiIHN0cm9rZT0iI2MwYzBjMCIgc3Ryb2tlLXdpZHRoPSIxIiBzdHJva2Utb3BhY2l0eT0iMC40Ii8+CiAgICAgICAgICA8dGV4dCBjbGFzcz0ibGFiZWwiIHg9Ii0xMCIgeT0iMzAyIj5QYXNzd29yZDwvdGV4dD4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJpbnB1dCIgeD0iLTEwIiB5PSIzMTAiIHdpZHRoPSIzMDgiIGhlaWdodD0iMzciIG9uY2xpY2s9ImF0dGFjaygpOyIvPgogICAgICAgICAgPGxpbmUgeDE9Ii0xMCIgeTE9IjMxMCIgeDI9IjI5OCIgeTI9IjMxMCIgc3Ryb2tlPSIjYzBjMGMwIiBzdHJva2Utd2lkdGg9IjEiIHN0cm9rZS1vcGFjaXR5PSIwLjQiLz4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJidXR0b24iIHg9Ii0xMCIgeT0iMzY2IiB3aWR0aD0iNzUiIGhlaWdodD0iMzciIHJ4PSIyIiBvbmNsaWNrPSJhdHRhY2soKTsiLz4KICAgICAgICAgIDx0ZXh0IGNsYXNzPSJidXR0b24tdGV4dCIgeD0iNCIgeT0iMzkwIj5TaWduIGluPC90ZXh0PgogICAgICAgICAgPGEgeGxpbms6aHJlZj0iaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL1JlY292ZXJBY2NvdW50IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJoNCIgdGV4dC1hbmNob3I9ImxlZnQiIGZpbGw9IiMxNWMiIHg9Ii0xMCIgeT0iNDQwIj5DYW4ndCBhY2Nlc3MgeW91ciBhY2NvdW50PzwvdGV4dD4KICAgICAgICAgIDwvYT4KICAgICAgICAgIDxhIHhsaW5rOmhyZWY9Imh0dHBzOi8vYWNjb3VudHMuZ29vZ2xlLmNvbS9TaWduVXAiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgPHRleHQgY2xhc3M9Img0IiB0ZXh0LWFuY2hvcj0ibGVmdCIgZmlsbD0iIzE1YyIgeD0iLTEwIiB5PSI0NzIiPkNyZWF0ZSBhIEdvb2dsZSBhY2NvdW50PC90ZXh0PgogICAgICAgICAgPC9hPgogICAgICAgICAgPGc+CiAgICAgICAgICAgIDxzdmcgaWQ9Im1zZyIgY2xhc3M9Im1zZyIgeD0iMjAiIHk9IjIwMCIgb25jbGljaz0iYXR0YWNrKCk7Ij4KICAgICAgICAgICAgICAgIDxyZWN0IHdpZHRoPSIyNTAiIGhlaWdodD0iMjAwIiByeD0iMTAiLz4KICAgICAgICAgICAgICAgIDx0ZXh0IGNsYXNzPSJtc2ctdGV4dCIgeD0iMTAiIHk9IjMwIj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiPlRoaXMgaXMgYSBkZW1vbnN0cmF0aW9uIG9mPC90c3Bhbj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiIGR5PSIxLjJlbSI+aG93IFNWRyBjYW4gYmUgYWJ1c2VkPC90c3Bhbj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiIGR5PSIxLjJlbSI+Zm9yIFBoaXNoaW5nIGF0dGFja3MuPC90c3Bhbj4KICAgICAgICAgICAgICAgICAgICA8dHNwYW4geD0iMTAiIGR5PSIyLjVlbSI+Rm9yIG1vcmUgaW5mbyB2aXNpdDo8L3RzcGFuPgogICAgICAgICAgICAgICAgPC90ZXh0PgogICAgICAgICAgICAgICAgPGEgeGxpbms6aHJlZj0iaHR0cDovL2d1eWEubmV0IiB0YXJnZXQ9Il9ibGFuayI+CiAgICAgICAgICAgICAgICAgICA8dGV4dCB0ZXh0LWFuY2hvcj0ibGVmdCIgeD0iMTAiIHk9IjE2MCIgc3R5bGU9ImZvbnQtc2l6ZToyMHB4O2ZvbnQtd2VpZ2h0OmJvbGQ7Ij5odHRwOi8vZ3V5YS5uZXQ8L3RleHQ+CiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgPC9nPgoKICAgICAgICAgPC9nPgogICAgICA8L2c+CiAgICA8L3N2Zz4KPC9zdmc+">POC of an SVG phishing attack embeded in an HTML5 Data-URI</a></span></p>
<p>Some of the attacker benefits are:</p>
<ol>
<li>This is just a link, no need to host anything.</li>
<li>AV won’t scan these links.</li>
<li>Not easily blockable – no domain to block.</li>
<li>More easily shared and distributed.</li>
<li>The attack is also cached in the browser history and doesn’t need Internet connection to be present at the moment of the attack.</li>
<li>Will propagate across devices. For example, if you’re signed-in into Chrome the attack will propagate to all of your devices. (You’ll still have to run it on each device though, just type data in the address bar).</li>
<li>Can be easily embedded in the naively looking *.URL file. Who doesn’t click on these? It always felt safe.</li>
</ol>
<p><span style="line-height: 1.5;">Everything said here is valid to all Data-URIs supported formats; notable is also text/html:<br><a href="data:text/html;base64,PHNjcmlwdD5hbGVydChkb2N1bWVudCk8L3NjcmlwdD4NCjxoMT5IZWFkZXIgaXMgaGVyZTwvaDE+">Here is an example</a></span></p>
<p>Actually Data-URIs have their own set of problems, which are not necessarily related to SVG. It works perfectly with SVG but the issues are more general. I’ll elaborate more in another post.</p>
<p><strong>More about the demo (Chrome Sign In)</strong></p>
<p>I don’t want give too many ideas for the bad guys, but the possibilities here are endless, I can already think of far more nasty vectors than this demo.</p>
<p>This specific demo has an image of the Google logo. I managed to create the Google logo as an SVG in about 7kb, but the Google logo in the demo is anyhow small and not too noticeable, it felt like a waste of KBs.</p>
<p>I found that the font used be Google for their logo is <strong><a href="http://www.myfonts.com/fonts/mti/calisto-mt/">catull</a></strong>, which is an old style serif typeface, and is similar to … you guessed it… <a href="http://www.myfonts.com/search/georgia/fonts/">Georgia</a>, that was good enough. Georgia is preinstalled on all OSs.</p>
<p>I know that might look horrible to fonts and esthetics lovers, but the average victim will easily fall for it.</p>
<p>One of the most important features of this attack is the SVG text-input. The user will need to enter his credentials somewhere.</p>
<p>Text-inputs are not natively available in SVG, though there were some attempts to create them.</p>
<p>I didn’t create fully functional text-inputs, didn’t think it’s appropriate for me to do it at this point – for various reasons. For one, I didn’t want to make it too easy to replicate this attack in the real. I’m sure that nearly perfect SVG text-inputs can relatively easily be created – one just need enough motivation.</p>
<p><strong>What about mobile?</strong></p>
<p>Smartphones are just fine with SVG, more on that later as well.</p>
<p><strong>Some tip to keep you safe</strong></p>
<ol>
<li>Be alert when clicking on links that direct to SVG files or Data-URIs.</li>
<li>Don’t double-click on SVG files to preview it in your browser.</li>
<li>Don’t preview unknown or unchecked SVG files in your browser.</li>
<li>Don’t export SVG from Adobe Illustrator and Inkscape without knowing where it came from and making sure it has no malicious script.</li>
</ol>
]]></content:encoded>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[Security]]></category>
    </item>
    <item>
      <title><![CDATA[The Pains and Remedies of Android HTML5]]></title>
      <link>https://guya.net/2013/10/24/the-pains-and-remedies-of-android-html5/</link>
      <guid isPermaLink="false">5f3b65ff-f663-4a91-aa3e-09a7d45d3fd6</guid>
      <pubDate>Thu, 24 Oct 2013 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[Prologue: I’ve written most of this post some months ago and somehow didn’t publish it. Looking at it now, it’s a good reminder of some of the pains I already…]]></description>
      <content:encoded><![CDATA[<p><strong>Prologue:</strong> I’ve written most of this post some months ago and somehow didn’t publish it. Looking at it now, it’s a good reminder of some of the pains I already forgotten. The Android version statistics already changed a bit by now, but, still today and even with the new type of measuring by Google – the most problematic Andorid versions which are <strong>2.2.x – 4.0.x</strong> are still <strong><a href="http://developer.android.com/about/dashboards/index.html" title="Android Platform Versions">running more than 50% of Androids out there</a>.</strong> Hence everything here still applies. (note that most of the bugs are in <strong>4.0.x <strong>and not in</strong> 4.1.x</strong> and above).<br> I’ve updated all the stats in the article to reflect the latest published stats.</p>
<p>These issues refer to HTML5 content running inside the native Android browser as well as  inside the native WebView (i.e. PhoneGap and alike)</p>
<p>———————————–</p>
<p>The promise of HTML5 is great, to be able to use the same code base on all clients and even on the server is really compelling.  While iOS has provided what it promise long time ago already – you can relatively easily create compelling HTML5 apps that will run on the iOS. Android HTML5 capabilities are still lagging far behind.</p>
<p>On paper Android 4.0.x <a href="http://developer.android.com/about/dashboards/index.html" title="Android Platform Versions">(20.6%)</a> was enhanced with many awaited features of HTML5. Similar to iOS 5. For example, Android 4.0.x was added with the important <strong>overflow:scroll</strong>, but, the Android 4.0 version is flawed. It has many other great features which are, sadly, mostly buggy. In fact this version is a buggy regression to the Android browser and WebView HTML5 capabilities.</p>
<p>It gets much better in Android 4.1, but this version still only holds only <a href="http://developer.android.com/about/dashboards/index.html" title="Android Platform Versions">(36.5%)</a> of Androids (48.6% including 4.2 &amp; 4.3). <del>Still today the most common version is 2.3.x which holds <a href="http://developer.android.com/about/dashboards/index.html" title="Android Platform Versions">(44%)</a> </del>and that version can not be avoided. Generally, if you’ll try to push the HTML5 envelop of the Android it’ll probably push you back.</p>
<p>Even with the new and optimistic way of Google to <a href="http://www.theverge.com/2013/4/2/4176532/google-changes-how-it-measures-android-version-adoption-sees-uptick" title="Google changes how it measures Android version adoption, sees uptick in Jelly Bean devices">measure Android versions distribution</a> it’s still clear that 2.2.x and 2.3.x and 4.0.x are still massively out there and needs to be supported.</p>
<p>Having said all that, it doesn’t mean you can’t create decent apps with HTML5 that will run properly on the Android. But you’ll have to consider its lacking abilities from the get go. Design the UI as simple as possible, without too many fancy CSS, images, and animations.</p>
<p>I will put here a list of some of the issues I had to go through while adopting HTML5 on the Android, I will keep this list updated.</p>
<p><strong><span style="text-decoration: underline;">Canvas:<br></span><span style="color: #ff0000;">Pain:</span></strong> Android** 4.1 – 4.3** render duplicated HTML5 Canvas<br><strong><span style="color: #339966;">Remedy:</span></strong> <strong>None</strong> of the parents HTML elements to the canvas should have <strong>overflow: hidden or overflow:scroll</strong></p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> In all Androids and especially <strong>4.x</strong> <strong>canvas</strong> drawing performance are extremely reduced by using canvas effects like <strong>shadowColor.</strong><br>**<span style="color: #339966;">Remedy:</span> **Try pre-rendering or adding the effects only when needed and/or once in every drawing cycles. For example, in a live drawing app – adding the effects only when the user stops to draw.</p>
<p><strong><span style="text-decoration: underline;">Network</span></strong>:<br><span style="color: #ff0000;"><strong>Pain:</strong></span> Android 2.x.x Making PUT (protocol) requests with no body will have no Content-Length header, it’s rejected by some servers/proxies i.e. NGNIX<br><span style="color: #339966;"><strong>Remedy:</strong></span> Configure NGNIX to accept it or send a {dummy: ‘data’} in the payload. i.e. $.ajax(‘PUT’, url, {dummy: ‘1’});</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> Android 2.x.x PUT (protocol) is cached on some versions of Android<br><span style="color: #339966;"><strong>Remedy:</strong></span><a href="http://www.adopsinsider.com/ad-ops-basics/what-is-a-cache-buster-and-how-does-it-work/" title="Cache Busting">Cache-bust</a> it, cache-bust all requests to the server even if it’s PUT.</p>
<p><strong><span style="text-decoration: underline;">Content</span>:</strong><br><strong><span style="color: #ff0000;">Pain:</span></strong> Box-scroll was introduced in Android <strong>4.0.x</strong>  but it has numerous issue on that version.<br><span style="color: #339966;"><strong>Remedy:</strong></span> Don’t use box-scroll for anything under than 4.1, or use iScroll or similar. The best, most performant, solution is to use postion:fixed for headers and footer and to simulate box-scroll.</p>
<p><strong><span style="color: #ff0000;">Pain:</span></strong> CSS pseudo <strong>:active</strong> selector is not working on <strong>2.x</strong>, working badly on <strong>4.0.x</strong>.<br><strong><span style="color: #339966;">Remedy:</span></strong> It is only perfect from Android <strong>4.1 and above</strong>, try to use your own implementation using touch events.</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> Making fixed content (position: fixed) issues on 2.x.x<br><span style="color: #339966;"><strong>Remedy:</strong></span> Works fine only  when the ViewPort is not resizable, use this in the html head:<br> &lt;meta name=”viewport” content=”width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no” /&gt;</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> Scrollbars shows over fixed content.<br><span style="color: #339966;"><strong>Reedy:</strong></span> When using a native shell, <a href="http://stackoverflow.com/questions/7088826/hiding-the-scroll-bar-in-webview" title="Hiding the scroll bar in WebView">scrollbars can be removed</a> using<br> webView.setVerticalScrollBarEnabled(false);<br> webView.setHorizontalScrollBarEnabled(false;</p>
<p><strong><span style="color: #ff0000;">Pain:</span></strong> Jumpy text inputs<br><strong><span style="color: #339966;">Remedy (native shell):</span></strong> <activity android:windowSoftInputMode=”adjustNothing” /><br><span style="color: #339966;"><strong>Remedy 2 :</strong></span> don’t use *{ -webkit-backface-visibility: hidden} or try to override it with *{ -webkit-backface-visibility:visible !important; }</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> Styling text-inputs that has focus<br><span style="color: #339966;"><strong>Remedy:</strong></span><a href="http://stackoverflow.com/a/9464837/275333">http://stackoverflow.com/a/9464837/275333</a>, <a href="http://java-cerise.blogspot.co.nz/2011/10/dodgy-double-input-fields-on-android.html">http://java-cerise.blogspot.co.nz/2011/10/dodgy-double-input-fields-on-android.html</a></p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> Android 4.0.x, any tap implementation will not be responsive enough, it will miss a lot of taps. (works fine with <strong>all</strong> other versions)<br><strong><span style="color: #339966;">Remedy:</span></strong> Essiest will be to revert to clicks on this buggy <strong>4.0.x</strong> version</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> In Android <strong>4.0.x</strong> long press is selecting text, on all other OSs it’s resolved with the css *{ -webkit-touch-callout: none; }<br><strong><span style="color: #339966;">Remedy (native shell):</span></strong> Use this Java snippet <a href="http://stackoverflow.com/a/11872686/275333">http://stackoverflow.com/a/11872686/275333</a></p>
<p><strong><span style="color: #ff0000;">Pain:</span> Duplicated Input fields</strong> on Android <strong>4.0.x</strong>. it happens because android uses another native input for fast typing response, it doesn’t work well with scrollable content. (very ugly hack google, if I may)<br> There are tones of hacks for that out there, most of it doesn’t work or at least doesn’t work good across devices.<br><span style="color: #339966;"><strong>Remedy (native shell):</strong></span> If you run in WebView – Don’t put text inputs inside a scrollable iframe or content with overflow:scroll. Putting this in the activity will auto scroll to the text-input (similar to iOS) android:<strong>windowSoftInputMode=”adjustPan”</strong> – only works on Android 4.0.x, not working on Android 4.1 and above (yeah really).<br><strong>adjustResize</strong> is working on all Androids I’ve tested, but that is less pretty and leads to jumpy inputs on older androids 2.x. <strong>adjustResize</strong> needs to be on the tags in order for it to work. I do not recommend that as well.<br> So to summarize the fiasco, <strong>adjustPan</strong> which give the best UX (similar to the iPhone) is only working on Android <strong>4.0.x.</strong><br><strong>adjustResize</strong> which is still nice in terms of UX can be made to work with all versions of Android, but can cause issues (jumpy text-inputs) for old <strong>2.x</strong><br><span style="color: #339966;"><strong>Remedy 2:</strong></span> Put this style on the text input **-webkit-user-modify: read-write-plaintext-only; ** Not great since it’ll make typing slower, it’ll be up to impossible to enter text on some devices. Swype keyboard won’t work either.<br><strong><span style="color: #339966;">Remedy 3:</span></strong> Shift the input element off the screen, and use the change event to render the text into another element. (this is too cumbersome, try to avoid it)</p>
<p><strong><span style="text-decoration: underline;">Misc:</span></strong><br><span style="color: #ff0000;"><strong>Pain:</strong></span><a href="/2011/05/11/cool-feature-of-html5/" title="Cool feature of HTML5">HTML5 PushState</a> is supported since Android 2.2, but somehow it was forgotten on Android 4.0 – 4.0.2 and some 4.0.3 devices. Told you these 4.0.x are cr*p…<br><strong><span style="color: #339966;">Remedy:</span></strong> Make sure your HTML5 app works well for devices without pushState support. Try a <strong>4.0</strong> emulator.</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> Incorrect dimensions, sometimes innerWidth &amp; innerHeight might still read 0 even after the DOM is ready.<br><span style="color: #339966;"><strong>Remedy:</strong></span>  Wait a few (~100 millisecond) after the DOM is ready to ask it what’s the window size is.<br><span style="color: #339966;"><strong>Remedy 2:</strong></span>Use screen.width &amp; screen.height (you’ll have to calculate the toolbar height)<br><span style="color: #339966;"><strong>Remedy 3:</strong></span> get the width/height from the server (using something like wufl)<br><span style="color: #339966;"><strong>Remedy 4 (native shell):</strong></span>  Get the size from the native shell.</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> WebSockets are not supported at all.<br><span style="color: #339966;"><strong>Remedy (native shell):</strong></span> Use this <a href="https://github.com/mkuklis/phonegap-websocket" title="Websocket PhoneGap plugin for Android">WebSockets PhoneGap plugin</a>. Don’t get bothered by sockets unless you really need to.</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> Web Workers doesn’t work at all<br><span style="color: #339966;"><strong>Remedy:</strong></span> Who cares..?!<br>**<span style="color: #339966;">Remedy 2 (native shell):</span> **Multi threaded, yeah baby.</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> Android <strong>2.x</strong> misses a lot of scrolls attempt because it’s stuck in touchmove event (error is: “Miss a drag as we are waiting for WebCore’s response for touch down.”)<br><span style="color: #339966;"><strong>Remedy 🙁</strong></span> No real remedy, I’m pretty sure there is no sulotion for that and using something like iScroll won’t solve it either.</p>
<p><span style="color: #ff0000;"><strong>Pain:</strong></span> DOM manipulation is extremely slow.<br><span style="color: #339966;"><strong>Remedy:</strong></span> documentFragments might help but don’t count on it.<br> You’re left with tricks, for example, It far smother to change visibility than to add/remove DOM elements.<br> It’s better to pre-render and just show() or hide() as needed, especially when animations are involved.</p>
<p><strong><span style="text-decoration: underline;">Some related links:<br></span></strong><a href="https://groups.google.com/forum/#!topic/phonegap/BFyBYjQp3a8">PhoneGap vs. Native: Some Thoughts on Going Native  
</a> <a href="https://news.ycombinator.com/item?id=3851515">Discussion in Hacker News  
</a><span style="line-height: 1.5;">These are one year old but still very relevant (sadly)<br></span><span style="line-height: 1.5;">Regarding point 1: Don’t remove images from the DOM, instead replace the src to a very small image (leason learned by the linkedin mobile team), 2: You can handle that, 3: There are good ways to do caching, 4: These days there’s reasonable debuging tools.</span></p>
<p><a href="http://www2012.wwwconference.org/proceedings/proceedings/p41.pdf" title="HTML5 for extending the device battery life (PDF)">HTML5 for extending the device battery life (PDF)</a></p>
<p><a href="http://www.jacksonfdam.com/sem-categoria/things-ive-learned-from-developing-for-mobile/" title="Things I’ve learned from developing for mobile">Some other pains &amp; remedies</a></p>
<p> </p>
<p>** Epilogue: ** Everytime I come across a cool HTML5 example and wonder how well it tuns on mobile, I try it on iOS  and mostly like what I see. Only to be disappointed with the way Android native browser run it. And I’m not talking solely about the old 2.x.x androids that mostly run these in an unacceptable way. Even the newer androids with new version of the OS doesn’t play smoothly as the mobile safari or even UIWebView. The only solution to HTML5 on Android at the moment, is to keep it simple, very simple.</p>
<p>When targeting an HTML5 app to run on mobile browsers, one can not assume that  her users will use anything other than the native browser (as opposed to the more capable Chrome for Android, for example). But,  if your running your HTML5 inside a native shell (i.e. PhoneGap) There are few projects that attempt to solve the native WebView problem, by letting us bundle a better webview.<br><a href="https://github.com/thedracle/cordova-android-chromeview">https://github.com/thedracle/cordova-android-chromeview</a><br><a href="https://github.com/davisford/android-chromium-view">https://github.com/davisford/android-chromium-view</a><br><a href="https://wiki.mozilla.org/Mobile/Projects/GeckoWebView">https://wiki.mozilla.org/Mobile/Projects/GeckoWebView  
</a>More on these will follow…</p>
]]></content:encoded>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Google Chrome]]></category>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Javascript]]></category>
      <category><![CDATA[Mobile]]></category>
    </item>
    <item>
      <title><![CDATA[Protecting Your Smart Phone, the Basics]]></title>
      <link>https://guya.net/2013/05/30/protecting-your-smart-phone-the-basics/</link>
      <guid isPermaLink="false">cf0e2e30-f4b9-4447-9c51-e240251f0344</guid>
      <pubDate>Thu, 30 May 2013 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[iPhone 1. Don’t jailbreak, a not jailbroken iPhone is a pretty secure device. 2. Use PIN code Settings -> General -> Passcode (and not something like 1234) 3.…]]></description>
      <content:encoded><![CDATA[<p><strong>iPhone</strong></p>
<ol>
<li>Don’t jailbreak, a not jailbroken iPhone is a pretty secure device.</li>
<li>Use PIN code <strong>Settings -&gt; General -&gt; Passcode</strong>** **(and not something like 1234)</li>
<li>Make sure data is really encrypted – default since iPhone 4 (which have hardware encryption). If you have an older version go to Settings -&gt; General -&gt; Passcode and look for “<a href="http://support.apple.com/kb/ht4175" title="Data Protection is Enabled">Data Protection is Enabled</a>” on the bottom.</li>
<li>Don’t install any profiles you’re not absolutely sure about. I saw that some ads company started to use these profiles in order to overcome the App Store restrictions. If you see something like <a href="http://www.bomgar.com/docs/content/resources/images/apple-ios/iphone_installingprofile.png" title="Profile screenshot">this</a> don’t approve it unless your absolutely sure. <a href="http://blog.skycure.com/2013/03/malicious-profiles-sleeping-giant-of.html" title="Malicious Profiles - The Sleeping Giant of iOS Security">Here’s some more info</a> about the danger of malicious profiles.</li>
<li>Consider using alphanumeric passcode by setting “Simple Passcode” to “Off”</li>
<li><del>Don’t use</del> Consider not using “Find My iPhone”. This is a trade off, “Find My iPhone” is really great tool for finding your lost phone. But, there is a 1 failure point which is your apple ID. Accessing it will gives attackers your exact position and an easy way to wipe all of your phone data.</li>
</ol>
<p><strong>Android</strong></p>
<ol>
<li>Don’t root your phone</li>
<li>Use a screen lock</li>
<li><a href="http://support.google.com/android/bin/answer.py?hl=en&answer=1663755">Encrypt data</a> – works better from Android 4.0 and above, might affect performance (it does <strong>not</strong> encrypt external SD card)</li>
<li>Use a security app like <a href="https://play.google.com/store/apps/details?id=com.lookout" title="Lookout Security &amp; Antivirus">Lookout</a> or <a href="https://play.google.com/store/apps/details?id=com.avast.android.mobilesecurity" title="avast! Mobile Security">AVast</a> – it’s free!</li>
<li>Don’t install an app unlesss you have decent amount of confidance in it, also check the permisisons it requires. Remeber to uninstall it if it’s useless.</li>
</ol>
<p>We all know that Android is open and its apps needs no approval, which make it more vurenable by nature. This openness has another aspect of vurnability, external SD cards will have variant quality and because of that the Android OS doesn’t encrypt it. It can’t promise a good enough performance on cheap external memory. Which make sense in a way, your somewhat compromising security by being open.</p>
<p><strong>Windows 8 Phone</strong><br> Never had a windows 8 phone only <a href="/2012/02/20/lose-when-youre-better/" title="Lose when you’re better">7.5</a>, but it’s obvious that Microsoft is batting big on their most loyal enterprise consumers, that need enterprise security. <a href="http://www.wpcentral.com/microsoft-beefing-security-windows-phone-8">From</a> <a href="http://www.mobilejaw.com/articles/2012/08/understanding-the-security-changes-in-windows-phone-8/">reading</a> <a href="http://blogs.tieto.com/enterprisemobility/2012/07/17/windows-phone-8-security-deep-dive/">online</a> it seems that it has a built in encryption but not for the SD card (same as Android).</p>
<p>Common sense still applies.</p>
<ol>
<li><span style="line-height: 15px;">Use screen lock </span></li>
<li>Encryption is built in for you, just don’t save anything important on the external SD card.</li>
</ol>
]]></content:encoded>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[iPad]]></category>
      <category><![CDATA[iPhone]]></category>
      <category><![CDATA[Security]]></category>
      <category><![CDATA[Windows Phone]]></category>
    </item>
    <item>
      <title><![CDATA[The Promise of Mobile HTML5]]></title>
      <link>https://guya.net/2013/04/20/the-promise-of-mobile-html5/</link>
      <guid isPermaLink="false">a1d63e4f-1336-4eea-a10a-fe4f485eac61</guid>
      <pubDate>Sat, 20 Apr 2013 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[Less than a year ago it seemed like HTML5 was going strong. With Facebook and Linkedin adopting the technology to reach most of the screens on the mobile and…]]></description>
      <content:encoded><![CDATA[<p>Less than a year ago it seemed like HTML5 was going strong. With Facebook and Linkedin adopting the technology to reach most of the screens on the mobile and on the desktop.</p>
<p>Linkedin had the better hybrid mobile app (HTML5 + native) and published a series of videos and articles about how they successfully did it with a team of “just” 5 developers.<br> Admittedly Linkedin app was really nice, but, after learning more about the internals of their app I’ve realized it wasn’t perfect.<br> For example the way they manage the application cache is not as good as the HTML5 app-cache that just works well out of the box. Using the term “it wasn’t documented” is not a good enough excuse, it was working well long before the debute of their app.<br> Also, their infinit scroll is just a not so infinit swipe, etc’</p>
<p>Anyhow, it appears that linkedin, similar to her bigger sister Facebook, <a href="http://venturebeat.com/2013/04/17/linkedin-mobile-web-breakup/" title="Why LinkedIn dumped HTML5 &amp; went native for its mobile apps">ditched its mobile HTML5 in favor of native.</a><br> Linkedin senior director for mobile engineering Kiran Prasad claims are that there is not a good debuger and no performance measuring tool.<br> Firstly the <a href="https://developers.google.com/chrome-developer-tools/docs/remote-debugging" title="Mobile Chrome Remote Debugging">debuggers</a> are <a href="http://www.iwebinspector.com/" title="Web Debugging for Safari on iPhone, iPad and PhoneGap for iOS 5.0 and 5.1">getting</a> there <a href="http://mobile.dzone.com/articles/device-debugging-phonegap-ios" title="On-Device Debugging With PhoneGap &amp; iOS 6">every day</a> (there are many more).<br> Secondly, profiling in the desktop and mobile Chrome will give you a general idea where memory is going. Profiling hybrid apps in iOS6 is also <a href="http://mobile.dzone.com/articles/device-debugging-phonegap-ios" title="On-Device Debugging With PhoneGap &amp; iOS 6">available</a>.<br> I don’t think that these are really the reasons, they simply needed a stronger platform and HTML5 became too difficult to scale to their needs. That’s reasonable, mobile HTML5 is definitely not for everything.</p>
<p>Yet, the promise is still here – use the same code base and the same web development skillset to deploy for: native apps for mobile, browser apps for mobile, cross platform for the desktop (also outside of the browser), and so much more.</p>
<p>So why mobile HTML5 is not there yet? I’ll outline some of the main reasons here:</p>
<p><strong>1. It’s not realy the same web development skillset</strong><br> Well it is in a way, for the simple stuff it is still mostly HTML, Javasctipt and CSS. But, even for the simple stuff, things that works just fine on the desktop browser can greatly affet smoothness, battery consumption, memory usage, and eventually crashes, when used in mobile.<br> Every bit of code needs to be perfected in order to maintain the user experiance. Not even talking about specific glitches in specific versions and OSes.</p>
<p><strong>2. Android – when it comes to HTML5 Android sux big time.</strong><br> iOS had good HTML5 support from the get go. It reached full maturity from iOS 5 which is currently all that is needed to cover the great majority of devices out there.<br> Android on the other hand only reached HTML5 maturity with version 4.1 which is less than 25% and going up slowly. The notorious Android fragmentation is affecting HTML5 as well.</p>
<p><strong>3. HTML5 apps doesn’t easily scale in terms of features</strong><br> You needs to be vigilant about every piece of code that is added.<br> For example, adding just a small feature like an image or a text to every item in a list can greatly hurt performance.</p>
<p><strong>4. HTML5 apps doesn’t easily scale in terms of crew</strong><br> You needs to be vigilant about every piece of code that is added.<br> In order to deliver the promise of same code base in all mobile devices and in the desktop you firstly need that all of your crew will be highly proficient. Mobile HTML5 apps can easily be ruined.<br> Secondly if you want that code to be used in the desktop as well, you need a greater level of harmony between members.</p>
<p><strong>5. Product ppl want stuff they see on other apps.</strong><br> Some of these stuff are very easy to create nativly but are extremly painfull when created in HTML5.<br> Product ppl needs to better understand the technology that is used.</p>
<p><strong>6. Native is not that hard to do</strong><br> At the end of the day wrting native apps for iOS and Android is not that difficult, it’ll be easier than HTML5 in many cases.<br> It’s way more diffuclt to ruin the smothness in native UI though I see many apps that manage to achive that.<br> An avarage native developer can easily achive good user experiance.<br> When writing native you can get a way with poorly written apps. Even if you will make the UI render itself 10 times more than it really needs to, you can still achive good user experiance that will satidfy most users.</p>
<p><strong>7. Peer presure, don’t be a chicken</strong><br> Some idiot with a rooted and very old phone, will install Android 4.0 mod (worse Android OS for HTML5). And than will start to whine that things don’t work smothly.<br> – That’s not even a real phone, idiot.<br> Announcements from facebook and linkedin ditching HTML5 in favor of native lowers the moral of HTML5 supporters and help “classic” developers that are intimidated by stuff like javascript to raise their heads.<br> What?! Can’t you write it in native what are you chicken – <a href="http://www.youtube.com/watch?v=IIwYZ5TTAwA" title="Back to the Future">nobody ever calls me chicken</a> (btw, this is how we’ll be in 2 years)<br> You will (almost) always have doubts about switching to native.</p>
<p><strong>∞. It’s not over, it’s barely just begun</strong><br> Don’t be let down by facebook and linkedin moving to native, it’s always depends on the type of app, resources and the kind of people involved.<br> Mobile HTML5 apps are deliverable and in good quality for some time already.<br> You will gain the benefits mentioned above of same codebase and skillset along with way better deployment model.<br> Done right, you can deploy new app versions like deploying a website. Without the need for approval, and without sacrificing much user experience.</p>
<p>The bottom line is that mobile HTML5 is here for somewhat long time already, but it’s not for everything and definitely not for everyone – yet.</p>
]]></content:encoded>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Google Chrome]]></category>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Javascript]]></category>
      <category><![CDATA[Mobile]]></category>
    </item>
    <item>
      <title><![CDATA[HTML5 Mobile Apps - Injection Heaven, Security Hell]]></title>
      <link>https://guya.net/2013/02/25/html5-mobile-apps-injection-heaven-security-hell/</link>
      <guid isPermaLink="false">9a4e6e9b-96e8-426f-8048-62b2f8d4fc14</guid>
      <pubDate>Mon, 25 Feb 2013 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[Three weeks ago Path.com was fined for stupidly stealing their user’s contact list and saving it onto their servers. Path’s doing was obviously wrong but I’m…]]></description>
      <content:encoded><![CDATA[<p>Three weeks ago <a href="http://techcrunch.com/2013/02/01/path-settles-with-ftc-over-privacy-row-will-pay-800k-and-establish-new-privacy-program-including-outside-audits/" title="Path Settles With FTC Over Privacy Row, Will Pay $800K And Establish New Privacy Program Including Outside Audits">Path.com was fined</a> for stupidly stealing their user’s contact list and saving it onto their servers. Path’s doing was obviously wrong but I’m not sure that their punishment was really justified, needing to pay this enormous bribe to the FTC using COPPA as an excuse. The lesson here is to always comply with <a href="http://www.coppa.org/" title="COPPA - Children&#39;s Online Privacy Protection Act">COPPA</a>.</p>
<p>Anyhow, in that same techcrunch article you can also find that “<a href="http://business.ftc.gov/documents/bus83-mobile-app-developers-start-security" title="Mobile App Developers: Start with Security">The FTC also took the opportunity to introduce a new set of guidelines for mobile developers</a>“. Although they explain early in that article that it’s not meant to be a guideline, I still feel they misses a lot.</p>
<p>When it comes to HTML5 apps even the simplest app can greatly compromise the user privacy and security. If we’ll take the FTC example of a simple and harmless alarm clock app, If that app is built using HTML5 its size and complexity doesn’t matter. All that is needed is one javascript injection that will pass thorough.</p>
<p>How will that code be injected you may ask – all that is needed is for the app to load some content from a remote server the simplest example will be the “Terms And Condition” page which is mostly loaded into a WebView. It can be a more “complex” settings, like choosing the favorite color or loading the saved alarms. Any kind of sharing will probably be way more open to be exploited, i.e. “share your favorite alarms”. Push messages might also bring malicious code. ETC’</p>
<p>The bottom line is that any injection of javascript will give an attacker a lot of control over the device, more often than not it’ll be persistant. HTML5 apps usually use the localStorage that is rarely flushed, and leverage native DBs and the file system. The “page” or webview is rarly refreshed, so even if the injection is not persistant it’ll be alive for a long time.<br> Things like stealing the user’s contact list and tracking the user location are pretty common. Enabled by default in iPhone <a href="http://phonegap.com" title="PhoneGap">PhoneGap</a> for example.</p>
<p>It’s only limited by the native API that is opened to Javascript, generally it’s very open, even more than the <a href="http://phonegap.com/" title="PhoneGap Home">PhoneGap</a> default API. I know of at least 1 popular HTML5 app that opens almost <span style="text-decoration: underline;">all</span> of the Android native API.</p>
<p>You see, Javascript is one tough beast – it can run almost anywhere.<br> Javascript was designed basically as a none important sidekick to the browser’s HTML, “it should not cause any problems by being poorly written and should fail silently and not interfere with the main thing that is HTML.” Seriously that how it was, we’re lucky it’s not case insensitive. I’m sure that back than some people though it’ll make it simpler and better.<br> So, Javascript will run in any dom element no matter how naive you may think it is, it will run in unexpected parts of the element without needing the <code>&lt;script&gt;</code> tag, i.e. <code>onerror=”attack()”</code>. It used to even run from CSS and from images, but we’re over that now asfaik in mobile browsers.</p>
<p>As opposed to that, it’ll take a very special case for injection to be able to execute arbitrary native code. You can make a native android app that will run anything – even get root, but I doubt that any legitimate app regularly download strings and run it as commands. (basically on rooted Android you can do exec(“su”) and everything else)</p>
<p>With Javascript the app does not need to be designed in any special way, an unsanitizes string will likely to execute.</p>
<p>These kind of injection are not the sole problem of <a href="http://phonegap.com" title="PhoneGap">PhoneGap</a> based applications.<br> Any app that uses HTML5, even if it’s mostly native, any API that is opened to javascript can be leveraged by an attacker.</p>
<p>Phonegap (Cordova) has a mechanism to white list remote hosts which is really only effective on the iOS. It adds a little bit of security, but many apps anyway uses a wildecard “*” to allow all hosts. The wildcard is used by default in the phonegap cloud (saas solution to build phonegap apps)</p>
<p>As you can see the option for an attacker are enourmoe, all it needs is one vector of injection and there is an open path (no phan) to <strong>take over all of the devices of all of the users.</strong></p>
<p>HTML5 apps that runs inside the mobile browser are also a nice target for injection attacks, althouygh it’s lacking most of the native api, there is still access to location in all mobile browsers. It’s less powerful for the attacker since it’ll prompt the user way more vigusly.<br> The <a href="http://dolphin-browser.com/" title="Dolphin Free Mobile Web Browser">Dolphin Mobile Browser</a> implement the full phonegap native api, for example (which is generally a good thing), but it makes in-the-browser websites and apps more exposed to attacks.</p>
<p>So what to do than?!<br> – Sanitize sanitize sanitize all user input, server and client!</p>
]]></content:encoded>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[iPhone]]></category>
      <category><![CDATA[Javascript]]></category>
      <category><![CDATA[Mobile]]></category>
      <category><![CDATA[PhoneGap]]></category>
      <category><![CDATA[Security]]></category>
    </item>
    <item>
      <title><![CDATA[Say What, Flash is More Secure Than HTML5?!]]></title>
      <link>https://guya.net/2012/10/15/say-what-flash-is-more-secure-than-html5/</link>
      <guid isPermaLink="false">f69dec01-94fb-4c23-a932-de7db38bfc0a</guid>
      <pubDate>Mon, 15 Oct 2012 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[So my favorite script kiddy and copycat, Feross (copied, note the shameless “I discovered” in his Quora post, LoL) Found a social engineering flaw in the HTML5…]]></description>
      <content:encoded><![CDATA[<p>So my favorite script kiddy and copycat, Feross (<a href="/2011/11/01/webcam-clickjacking-revived/" title="Webcam ClickJacking Revived">copied</a>, note the <a href="http://www.quora.com/Hackers/Is-it-possible-for-hackers-to-access-my-computers-webcam" title="Is it possible for hackers to access my computer&#39;s webcam?">shameless</a> “I discovered” in his Quora post, LoL)<br> Found a <a href="http://feross.org/html5-fullscreen-api-attack/" title="Using the HTML5 Fullscreen API for Phishing Attacks">social engineering flaw in the HTML5 fullscreen mode</a> that can be used for phishing attacks. This time it might be even his own finding… what do you know 😉</p>
<p>This flaw is very much similar to the well known and very old picture-in-picture<br><a href="http://www.clerkendweller.com/2009/9/15/Picture-in-Picture-Phishing-Attacks-and-Operating-System-Styles"><img src="/images/posts/2012/10/picture-in-picture-1.png" alt="Picture-in-Picture Phishing Attacks and Operating System Styles" title="Picture-in-Picture Phishing Attacks and Operating System Styles">  
</a> <a href="http://www.clerkendweller.com/2009/9/15/Picture-in-Picture-Phishing-Attacks-and-Operating-System-Styles" title="Picture-in-Picture Phishing Attacks and Operating System Styles">More info..  
</a>IMHO the old version is still way more dangers for phishing.</p>
<p><span style="text-decoration: underline;"><strong>So How Flash is more secure?</strong></span></p>
<p>What enables this HTML5 fullscreen flaw to exist in his prime is the fact you have <strong>full keyboard access</strong>. This way an attacker can more easily steal the user’s credentials.<br> After all fullscreen was existant in Flash for many years now, <a href="https://github.com/beefproject/beef/issues/702" title="beef FullScreen Attack">yet it was never compromised</a> this way. The main reason is that Flash is more secure is that it does <strong><span style="text-decoration: underline;">not</span></strong> allow full keyboard interaction in fullscreen.</p>
<p>Good thinking Adobe, taking care our security… oh wait… Flash was added with <a href="http://www.leebrimelow.com/?p=3311" title="Flash Player 11.3 fullscreen keyboard input">this feature</a> with version 11.3… after all Flash can’t be left behind…<br><a href="http://leebrimelow.com/flash/fullkeys/">Working demo…</a></p>
<p>Damn… but still Flash gives you a decent popup confirmation which HTML5 doesn’t<a href="/images/posts/2012/10/falsh_fullscreen3.png"><img src="/images/posts/2012/10/falsh_fullscreen3.png" alt="" title="falsh_fullscreen"></a></p>
<p>Yeah, I know Chrome give you a popup too, but **you don’t have to click on it to get FULL keyboard access.<br>**I constructed this <a href="http://guya.net/security/fullscreen/" title="Chrome FullScreen">“amazing” demo here</a> (chrome only), as you can see you get the message but the keyboard is fully functional and accessible through javascript.</p>
<p>****<a href="http://guya.net/security/fullscreen/" title="Chrome Fullscreen"><img src="/images/posts/2012/10/chrome_fullscreen.png" alt="" title="chrome_fullscreen"></a></p>
<p><a href="http://guya.net/security/fullscreen/" title="Chrome Fullscreen"><img src="/images/posts/2012/10/chrom_keyboard.png" alt="" title="chrom_keyboard"></a></p>
<p>So still Flash is more secure than HTML5 – in that respect.</p>
<p>It takes us back to what me and other were preaching about, that with great power comes great responsibility.<br> HTML5 have its own flaws and the more powerful it’ll become it will get even more.</p>
<p>Stay tuned…</p>
]]></content:encoded>
      <media:content url="https://guya.net/images/posts/2012/10/picture-in-picture-1.png" medium="image"/>
      <category><![CDATA[Adobe Flash]]></category>
      <category><![CDATA[ClickJacking]]></category>
      <category><![CDATA[Flash Security]]></category>
      <category><![CDATA[HTML 5]]></category>
      <category><![CDATA[Javascript]]></category>
      <category><![CDATA[Security]]></category>
    </item>
    <item>
      <title><![CDATA[I Didn't Wait for the iPhone 5]]></title>
      <link>https://guya.net/2012/09/16/i-didnt-wait-for-the-iphone-5/</link>
      <guid isPermaLink="false">201b6238-2b1a-48b3-b75c-798f25bb47d3</guid>
      <pubDate>Sun, 16 Sep 2012 00:00:00 GMT</pubDate>
      <dc:creator><![CDATA[Guy A]]></dc:creator>
      <description><![CDATA[I was an happy Android user ever since the Nexus One came out (the One was the first decent Android, btw). Since than I used a few Android phones and never…]]></description>
      <content:encoded><![CDATA[<p>I was an happy Android <a href="/2010/02/15/now-the-world-is-gone-nexus-one/" title="Now the world is gone, Nexus one">user</a> ever since the Nexus One came out (the One was the first decent Android, btw). Since than I used a few Android phones and never thought I will switch. Android is open, free, power to the people, and all that – but the fact is that the iPhone is still the best phone there is.</p>
<p>Last Android I used a lot is the <a href="http://www.gsmarena.com/samsung_galaxy_nexus_i9250-4219.php" title="Samsung Galaxy Nexus">Samsung Galaxy Nexus</a>, it has an impressive 720 x 1280 pixels, 4.65 inches screen, and overall a very nice spec. But overall it’s a bad phone. I was totaly not impressed by it. It only become good with the <a href="http://www.android.com/whatsnew/" title="Android 4.1, Jelly Bean: The world&#39;s most popular platform gets even better">Android 4.1 Jelly Bean update</a> (<a href="http://developer.android.com/about/dashboards/index.html" title="Android OS Stats">only 1.2%</a> of Androids). Google even use this phone in the Gelly Bean screenshots.</p>
<p>Developing mainly for mobile, I have an iPhone 4S laying around, I knew the iPhone is better but didn’t want to switch yet because I was used to the Android ecosystem, the great Gmail app and the way it sync everything nicely – this is  an area where the iOS is still lacking.</p>
<p>I always postpond it saying – I will switch with the iPhone 5.</p>
<p>But, one day it happened, I stuck my sim into the 4S and never looked back.The small screen got some time to get used to, but after a short while, you realize its qaulity is far superior than anything else.</p>
<p>When I first saw the leaked iPhone case I was a bit shocked – it can’t be only that, it’s exactly the same just a bit longer. If this is for real than Apple might be in trouble. Then I relized, it doesn’t matter if that only what we get, it’s still gonna be the best phone. The iPhone 4S is already the best phone, so any improvement of that is still the best phone.</p>
<p>Yeah, there is the <a href="http://www.samsung.com/global/microsite/galaxynote/note/index.html?type=find" title="Galaxy Note">note</a> with the huge screen, and the <a href="http://www.samsung.com/global/galaxys3/" title="Galaxy S3">S3</a> is impressive, but still these are niche phones.</p>
<p>Apple will not be able to go on forever with improving what they already have, they will have to reinvent the wheel – again. Hopefully that will arrive as well.</p>
<p>I’m still excited about every new Android version and device, but for now I’m on an iPhone.</p>
]]></content:encoded>
      <category><![CDATA[Android]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[iPhone]]></category>
    </item>
  </channel>
</rss>