In 2015, I wrote one of my more popular blog posts, “Your Text Editor Is Malware”, about the sorry state of security in text editors in general, but particularly in Emacs and Vim.
It’s nearly been a decade now, so I thought I’d take a moment to survey the world of editor plugins and see where we are today. Mostly, this is to allay fears, since (in today’s landscape) that post is unreasonably alarmist and inaccurate, but people are still reading it.
|Is It Fixed?
vim.org is not available via
http://www.vim.org/ redirects to
|Emacs's HTTP client doesn't verify certificates by default
|Mostly! The documentation is incorrect and there are some UI problems1, but it doesn’t blindly connect insecurely.
|ELPA and MELPA supply plaintext-HTTP package sources
|Kinda. MELPA correctly responds to HTTP only with redirects to HTTPS, and ELPA at least offers HTTPS and uses HTTPS URLs exclusively in the default configuration.
|You have to ship your own trust roots for Emacs.
|Fixed! The default installation of Emacs on every platform I tried (including Windows) seems to be providing trust roots.
|MELPA offers to install code off of a wiki.
|Yes. Wiki packages were disabled entirely in 2018.
The big takeaway here is that the main issue of there being no security whatsoever on Emacs and Vim package installation and update has been fully corrected.
Where To Go Next?
Since I believe that post was fairly influential, in particular in getting MELPA to tighten up its security, let me take another big swing at a call to action here.
More modern editors have made greater strides towards security. VSCode, for example, has enabled the Chromium sandbox and added some level of process separation. Emacs has not done much here yet, but over the years it has consistently surprised me with its ability to catch up to its more modern competitors, so I hope it will surprise me here as well.
Even for VSCode, though, this sandbox still seems pretty permissive — plugins still seem to execute with the full trust of the editor itself — but it's a big step in the right direction. This is a much bigger task than just turning on HTTPS, but I really hope that editors start taking the threat of rogue editor packages seriously before attackers do, and finding ways to sandbox and limit the potential damage from third-party plugins, maybe taking a cue from other tools.
Thank you to my patrons who are supporting my writing on this blog. If you like what you’ve read here and you’d like to read more of it, or you’d like to support my various open-source endeavors, you can support me on Patreon as well!
the documention still says “gnutls-verify-error” defaults to
niland that means no certificate verification, and maybe it does do that if you are using raw TLS connections, but in practice,
url-retrieve-synchronouslydoes appear to present an interactive warning before proceeding if the certificate is invalid or expired. It still has yet to catch up with web browsers from 2016, in that it just asks you “do you want to do this horribly dangerous thing? y/n” but that is a million times better than proceeding without user interaction. ↩