Coleslaw
kiwifarms.net
- Joined
- Jan 12, 2019
I don't know why we're arguing the merits of FLOSS here. It should be a given.
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
Freenet is free and open source software available under GPLv2+. The source code is on GitHub.For the love of God, they won't even let you see the source code from the supposed clearnet mirror without getting on Freenet. I'm not feeling much trust in a system that says "Just trust us and run our code if you want to read our code".
Thanks. I'll take a look and see what this is really all about.Attached is the latest FMS source tree
I know that's the Freenet line, but it's a definite point of vulnerability if Freenet was to become a common platform for discussions of a type that governments want to suppress. You might not 'know' exactly what CP you're hosting... but you know that you probably are hosting some.That's true, but neither do you have any knowledge of it. Nobody, not even known pedophiles, has been sentenced over Freenet "storing" illegal materials.
The datastore is always encrypted. There is no way to tell what material you're storing, unless you already have its key. Nobody has been sentenced or charged with any crimes for running a Freenet node. It's like Tor in that regard, where it's completely legal to run an exit node, but illegal to deal in child pornography.
I was guessing that the storage needs would be the bottleneck too. Using a blockchain type thing makes the most sense; solves most of the taking problems in decentralization. You could use key singing on top of the public-private keys to do permissions. For example have a key in the chain that if a user's key is signed with that user is an admin, so it really just turns into distributed key-trust like for ssl certificates.As I write this, the current total posts on KF is 7,583,872. So just the text wouldn't be an outrageous amount in this internet age, even if we assume they're a few KB apiece. Images and attachments, I have no clue, but I think that's going to be an issue with any decentralized system.
du
on the right directories would be a good jumping-off point before making anything concrete. I'd also be interested in data usage as a function of popularity (posts being made). F(post) -> size would give a good idea of what bandwidth miners will need to grow the blockchain.You say retarding frivolous sign-ups is amongst the worst things we could do and then suggest we do something that does exactly that - i.e. require an existing user to vouch for you. I think you misunderstood me. I've proposed using a small crypto payment as the way to do it - a payment that is trivial in the single case but obviously becomes non-trivial when done en masse. You've proposed vouching for someone. I don't care what method is used so long as it's there and works. We can't have this be viable if account creation is either not required to post or it is trivial to do en masse."Retarding frivolous sign-ups" is among the worst things you could do. It's extremely difficult to get people to donate crypto to this forum, imagine how much harder it'd be for a forum nobody uses.
A much better model is to be allowed in if at least one other user vouches for you. It's then left up to the individual users what criteria to use:
If you vouch for people who spam, you lose the ability to vouch for others.
- CAPTCHA
- Email verification
- Phone verification
- I know them IRL
- Account on a different forum
- etc
There is a much simpler solution: ban anyone who posts CP, ban the user who vouched for them, and don't store the media posted by banned users.
I strongly encourage you to check out FMS - it solved this problem more than 10 years ago.
But speaking more seriously, if you're looking to set up a web of trust for a decentralized KF successor, the best thing to do is establish it before KF goes down so current users can more easily get themselves on board. If you wait until after Null pulls the plug, it's going to be considerably harder to know who's who, given the fairly anonymous nature of the userbase.
I saw that. Looks like there's three of us that have posted to f.h.kiwis now.I got onto usenet finally, ended up using Firebird. Found a free NNTP server fairly easily and kiwis were on it.
If you're really keen, you could try setting up your own NNTP (news) server. You'd want to set it up in such a way that only only group on it is f.h.kiwis, otherwise it could get very messy very quickly.How does one rehost f.h.kiwis?
There most likely won't be any such thing as "private messages" in a distributed system, since there would be nowhere private to hide them. Anyone wanting to talk privately will have to exchange encryption keys themselves or something.it can catch it being exchanged in private messages
"You are probably hosting some" isn't sufficient for a crime. If it were, the Tor relay operators would've been charged with something by now, as would Google Drive.I know that's the Freenet line, but it's a definite point of vulnerability if Freenet was to become a common platform for discussions of a type that governments want to suppress. You might not 'know' exactly what CP you're hosting... but you know that you probably are hosting some.
Known by whom?It would be interesting to see how the Freenet project would respond if someone made a version that blacklists hashes for known CP. I suspect some substantial fraction of the community would use it as a resource to decide what to download next.
Correct.So what it looks like is that in FMS, each user is running their own SQLite database instance which maintains their model of the forum as they see it. They're using this as a full relational database including queries, indexes and triggers. The DB is serialized to a file locally. They do protect against SQL injection by using prepared statements, so the obvious "Johnny Drop Tables" attack won't work at least.
Your node will have one thread running at all times to merge incoming messages into your local view of the forum (and process identity requests etc), as well as up to 3 optional threads:
1. An HTTP server to view the forum as HTML
2. An NNTP server to talk to Usenet clients
3. A Freenet listener that actually does the work on the network.
It's not correct to say you have an inbox to which other nodes send messages. It's more correct to say that other nodes have outboxes from which you retrieve messages. There's no way to push data to a node. FMS will always ignore untrusted nodes, because it by definition doesn't know about them.One "griefable" thing that I notice is that while you can tell the server to ignore incoming requests from untrusted nodes, those ignored requests don't get removed from the various "incoming" queues until the daily housekeeping thread runs. So an attacker could just pile up tons of requests and massive messages in your inbox. If there's any other sort of garbage collection / reclaim process, I haven't found it.
In fact, all the "web of trust" features are part of FMS, not Freenet itself, so if I'm reading this right, you will unavoidably end up with random, unwanted messages - and since the input queues are actually database tables, they will get serialized to your own hard disk too. The SQLite DB is in synchronous mode, so serialization happens after every commit.
That's not correct. The maximum size of a message (in XML format) is a hardcoded 1 MB, for example (see src/freenet/messagerequester.cpp:624), and attachments are just links to files. There's a limit to how many messages you will request from a peer per day.There are also no limits on the size of incoming data, it'll happily go ahead and download any amount of data it's told to. There's some validation on the dimensions (height and width) of images, but that's just a bit of post-processing validation.
Most of the business logic is in the classes in the root, or in src/freenet.fms-src-0.3.82\src\translationsetup.cpp is a good place to look to see all the configurable features in human-readable form, so you can get an idea of just what the system is up to.
Blockchains don't really help here - you're not looking to mathematically validate a ledger is consistent, just keep a log of posts.@stares at error messages - when I was mentioning blockchain before, I was thinking of using one of the big existing blockchains rather than one we create. Otherwise we'd just get 51% attacked. At any rate, I'm not sure the idea is really workable at all, I'd be interested in hearing other ideas for establishing a small bit of decentralized shared state.
The important thing is that with a vouching system, you'll decentralize registration. If "the system" has a common CAPTCHA system, then things will break if it turns out to be vulnerable. If Bob runs a "fill out a captcha, get vouched" service and that service breaks, then the only impact is that Bob's service will be broken until he fixes it.You say retarding frivolous sign-ups is amongst the worst things we could do and then suggest we do something that does exactly that - i.e. require an existing user to vouch for you. I think you misunderstood me. I've proposed using a small crypto payment as the way to do it - a payment that is trivial in the single case but obviously becomes non-trivial when done en masse. You've proposed vouching for someone. I don't care what method is used so long as it's there and works. We can't have this be viable if account creation is either not required to post or it is trivial to do en masse.
I've thought about the "must be sponsored by a member in good standing" approach myself. I'm not wholly against it but whilst it works for Gentleman's Clubs and the Masons, it's a lot trickier for an anonymous online community. I don't know anyone on KF outside of KF. At least I don't know that I do. By its nature we all take precautions to separate our identity here from real life and even other online identities. I needed an email to sign up but that's not public information that someone can say "I'll email Overly Serious and ask them to sponsor me." CAPTCHA and Email verification aren't gate-keeping and aren't matching your model of en existing user vouching for them either, though you listed them under that.
Are you suggesting all private messages be sent through Microsoft? How are you even going to do this in a decentralized system?Regards CP, yes - your solution of someone saying: "Hey - that's CP, lets ban it" is simpler. Doesn't mean it's better. Using a service like PhotoDNA lets us pro-actively catch it before thousands of people have the misfortune of downloading it and seeing it, it can catch it being exchanged in private messages,it also sends a strong message to anyone who tries it that we actively root it out. And all we have to do is submit the media to the Third Party before allowing it to be posted. We don't know what number of active mods we will have in any solution we build or how on the ball they will be. I don't think any of them could be as fast or as effective as a simple REST call with the media and getting a response saying: "Bad - do not accept, place user that sent it into a suspension pending evaluation" no matter how willing and numerous mods were.
Schematically, since you have everyone's public keys, you can just encrypt a post to their public key and post it somewhere public. There's also nicer ways to do it that don't leak metadata.There most likely won't be any such thing as "private messages" in a distributed system, since there would be nowhere private to hide them. Anyone wanting to talk privately will have to exchange encryption keys themselves or something.
You can ask for a maximum of 1MB to be returned, but I see nothing in there enforcing that. What's to stop the following:That's not correct. The maximum size of a message (in XML format) is a hardcoded 1 MB, for example (see src/freenet/messagerequester.cpp:624),
ClientGet
, 1MB limit please.PersistentGet
, yes, I will send you 800KB (lying)AllData
, DataLength = a zillion.Well, the code definitely anticipates untrusted nodes ending up in tblIdentity somehow, but I haven't yet convinced myself exactly how this works yet. It does filter them out from polling, but I wonder about these nulls.FMS will always ignore untrusted nodes, because it by definition doesn't know about them.
if(m_localtrustoverrides==false)
{
sql+="AND (tblIdentity.LocalMessageTrust IS NULL OR tblIdentity.LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust')) ";
sql+="AND (tblIdentity.PeerMessageTrust IS NULL OR tblIdentity.PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')) ";
}
The ClientGet is made to your local Freenet node, not to a remote node. FMS never directly interacts with the Internet.You can ask for a maximum of 1MB to be returned, but I see nothing in there enforcing that. What's to stop the following:
Me:ClientGet
, 1MB limit please.
Other node:PersistentGet
, yes, I will send you 800KB (lying)
Other node:AllData
, DataLength = a zillion.
The limits are passed to Freenet in the ClientGet message.If you look at the AllData handlers like in fms-src-0.3.82\src\freenet\messagerequester.cpp (and similar for other types) it never actually compares back against any of the limits that were originally requested.
Yes, see https://github.com/freenet/wiki/wiki/FCPv2-ClientGetThere may well be some other limits in Freenet itself, but I've only looked at the FMS code.
If trust is null, this means I don't have an opinion on them. If I give someone message trust but not trust list trust, for instance, I'll give them a null trust list trust. Likewise for all those not in my list, although those are obviously not in the database.Well, the code definitely anticipates untrusted nodes ending up in tblIdentity somehow, but I haven't yet convinced myself exactly how this works yet. It does filter them out from polling, but I wonder about these nulls.
Code:if(m_localtrustoverrides==false) { sql+="AND (tblIdentity.LocalMessageTrust IS NULL OR tblIdentity.LocalMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinLocalMessageTrust')) "; sql+="AND (tblIdentity.PeerMessageTrust IS NULL OR tblIdentity.PeerMessageTrust>=(SELECT OptionValue FROM tblOption WHERE Option='MinPeerMessageTrust')) "; }
OK, I see what you mean. So as long as your own copy of FCPv2 is good, then all those messages will follow the rules and play nicely.The ClientGet is made to your local Freenet node, not to a remote node.
Tor relays aren't 'hosting' anything. They simply relay traffic. FreeNet nodes retain and further distribute material that not just yourself, but others connected to you, request."You are probably hosting some" isn't sufficient for a crime. If it were, the Tor relay operators would've been charged with something by now, as would Google Drive.
A nation state actor looking to attack FreeNet could build up a list legitimately. Anyone else would presumably go through Freesites that puport to host it, and build up a list of whatever images are present (with image display turned off, hopefully).Known by whom?
How are you going to verify it's actually CP?
Are you gonna download a list of hashes some rando claims are CP and look at them to "verify"?
Speaking of such things, I found this article from about 5 years ago.If you're running a FreeNet node, you're retaining and distributing a bunch of CP. You just can't say for sure whether it's babyfuck1.jpg or babyfuck2.jpg without a list of hashes of CP (which I'm sure law enforcement would build up if FreeNet ever really took off).