A Vulnerability in Libsodium

(00f.net)

212 points | by raggi 9 hours ago ago

25 comments

  • CiPHPerCoder 7 hours ago

    This also affected the PHP library, sodium_compat. https://github.com/FriendsOfPHP/security-advisories/pull/756

    I'm planning to spend my evening checking every other Ed25519 implementation I can find to see if this check is missing any where else in the open source ecosystem.

    • CiPHPerCoder 5 hours ago

      I found several libraries that simply didn't implement the check, but none that implemented in incorrectly in the same way as the vulnerability discussed above.

      If you didn't receive an email from me, either your implementation isn't listed on https://ianix.com/pub/ed25519-deployment.html, I somehow missed it, or you're safe.

      • F3nd0 3 hours ago

        Thank you for your work on free software.

    • hu3 6 hours ago

      Thank you for your work on open source.

  • proof_by_vibes 7 hours ago

    I've been iterating on sodium bindings in Lean4 for about four months, and now that I've gotten to Ristretto255 I can see why the author is excited about its potential. Ristretto is a tightly designed API that allows me to build arbitrary polynomials on Curve25519 and I've been having a blast tinkering and experimenting with it! If the author by chance reads this, just want to say thank you for your work!

    • fshacf 5 hours ago

      You have a public repo of this?

      • proof_by_vibes 3 hours ago

        Yes: https://github.com/rj-calvin/sodium

        The bindings are set and have a monadic interface, but there's some abstractions that still need refining/iterating: mostly I want to be able to formalize keyboard input and eventually build a tactic framework for zero-knowledge proofs.

  • runtimepanic 6 hours ago

    Subtle but important bug. This is a good example of how “is valid” checks in crypto are rarely as simple as they sound. Accepting points outside the prime-order subgroup can quietly undermine higher-level assumptions, even if no immediate exploit is obvious. Also a reminder that low-level primitives tend to be reused far more widely than intended, so small validation gaps can have surprisingly large blast radii.

    • loup-vaillant 3 hours ago

      Do note thought that X25519 and Ed25519 were designed so they wouldn’t need those checks at all. It’s only when you’re trying to design fancier protocols on top of Curve25519 or Edwards25519 that you can run into subgroup issues.

      And for those use cases, I personally try my best to just reproject everything back into the prime order subgroup whenever possible. Monocypher has a number of such fancy functions:

        crypto_x25519_dirty_fast()
        crypto_x25519_dirty_small()
        crypto_elligator_map()
        crypto_elligator_rev()
        crypto_elligator_key_pair()
      
      The dirty functions explicitly produce public keys that cover the entire curve, so that random such keys are truly indistinguishable from random when converted with `crypto_elligator_rev()`. But instead of just removing the clamp operation, I instead add random low-order point, so that when we later use the point in an X25519 key exchange, the shared secret is exactly the same as it would have been for a genuine X255119 key.

      That’s where I thank DJB for designing a key exchange protocol that project the shared secret to the prime order subgroup, even when the public key it processes is not. The original intent may have been to make checks easier (low order keys all end up yielding zero), but a nice side effect is how it enabled a nice API for Mike Hamburg’s Elligator2.

      > Accepting points outside the prime-order subgroup can quietly undermine higher-level assumptions, even if no immediate exploit is obvious.

      If on the other hand we can prove that all computed results are low-order-component-independent (as is the case for X25519), then we know for sure we’re safe. In the end, Ristretto is only really needed when we can’t tweak the protocol to safely reproject to the prime order subgroup.

      Don’t get me wrong, having a prime order group abstraction does help. But if someone is qualified to design a protocol that may require this, they’re qualified to try and make it work with a non-trivial cofactor as well — that, or prove it cannot be done.

  • theLiminator 7 hours ago

    If you work for a big company, consider trying to get Frank sponsored by your company.

    • guessmyname 5 hours ago

      I work for a big company (Apple) but I have no idea who Frank is, nor how to sponsor them; and even if I knew them and how to sponsor them, the money would come directly from my pocket instead of Apple’s banking account.

      • CiPHPerCoder 5 hours ago

        From the article:

          If libsodium is useful to you, please keep in mind that it is maintained by one person, for free, in time I could spend with my family or on other projects. The best way to help the project would be to consider sponsoring it, which helps me dedicate more time to improving it and making it great for everyone, for many more years to come.
        
        The "sponsoring it" links to https://opencollective.com/libsodium/contribute

        Hope that helps.

        • FiloSottile 4 hours ago

          Frank does great work that is critical to many businesses, and should get funded to do it professionally.

          However, donating money to an open collective is prohibitively hard for most big companies. Maybe the world should be different (or maybe not, since it would be easy for employees to embezzle money if they could direct donations easily), but that's how it works currently.

          AFAICT, there is also no fiscal sponsor, so the donation matching suggested in a sister comment won't apply.

          This is why Geomys (https://geomys.org) works the way it does, and why it has revenue (ignoring the FIPS and tlog sides of the business) which is 30-50x of some GitHub Sponsors "success stories": we bill in a way that's compatible with how companies do business, even if effectively we provide a similar service (which is 95% focused on upstream maintenance, not customer support).

          I am not saying it's for everyone, or that Frank should necessarily adopt this model, or that it's the only way (e.g. the Zig foundation raises real amounts of money, too), but I find it frustrating to see over and over again the same conversation:

          - "Alice does important maintenance work, she should get professionally funded for it!"

          - "How does Alice accept/request funding?"

          - "Monthly credit card transactions anchored at $100/mo that are labeled donations"

          - no business can move professional amounts of money that way

          - "Businesses are so short-sighted, it's a tragedy of the commons!"

          • wyldberry 2 hours ago

            Given the increasing obviousness that there's functionally no oversight of NGOs and government funding, perhaps we just need some NGOs and get government grants for these critical services.

          • squigz an hour ago

            While it might be frustrating to see non-viable options presented as ways to fund critical FOSS, it's even more frustrating to see blame effectively being placed on the maintainer; particularly because, if companies like Apple really wanted to fund this work, I'm pretty sure they could figure something out.

            Anyway, looking at the model you propose, it seems like the main difference is that Frank just doesn't explicitly say "you can retain my services"? Is that all that's stopping Apple from contacting him and arranging a contract?

            • tptacek an hour ago

              Filippo is another maintainer, of extremely similar open source software with entirely the same customer base, offering (important) advice to a peer, so I don't think policing his tone is helpful here.

              • squigz 41 minutes ago

                I know who he is and what he does. I think we probably disagree on whether that makes the comment in better or worse taste.

                Otherwise, I agreed with him, and am genuinely curious whether the stopping factor here is maintainers like Frank simply not saying "you can email me to retain my services"

        • commandersaki an hour ago

          If you donate via GitHub Sponsors to https://github.com/jedisct1 from an individual / personal account GitHub won't take a cut (or pays for it from their own purse) for any credit card processing fees.

      • AndyKelley 5 hours ago

        Maybe you don't know this but Apple has a donation-matching program. If you make donations to non-profits through some special internal mechanism, the company will send a donation of equal value (up to some limit). If I recall correctly the limit is 30K USD per person.

        • agwa 4 hours ago

          Any non-profit, or just charitable non-profits (aka 501(c)(3))? Unfortunately, the US does not consider producing open source software to be charitable activity.

          • btilly 3 hours ago

            It can. There are a number of charitable foundations that support open aource. For example the Python Foundation.

            But it is on a case by case basis, and it does take work to get the IRS to accept it.

        • zenmac 5 hours ago

          Do you have any links or more info about the special internal mechanism? Would need an apple employee to initiate this I assume?

          • squigz 4 hours ago

            "When you give money to an eligible organization, we’ll match your donations one-for-one, so your $1 has the impact of $2. And if you choose to donate your time, we’ll contribute $25 for every hour you volunteer. Whether you donate time or money, Apple will match your contributions up to $10,000 a year."

            https://www.apple.com/careers/us/life-at-apple/benefits.html

  • gafferongames 7 hours ago

    Such a great library. Thank you Frank Denis