Skip to content

Piero Bosio Social Web Site Personale Logo Fediverso

Social Forum federato con il resto del mondo. Non contano le istanze, contano le persone

Returning objects in a collection vs. IDs

Technical Discussion
27 6 124
  • @grishka I am developing a client application where this is a real concern.
    But I agree that in general, originating servers are responsible for verification of client data. This part of FEP-fe34 will likely be revised in the future.

    @silverpill do you mean that the "malicious" attachment is not a facsimile of an actual note produced by that actor, but a forgery?

    In these cases, I'll agree with
    @grishka that some validation based on the ID should be necessary.

    For embedded object attachments on the other hand (like mastodon produces), probably the validation needs to check that attributedTo corresponds to the one of the parent object or missing.

    Interesting corner case.

    @technical-discussion

  • @silverpill do you mean that the "malicious" attachment is not a facsimile of an actual note produced by that actor, but a forgery?

    In these cases, I'll agree with
    @grishka that some validation based on the ID should be necessary.

    For embedded object attachments on the other hand (like mastodon produces), probably the validation needs to check that attributedTo corresponds to the one of the parent object or missing.

    Interesting corner case.

    @technical-discussion

    @mariusor Yes, a forged note. I've come up with a more realistic example:

    {
      "type": "Create",
      "id": "https://social.example/activity/345",
      "actor": "https://social.example/alice"
      "object": {
        "type": "Note",
        "id": "https://social.example/note/123",
        "attributedTo": "https://social.example/alice",
        "content": "This is just a note, nothing to see here",
        "replies": {
          "type": "Collection",
          "id": "https://social.example/note/123/replies",
          "items": [{
            "type": Note",
            "id": "https://social.example/note/987",
            "attributedTo": "https://social.example/bob",
            "inReplyTo": "https://social.example/note/123",
            "content": "Ha ha ha... Yes!"
          }]
        }
      }
    }
    

    If the originating server doesn't check the embedded replies collection, a recipient that processes replies and trusts same-origin embeddings unconditionally may end up trusting the forged note.

    What we can do?

    - Sender: find all embedded objects with local id and reject activity if they are not known.
    - Recipient: trust embedded object only if the wrapping object has the same owner.

    I think the second solution is much easier to implement. It reduces the utility of embedding in the use case described by @julian, but to be honest I doubt that embedding significantly reduces the number of required HTTP requests in that case.

    @grishka

  • @mariusor Yes, a forged note. I've come up with a more realistic example:

    {
      "type": "Create",
      "id": "https://social.example/activity/345",
      "actor": "https://social.example/alice"
      "object": {
        "type": "Note",
        "id": "https://social.example/note/123",
        "attributedTo": "https://social.example/alice",
        "content": "This is just a note, nothing to see here",
        "replies": {
          "type": "Collection",
          "id": "https://social.example/note/123/replies",
          "items": [{
            "type": Note",
            "id": "https://social.example/note/987",
            "attributedTo": "https://social.example/bob",
            "inReplyTo": "https://social.example/note/123",
            "content": "Ha ha ha... Yes!"
          }]
        }
      }
    }
    

    If the originating server doesn't check the embedded replies collection, a recipient that processes replies and trusts same-origin embeddings unconditionally may end up trusting the forged note.

    What we can do?

    - Sender: find all embedded objects with local id and reject activity if they are not known.
    - Recipient: trust embedded object only if the wrapping object has the same owner.

    I think the second solution is much easier to implement. It reduces the utility of embedding in the use case described by @julian, but to be honest I doubt that embedding significantly reduces the number of required HTTP requests in that case.

    @grishka

    > - Recipient: trust embedded object only if the wrapping object has the same owner.

    @silverpill no, dereference object and use that instead. The canonical version of an object is the one retrieved from the originating service.

    Mastodon has popularised this behaviour where embedding collections (like your replies) is done by servers in the name of "optimizing" for request counts. But this introduces issues and personally I think it's a "code smell" for ActivityPub. Embedding should be restricted to anonymous objects. When an ID exists it should be used most of the time.

    @technical-discussion @julian @grishka

  • > - Recipient: trust embedded object only if the wrapping object has the same owner.

    @silverpill no, dereference object and use that instead. The canonical version of an object is the one retrieved from the originating service.

    Mastodon has popularised this behaviour where embedding collections (like your replies) is done by servers in the name of "optimizing" for request counts. But this introduces issues and personally I think it's a "code smell" for ActivityPub. Embedding should be restricted to anonymous objects. When an ID exists it should be used most of the time.

    @technical-discussion @julian @grishka

    mariusor@metalhead.club silverpill@mitra.social C2S brings with it a whole other rat's nest of security concerns.

    In an S2S context same origin content ought to be trusted as having been verified. I'd argue a server blindly reflecting received AP content is a vulnerability.

  • @julian I'm not sure what "blindly reflecting" means, but it's at most as vulnerable as using iframes and way less than trusting CDN scripts.

    The way GoActivityPub uses C2S is through clients that validate and sanitize content that they serve back to users, or store in a persistence layer.

    Personally I don't understand why it would make it different than S2S?

    Are you thinking about C2S from a JavaScript client perspective only?

    @silverpill

  • > - Recipient: trust embedded object only if the wrapping object has the same owner.

    @silverpill no, dereference object and use that instead. The canonical version of an object is the one retrieved from the originating service.

    Mastodon has popularised this behaviour where embedding collections (like your replies) is done by servers in the name of "optimizing" for request counts. But this introduces issues and personally I think it's a "code smell" for ActivityPub. Embedding should be restricted to anonymous objects. When an ID exists it should be used most of the time.

    @technical-discussion @julian @grishka

    @mariusor This is basically what my FEP currently recommends: you can trust embedded anonymous objects, fragments and object of Create. Everything else should be authenticated using a different method (e.g. fetched from origin).

    @julian @grishka

  • @mariusor This is basically what my FEP currently recommends: you can trust embedded anonymous objects, fragments and object of Create. Everything else should be authenticated using a different method (e.g. fetched from origin).

    @julian @grishka

    @silverpill oh, I see. I must have missed the context for the discussion, sorry. :)

    @technical-discussion @julian @grishka


Gli ultimi otto messaggi ricevuti dalla Federazione
Post suggeriti
  • 0 Votes
    1 Posts
    6 Views
    Never thought a simple follower list would turn into this!Multi-tab experience, seamless search, smart suggestions, polished interactions, and we're only talking about the Followers screen.Loops is proving first party fedi apps can go toe-to-toe with the biggest mainstream platforms.Beta shipping soon โœจhttps://joinloops.org#loops #tikTok #fediverse #activityPub
  • 0 Votes
    1 Posts
    8 Views
    Annoying #Mastodon and/or #ActivityPub ??? (need info from people much more knowledgeable than I) limitation: I cannot change the post privacy of posts which have already been posted. Not a fan of deleting everything I've put up on #Masto but *do* want to exercise control over what I have already posted and be much more selective about what is and isn't public in the future. Would be great if that were possible, but it seems my only option is to go "scorched Earth." Frustrating. #Fedi #Fediverse
  • Probando snac en debian.

    General Discussion activitypub mastodon snac
    1
    0 Votes
    1 Posts
    8 Views
    Probando snac en debian. Esto sรญ que es autarquรญa. Ya ni siquiera se trata de Mastodon, o de elegir alguna instancia, sino de optar por su lenguaje, ActivityPub, o de montar instancia propia, nรณmada, itinerante, en algรบn cacharro electrรณnico reciclado.#ActivityPub #Mastodon #snac
  • 1 Votes
    1 Posts
    10 Views
    We have just released v4.6.0 of NodeBB, containing fixes to our ActivityPub integration, minor fixes with SCSS, and some new functionality with topic templating. :globe_with_meridians: ActivityPub Fixes WordPress blogs can be properly pulled into NodeBB (via their URL) now Fixed an error when moving a remote topic to another category This also fixed the issue where moved topics didn't update topic/post counters Fixed bug where NodeBB could not properly process Link headers when it contained the standalone crossorigin directive Notifications for replies to topics made in remote categories now show the appropriate user Fixed bug where remote users were not able to post to a local category if registered-users privilege was removed (now checks fediverse pseudo-user) Nested remote categories can now be removed from the ACP Remote categories can be renamed for de-duplication purposes Improved title generation for quote-posts Core fixes Persona theme now shows hidden (zero-character) links in post content _variables.scss page in ACP > Appearance can now override Bootstrap variables A template can be provided in a category's settings. This template is auto-populated in the composer when a new topic is being authored.