ʕ·ᴥ·ʔ Dmitry's Internet Website

eMudhra Python mitigations

The eMudhra problem is quite bad. Any system that depends on TLS/SSL and makes network requests is potentially vulnerable. eMudhra was added in spring 2019, so most versions of until 2026-10-20 have problems.

Examples of things in need of attention:

  • any Linux machines with old cron jobs/services making network requests
  • old Docker images deployed somewhere
  • CI package caches
  • Python venvs with the certifi dependency or with the pip dependency (which vendors its own certificates)

For Python specifically, you’ll need to update pip and uv, since they vendor their own certs and those are exposed.

 1# Update uv
 2brew update && brew upgrade uv
 3# or
 4sudo pacman -Sy uv
 5# or
 6uv self update
 7# Upgrade all Python installations which now ship a patched pip
 8uv python upgrade
 9
10# Updating pip
11python -m pip install "pip @ https://files.pythonhosted.org/packages/3f/06/3e4420302363fbb71be3c7f35ce042f54bfca330e3e66b3a2e3c4cca579f/pip-26.2.2-py3-none-any.whl#sha256=fd7f4dfa8190e014013b9f08f3e973f4e4c26ffd179a204895533a7254813a70"

More useful scripts and information here: Information for Python users regarding eMudhra / emSign CA certificate security incident - Announcements - Discussions on Python.org.

Any vulnerable venv needs to upgrade

1# Upgrade certifi and pip
2uv pip install -U certifi pip
3# If a uv.lock is present, it needs an explicit version bump
4uv lock --upgrade-package certifi

This script will find and print all Python venvs on your machine (under your user) and print the certifi version in that venv

1find ~ /opt /usr/lib -xdev -type f -path '*certifi/__init__.py' 2>/dev/null |
2while read f; do
3  v=$(grep -m1 -oP '__version__ = "\K[^"]+' "$f")
4  echo "$v  ${f%/__init__.py}"
5done | sort

CI/CD and Code Review

Now, review runs continuously, more like spellcheck while you write. Most changes have been reviewed and fixed by Claude at least once before a human is asked to look. This catches most routine mistakes, and saves team attention for higher-level questions and scrutiny.

As we move through big shifts in software dev practices, it’s grounding to get historical context and realize that much of what we do is more recent than we thought. In the 90s/00s, it wasn’t that uncommon for small teams to just push to trunk directly (as long as the build/test times were fast):

Some teams will choose to commit/push straight to the trunk. Most likely it is because they are a small team with each team member knowing what the others are up to. Their build is probably fast and relatively exhaustive, and they may well seldom experience a build breakage. If the build does break (post integration into trunk/main) then they most likely ‘revert’ the commit straight away, possibly locking the trunk for a short period of time while that is performed. If the team is really small (say three or four), in which case the team might allow someone to fix the build quickly and commit that in order to get the build green again.

Steve Yegge’s experiments with running an MMO come to mind - it’s not only a question of whether human review can keep up, but can your CI/CD keep up? Github is certainly feeling the strain of having to run CI/CD on every change. If the pace of change keeps increasing, I can see CI/CD running in a git bisect-like mode, only in response to a suspected problem, rather than on every commit.

Debugging SteamLink Streaming Issues

Surprisingly many things can go wrong with streaming a game from your computer to your TV. Most of these issues came up around this time last year when I played through Silksong, so I figured I’d write them up before I totally forget them (at this point I’m using Sunshine/Moonlight anyway).

Steam Link performance overlay graph

[… 631 words]

Rust and MistQL

I made a Rust port of MistQL, a query language for JSON-like data structures. I learned a lot about what goes into a program that runs a language: lexers, parsers, grammars, runtimes, and general language design. This was also my first serious project with Rust. I made a follow-up improvement that focused on memory management, which taught me a lot about Rust lifetimes, and, in particular, it taught me that JSON-like structures are very tough to represent in Rust. I’m not sure if I will get the motivation to write an in-depth post.

Recent Delphi Projects

A large portion of my work at Delphi has involved producing R packages for epidemiological data processing and forecasting. This includes:

  • epidatr - a package for downloading and processing epidemiological data.
  • epiprocess - a package for processing epidemiological data.
  • epipredict - a package for building forecasting models on epidata.

I used these to build data pipelines (in Python and in R) that flowed into forecasting models. I worked with a research team to design and implement our forecasting models. We read through Forecasting: Principles and Practice and Advanced R recently, as a reading group.

I have also built web apps with Django and FastAPI to Epidata API - Swagger UI. I have peered into the depths of data engineering to serve a 2TB versioned dataset in Postgres (and scoped potential migration to a datalake using DuckDB). Might do some technical writeups on this soon.

Sketches EP

I made an album of improvised acoustic guitar songs this February. It’s here on Bandcamp.

I am quite proud of it. Not so much of the guitar playing or the composition, but of the fact that I actually put something out. I’ve been playing guitar for almost 20 years and finishing and publishing projects has been my biggest challenge1.

So here’s to overcoming long-held hurdles.


  1. My two main projects were a cover of Sikth “Bland Street Bloom” in 2011 and a metal radio show called HEAVY from 2015-2016, which I co-hosted with my friend George Mossessian. ↩︎

All posts →