<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Opw on yomimono - something to read</title>
    <link>http://localhost:1313/tags/opw/</link>
    <description>Recent content in Opw on yomimono - something to read</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Fri, 22 Aug 2014 12:56:15 +0000</lastBuildDate>
    <atom:link href="http://localhost:1313/tags/opw/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>OPW FIN</title>
      <link>http://localhost:1313/blog/2014/08/22/opw-fin/</link>
      <pubDate>Fri, 22 Aug 2014 12:56:15 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/08/22/opw-fin/</guid>
      <description>&lt;p&gt;We&amp;rsquo;ve come to the end of my round of the &lt;a href=&#34;http://gnome.org/opw&#34;&gt;Outreach Program for Women&lt;/a&gt;, which sponsored my work with &lt;a href=&#34;http://www.openmirage.org&#34;&gt;the MirageOS folks&lt;/a&gt; this summer.  I was fortunate to be able to mark the occasion by joining my mentors and an awful lot of badass Xen hackers at the &lt;a href=&#34;http://events.linuxfoundation.org/events/xen-project-developer-summit&#34;&gt;Xen Project Developers Summit&lt;/a&gt; earlier this week, where I waved my extremely conspicuous American accent around in everyone&amp;rsquo;s face and saw some awesome presentations on Xen internals and research.  (&lt;a href=&#34;http://xenprojectdevelopersummit2014.sched.org/event/f08246d3babd972179ee05d4b310bd29?iframe=yes&amp;amp;w=i:0;&amp;amp;sidebar=yes&amp;amp;bg=no&#34;&gt;Xen on ARM is relatively performant!&lt;/a&gt;  &lt;a href=&#34;http://xenprojectdevelopersummit2014.sched.org/event/6cd3b3f8cacc3b711e22f8bcb418edbf?iframe=yes&amp;amp;w=i:100;&amp;amp;sidebar=yes&amp;amp;bg=no&#34;&gt;It&amp;rsquo;s hard to run 10,000 host VMs!&lt;/a&gt;  &lt;a href=&#34;http://xenprojectdevelopersummit2014.sched.org/event/fc33354584e57a307ccac0bae5fb0b2f?iframe=yes&amp;amp;w=i:0;&amp;amp;sidebar=yes&amp;amp;bg=no&#34;&gt;The HaLVM has already implemented a whole bunch of stuff I was thinking about doing!&lt;/a&gt;)&lt;/p&gt;</description>
    </item>
    <item>
      <title>I Am Unikernel (And So Can You!)</title>
      <link>http://localhost:1313/blog/2014/08/17/i-am-unikernel/</link>
      <pubDate>Sun, 17 Aug 2014 23:47:13 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/08/17/i-am-unikernel/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://jvns.ca&#34;&gt;Julia Evans,&lt;/a&gt; prolific blogger and rad person, gave me several kind comments on the &amp;ldquo;Why I Unikernel&amp;rdquo; posts (&lt;a href=&#34;http://localhost:1313/blog/2014/08/11/attack-surface-area/&#34;&gt;security&lt;/a&gt;, &lt;a href=&#34;http://localhost:1313/blog/2014/08/14/my-content-is-mine/&#34;&gt;self-hosting&lt;/a&gt;).  She also asked, quite reasonably, whether I&amp;rsquo;d written a high-level summary of how I host my blog from a unikernel.  &amp;ldquo;No, but I should,&amp;rdquo; I said, and unlike most times I say I should do something, I actually did it.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the very-high-level overview:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;use brain to generate content that some human, somewhere, might want to read (hardest step)&lt;/li&gt;&#xA;&lt;li&gt;write all that stuff in Markdown&lt;/li&gt;&#xA;&lt;li&gt;use &lt;a href=&#34;http://www.octopress.org&#34;&gt;Octopress&lt;/a&gt; to generate a static site from that Markdown&lt;/li&gt;&#xA;&lt;li&gt;use &lt;a href=&#34;http://www.openmirage.org&#34;&gt;Mirage&lt;/a&gt; to build a unikernel with the blog content&lt;/li&gt;&#xA;&lt;li&gt;upload the unikernel to an EC2 instance running Linux&lt;/li&gt;&#xA;&lt;li&gt;build a new EC2 instance from the uploaded unikernel&lt;/li&gt;&#xA;&lt;li&gt;make sure that newly generated instance looks like my website with new content&lt;/li&gt;&#xA;&lt;li&gt;shut down the Linux host that made the new EC2 instance&lt;/li&gt;&#xA;&lt;li&gt;make &lt;code&gt;somerandomidiot.com&lt;/code&gt; point to the new EC2 instance&lt;/li&gt;&#xA;&lt;li&gt;kill the EC2 instance which previously served &lt;code&gt;somerandomidiot.com&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;And below, one can find the gory details.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Content is Mine: Why I Unikernel, Part 2</title>
      <link>http://localhost:1313/blog/2014/08/13/my-content-is-mine/</link>
      <pubDate>Wed, 13 Aug 2014 15:33:52 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/08/13/my-content-is-mine/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;http://localhost:1313/blog/2014/08/11/attack-surface-area/&#34;&gt;Having a machine capable of executing arbitrary instructions on the public Internet is a responsibility&lt;/a&gt;, and it&amp;rsquo;s a fairly heavy one to assume just to run a blog.  Some people solve this by letting someone else take care of it &amp;ndash; GitHub, Tumblr, or Medium, for example.  I&amp;rsquo;m not so keen on that solution for a number of reasons, almost none of which are Internet-old-person crankery.&lt;/p&gt;&#xA;&lt;p&gt;First, and most emotionally: as dumb as my thoughts are, they&amp;rsquo;re &lt;em&gt;mine&lt;/em&gt;.  Not GitHub&amp;rsquo;s or Medium&amp;rsquo;s or any other group&amp;rsquo;s.  Most entities on the web don&amp;rsquo;t host user content out of the goodness of their heart; they&amp;rsquo;re getting something out of it, and it&amp;rsquo;s likely that they&amp;rsquo;re getting more out of it than the user is.  I&amp;rsquo;m reminded of the old MetaFilter maxim: &amp;ldquo;If you&amp;rsquo;re not paying for it, you&amp;rsquo;re not the consumer, you&amp;rsquo;re the product.&amp;rdquo;  Either someone&amp;rsquo;s making money off of you now or &lt;a href=&#34;http://idlewords.com/bt14.htm#ads&#34;&gt;they plan to do it later&lt;/a&gt;.  I don&amp;rsquo;t want to encourage that kind of behavior.  I just want to write things that people can read about how to make stuff work.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Attack Surface: Why I Unikernel, Part 1</title>
      <link>http://localhost:1313/blog/2014/08/08/attack-surface-area/</link>
      <pubDate>Fri, 08 Aug 2014 14:17:43 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/08/08/attack-surface-area/</guid>
      <description>&lt;p&gt;Before I started this blog, I had started a few others at &lt;!-- raw HTML omitted --&gt;my other domain&lt;!-- raw HTML omitted --&gt; (now moribund).  Despite repeated attempts, I never could resign myself to doing systems administration for a web server that executed dynamic code, like that which powers WordPress or Drupal; I&amp;rsquo;d install such a framework, begin &lt;a href=&#34;http://blog.softlayer.com/2012/tips-and-tricks-how-to-secure-wordpress/&#34;&gt;locking the site down&lt;/a&gt;, realize that I&amp;rsquo;d spent a lot of time reassuring myself that the site was secure without believing it for a second, then delete the framework and revert the frontpage to an &lt;code&gt;index.html&lt;/code&gt; rather like what&amp;rsquo;s present there now.  Particularly ambitious iterations would get a post or two published before this cycle completed, now long-vanished.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Doing Nothing in Mirage</title>
      <link>http://localhost:1313/blog/2014/07/25/doing-nothing-in-mirage/</link>
      <pubDate>Fri, 25 Jul 2014 13:30:49 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/07/25/doing-nothing-in-mirage/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s Northern Hemisphere summer right now, and in Wisconsin we&amp;rsquo;re having one of the loveliest ones I can remember.  Today the temperature is hovering right at pleasant, there are high clouds blowing across the sky, the breeze is soothing, and birds are singing all over the place.  It is not, in short, programming weather.  It is sit-outside, read-a-novel, do-nothing weather.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://flic.kr/p/jWqcS&#34;&gt;&lt;figure class=&#34;center&#34;&gt;&lt;img src=&#34;http://localhost:1313/images/bicycle_tree.jpg&#34;&#xA;    alt=&#34;Sunbeams stream through the leaves of a large tree, beneath which is a bicycle.&#34;&gt;&lt;figcaption&gt;&#xA;      &lt;h4&gt;Yes, this sort of thing.&lt;/h4&gt;&#xA;    &lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;We don&amp;rsquo;t often let our programs slack off, even when we let ourselves take a peaceful day.  I got to wondering (staring off into space, watching the shadows cast by sun-dappled leaves) what the most trivial, do-nothing Mirage project would look like, and how it could be constructed with a minimum of activity and a maximum of understanding.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[] dothraki@iBook:~$ mkdir trivial&#xA;[] dothraki@iBook:~$ cd trivial/&#xA;[] dothraki@iBook:~/trivial$ ls -alh&#xA;total 16K&#xA;drwxrwxr-x   2 dothraki dothraki 4.0K Jul 23 13:17 .&#xA;drwxr-xr-x 161 dothraki dothraki  12K Jul 23 13:17 ..&#xA;[] dothraki@iBook:~/trivial$ mirage configure --xen&#xA;[ERROR]      No configuration file config.ml found.&#xA;You&amp;#39;ll need to create one to let Mirage know what to do.&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Okay, we&amp;rsquo;ll have to do at least one thing to make this work.  Mirage uses &lt;code&gt;config.ml&lt;/code&gt; to programmatically generate a &lt;code&gt;Makefile&lt;/code&gt; and &lt;code&gt;main.ml&lt;/code&gt; when you invoke &lt;code&gt;mirage --configure&lt;/code&gt;.  &lt;code&gt;main.ml&lt;/code&gt; uses instructions from &lt;code&gt;config.ml&lt;/code&gt; to satisfy module types representing driver requirements for your application, then begins running the threads you requested that it run.  That all sounds an awful lot like work; maybe we can get away with not asking for anything.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[] dothraki@iBook:~/trivial$ touch config.ml&#xA;[] dothraki@iBook:~/trivial$ mirage configure --xen&#xA;Mirage      Using scanned config file: config.ml&#xA;Mirage      Processing: /home/dothraki/trivial/config.ml&#xA;Mirage      =&amp;gt; rm -rf /home/dothraki/trivial/_build/config.*&#xA;Mirage      =&amp;gt; cd /home/dothraki/trivial &amp;amp;&amp;amp; ocamlbuild -use-ocamlfind -tags annot,bin_annot -pkg mirage config.cmxs&#xA;empty       Using configuration: /home/dothraki/trivial/config.ml&#xA;empty       0 jobs []&#xA;empty       =&amp;gt; ocamlfind printconf path&#xA;empty       Generating: main.ml&#xA;empty       Now run &amp;#39;make depend&amp;#39; to install the package dependencies for this unikernel.&#xA;[] dothraki@iBook:~/trivial$ ls&#xA;_build  config.ml  empty.xl  log  main.ml  Makefile&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;That seems like a great start!  Maybe we can trivially achieve our dream of doing nothing.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[] dothraki@iBook:~/trivial$ make depend&#xA;opam install mirage-xen --verbose&#xA;[NOTE] Package mirage-xen is already installed (current version is 1.1.1).&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Resting on our laurels.  Excellent.  (In keeping with the lazy theme of this post, I&amp;rsquo;ll elide the &lt;code&gt;make depend&lt;/code&gt; step from future examples, but if you&amp;rsquo;re playing along at home you may discover that you need to run it when you introduce new complexity in pursuit of perfect non-action.)&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[] dothraki@iBook:~/trivial$ make&#xA;ocamlbuild -classic-display -use-ocamlfind -pkgs lwt.syntax,mirage-types.lwt -tags &amp;#34;syntax(camlp4o),annot,bin_annot,strict_sequence,principal&amp;#34; -cflag -g -lflags -g,-linkpkg,-dontlink,unix main.native.o&#xA;ocamlfind ocamldep -package mirage-types.lwt -package lwt.syntax -syntax camlp4o -modules main.ml &amp;gt; main.ml.depends&#xA;ocamlfind ocamlc -c -g -annot -bin-annot -principal -strict-sequence -package mirage-types.lwt -package lwt.syntax -syntax camlp4o -o main.cmo main.ml&#xA;+ ocamlfind ocamlc -c -g -annot -bin-annot -principal -strict-sequence -package mirage-types.lwt -package lwt.syntax -syntax camlp4o -o main.cmo main.ml&#xA;File &amp;#34;main.ml&amp;#34;, line 8, characters 2-13:&#xA;Error: Unbound module OS&#xA;Command exited with code 2.&#xA;make: *** [main.native.o] Error 10&#xA;[] dothraki@iBook:~/trivial$ &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Oh, bother.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Set the Evil Bit</title>
      <link>http://localhost:1313/blog/2014/07/08/how-to-set-the-evil-bit/</link>
      <pubDate>Tue, 08 Jul 2014 15:23:55 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/07/08/how-to-set-the-evil-bit/</guid>
      <description>&lt;p&gt;Our mission: fuzzing &lt;a href=&#34;http://localhost:1313/blog/2014/07/07/parsers-optional/&#34;&gt;TCP options&lt;/a&gt; from &lt;code&gt;scapy&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Our target: the &lt;code&gt;echo&lt;/code&gt; service from &lt;code&gt;mirage-tcpip/examples/services.ml&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Outcome: a revision on a widely-used OCaml dependency, gleeful murder and resurrection of several EC2 instances, something to brag to my mom about, a look at a case worse than failure, and great justice.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Parsers Optional</title>
      <link>http://localhost:1313/blog/2014/07/07/parsers-optional/</link>
      <pubDate>Mon, 07 Jul 2014 12:49:38 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/07/07/parsers-optional/</guid>
      <description>&lt;p&gt;Friends, I have spoken to you of &lt;a href=&#34;http://localhost:1313/blog/2014/06/03/the-minnesota-goodbye/&#34;&gt;TCP&lt;/a&gt; and of &lt;a href=&#34;http://localhost:1313/blog/2014/05/22/throwing-some-fuzzy-dice/&#34;&gt;fuzzing&lt;/a&gt;.  Next I will speak to you of both, but today, I will speak to you of TCP options.  If you&amp;rsquo;re here for the pwnage, sit tight; it&amp;rsquo;s coming.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-even-is-tcp-anyway&#34;&gt;What Even Is TCP Anyway&lt;/h3&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the lazy way of explaining it: TCP is the abstraction layer that allows you to pretend that network communication works in a logical, orderly, reliable fashion when you&amp;rsquo;re writing an application.  Reading data and having it always be in the order it was sent?  TCP.  Being able to know whether a connection is open or closed?  TCP.  Knowing the difference between data coming from two separate processes on the same remote host?  TCP.  (There are other ways to get these guarantees, but the vast majority of Internet traffic that needs them gets them via TCP.)&lt;/p&gt;&#xA;&lt;p&gt;On a less abstract level, TCP is a header (one of several!) that your operating system slaps on your network traffic before shipping it over the wire, on the way to its final destination.  For damn near all the information on TCP you can shake a stick at, you can consult &lt;a href=&#34;http://www.rfc-editor.org/rfc/rfc793.txt&#34;&gt;RFC 793&lt;/a&gt; directly.  The header summary, most relevant for our exploration, is reproduced below:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;0                   1                   2                   3   &#xA;0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 &#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|          Source Port          |       Destination Port        |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|                        Sequence Number                        |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|                    Acknowledgment Number                      |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|  Data |           |U|A|P|R|S|F|                               |&#xA;| Offset| Reserved  |R|C|S|S|Y|I|            Window             |&#xA;|       |           |G|K|H|T|N|N|                               |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|           Checksum            |         Urgent Pointer        |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|                    Options                    |    Padding    |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;|                             data                              |&#xA;+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Everything here is a fixed-length field except for &lt;code&gt;Options&lt;/code&gt;, &lt;code&gt;Padding&lt;/code&gt;, and &lt;code&gt;data&lt;/code&gt;, all of which are optional.  &lt;code&gt;Data&lt;/code&gt; is up to the application, when it&amp;rsquo;s present (and is also frequently referred to as &lt;code&gt;payload&lt;/code&gt;).  When you loaded this web page, TCP packets were sent from my server at &lt;code&gt;somerandomidiot.com&lt;/code&gt; to your computer, and the contents of the &lt;code&gt;data&lt;/code&gt; field were these very words that you&amp;rsquo;re reading right now.  TCP is &lt;code&gt;data&lt;/code&gt;-agnostic; it only cares that your payload arrives intact, not what&amp;rsquo;s in it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;Options&lt;/code&gt;, on the other hand, are very much TCP&amp;rsquo;s concern.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Minnesota Goodbye</title>
      <link>http://localhost:1313/blog/2014/06/03/the-minnesota-goodbye/</link>
      <pubDate>Tue, 03 Jun 2014 13:28:43 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/06/03/the-minnesota-goodbye/</guid>
      <description>&lt;p&gt;Looking into some of the &lt;a href=&#34;http://localhost:1313/blog/2014/05/22/throwing-some-fuzzy-dice/&#34;&gt;results from last week&amp;rsquo;s fuzzing session&lt;/a&gt;, I noticed something interesting:&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ tcpdump -r experimenting_with_pathoc.pcap &amp;#39;src host 192.168.2.24 and tcp[13] &amp;amp; 1 != 0&amp;#39;&#xA;reading from file experimenting_with_pathoc.pcap, link-type EN10MB (Ethernet)&#xA;$&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Let&amp;rsquo;s translate that into human.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;tcpdump -r experimenting_with_pathoc.pcap&lt;/code&gt;: use &lt;a href=&#34;http://www.danielmiessler.com/study/tcpdump/&#34;&gt;tcpdump&lt;/a&gt; to read an existing packet trace named &lt;code&gt;experimenting_with_pathoc.pcap&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;src host 192.168.2.24&lt;/code&gt;: show me only packets that were sent by &lt;code&gt;192.168.2.24&lt;/code&gt;, which is the IP address of a running unikernel that&amp;rsquo;s serving web pages on port 80.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;and tcp[13] &amp;amp; 1 != 0&lt;/code&gt;: of the packets sent by &lt;code&gt;192.168.2.24&lt;/code&gt;, show me only those where the least significant bit of the 13th byte of the TCP header was not zero.  The 13th byte of the TCP header is designated for flags relevant to how the packet should be processed by the &lt;a href=&#34;http://tcpipguide.com/free/t_TCPOperationalOverviewandtheTCPFiniteStateMachineF-2.htm&#34;&gt;TCP state machine&lt;/a&gt;, and the least significant bit corresponds to the &lt;code&gt;FIN&lt;/code&gt; flag, used to initiate graceful connection closures.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;All together, &amp;ldquo;show me all the packets sent by 192.168.2.24 which initiated a graceful connection closure.&amp;rdquo;  &lt;code&gt;tcpdump&lt;/code&gt; helpfully shows us&amp;hellip; all zero such packets in the trace.&lt;/p&gt;&#xA;&lt;p&gt;This isn&amp;rsquo;t necessarily wrong for a webserver implementing HTTP/1.1, which defaults to persistent connections:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;8.1.2 Overall Operation&lt;/p&gt;&#xA;&lt;p&gt;A significant difference between HTTP/1.1 and earlier versions of&#xA;HTTP is that persistent connections are the default behavior of any&#xA;HTTP connection. That is, unless otherwise indicated, the client&#xA;SHOULD assume that the server will maintain a persistent connection,&#xA;even after error responses from the server.&#xA;&amp;ndash; RFC 2616&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;So let&amp;rsquo;s make something that &lt;em&gt;will&lt;/em&gt; try to initiate a connection closure.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Throwing Some Fuzzy Dice</title>
      <link>http://localhost:1313/blog/2014/05/22/throwing-some-fuzzy-dice/</link>
      <pubDate>Thu, 22 May 2014 10:42:56 +0000</pubDate>
      <guid>http://localhost:1313/blog/2014/05/22/throwing-some-fuzzy-dice/</guid>
      <description>&lt;p&gt;I mentioned &lt;a href=&#34;http://localhost:1313/blog/2014/04/23/verb-your-own-noun/index.html&#34;&gt;a while ago&lt;/a&gt; that the &lt;a href=&#34;http://www.openmirage.org&#34;&gt;Mirage project&lt;/a&gt; agreed to have me on board, through the &lt;a href=&#34;https://opw.gnome.org&#34;&gt;OPW internship project&lt;/a&gt;, for the summer.  We started on Monday, and I&amp;rsquo;ve already had a lot of fun!&lt;/p&gt;&#xA;&lt;p&gt;Officially, my job for the summer is to help shore up the network stack in Mirage, in part by running the current code through its paces, and in part through implementing some new functionality.  This first week, I continued some work I started at the end of Hacker School - figuring out how to fuzz some strange (and not-so-strange) corners, and how to wrangle the data I got out of doing so.&lt;/p&gt;&#xA;&lt;h2 id=&#34;fuzz-what-now&#34;&gt;Fuzz What Now?&lt;/h2&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s step back.  Way, way, way back.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re a computer program, and you have some data that you care about, your data is likely in some kind of structure reflecting an underlying order to that data.  Objects are a common way to organize this stuff; dictionaries, hashmaps, lists, arrays, trees, the list goes on.  That&amp;rsquo;s all well and good when your program is running, keeping all this stuff in memory.  But it happens depressingly often that you need to dump this stuff to permanent storage, or express it in some way to some other program or another computer, or represent it on the screen because something awful has happened, and you can&amp;rsquo;t just say &amp;ldquo;&lt;code&gt;memory address 0x52413abd&lt;/code&gt;, &lt;code&gt;memory address 0x52413cda&lt;/code&gt;, &lt;code&gt;memory address 0x52413ea2&lt;/code&gt;&amp;rdquo; - these things are meaningless outside the context of the current run of that program.&lt;/p&gt;&#xA;&lt;p&gt;So we have &lt;a href=&#34;https://en.wikipedia.org/wiki/Serialization&#34;&gt;serialization&lt;/a&gt;, the high-level concept for the jillion different ways to take that data and put it in a string, or a binary data format, so something else can read that string and reassemble the structure of the data.  That&amp;rsquo;s deserialization, which implies parsing; parsing is &lt;a href=&#34;https://en.wikipedia.org/wiki/Abstract_syntax_tree&#34;&gt;a pretty big deal&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;When the data you&amp;rsquo;re attempting to assemble into a structure is as you expect it and everything is correct, parsing&amp;rsquo;s no problem.  But it frequently happens that everything is not as you expect it, for any number of reasons - the programmer who made the program that made the message made a mistake; the programmer who made the program that reads the message made a mistake; the programs reading and writing the message are using different versions of the specification in the first place; the specification wasn&amp;rsquo;t specific about whether the third byte&amp;rsquo;s range from 0 to 5 was inclusive or exclusive and each programmer made a different decision; both programs agree, but the message was corrupted in transit; the message was corrupted in transit, and one program has implemented a different corruption recovery algorithm than the other&amp;hellip; I&amp;rsquo;ll stop now, but I could keep going for a long time.&lt;/p&gt;&#xA;&lt;p&gt;There are a lot of bad messages out there.  It&amp;rsquo;s hard to make your parser do the right thing when it receives an arbitrary bad message.  It can be hard to even know that your parser does the &lt;em&gt;wrong&lt;/em&gt; thing when it receives an arbitrary bad message - if you thought of a certain kind of bad message to use in testing, of course you fixed your code to deal with it; you thought of it!  But there are almost certainly loads more bad messages out there than the ones you thought of - both by chance, and &lt;a href=&#34;http://insecure.org/sploits/ping-o-death.html&#34;&gt;by design&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;If humans can&amp;rsquo;t make enough bad messages, maybe computers can.  Randomly generating a whole mess of bad messages, sending them to your program, and seeing what happens is called fuzz testing, and it&amp;rsquo;s awesome.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
