Programming

The earliest memory I have of ‘programming’ is in the early/mid 90s when my father brought home a computer from work. We could play games on it … so of course I took the spreadsheet program he used (LOTUS 123, did I date myself with that?) and tried to modify it to print out a helpful message for him. It … halfway worked? At least I could undo it so he could get back to work…

After that, I picked up programming for real in QBASIC (I still have a few of those programs lying around), got my own (junky) Linux desktop from my cousin, tried to learn VBasic (without a Windows machine), and eventually made it to high school… In college, I studied computer science and mathematics, mostly programming in Java/.NET, although with a bit of everything in the mix. A few of my oldest programming posts on this blog are from that time.

After that, on to grad school! Originally, I was going to study computational linguistics, but that fell through. Then programming languages (the school’s specialty). And finally I ended up studying censorship and computer security… before taking a hard turn into the private sector to follow my PhD advisor.

Since then, I’ve worked in the computer security space at a couple of different companies. Some don’t exist any more, some you’ve probably heard of. I still program for fun too, and not just in security.

But really, I still have a habit of doing a little bit of everything. Whatever seems interesting at the time!


Recent posts (Page 5 of 74)

Advent of Code 2025

It’s back! (Advent of Code)!

It’s been ten years (of advent of code, I haven’t done them all (yet)) and oh what a ten years it’s been. This time around, there will be only 12 days instead of 25, but honestly, that means I’m not working on these right up until Christmas. So I’m okay with this.

Once again, Rust! But this time, I won’t be using cargo-aoc, instead I wrote my own proc macros. Mostly to see if I could. 😄 See this section for more information.

Full solutions will once again be posted to GitHub (including previous years and possibly some I haven’t written up yet): jpverkamp/advent-of-code

read more...

API Tricks: Wikipedia Table JSON API

Quick, what is the order of the (as of now) 63 released Walk Disney Animation Studios films?

$ api=https://www.wikitable2json.com/api; \
  page=List_of_Walt_Disney_Animation_Studios_films; \
  curl -s "$api/$page?table=0&keyRows=1" \
  | jq '.[0][].Film' -rc \
  | egrep -v '^as' \
  | nl

     1	Snow White and the Seven Dwarfs
     2	Pinocchio
     3	Fantasia
...
    61	Strange World
    62	Wish
    63	Moana 2

There is a list on Wikipedia: List of Walt Disney Animation Studios films, but the tables there are … a bit of a pain to copy paste. I could very well just manually do that, but where’s the fun in that?

Luckily, someone went through the work of providing a wrapper around Wikipedia that will extract all (or selected) tables from a Wikipedia page!

To break down the command:

  • curl -s https://{...}?table=0&keyRows - Download the first (zero based indexing) table on the page; use the first row as column names (-s for ‘silent’ mode)
  • jq '.[0][].Film - Extract the first table in the response (.[0]), for each row in that table [] extract the film name .Film
  • egrep -v '^as - Remove rows starting with ‘as …’; these are extra rows when the studio was renamed

And that’s it!

Using CSP unsafe-hashes

So here’s a fun one: how does the unsafe-hashes directive in a content security police work?

In a perfect world, you don’t need it. You can write a CSP with a minimal script-src policy, including only scripts from your own domains (self) or a list of specific other scripts or at worst domains.

But sometimes real life (and third party libraries) get in the way.

It starts with inline scripts. So you have to add unsafe-inline. But there’s a better way to do that: CSP nonces. Specify a randomly generated (per request) nonce in the CSP header and then apply that same nonce to every script tag. Voila. Better.

The problem: inline JavaScript events

But what about something like this:

<button onClick="doSomething();">

Well, you might say, don’t do that. Write it as a script:

<button id="doSomethinger">

<script nonce="correctHorseBatteryStable">
document.getElementById("doSomethinger").addEventListener("click", function() {
  doSomething();
});
</script>

But like I said–third parties scripts can be imperfect. And sometimes, they just insist on embedding their own event handlers inline.

A solution: unsafe-hashes

Enter: unsafe-hashes.

Basically, you can add this to your CSP:

script-src 'unsafe-hashes' 'sha256-44558f2c36efd8163eac2903cec13ed1fafcca51abd91d9f696321ab895f1107'

This tells the browser that you are allowed to have event listeners directly on HTML elements… so long as the content of the JavaScript hashes exactly to any hash listed as an unsafe-hash:

$ echo -n "doSomething();" | sha256

44558f2c36efd8163eac2903cec13ed1fafcca51abd91d9f696321ab895f1107

It gets worse: dynamically generated JavaScript

There is, however, one problem with this that does come up unfortunately often. If you’re already dealing with third parties not doing things you wish they would, well then you have to deal with fun code like this:

<?php
foreach ($buttonIds as $buttonId) {
    echo '<button onclick="doSomething(' . $buttonId . ');">Button ' . $buttonId . '</button>' . PHP_EOL;
}
?>

Unfortunately… that completely blows up the CSP. Because…

$ echo -n "doSomething(1);" | sha256
2ef899c15aae95711855a45a5bb93c55363162e0e75e295aad4f189f20323d7c

$ echo -n "doSomething(5);" | sha256
0e03bb385169b89c95eb62659f50604ffb8283154bd58ab8cc7e692c4b5c05a3

$ echo -n "doSomething(42);" | sha256
4d9691449db6740ee19207c5bb52361eb97e18f06352ed400f83ae7caee270da

Just hashes doing hash things there. So basically, you have to be able to dynamically generate your CSP on the fly, including all of the hashes of all of the functions and with each of their arguments that are either possible or (even better) actually used.

And this isn’t fun at all.

Now, you might say: but you can do something like this:

<?php
foreach ($buttonIds as $buttonId) {
  echo '<button data-id="$buttonId" onclick="doSomething(this.dataset.id);">'
}
?>

After all

$ echo -n "doSomething(this.dataset.id);" | sha256

d2ecabb98b1bb7cc81cd75d43dcb7bac08ce31055339920976cb92aa2f5dd2f5

Only one hash!

But if you have that much control… then why are you using inline JavaScript in the first place?

Is it safe?

Is this safe?

No. It’s called unsafe-* for a reason. An attacker that controls input can theoretically take any of the hashed functions you’re including (like submitPayment…) and inject them in places they shouldn’t be. And heck, if you manage to find a SHA-256 hash collision? Well, then you have far more interesting things to do with that then attacking some site that found themselves force to used unsafe-hashes

But it’s better than unsafe-inline without nonces which allows arbitrary inline scripts. And unfortunately, there’s no way to actually use nonces with inline scripts.

And while a perfectly secure system would be the best case, it’s absolutely better to do as much as you can to secure a system rather than doing nothing waiting for the perfect solution to become possible.

Onward!

Building a virtual CPU from NAND gates up

Building a virtual CPU from NAND gates up

Over the past couple of weeks, I’ve spent entirely longer than I probably should have falling down the rabbit hole that is the game Turing Complete.

In a nutshell, you start with basically nothing, build up simple logic gates, create memory cells and 1-bit addition, build that into 8-bit math and logic, read instructions RAM, implement loops, and function calls (in hardware!), and eventually use your very own custom built CPU to solve a few programming challenges.

read more...


All posts