Ben Fiedler

'changeme' is valid base64

Base64-encoding is ubiquitous in our modern world. Many programs communicate in base64-encoded messages, since these have nice properties: They consist of a very limited subset of ASCII characters, and can thus be displayed as text. E-Mails for example are commonly encoded in base64 in transfer, which can be seen in the Content-Transfer-Encoding header.

Where I volunteer we have a tradition of putting changeme as a placeholder for many template variables indicating that they should be overwritten later. Thus, if we later still see changeme anywhere we know that somewhere somebody must have forgotten to specify a variable1.

Sometimes these template variables should correspond to base64-encoded content, i.e. the base64-decoding of said variable should produce meaningful content. But what happens if somebody forgets to define said variable, and it is substituted with changeme instead? I always thought that it would fail to decode the string since the probability that changeme is actually valid base64 encoding must be very low. But lo and behold, this is not the case:

% echo changeme | base64 -d
r�[1m

Running hexdump on the output we can identify the characters:

% echo changeme | base64 -d | hexdump -C
00000000  72 16 a7 81 e9 9e      |r.....|
00000006

Mostly nonsense, but the second byte is interesting: It is an ASCII control character 2, meaning trips up all sorts of programs which expect to read printable ASCII characters, such as JSON deserializers.

This bug actually occurred when I was migrating some applications between different Kubernetes clusters: In the old cluster the application ran without problems, but I forgot to specify some variable in the new cluster, and it lead to Go complaining about non-ASCII characters in a JSON string.

I guess the moral of the story is: If you use dummy values be sure that they cannot be misinterpreted.

Articles from blogs I follow

Status update, July 2021

Hi! This status update comes a bit late, because I was on leave, biking in the south of France for a few days. This month I’ve released mako 1.6, to try to make up for the long delay for the last release. mako 1.6 brings quality-of-life improvements: modes a…

via emersion on

Paranoid NixOS Setup

Most of the time you can get away with a fairly simple security posture on NixOS. Don't run services as root, separate each service into its own systemd units, don't run packages you don't trust the heritage of and most importantly don't give…

via Christine Dodrill's Blog on

The mythical 10× programmer is just a good leader

There is some truth to the idea that some programmers are more productive than others. In practice, this is mainly a function of the breadth and depth of their experience, rather than an expression of innate talent. Under the right circumstances, the differe…

via Blogs on Sourcehut on