Damus
洪 民憙 (Hong Minhee) :nonbinary: profile picture
洪 民憙 (Hong Minhee) :nonbinary:
@洪 民憙 (Hong Minhee) :nonbinary:

An intersectionalist, feminist, and socialist living in Seoul (UTC+09:00). @tokolovesme's spouse. Who's behind @fedify, @hollo, and @botkit. Write some free software in #TypeScript, #Haskell, #Rust, & #Python. They/them.

서울에 사는 交叉女性主義者이자 社會主義者. 金剛兔(@tokolovesme)의 配偶者. @fedify, @hollo, @botkit 메인테이너. #TypeScript, #Haskell, #Rust, #Python 等으로 自由 소프트웨어 만듦.

#國漢文混用體 #한국어 (#朝鮮語) #English #日本語

Relays (1)
  • wss://relay.ditto.pub – read & write

Recent Notes

洪 民憙 (Hong Minhee) :nonbinary: profile picture
The more I work on Hollo, the more its Mastodon-compatible API feels like a straitjacket. I chose it for a practical reason: people could use existing clients, and I wouldn't have to build a frontend too. I still think that was the right call at the time.

The problem is that clients can only expose what Mastodon's API represents. I keep coming up with ideas, then asking whether the API has anywhere to put them. If it doesn't, I have no way to get the feature in front of users.

ActivityPub API (so-called “C2S”) might be the eventual answer, but it doesn't help much today. I don't know of any clients Hollo users could realistically use with it, and adoption is still limited.

So I keep coming back to the idea that Hollo will need a frontend of its own. I'd keep the Mastodon API for existing apps. I'm not especially eager to take on a whole frontend, but I don't see another way to try ideas that don't fit Mastodon's model.
洪 民憙 (Hong Minhee) :nonbinary: profile picture
I recently moved my personal blog from a PHP setup to Astro on Netlify because I wanted to add ActivityPub support with Fedify.

Somehow, it took me until then to realize that I had never actually tried running Fedify on Netlify.

Netlify Database is PostgreSQL, so the persistence side should already fit @fedify/postgres. The less obvious part is background delivery: Netlify Functions cannot keep a queue consumer alive, while Async Workloads uses a push-based model similar to WorkersMessageQueue in @fedify/cfworkers.

So I’m going to try making @fedify/netlify, with my own blog as its first real test case. I wrote down the initial design in issue #930.
洪 民憙 (Hong Minhee) :nonbinary: profile picture
#Mastodon's #ActivityPub inbox treats object types in tiers. Note and Question are supported directly. A second tier, Article, Page, Image, Audio, Video, and Event, gets converted to a title, a summary, and a link; content itself doesn't show. Anything outside both tiers is dropped on delivery, which is a large part of why so much of the fediverse federates as Note regardless of what the object actually is.

mastodon/mastodon#24079 asks for content to show up whenever it's present and the mediaType is supported, independent of type. Open since 2023, and as far as the thread shows, no core team engagement beyond one offhand remark that they're not happy with the status quo either.

Reading the issue text closely, it's a bit ambiguous whether it covers the drop tier or only the convert-to-title-and-link tier. I left a comment asking for clarification, since the fix looks very different depending on the answer.

If you build on ActivityPub, a comment or a reaction there is worth more than another workaround.

#fedidev #fediverse
1
silverpill · 1w
nostr:nprofile1qy2hwumn8ghj7un9d3shjtnyd968gmewwp6kyqpqpzjfm9lymy3dnrxg2uk237vlvteefahea7s4ptjzv8n2a9uarrxqp2ut88 Added a comment https://github.com/mastodon/mastodon/issues/24079#issuecomment-4938693508
洪 民憙 (Hong Minhee) :nonbinary: profile picture
One thing I keep coming back to when comparing #ActivityPub and AT Protocol: ActivityPub is basically a convention on top of the #web stuff we already have. An actor is a JSON-LD document you GET. An inbox is an endpoint you POST to. If you already run a website, you can bolt this on without changing the site's basic shape. Ghost didn't set out to join the #fediverse, and then years later it could, just by adding an endpoint.

AT Protocol feels less like that to me. Running a PDS means a signed repo, a Merkle search tree, a firehose, a DID. It's not a layer you add to an existing site. It's closer to standing up another backend beside it.

I think that's why ActivityPub keeps making sense to me. You can join later. You don't have to have built the whole thing with federation in mind from day one.

#ATProto #ATProtocol #fedidev
silverpill · 4w
nostr:nprofile1qy2hwumn8ghj7un9d3shjtnyd968gmewwp6kyqpqpzjfm9lymy3dnrxg2uk237vlvteefahea7s4ptjzv8n2a9uarrxqp2ut88 When two implementations don't federate, the slow part is usually figuring out where the exchange broke: signing, JSON-LD processing, WebFinger, or something less obvious. DrFed's first...
silverpill · 5w
nostr:nprofile1qy2hwumn8ghj7un9d3shjtnyd968gmewwp6kyqpq4m5mtm90njtvnfethdhsy4svharvsyr7kep4dws6y9kvdn8sj96szxw028 That gap could allow outbound requests to ranges such as carrier-grade NAT, benchmark...
洪 民憙 (Hong Minhee) :nonbinary: profile picture
@silverpill The dangerous case is not that every one of those ranges is equally exploitable. For example, the documentation ranges are mostly a correctness signal.

The real concern is that this function is an SSRF boundary. Once Fedify decides “this URL is public enough to fetch,” the request is made from the server's network, not from the attacker's network.

A realistic example would be a Fedify server running in an environment where 100.64.0.0/10 is used for provider, VPN, Kubernetes, or internal service networking. If an attacker can put a URL like https://100.64.0.10/... in a remote ActivityPub object or media URL, and Fedify classifies that address as public, the Fedify server may send a request to something only reachable from inside that deployment. That could be an internal HTTP service, proxy, metadata endpoint, admin panel, or just a host that reveals reachability through timing or errors.

Similar reasoning applies to ranges like 198.18.0.0/15 in lab or benchmarking networks, and to IPv6 translation/tunneling prefixes where an address can map back to a private IPv4 destination.

So I would not phrase it as “documentation or multicast addresses are always practical SSRF targets.” The issue is that a security check whose job is to allow only public internet destinations was accepting addresses that are not public internet destinations. For SSRF mitigation, that should fail closed: allow globally routable public addresses, reject the rest.
1
silverpill · 5w
nostr:nprofile1qy2hwumn8ghj7un9d3shjtnyd968gmewwp6kyqpqpzjfm9lymy3dnrxg2uk237vlvteefahea7s4ptjzv8n2a9uarrxqp2ut88 >So I would not phrase it as “documentation or multicast addresses are always practical SSRF targets.” But could they be, even in theory? I found that 100.64.0.0/10 is indeed used ...
洪 民憙 (Hong Minhee) :nonbinary: profile picture
Small fedi badge update: the service has moved to a new domain. Please update your badges to use fedi-badge.minhee.org instead of fedi-badge.deno.dev. The old domain will stop working in July.

I also shipped a couple of related changes. Badges can now show the logo of the software an instance is running, like Mastodon, Misskey, Pleroma, and a few others, detected via NodeInfo. If the software isn't recognized, it falls back to the generic fediverse logo.

The service also moved from Deno Deploy Classic, which is sunsetting, to Cloudflare Workers.
Doug Webb · 6w
nostr:nprofile1qy2hwumn8ghj7un9d3shjtnyd968gmewwp6kyqpqpzjfm9lymy3dnrxg2uk237vlvteefahea7s4ptjzv8n2a9uarrxqp2ut88 dayum