- cross-posted to:
- meta@lemm.ee
- main@feddit.de
- lemmy@lemmy.ml
In the past months, there’s a been a issue in various instances where accounts would start uploading blatant CSAM to popular communities. First of all this traumatizes anyone who gets to see it before the admins get to it, including the admins who have to review to take it down. Second of all, even if the content is a link to an external site, lemmy sill caches the thumbnail and stores it in the local pict-rs, causing headaches for the admins who have to somehow clear that out. Finally, both image posts and problematic thumbnails are federated to other lemmy instances, and then likewise stored in their pict-rs, causing such content to be stored in their image storage.
This has caused multiple instances to take radical measures, from defederating liberaly, to stopping image uploads to even shutting down.
Today I’m happy to announce that I’ve spend multiple days developing a tool you can plug into your instance to stop this at the source: pictrs-safety
Using a new feature from pictr-rs 0.4.3 we can now cause pictrs to call an arbitary endpoint to validate the content of an image before uploading it. pictrs-safety builds that endpoint which uses an asynchronous approach to validate such images.
I had already developed fedi-safety which could be used to regularly go through your image storage and delete all potential CSAM. I have now extended fedi-safety to plug into pict-rs safety and scan images sent by pict-rs.
The end effect is that any images uploaded or federated into your instance will be scanned in advance and if fedi-safety thinks they’re potential CSAM, they will not be uploaded to your image storage at all!
This covers three important vectors for abuse:
- Malicious users cannot upload CSAM to for trolling communities. Even novel GenerativeAI CSAM.
- Users cannot upload CSAM images and never submit a post or comment (making them invisible to admins). The images will be automatically rejected during upload
- Deferated images and thumbnails of CSAM will be rejected by your pict-rs.
Now, that said, this tool is AI-driven and thus, not perfect. There will be false positives, especially around lewd images and images which contain children or child-topics (even if not lewd). This is the bargain we have to take to prevent the bigger problem above.
By my napkin calculations, false positive rates are below 1%, but certainly someone’s innocent meme will eventually be affected. If this happen, I request to just move on as currently we don’t have a way to whitelist specific images. Don’t try to resize or modify the images to pass the filter. It won’t help you.
For lemmy admins:
- pictrs-safety contains a docker-compose sample you can add to your lemmy’s docker-compose. You will need to your put the .env in the same folder, or adjust the provided variables. (All kudos to @Penguincoder@beehaw.org for the docker support).
- You need to adjust your pict-rs ENVIRONMENT as well. Check the readme.
- fedi-safety must run on a system with GPU. The reason for this is that lemmy provides just a 10-seconds grace period for each upload before it times out the upload regardless of the results. A CPU scan will not be fast enough. However my architecture allows the fedi-safety to run on a different place than pictrs-safety. I am currently running it from my desktop. In fact, if you have a lot of images to scan, you can connect multiple scanning workers to pictrs-safety!
- For those who don’t have access to a GPU, I am working on a NSFW-scanner which will use the AI-Horde directly instead and won’t require using fedi-safety at all. Stay tuned.
For other fediverse software admins
fedi-safety can already be used to scan your image storage for CSAM, so you can also protect yourself and your users, even on mastodon or firefish or whatever.
I will try to provide real-time scanning in the future for each software as well and PRs are welcome.
Divisions by zero
This tool is already active now on divisions by zero. It’s usage should be transparent to you, but do let me know if you notice anything wrong.
Support
If you appreciate the priority work that I’ve put in this tool, please consider supporting this and future development work on liberapay:
All my work is and will always be FOSS and available for all who need it most.
Cobalt_Blu ( @C0balt_Blu@lemmy.ml ) 48•1 year agoDb0 the fuckin hero 🙏
Demigodrick ( @Demigodrick@lemmy.zip ) English25•1 year agoJust want to add - i’ve been using this (via my desktop!) for my instance for a little while now and its great - While the evidence shows there are false positives, i’ve yet to see it affect anything in real time.
Beware your B2 transaction costs though! 😭 I’m sure there is a cheaper way to do it but backblaze costs went up quite a bit.
PenguinCoder ( @Penguincoder@beehaw.org ) English5•1 year agoB2 cloud storage update says:
effective October 3, we’re making egress free (i.e. free download of data) for all B2 Cloud Storage customers—both pay-as-you-go and B2 Reserve—up to three times the amount of data you store with us, with any additional egress priced at just $0.01/GB. Because supporting an open cloud environment is central to our mission, expanding free egress to all customers so they can move data when and where they prefer is a key next step.
Demigodrick ( @Demigodrick@lemmy.zip ) English6•1 year agoYeah, I had the email yesterday, but they don’t mention if this is specifically their download charge, or if the class b and class c transactions are included in this - I mean I’ll be honest, I haven’t had time to properly look into yet, but either way it should help.
Blaze ( @Blaze@discuss.tchncs.de ) 24•1 year agoWell done!
zeus ∽↯∼ ( @Zeus@lemm.ee ) English15•1 year agoholy hell this is massive
thank you for your work db0
kreynen ( @kreynen@kbin.social ) 13•1 year agoSounds like progress, but please consider using a term other than “whitelist” when describing a list of allowed values. While the use of blacklist predates references to black as a race, allowlist is a reasonable alternative that doesn’t reinforce viewing black as less than or unwanted and white as allowed.
S410 ( @S410@kbin.social ) 22•1 year agoMaking things that were never about race into things about race, just to have one more reason to be potentially offended by, is not productive and doesn’t help anyone.
By exercising enough mental gymnastics almost any term could be twisted into something supposedly offensive. The real solution to that problem: don’t do mental gymnastics.
Honytawk ( @Honytawk@lemmy.zip ) 17•1 year agoThose are technical terms that have nothing to do with race or even humans.
burble ( @burble@lemmy.dbzer0.com ) 16•1 year agoAllowlist and Blocklist are also more intuitive to people who haven’t heard the terms before.
TehPers ( @TehPers@beehaw.org ) English7•1 year agoI’ve honestly always found “allowlist” and “blocklist” to feel like forced compound words, and I don’t see why “list” is necessary at all. For example, just saying “allowed” and “blocked” both implies it’s a list and is more intuitive than any of the *list terms.
Personally I have no stake in the battle, but I do wish people would use the most intuitive terms for the situation at least (whatever they are, for example “enabled”/“disabled” or “included”/“excluded”) instead of blanket ctrl+f on everything.
burble ( @burble@lemmy.dbzer0.com ) 3•1 year agoThat’s a good point, and I hadn’t thought about that angle, that there just isn’t a reason for the terms to exist in the first place.
“In the red” and “in the black” is another pair that isn’t intuitive to me at all and I have to look up every time.
e-ratic ( @e-ratic@kbin.social ) 16•1 year agoOh come on… The origin of blacklist was centuries before “black” became the term for a person of colour. And on a thread about CSAM…
TheGreenGolem ( @TheGreenGolem@lemm.ee ) 14•1 year agoOh the fuck with this nonsense!
Scary le Poo ( @Scary_le_Poo@beehaw.org ) 12•1 year agoDo you ever get tired of twisting yourself into a pretzel every time you want to be offended?
grimace1153 ( @grimace1153@lemm.ee ) 8•1 year agoHoly fuck
WallsToTheBalls ( @WallsToTheBalls@lemmynsfw.com ) 7•1 year agoWahhhhhhh
Lemmyvisitor ( @Lemmyvisitor@lemmy.dbzer0.com ) 12•1 year agoI’m curious how an AI like this is trained
Lemmyvisitor ( @Lemmyvisitor@lemmy.dbzer0.com ) 2•1 year agointeresting read, thank you
given CLIP has a high zero-shot learning success rate, was it functional for this use case out of the box? or were further modifications required?
It requires specific usage of clip. Check the horde-safety repo if you’re interested
marco ( @marco@beehaw.org ) English12•1 year agoSent you a little bit of money, @db0@lemmy.dbzer0.com - it sucks that this is necessary, but thanks for doing the good work <3
much appreciated
iByteABit [he/him] ( @iByteABit@lemm.ee ) 11•1 year agoGreat work, this is the biggest issue that Lemmy has a the moment, I hope the admins will be able to set this up easily and start to take back all the preventative measures.
user ( @user@lemmy.one ) 10•1 year ago👏well done.
Duchess ( @Duchess@yiffit.net ) 9•1 year agothank you for making the fediverse a safer place to be
fmstrat ( @fmstrat@lemmy.nowsci.com ) English9•1 year agoHave you considered federating hashes of positive matches and working with the Lemmy team to not outward federate on a local positive match (and potentially have the hash go instead)?
The former can reduce overhead and electricity use, and the latter will stop more distribution and aid those sans-GPU who can’t run it.
Over time, the hash DB will grow and get better. In addition, perhaps there is metadata that can be used to track image similarity to positive matches to reduce false-positives, but I imagine that algorithm would be much more complicated.
Hashes won’t work for novel GenerativeAI images. For this kind of thing we need to be sharing tensors and comparing distances so that it catches format changes and compression artifacts. Theoretically possible. Practically, I don’t know how feasible it is.
fmstrat ( @fmstrat@lemmy.nowsci.com ) English1•1 year agoHow large is each tensor? If it can be stored as JSON or Base64 and is of sufficiently small size, integration into ActivityPub wouldn’t be all that bad. The time consuming part would likely be integration into Lemmy itself.
Another option would be a separate service, similar to how Lemmy Explorer works, where a list of the latest tensors can be downloaded. It’s centralized vs distributed, but probably easier to implement. Just an API admins can register for to send and get tensors.I would be happy to assist with this if it is a route you would like to explore. Feel free to DM me.
db0 ( @db0@hachyderm.io ) 1•1 year ago@fmstrat each tensor is small. The problem is when you have millions of them and you have to compare each image to each. You can’t index this. It has to be one by one. And you still need to covert the new image to tensors as well,which still needs gpu. I just don’t see anything useful here. The current system would be faster.
fmstrat ( @fmstrat@lemmy.nowsci.com ) English1•1 year agoGood point. I wonder how the commercial hash-based systems are doing it…
AceQuorthon ( @AceQuorthon@lemmy.dbzer0.com ) 9•1 year agoWhat’s CSAM?
noctisatrae ( @noctisatrae@beehaw.org ) 4•1 year agoChild pornography
TiTeY` ( @titey@lemmy.home.titey.net ) 8•1 year agoGreat job! 👍
azurefirefly ( @azurefirefly@lemmy.basedcount.com ) 6•1 year agoFantastic work
yildo ( @yildo@kbin.social ) 4•1 year agoI would love some form of this for Mastodon
I don’t know the architecture of masto unfortunately. I guess it doesn’t use pict-rs. What does it use for images?
poVoq ( @poVoq@slrpnk.net ) 2•1 year agoAFAIK it is a built in system. But scanning the file folder or object storage probably works the same.
It would be definitely nice to have the option to scan multiple locations if you run more than one service.
Yes, it’s just not realtime anymore