cross-posted from: https://lemmy.world/post/49778353

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.

  • sin_free_for_00_days@sopuli.xyz
    link
    fedilink
    English
    arrow-up
    0
    ·
    7 days ago

    I wonder if this is someone taking their personal block list and just slapping it into their app? I’ve blocked a lot of users/communities/instances, but I certainly don’t want to block them for anyone else.

  • Pogogunner@sopuli.xyz
    link
    fedilink
    English
    arrow-up
    0
    ·
    edit-2
    9 days ago

    This is very upsetting. I could see an argument if it was made a user toggle for a “more friendly experience” or something like that (Like the enable toxic mode toggle), but hiding the blacklist and then an opaque error message is cowardly. Having it be pulled every time from another website instead of built into the software is also a very clear accountability dodge.

    Also reading over the file, I think it’s biased, especially towards unfairly heavy moderation.

    Edit: Just noticed I’m on the blocklist. What he said fuck me for?

      • prole@lemmy.blahaj.zone
        link
        fedilink
        English
        arrow-up
        0
        ·
        7 days ago

        I’m curious what makes them liberal not conservative? Why do you immediately jump to liberal, when every thing I’ve seen that’s been blocked has been shit that triggers conservatives.

        I get that you have to shoe horn your “everything bad is liberal” shit into everything, but this ain’t it chief.

        Before you accuse me of the same bullshit, I’m on the block list.

      • teslekova@sh.itjust.works
        link
        fedilink
        English
        arrow-up
        0
        ·
        8 days ago

        No, it’s a particular type of liberalism. Freedom of speech is actually a core liberal value, and while some who think themselves liberal will use censorship, (usually political hacks doing it for political ratfuckery, like the dev of Tesseract) most do not.

        • cavitationfetishist2@quokk.au
          link
          fedilink
          English
          arrow-up
          0
          ·
          8 days ago

          No. They say that shit, they say they have values beyond the class system and terror and feeling good about themselves for doing it, but shitlibs are liars.

          Every single one, when pressed, is an authoritarian first. They fucking fetishize that shit. Everything else is just painted on.

          • pet the cat, walk the dog@lemmy.world
            link
            fedilink
            English
            arrow-up
            0
            ·
            8 days ago

            No. They say that shit, they say they have values beyond the class system and terror and feeling good about themselves for doing it, but shitcommies are liars. Every single one, when pressed, is an authoritarian first. They fucking fetishize that shit. Everything else is just painted on.

      • cloudskater@piefed.blahaj.zone
        link
        fedilink
        English
        arrow-up
        0
        ·
        7 days ago

        Liberals are nothing more then centrists and can suck eggs for all I care but jeez, could you offer comments that were any more useless and rage-baity then this?

        • cavitationfetishist2@quokk.au
          link
          fedilink
          English
          arrow-up
          0
          ·
          7 days ago

          Ikept getting told to ‘shut up cunt’ in this thread and mods seemed fine with it. So I’m explaining myself in detail.

          And libs aren’t centrists, except maybe between Ronald Reagan and the Thule society.

      • GregorGizeh@lemmy.zip
        link
        fedilink
        English
        arrow-up
        0
        ·
        9 days ago

        Why do you keep repeating this throughout these comments chief?

        Being self important is not a political act and so far there is no indication of a political motivation, just that the dev somehow got the idea of appointing themselves secret online discourse admin. If it turns out there is some financial goal behind it i’m with you tho.

            • Aceticon@lemmy.dbzer0.com
              link
              fedilink
              English
              arrow-up
              0
              ·
              edit-2
              8 days ago

              American style “liberalism” (aka Neoliberalism) is exactly the opposite of that:

              • Everything must be behind a money-gate (everything must be private, nothing public) and only if you have enough money can you pass such a gate
              • Unless you’re born on the right side of the gate or from parents with enough money, you can only get the money to pass most money-gates (even just the ones for food and for shelter) by working for the people with enough money to pass ownership-of-means-of-production & land-ownership money-gates.

              It’s a structure to heavilly reduce freedom in the most important aspects of one’s life including things necessary for survival (like food and shelter), not to increase it, so it’s the very opposite of increasing Liberty or Freedom.

              I reckon that’s the kind of “Liberalism” (which is the only one with political power anywhere in the World at the moment as far as I can tell, since there sure aren’t any politicians in power anywhere which both claim to be Liberal and are against core liberty-reducing legislation such as Private Land Ownership) that the previous poster is talking about.

              Mainstream politicians out there who call themselves “Liberal” are 100% liars and frauds.

    • goferking (he/him)@lemmy.sdf.org
      link
      fedilink
      English
      arrow-up
      0
      ·
      8 days ago

      Edit: Just noticed I’m on the blocklist. What he said fuck me for?

      Figuring this out has been interesting, but then again based on that user could have just said something they didn’t like in a random thread so they put you on the list

  • dual_sport_dork 🐧🗡️@lemmy.world
    link
    fedilink
    English
    arrow-up
    0
    ·
    9 days ago

    The developer behind Tesseract is the same user who has displayed the habit of preemptively banning users who have never participated in or even visited his communities, particularly those that were on dubvee.org. Apparently for ideological reasons, or simply for being associated with a particular Lemmy instance.

    So at the risk of stirring up even more Fediverse drama by saying it, it seems like the findings above are squarely on brand.

    Not to come over all Graham Chapman about it or anything, but I always found that type of behavior to be very silly.

  • Rimu@piefed.social
    link
    fedilink
    English
    arrow-up
    0
    ·
    9 days ago

    It looks like there is an ‘enable toxic mode’ setting that DOES switch off the auto-updating blocklist. The LLM that wrote this post claimed that there is no way to turn it off.

    from src/lib/policies/system.ts:

    export async function updateSystemFilterPolicy() {  
        if (SBDisabled && get(userSettings).enableToxicMode) {  
            SYSTEM_POLICY.set(BLANK_SYSTEM_FILTER_POLICY)  
            return  
        }  
       // auto-update of blocklist continues below  
    

    The original post was written using AI so it’s going to have a lot of inaccuracies like that.

    Overall though, this does seem poorly documented, too opaque and overly prescriptive. And needlessly encrypting the payload looks shifty.

    • prole@lemmy.blahaj.zone
      link
      fedilink
      English
      arrow-up
      0
      ·
      9 days ago

      Yeah it’s the trans people who simply want to exist who are toxic

      Edit: no indication any of that post was LLM, but would love to hear why you think that.

      Though I suspect that’s just a tactic to get people to shift their ire.

      • subignition@fedia.io
        link
        fedilink
        arrow-up
        0
        ·
        9 days ago

        Hi, not the person you replied to, and (edit: not*) agreeing with any of this blocklist shit, AND my ire is firmly not shifted away from Tesseract, but just wanted to break down the characteristics of the OP that suggest (to me) it was composed mostly with an LLM and fine tuned after. (Though to be clear, that’s a pretty unimportant characteristic of the post considering the actual content)

        1. The division of the text into small “sections” of five or fewer short paragraphs separated by headers is probably the most obvious hallmark.

        2. Kind of difficult to put into words, but abrupt / awkward / overly poetic metaphor and… “overconfident”? “sensationalized”? phrasing both give me an LLM vibe. examples:

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

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

        The spam work is what makes the rest unauditable: “it’s a spam list” answers every individual question and none of the whole.

        It’s downloaded at runtime from a file nobody has ever looked at.

        spam filtering and political editorial got welded into one undocumented, remotely-updatable blob, shipped hidden

        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.

        1. Overuse of the rule of three. This one is probably the most tenuous, because genuine human writing does make frequent use of the rule of three. But when LLMs do it, it’s usually at a high enough density where it starts sounding like it’s trying too hard, or it’s clickbaity.

        Admins can’t see it, can’t configure it, and aren’t told it’s there.

        That’s the live policy, base64-wrapped gzip, 111KB of JSON when it unpacks.

        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.

        355 of the 552 usernames are plain alphabetic, twelve characters or under, median length eight.

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

        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.

        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.

        1. Tonally inconsistent with the intended audience. I realize Lemmy/Fediverse users are more technically savvy than usual, but even then… consider the claim “I went through the code to see how that was implemented.” early in the post. A lot of plausible technical jargon is used, and there are plenty examples of the actual filters and filter patterns themselves, but the post makes claims about what is happening without really being specific at all about how.

        Could be explained by me just not being familiar enough with the technical side, but saying stuff like “There’s a second filter policy fetched over HTTP every time the app loads” without breaking it down any further seems a bit suspicious to me? It doesn’t actually call out any function, file, or… i dunno, a logical starting point, for a competent reader to dig into the source themselves. Reads like it’s written for either an expert who doesn’t need any details, or for an audience with zero skepticism whatsoever.

        1. And least importantly, because my focus is on the presentation of the post moreso than the accuracy, IF rimu’s read of the code is correctly calling out a factual error in the OP (and let me be clear that I’m not enough of a programmer to evaluate whether it is), that is pretty strong evidence of an LLM getting something wrong.

        Again… this wall of text isn’t meant as a refutation of anything you’re saying, or a reason to dismiss the contents of the OP uncritically. Seems pretty clear after reading through db0’s posts about it that this is seriously fucked up. I hope I’ve been clear enough about that.

        • Zawaj_Al_Qasirat@sh.itjust.works
          link
          fedilink
          English
          arrow-up
          0
          ·
          9 days ago

          Could be explained by me just not being familiar enough with the technical side, but saying stuff like “There’s a second filter policy fetched over HTTP every time the app loads” without breaking it down any further seems a bit suspicious to me? It doesn’t actually call out any function, file, or… i dunno, a logical starting point, for a competent reader to dig into the source themselves. Reads like it’s written for either an expert who doesn’t need any details, or for an audience with zero skepticism whatsoever.

          It gives you the file directly

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

            • Zawaj_Al_Qasirat@sh.itjust.works
              link
              fedilink
              English
              arrow-up
              0
              ·
              8 days ago

              ./Dockerfile:14:COPY --chown=node:node static/data/policy.dat /app/system/policy/policy.dat
              ./src/lib/policies/system.ts:105: res = await fetch(‘/data/policy.dat’)
              ./src/server/system.ts:27: let file = await open(${policyDir}/policy.dat)
              ./src/server/system.ts:71: await writeFile(${policyDir}/policy.dat, policy)

              • ripcord@lemmy.world
                link
                fedilink
                English
                arrow-up
                0
                ·
                8 days ago

                But none of those are the remotely fetched file.

                There seems to ALSO be a statically included policy file with a bunch of stuff. That he updates periodically.

                • subignition@fedia.io
                  link
                  fedilink
                  arrow-up
                  0
                  ·
                  8 days ago

                  Give them a little credit, they were only five lines away from a bullseye in their second example. That’s much closer to accurate than their overall comprehension of my post was

              • subignition@fedia.io
                link
                fedilink
                arrow-up
                0
                ·
                8 days ago

                Thanks, but I’m not sure what value you think you’re adding by actually going and finding that - if you had understood my post, you would know that my critique of the lack of specifics in the OP was a reason to doubt it was written by a human, not anything to do with whether or not the details of the post were credible or not.

        • null@piefed.nullspace.lol
          link
          fedilink
          English
          arrow-up
          0
          ·
          8 days ago

          5 month old account on a free-registration instance that actively and only downvotes.

          Or what we like to call, the cowards alt.

        • prole@lemmy.blahaj.zone
          link
          fedilink
          English
          arrow-up
          0
          ·
          8 days ago

          I didn’t know they were an established transphobe, so I wanted to give some benefit of the doubt.

          But yeah, all signs pointed to that fact.

      • BillyClark@piefed.social
        link
        fedilink
        English
        arrow-up
        0
        ·
        8 days ago

        On the LLM thing, there are tools that can say the likelihood that any given text was written by an LLM. Apparently, they’re a necessity for English teachers these days. So, it’s possible that Rimu used a tool like that.

        • subignition@fedia.io
          link
          fedilink
          arrow-up
          0
          ·
          8 days ago

          Unfortunately (or hilariously depending on your perspective) those tools are notoriously inaccurate and often driven by LLMs themselves.

      • ScoffingLizard@lemmy.dbzer0.com
        link
        fedilink
        English
        arrow-up
        0
        ·
        8 days ago

        The question is how to prevent toxic material that brainwashes people like Facebook did. It irreparably damaged the social fabric in my country.

        (Don’t know the answer)

  • WesternInfidels@feddit.online
    link
    fedilink
    English
    arrow-up
    0
    ·
    9 days ago

    So a system named after a hypothetical, hyper-dimensional solid turns out to have hidden depths, secret facets that we can’t see from our universe?