Magically expressive social media
Find a file
Oneric f7c9793542 Sanitise Content-Type of uploads
The lack thereof enables spoofing ActivityPub objects.

A malicious user could upload fake activities as attachments
and (if having access to remote search) trick local and remote
fedi instances into fetching and processing it as a valid object.

If uploads are hosted on the same domain as the instance itself,
it is possible for anyone with upload access to impersonate(!)
other users of the same instance.
If uploads are exclusively hosted on a different domain, even the most
basic check of domain of the object id and fetch url matching should
prevent impersonation. However, it may still be possible to trick
servers into accepting bogus users on the upload (sub)domain and bogus
notes attributed to such users.
Instances which later migrated to a different domain and have a
permissive redirect rule in place can still be vulnerable.
If — like Akkoma — the fetching server is overly permissive with
redirects, impersonation still works.

This was possible because Plug.Static also uses our custom
MIME type mappings used for actually authentic AP objects.

Provided external storage providers don’t somehow return ActivityStream
Content-Types on their own, instances using those are also safe against
their users being spoofed via uploads.

Akkoma instances using the OnlyMedia upload filter
cannot be exploited as a vector in this way — IF the
fetching server validates the Content-Type of
fetched objects (Akkoma itself does this already).

However, restricting uploads to only multimedia files may be a bit too
heavy-handed. Instead this commit will restrict the returned
Content-Type headers for user uploaded files to a safe subset, falling
back to generic 'application/octet-stream' for anything else.
This will also protect against non-AP payloads as e.g. used in
past frontend code injection attacks.

It’s a slight regression in user comfort, if say PDFs are uploaded,
but this trade-off seems fairly acceptable.

(Note, just excluding our own custom types would offer no protection
 against non-AP payloads and bear a (perhaps small) risk of a silent
 regression should MIME ever decide to add a canonical extension for
 ActivityPub objects)

Now, one might expect there to be other defence mechanisms
besides Content-Type preventing counterfeits from being accepted,
like e.g. validation of the queried URL and AP ID matching.
Inserting a self-reference into our uploads is hard, but unfortunately
*oma does not verify the id in such a way and happily accepts _anything_
from the same domain (without even considering redirects).
E.g. Sharkey (and possibly other *keys) seem to attempt to guard
against this by immediately refetching the object from its ID, but
this is easily circumvented by just uploading two payloads with the
ID of one linking to the other.

Unfortunately *oma is thus _both_ a vector for spoofing and
vulnerable to those spoof payloads, resulting in an easy way
to impersonate our users.

Similar flaws exists for emoji and media proxy.

Subsequent commits will fix this by rigorously sanitising
content types in more areas, hardening our checks, improving
the default config and discouraging insecure config options.
2024-03-18 22:33:10 -01:00
.gitea/issue_template Update '.gitea/issue_template/feat.yml' 2022-12-12 04:26:43 +00:00
.woodpecker Migrate to phoenix 1.7 (#626) 2023-08-15 10:22:18 +00:00
benchmarks Merge branch 'benchmark-fixes' into 'develop' 2021-12-09 15:38:26 +00:00
ci CI: Use own package as base 2021-12-26 18:05:42 +01:00
config Sanitise Content-Type of uploads 2024-03-18 22:33:10 -01:00
docker-resources Update docker compose commands to Compose V2 2023-06-18 01:37:40 -04:00
docs Merge pull request 'Better document database differences for Pleroma migrations' (#699) from Oneric/akkoma:doc_pleroma-migration-db into develop 2024-02-24 04:33:43 +00:00
installation Add NoNewPrivileges to systemd service file for source installs 2023-07-22 02:40:25 -04:00
lib Sanitise Content-Type of uploads 2024-03-18 22:33:10 -01:00
priv Update translation files 2024-02-24 13:42:59 +00:00
rel Disable busy waits in the default OTP vm.args configuration. 2024-02-17 13:21:56 +01:00
restarter fix_flaky_transfer_task_test.exs (#237) 2022-11-01 14:31:29 +00:00
scripts document prometheus 2022-12-16 10:24:36 +00:00
test Merge pull request 'Fix static-fe Twitter metadata / URL previews' (#700) from Oneric/akkoma:staticfe-metadata into develop 2024-02-24 13:42:55 +00:00
uploads fix issues with the uploads directory 2019-04-28 06:43:00 +02:00
.buildpacks CI: Add auto-deployment via dokku. 2019-05-31 10:55:35 +02:00
.credo.exs Move Consistency.FileLocation to ./test 2020-10-13 19:57:45 +02:00
.dockerignore Docker builds (#231) 2022-10-16 19:25:54 +00:00
.formatter.exs Migrate to phoenix 1.7 (#626) 2023-08-15 10:22:18 +00:00
.gitattributes Don't treat js/css as binary in git anymore 2022-12-23 18:03:14 +00:00
.gitignore Change docs README for new way of building docs 2023-01-26 15:42:53 +01:00
.mailmap Add myself to .mailmap 2021-02-15 13:19:44 +03:00
AGPL-3 LICENSE → AGPL-3 2019-04-01 00:31:21 +02:00
CC-BY-4.0 Add a copy of CC-BY-4.0 to the repo 2020-09-06 11:38:38 +03:00
CC-BY-SA-4.0 CC-BY-SA-4.0: Add a copy of the CC-BY-SA-4.0 license 2019-04-01 00:30:21 +02:00
CHANGELOG.md Sanitise Content-Type of uploads 2024-03-18 22:33:10 -01:00
CODE_OF_CONDUCT.md add code of conduct (#129) 2022-08-03 10:55:11 +00:00
COPYING Remove reference to city.jpg in COPYING 2022-11-25 07:29:50 +00:00
coveralls.json exclude file_location check from coveralls 2020-10-13 16:44:01 +03:00
docker-compose.yml Add shm_size to the Database container 2023-08-21 21:50:10 +00:00
docker-entrypoint.sh Docker builds (#231) 2022-10-16 19:25:54 +00:00
Dockerfile Bump builds to OTP26 2023-08-09 14:39:28 +01:00
elixir_buildpack.config Update elixir version in elixir_buildpack.config 2023-03-16 12:54:15 -04:00
mix.exs 2024.02 release 2024-02-24 13:54:21 +00:00
mix.lock don't select ueberauth 0.10.6, as it is broken 2023-12-17 18:59:31 +00:00
Procfile CI: Add auto-deployment via dokku. 2019-05-31 10:55:35 +02:00
README.md Add YunoHost to installation guides 2023-04-03 11:22:53 +02:00
SECURITY.md Update notes on security exploit handling 2024-03-04 17:50:19 +01:00
SIGNING_KEY.pub 2022.09 stable release chores (#206) 2022-09-10 14:44:17 +00:00

akkoma

a smallish microblogging platform, aka the cooler pleroma

English OK 日本語OK

About

This is a fork of Pleroma, which is a microblogging server software that can federate (= exchange messages with) other servers that support ActivityPub. What that means is that you can host a server for yourself or your friends and stay in control of your online identity, but still exchange messages with people on larger servers. Akkoma will federate with all servers that implement ActivityPub, like Friendica, GNU Social, Hubzilla, Mastodon, Misskey, Peertube, and Pixelfed.

Akkoma is written in Elixir and uses PostgreSQL for data storage.

For clients it supports the Mastodon client API with Pleroma extensions (see the API section on https://docs.akkoma.dev/stable/).

Differences with Pleroma

Akkoma is a faster-paced fork, it has a varied and potentially experimental feature set tailored specifically to the corner of the fediverse inhabited by the project creator and contributors.

This should not be considered a one-for-one match with pleroma; it is more opinionated in many ways, and has a smaller community (which is good or bad depending on your view)

For example, Akkoma has:

  • Custom Emoji reactions (compatible with misskey)
  • Misskey-flavoured markdown support
  • Elasticsearch and Meilisearch support for search
  • Mastodon frontend (Glitch-Soc and Fedibird flavours) support
  • Automatic post translation via DeepL or LibreTranslate
  • A multitude of heavy modifications to the Pleroma Frontend (Pleroma-FE)
  • The "bubble" concept, in which instance administrators can choose closely-related instances to make a "community of communities", so to say

And takes a more opinionated stance on issues like Domain blocks, which are enforced far more on Akkoma.

Take a look at the Changelog if you want a full list of recent changes, everything since 3.0 has been Akkoma.

Installation

If you are running Linux (glibc or musl) on x86, the recommended way to install Akkoma is by using OTP releases. OTP releases are as close as you can get to binary releases with Erlang/Elixir. The release is self-contained, and provides everything needed to boot it. The installation instructions are available here.

From Source

If your platform is not supported, or you just want to be able to edit the source code easily, you may install Akkoma from source.

Docker

Docker installation is supported via this setup

Packages

Akkoma is packaged for YunoHost and can be found and installed from the YunoHost app catalogue.

Compilation Troubleshooting

If you ever encounter compilation issues during the updating of Akkoma, you can try these commands and see if they fix things:

  • mix deps.clean --all
  • mix local.rebar
  • mix local.hex
  • rm -r _build

Documentation