237153c026524132fbb389c5e69bb9578b207158
[web.git] / personal / _posts / 2018-06-02-mailman-subscription-spam.md
1 ---
2 title: "Fighting Mailman Subscription Spam: The Easy Way"
3 categories: sysadmin
4 ---
5
6 I recently noticed that both of the Mailman setups that I am running are being
7 abused for *subscription spam*: Bots would automatically attempt to subscribe
8 foreign email addresses to public mailing lists, resulting in a subscription
9 notification being sent to that address.  I am still extremely saddened by the
10 fact that this is a thing---whoever sends this spam has no direct benefit and no
11 way of selling anything (they don't control the content of the message); the
12 only effect is to annoy the owner of that email address, the victim.  That seems
13 to be enough for some. :(
14
15 Oh, and my servers' reputation goes down because people mark these emails as
16 spam.  So, more than enough reasons to try and stop this.
17
18 <!-- MORE -->
19
20 ### The Big Guns
21
22 My first reaction was to go and look for a way to add a CAPTCHA to the
23 subscription page.  Unfortunately, Mailman itself does not support a CAPTCHA (at
24 least not Mailman 2), and the existing patches I found were all about adding
25 support for Google's reCAPTCHA.  I am not going to expose my users to Google's
26 tracking like that, nor am I willing to actively discriminate against people not
27 having Google accounts (reCAPTCHA is much more annoying if Google can't track
28 you because you are not logged in), so reCAPTCHA was clearly not an option.
29 Instead, the plan was to look at one of these patches and implement a simple
30 question-and-answer CAPTCHA myself.
31
32 ### Keep It Simple
33
34 But then, while just getting started on this and browsing the Mailman sources, I
35 found out about `SUBSCRIBE_FORM_SECRET`.  `SUBSCRIBE_FORM_SECRET` is a Mailman
36 config option that, once set to a random string, will make Mailman embed a
37 [CSRF token](https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet)
38 into the subscription form.  Mailman will also enforce that the form must be
39 submitted *at least* five seconds after it was generated.  Since the bots that
40 have found my servers so far are much less patient than that, just setting
41 `SUBSCRIBE_FORM_SECRET` was enough to completely get rid of the subscription
42 spam.
43
44 So, if you are reading this and running a Mailman installation: **Please set
45 `SUBSCRIBE_FORM_SECRET` and protect your setup against abuse!**  Just run `pwgen
46 16` to get some random string, and then add `SUBSCRIBE_FORM_SECRET = "<random
47 string here>"` to `/etc/mailman/mm_cfg.py`.  It's really that simple!  Just a
48 [four-line patch in my Ansible playbook](https://git.ralfj.de/ansible.git/commitdiff/937b170594be82e500ae726dc47de8ca9ef3dfcf)
49 to get this rolled out to all servers.  Note that you need to be at least on
50 Mailman 2.1.16 for this to work; all currently supported versions of Debian come
51 with a recent enough version (if you use backports on Debian 7 "Wheezy").
52
53 The more people do this, the more it will help to stop this kind of spam.  Or
54 rather, it'll force the spammers to upgrade their game.  I assume eventually I
55 *will* have to add a CAPTCHA.  Or maybe there is a simple and reliable way to
56 migrate to Mailman 3 before that happens---and maybe that will have a CAPTCHA.
57 (Though, from a quick search, it doesn't seem like it does, which I find pretty
58 surprising.  If my tiny servers are abused like this, I assume it's a really
59 common problem and Mailman should protect against it per default.)