Also /c/modabuse. Also /c/yepowertrippinbastards. Also lemmy.ml/c/worldnews, comrade, ACAB, and 552 individual accounts across 67 instances, about half of them on lemmy.world.

None of this is in the source code. It’s downloaded at runtime from a file nobody has ever looked at.

If you’re just tuning in

Tesseract is a third-party web frontend for Lemmy, maintained by asimons04 and licensed AGPL-3.0. Admins deploy it on their own servers alongside or instead of lemmy-ui, and there are public instances of it people use to browse Lemmy generally. If you’ve used a Lemmy site that didn’t look like stock Lemmy, there’s a fair chance it was this.

Last week db0 posted a PSA: Tesseract contains a blacklist of instance domains compiled directly into the application. 32 of them. Admins can’t see it, can’t configure it, and aren’t told it’s there. Connect to a listed instance and the app tells you it’s “incompatible,” which is not true.

I went through the code to see how that was implemented. The hardcoded list turns out to be the small half of the system.

There’s a second filter policy fetched over HTTP every time the app loads. It isn’t in the git repository. It’s unauthenticated and world-readable, so anyone can pull it. Right now it carries 552 user accounts, 2,275 username patterns, 54 instances, 97 communities, 289 keyword patterns and 351 domains, with every category set to hide matches rather than flag them. Not collapsed behind a click. Simply absent, with no indication anything was removed.

Verify all of it in ten seconds

curl -s https://tesseract.dubvee.org/tesseract/api/system/policy \
  | base64 -d | gunzip > policy.json

That’s the live policy, base64-wrapped gzip, 111KB of JSON when it unpacks. There’s a stale fallback copy at /data/policy.dat as well.

It filters criticism of moderators

  • lemmy.sdf.org/c/modabuse — listed
  • lemmy.dbzer0.com/c/yepowertrippinbastards — listed
  • lemmy.dbzer0.com/c/YPTBcirclejerk — listed
  • community regex power ?tripping?
  • keyword censoring me

Call the rest of it whatever you like. This part is not spam defence.

It filters words

The 32 community name patterns include Communis(t|m), Conservativ(e|es|ism), Leftis(t|m), Libertarian(ism)?, ^Green Part(y|ies), Zionis(t|m), (Police|Cops), guillotine and billionaire.

Keywords include comrade, ACAB, neoliberal, proletaria(n|t) and death to.

Filtered communities on instances that aren’t blocked: lemmy.ml/c/worldnews, lemmy.today/c/news, lemmy.ca/c/politicalnewscanada, lemmy.ca/c/usa, infosec.pub/c/strategic_unions.

The 552 users aren’t bots

67 instances. 272 on lemmy.world alone, 40 on sh.itjust.works, 19 on lemmy.ca, and 28 instances contributing exactly one person each.

355 of the 552 usernames are plain alphabetic, twelve characters or under, median length eight. Only 36 look like spam registrations. A bot list looks like the opposite of that.

Seven of them aren’t even Lemmy. There are Mastodon and Friendica accounts in there: people who have never used Lemmy, hidden by a Lemmy frontend, with no possible way of finding out.

I have the list and I’m not posting it. Most of these are ordinary people who got pattern-matched, and 552 names on this comm is a harassment target inside an hour. Run the command above and grep for yourself.

And it lies about it

When the instance block fires you get: “Incompatible Instance. Not Supported. $instance is not compatible with Tesseract.”

Nothing is incompatible. It’s a policy decision dressed as an API error, and it’s what had db0 chasing a version mismatch that never existed.

For the hidden users, communities and keywords, you get no message at all.

Admins can’t switch it off

Tesseract has env vars for PUBLIC_DOMAIN_BLACKLIST, PUBLIC_FAKE_NEWS_BLACKLIST and the shortener lists. There is none for either blocklist. enableToxicMode bypasses the other filters and explicitly not this one.

Self-host it and you cannot disable this, nothing in your config admits it exists, and the contents can change without you pulling a commit.

Before someone says it

A lot of that domain list is real spam defence. It filters conservatism as well as communism. “It targets the left” doesn’t survive the data and I’m not going to pretend it does.

The problem is that spam filtering and political editorial got welded into one undocumented, remotely-updatable blob, shipped hidden, to admins who’ve never read it and users who don’t know it’s there. The spam work is what makes the rest unauditable: “it’s a spam list” answers every individual question and none of the whole.

And /c/modabuse is not spam.

Asks

  1. Publish the runtime policy in the repo, or kill the endpoint.
  2. Stop reporting a policy block as a technical incompatibility.
  3. Tell users when something’s been hidden. One line.
  4. Give operators an off switch, like every other blacklist in the codebase has.

It’s AGPL-3.0 and db0 already forked it. That’s the licence working as designed. But forking isn’t disclosure, and the admins who need this are precisely the ones with no reason to go looking.

If you run Tesseract, you are relaying a 111KB moderation policy you have never read, under your instance’s name, to users who don’t know it exists.

Full contents of every list, unedited, in the comments.

    • eldavi@lemmy.ml
      link
      fedilink
      English
      arrow-up
      3
      arrow-down
      1
      ·
      2 months ago

      it used to be par for the course in the foss world as you could see torvalds’ rants targeting some developers and i suspect it never went away.

  • ea6927d8@lemmy.ml
    link
    fedilink
    English
    arrow-up
    39
    ·
    2 months ago

    I thought piefed’s main developer crusade was pathetic enough. This is something else.

  • davel@lemmy.ml
    link
    fedilink
    English
    arrow-up
    28
    arrow-down
    1
    ·
    2 months ago

    @Cowbee@lemmy.ml, explain yourself:

    $ curl -s https://tesseract.dubvee.org/tesseract/api/system/policy | base64 -d | gunzip \
    >    | gron | grep -iP '(davel|cowbee|yogthos)'
    json.userRegexes[466] = "^davel$";
    json.userRegexes[2187] = "^yogthos$";
    $
    
  • Nutomic@lemmy.mlM
    link
    fedilink
    English
    arrow-up
    26
    ·
    2 months ago

    Wow this “policy” has 3700 lines in total. It must take a lot of time to create and maintain it. How does someone even find the time for that?

    I tried to access some blocked users and communities via tesseract.dubvee.org and it simply shows a generic “Not Found” error. So this is impossible to figure out for the average user. Even for developers it would be hard to figure out if the JSON file was hidden a bit better.

  • ZeroHora@lemmy.ml
    link
    fedilink
    English
    arrow-up
    26
    arrow-down
    2
    ·
    2 months ago

    I saw a funny weirdo saying that this person is just blocking “extremists”. How in the fuck doing this shit is not extreme extremist radical liberalism??? They like the status quo so much that they don’t want to see people complain about it LMAO

  • Rentlar@lemmy.ca
    link
    fedilink
    English
    arrow-up
    21
    ·
    2 months ago

    Like I would have zero problems with developers that do this, if they could come out clearly and document/announce: “I don’t like these accounts or words, if you do then this is what you do to change it or shut it off.”

    Stuff like Lemmy’s word list, Piefed’s default blocklist, you can turn off or change the words. Even if I think the daily vote quota is a stupid default on setting, if you’re a Piefed admin and don’t like that, set the limit to 10000, 99999999 or whatever. I usually have tons and tons of sympathy for FOSS devs, take their side and give the benefit of doubt in grey areas. They work for free and share it for free so I don’t expect perfection or how I would want things to be.

    Undocumented shit like this, intentionally hidden is way past the line, and I have no patience for it whatsoever. You never know when this could be somehow used as an attack vector.

    • Rentlar@lemmy.ca
      link
      fedilink
      English
      arrow-up
      10
      ·
      2 months ago

      One note/minor correction, it is in the git repo: https://github.com/db0/tesseract/commits/main/static/data/policy.dat

      You can see when asimons04 changed the static base64 filter .dat file. The changes happen in completely unrelated or nondescript commits. Looking at the commit when it was implemented, it does say filter, but the error messages and code comments creating the folder indicate “cache” folder creation, when the variable name and function is for the policy, which might technically be correct, is misleading and is quite suspect to me.

    • davel@lemmy.ml
      link
      fedilink
      English
      arrow-up
      2
      arrow-down
      1
      ·
      2 months ago

      Stuff like Lemmy’s word list

      Lemmy’s slur filter is disabled by default. It’s opt-in at the admin level, and most instances don’t opt for it, including your own I believe.

      I don’t know why this molehill keeps being made into a mountain.

  • Ecco the dolphin@lemmy.ml
    link
    fedilink
    English
    arrow-up
    20
    ·
    edit-2
    2 months ago

    “It targets the left” doesn’t survive the data

    I mean, sure but, isn’t that like pointing out you’ve banned vegans to your BBQ ribs restaurant along with (insert group here)

    • ShinkanTrain@lemmy.ml
      link
      fedilink
      English
      arrow-up
      39
      ·
      2 months ago

      The law, in its majestic equality, forbids the rich and poor alike to sleep under bridges, to beg in the streets, and to steal bread

      • eldavi@lemmy.ml
        link
        fedilink
        English
        arrow-up
        7
        ·
        2 months ago

        soup kitchens for the rich and soup kitchens for the poor is equality… lol

  • DupaCycki@lemmy.world
    link
    fedilink
    English
    arrow-up
    16
    arrow-down
    1
    ·
    2 months ago

    Looking at what is blocked, it just looks like someone very much aligned with the government came up with the list.

    • TiredTiger@lemmy.ml
      link
      fedilink
      English
      arrow-up
      14
      ·
      2 months ago

      If this isn’t an op, then that’s even more pathetic, honestly. Imagine doing this shit for free.

      • eldavi@lemmy.ml
        link
        fedilink
        English
        arrow-up
        7
        ·
        2 months ago

        following leftist & radlib influencers on social media makes me suspect that the brainworms implanted by almost a century’s worth of efforts – like cointelpro – have taken root into western culture since many of those brand new influencers didn’t exist weeks/months before have a sudden swell of subscribers/voters and their channels are dedicated to contradicting the leftist/radlib influencers instead of their own organic content.

  • iByteABit@lemmy.ml
    link
    fedilink
    English
    arrow-up
    15
    ·
    2 months ago

    Let them shoot themselves on the foot, they are only providing more evidence that their ideology is the one that needs to control the narrative or else it shatters at the first sign of critical thought

    • eldavi@lemmy.ml
      link
      fedilink
      English
      arrow-up
      2
      arrow-down
      1
      ·
      2 months ago

      are they still shooting themselves in the foot if there are currently 5 such examples, but we’ve only detected one and by accident?

      • iByteABit@lemmy.ml
        link
        fedilink
        English
        arrow-up
        8
        ·
        2 months ago

        Piefed was also detected, and also I’m not sure what your point is. Personally I’m sticking with the original software and the instance I’m on knowing that there’s no such ideological firewall with fake 404 errors so I don’t find out. People who agree with the Piefed and Tesseract dev’s worldviews can go there and enjoy their bubble if that’s their thing

  • 9point6@lemmy.world
    link
    fedilink
    English
    arrow-up
    14
    ·
    2 months ago

    Lol the keywords list is hilarious, imagine publishing a list of things that rustle your jimmies.

  • ellypony@lemmy.world
    link
    fedilink
    English
    arrow-up
    7
    ·
    2 months ago

    Oh my god it’s actually way worse they’re using incredibly broad regular expressions to blacklist users. There’s a whole section for it.

    If you just happen to have the same text in your username as a previously blacklisted user, you’re blacklisted automatically too. For example:

    "^Fleure", 
    

    If your username is Fleure_1998 or FleuresArePretty you’re going to be blacklisted.

    Isn’t there a less draconian way to manage alt-account spam? This is casting the net over the whole ocean and eventually if that user regex list gets big and broad enough it’ll be near impossible to not be shadowbanned by default.

    ALSO WHY IS YURI BLOCKED HELLO???