There’s a weird tension in programming — on the one hand, as you learn the
ropes, you (hopefully) learn very quickly that the problem is almost always
in your code, and not, say, the compiler, stdlib, kernel, etc. This is usually
very correct; the people who’ve worked on those things have many times the
experience you did when you decided that there must be a bug in printf or
something.
You’ll later realise you tried to print something through a pointer to a
stack-allocated variable that’s long since gone. These accusations tend to
wane as you gain familiarity with your subject matter, and wax as you step out
into lands populated with ever more footguns, exposing more of the architecture
than you ever suspected was there. (See also: the emails from me to the libev
mailing list in 2011.)
At some point, though, your journies will take you to places where things
aren’t so clear cut, and you’ll start to gain a sixth sense; a kind of visceral
experience that things are not as they have been promised to be.
A few weeks ago, that sixth sense whispered in my ear: “what
if, instead of your cruddy bootloader written in a pre-1.0 systems language for
a platform you don’t fully understand, it’s the 20 year-old project with 80,000
commits that’s wrong?” And it was right.
I recently received an Inkplate, and while I’m in the
middle of a few interesting projects already, I couldn’t let it sit there
unused. Until I get a longer chunk of time to turn it into something really
nifty — maybe an embedded debugging helper of some kind — it can at least
mean I no longer need to have Mail.app open.
Ever find yourself needing to implement a device tree
blob
(aka FDT, flattened device tree) parser and want to save yourself some time?
Learn from my mistakes!
If you try to do it in one pass, you will hurt yourself
I charged headlong into writing
dtb.zig
by starting at the top of the Devicetree Specification page on the “Flattened
Devicetree (DTB)” Format” and reading down. It looked delightfully simple. Keep
in mind, I still didn’t know what I yet needed out of it, just that I probably
needed to reference the DTB to get it. (I kind of know better now.)
Note: this is a pretty long article which does a deep dive into breaking some amateur crypto. I go on for quite a bit. Make a cup of tea before reading, and get ready to read some code!
This, then, is a post about a broken homegrown cryptosystem; namely, that used in CodeIgniter, pre-2.2. This version was current until the release of CodeIgniter 2.2, on the 5th of June, 2014, and you can still find sites on it today.
The attack described in the post depends on a lot of things to go right (or wrong, if you will); it’s not just that they used a bad cipher, but also the fact that they rolled their own session storage, and implemented a fallback, and a dozen other things. This is probably typical for most bugs of this class; a bunch of bad decisions which aren’t thought through find their logical conclusion in complete insecurity.
I use Snapchat. It’s an app where you can take a
photo or short (< 10 second) video and send it to your friends who use the
service; they’ll then be able to see it, once, before it disappears forever.
My circle of friends use it basically as an extension of weird Twitter – most
snaps I send and receive are strange angles of weird objects; the completely
mundane but somehow therapeutic (7 seconds of the camera pointed outside the
window of a tram, pointed at the ground moving below); or just closeups of
Curtis Stone’s face,
wherever we see him.
Of course, the promise that they won’t get retained is just that: a promise.
Since your phone receives this image and shows it to you at some point, it must
be downloaded by your phone. If it can be downladed by the phone, it can be
downloaded by something else. We decided to find out how.
As programmers, we spend a lot of time just carting data from one place to
another. Sometimes that’s the entire purpose of a program or library (data
conversion whatevers), but more often it’s just something that needs to happen
in the course of getting a certain task done. When we’re sending a request,
using a library, executing templates or whatever, it’s important to be 100%
clear on the format of the data, which is a fancy way of saying how the data is
encoded.
(computing) The way in which symbols are mapped onto bytes, e.g. in the
rendering of a particular font, or in the mapping from keyboard input into
visual text.
A conversion of plain text into a code or cypher form (for decoding by the
recipient).
I think these senses are a bit too specific—if your data is in a computer in
any form, then it’s already encoded. The keyboard doesn’t even have to come
into it.