La nostra istanza puntarella.party si è trovata a fronteggiare due problemi distinti di account spam. Il primo avveniva attraverso un grande numero di registrazioni e che utilizzavano disposable email (email temporanee): questi utenti una volta registrati rimanevano silenti per un certo periodo postavano poi qualche cosa di generico (probabilmente generato da AI) per guadagnare “fiducia” e poi pubblicavano contenuti fuori policy, cospirazionisti ecc… Questi account non avevano pattern ben definiti per le registrazioni se non motivazioni rubate dalle descrizioni di altri profili e l’utilizzo di email usa e getta.

Noi approvavamo già manualmente tutti gli utenti quindi non abbiamo avuto impatti su utenti o carico del db, solo un noiosissimo lavoro di moderazione dato che le richieste erano parecchie.

Il secondo caso è quello di registrazioni provenienti da bot AI che riempivano la coda di approvazione, fortunatamente questi hanno un pattern ben definito che spieghiamo più avanti

[Disclaimer:] Tutte le azioni da noi intraprese sono risultate funzionali e funzionanti per la nostra istanza/modalità di moderazione. Sentitevi liberi di usare tutto AS IS, non ci prendiamo responsabilità se distruggete l’istanza o il db [/Disclaimer]

Caso 1

L’approccio da parte nostra è stato un pochino aggressivo: abbiamo deciso di non accettare registrazioni con mail usa e getta. Chiedere di inserire una frase specifica come motivazione della registrazione è un compromesso ma lo spam restava molto, molti utenti non scrivavano comunque la frase richiesta e questo portava a troppi dubbi.

Abbiamo creato uno script che ogni notte scarica una lista di disposable email, la normalizza e la aggiunge tramite tootctl ai domini email bloccati.

Mastodon offre anche la possibilità di risolvere l’MX e bloccare quello, ma molti provider di email usa e getta utilizzano MX “leciti” come Cloudflare, abbiamo preferito evitare questa ipotesi per non bloccare domini email reali.

Trovate tutto in questo repository con istruzioni sia per Mastodon bare metal sia docker.

Caso 2

Caso più noioso perché le iscrizioni avvengono da domini gmail/icloud/hotmail che non possono essere bloccati per ovvi motivi, la buona notizia è che rispettano un pattern preciso:

  • Il nome utente è sempre bp + 16 caratteri esadecimali
  • La reason è sempre Automated protocol deliverability probe

Il modo migliore che abbiamo trovato per bloccarli e non farli arrivare neanche in coda di moderazione è stato quello di fare un trigger su postrges: in sostanza, se una richiesta di iscrizione soddisfa quelle due condizioni scatta un trigger sul database che fa il rollback della registrazione ignorandola e impedendo così che arrivi al backend di moderazione.

In caso di installazioni bare metal ci si collega prima al db

sudo -u postgres psql
\c mastodon_production

Poi si inserisce la seguente query

CREATE OR REPLACE FUNCTION block_automated_protocol_probe()
RETURNS trigger AS
$$
DECLARE
    v_username text;
BEGIN
    SELECT a.username
    INTO v_username
    FROM users u
    JOIN accounts a ON a.id = u.account_id
    WHERE u.id = NEW.user_id;

    IF NEW.text = 'Automated protocol deliverability probe'
       AND v_username ~ '^bp[0-9a-f]{16}$'
    THEN
        RAISE EXCEPTION 'Blocked automated protocol deliverability probe';
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg_block_automated_protocol_probe
BEFORE INSERT ON user_invite_requests
FOR EACH ROW
EXECUTE FUNCTION block_automated_protocol_probe();

Per spegnerlo temporaneamente

ALTER TABLE user_invite_requests
DISABLE TRIGGER trg_block_automated_protocol_probe;

Per riabilitarlo

ALTER TABLE user_invite_requests
ENABLE TRIGGER trg_block_automated_protocol_probe;

Per eliminare il trigger

DROP TRIGGER IF EXISTS trg_block_automated_protocol_probe
ON user_invite_requests;

DROP FUNCTION IF EXISTS block_automated_protocol_probe();

Applicando entrambe le mitigazioni la nostra coda di approvazione è libera dallo spam da almeno 2 giorni, rimangono delle spurie quali registrazioni da domini proton.me che non abbiamo cancellato per non tagliare fuori chi possiede protonmail e qualche dominio usa e getta che non è ancora censito ma che si può aggiungere a mano dal pannello di moderazione.