LWN: Comments on "A backdoor in a popular Ruby gem" https://lwn.net/Articles/785386/ This is a special feed containing comments posted to the individual LWN article titled "A backdoor in a popular Ruby gem". en-us Sun, 02 Nov 2025 13:52:32 +0000 Sun, 02 Nov 2025 13:52:32 +0000 https://www.rssboard.org/rss-specification lwn@lwn.net A backdoor in a popular Ruby gem https://lwn.net/Articles/786342/ https://lwn.net/Articles/786342/ njs <div class="FormattedComment"> Reproducible builds are a great thing, but they're not the first step I'd take.<br> <p> If RubyGems switched to a model where you gave it the VCS tag, and then it used that to build the distributed artifacts itself, then that would already get the main guarantee, without any reproducible builds infrastructure. This is strictly simpler than your proposal, since you also require that RubyGems build the artifacts itself.<br> <p> Once you have that, adding reproducible builds on top would add some value: it would let third-parties validate that the RubyGems build infrastructure hasn't been compromised. This would certainly be a nice capability to have, but it's not really the first priority. (Everyone who downloads from RubyGems already trusts the RubyGems infrastructure in lots of ways!)<br> <p> </div> Sat, 20 Apr 2019 05:56:46 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/786035/ https://lwn.net/Articles/786035/ flussence <div class="FormattedComment"> It's a sad state of affairs. One would think some lessons would be learned after the first 50 or so high profile incidents like this.<br> <p> So… which language ecosystems (if any) *have* bothered to learn? I've seen a few attempts at papering over the multiple-upstreams-single-package problem which could only generously be described as “advisory security”.<br> </div> Mon, 15 Apr 2019 15:57:01 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/786037/ https://lwn.net/Articles/786037/ k8to <div class="FormattedComment"> I think the question I have about articles like this is what does a package repo that is not the wild west look like? <br> </div> Mon, 15 Apr 2019 15:54:09 +0000 Go notary proposal https://lwn.net/Articles/785988/ https://lwn.net/Articles/785988/ ms <div class="FormattedComment"> Yeah, this is currently true because "replace" is only honoured in the main module. And you can't even have a go.mod file include another go.mod-style file so you can't do convenient hacks using eg symlinks. Which means your "build" system is going to have to include random set of "go mod edit" commands, or you start messing with stuff like gohack.<br> <p> They do seem to have admitted the design has a number of holes in it. I'm not aware of the rate of progress addressing said holes....<br> </div> Mon, 15 Apr 2019 11:19:39 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785983/ https://lwn.net/Articles/785983/ cyphar <div class="FormattedComment"> I'm not a fan of Go (despite having been developing with it for the past ~6 years), but I would like to point out that this isn't a new problem with Go -- nor is it really related to reproducible builds (other than the fact that Go's builds are reproducible).<br> <p> The proposal you've linked is talking about effectively adding more checks to go.sum to make it so that go.sum hashes need to be signed by a notary. There are definitely some concerns I have about how this probably would break the Debian "Deserted Island" test for free software, and how it entrenches Google as being central to you being able to build Go code (though they say there will be other notaries managed by other people) -- rather than providing some way for the module author to control the signing of their module hashes.<br> <p> But this doesn't make patching any more difficult than it has been in the past. Outside of vendor/, Go has always made patching exceptionally painful (even pre-modules). And while you could patch vendor/, that's been considered a Very Bad Idea™ for quite a while. Obviously if you need to do it for a private build you can (and in the case of Go modules you could do it with "go mod vendor"), but publishing code that patches vendor/ in that way has been considered a bad practice for quite a long time.<br> <p> It's also not related to reproducible builds because the go.sum hashes are the hashes of the source code, not binaries (so the reproducibility of Go is not relevant to the system being proposed).<br> </div> Mon, 15 Apr 2019 09:31:19 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785939/ https://lwn.net/Articles/785939/ robert_s <div class="FormattedComment"> Newsflash: wild-west package repositories are not to be trusted.<br> </div> Sat, 13 Apr 2019 19:12:43 +0000 Go notary proposal https://lwn.net/Articles/785928/ https://lwn.net/Articles/785928/ Hattifnattar <div class="FormattedComment"> I never worked with Go, but my impression was that Go designers generally like to put the coder in a straitjacket. <br> (For a really funny review of Go, see <a href="https://www.evanmiller.org/four-days-of-go.html">https://www.evanmiller.org/four-days-of-go.html</a>).<br> <p> So this begs the question: are these problems and inconveniences just some "Go things", or this is a general requirement for anybody trying to implement stable builds?<br> </div> Sat, 13 Apr 2019 14:21:51 +0000 Go notary proposal https://lwn.net/Articles/785925/ https://lwn.net/Articles/785925/ nim-nim <div class="FormattedComment"> Besides, with replaces you can not even share your fixed fork within your builds, you need to add a replace directive to every single app, that uses the component requiring patching<br> </div> Sat, 13 Apr 2019 13:43:11 +0000 Go notary proposal https://lwn.net/Articles/785924/ https://lwn.net/Articles/785924/ nim-nim <div class="FormattedComment"> And that amounts to `forcing you to fork and rename everything`, as I wrote in my original message.<br> </div> Sat, 13 Apr 2019 13:41:07 +0000 Go notary proposal https://lwn.net/Articles/785912/ https://lwn.net/Articles/785912/ Cyberax <div class="FormattedComment"> Go modules support replacing, allowing you to use local forks. go get is not at all required.<br> </div> Sat, 13 Apr 2019 09:46:54 +0000 Go notary proposal https://lwn.net/Articles/785911/ https://lwn.net/Articles/785911/ nim-nim <div class="FormattedComment"> To be clearer: in module mode (which will become the default in Go in August) the compiler only knows about the current module it is working on. Every other module the current module needs is taken from a cache. The cache is populated by "go get". Doing a local fix of a module, to use in other modules, therefore, becomes a "publish it for go get" operation, notary checks included.<br> </div> Sat, 13 Apr 2019 09:40:55 +0000 Who is "them"? https://lwn.net/Articles/785910/ https://lwn.net/Articles/785910/ nim-nim <div class="FormattedComment"> The notaries automate the independant versification. And I need them, because the people writing the language spec felt they needed them.<br> </div> Sat, 13 Apr 2019 09:23:27 +0000 Go notary proposal https://lwn.net/Articles/785908/ https://lwn.net/Articles/785908/ nim-nim <div class="FormattedComment"> `go get` and `go build` are deeply imbricated, `go build` builds things from the local project and a cache populated by `go get` (and can trigger `go get` calls during the build process). If `go get` does not accept something, basically, you can not build against this something in go.<br> </div> Sat, 13 Apr 2019 09:20:37 +0000 Go notary proposal https://lwn.net/Articles/785904/ https://lwn.net/Articles/785904/ skybrian <div class="FormattedComment"> This proposal looks like it's all about authenticating downloads using "go get". It doesn't say that the Go compiler will be checking anything or that you can't modify the code after it was downloaded? I didn't see any mention of the Go compiler.<br> <p> <p> </div> Sat, 13 Apr 2019 03:26:50 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785865/ https://lwn.net/Articles/785865/ david.a.wheeler <div class="FormattedComment"> Fair enough. If you're doing anything other than directly fetching from the source distribution (e.g., GitHub), then it makes sense to ensure it's a reproducible build.<br> </div> Fri, 12 Apr 2019 18:43:56 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785864/ https://lwn.net/Articles/785864/ david.a.wheeler <div class="FormattedComment"> Debian certainly doesn't own the concept, that's true. But Debian also doesn't require that you create a new project for every patch, even with reproducible builds. It's simply not true that reproducible builds require the creation of a new project for every patch. Reproducible builds simply give you a way to verify that the binary and source correspond given a build toolsuite. That's a big improvement over "trust us" - you can now "trust but verify".<br> </div> Fri, 12 Apr 2019 18:41:41 +0000 Sandboxing https://lwn.net/Articles/785863/ https://lwn.net/Articles/785863/ david.a.wheeler <div class="FormattedComment"> Travis doesn't make the promise. Travis simply runs the build and can return its results. You can then compare the new build with the old build. The build might include malicious steps... but now you can review the source (including any build instructions) instead of blindly trusting that a precompiled package is the same thing.<br> </div> Fri, 12 Apr 2019 18:38:57 +0000 Who is "them"? https://lwn.net/Articles/785859/ https://lwn.net/Articles/785859/ Cyberax <div class="FormattedComment"> Why do you need notaries at all?<br> </div> Fri, 12 Apr 2019 18:16:22 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785842/ https://lwn.net/Articles/785842/ hmh <div class="FormattedComment"> Ah, golang.<br> <p> Thanks for the link, I have to digest that proposal document before commenting any further.<br> </div> Fri, 12 Apr 2019 15:14:21 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785807/ https://lwn.net/Articles/785807/ nim-nim <div class="FormattedComment"> Close but no hit<br> <p> <a href="https://go.googlesource.com/proposal/+/master/design/25530-notary.md">https://go.googlesource.com/proposal/+/master/design/2553...</a><br> <p> The consequence of this design is that any change to sources (ie patching to fix bugs or security issues) requires setting up a new project, since obviously you can not push your patches to the original project (if you could you would not need patching in the first place), and any patch will invalidate the notary attestation checked by the compiler.<br> </div> Fri, 12 Apr 2019 13:14:27 +0000 Who is "them"? https://lwn.net/Articles/785806/ https://lwn.net/Articles/785806/ nim-nim <div class="FormattedComment"> And an independently-verifiable path can and has been implemented via notary robots, that perform the independant verification.<br> </div> Fri, 12 Apr 2019 13:04:16 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785805/ https://lwn.net/Articles/785805/ nim-nim <div class="FormattedComment"> Debian is not the only entity working on reproducible builds and it does not own the concept.<br> </div> Fri, 12 Apr 2019 12:59:32 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785797/ https://lwn.net/Articles/785797/ NAR <I>However, very few people rebuild *EVERY* package. Most people use a lot of precompiled packages.</I> <P> I think it depends on the language and ecosystem. For Erlang the most common way to get dependencies to fetch the sources from GitHub. For Elixir it looks like source files are downloaded from hex.pm (and compiled once). I don't know about ruby though. Fri, 12 Apr 2019 10:05:47 +0000 Sandboxing https://lwn.net/Articles/785777/ https://lwn.net/Articles/785777/ NYKevin <div class="FormattedComment"> <font class="QuotedText">&gt; If the returned hash is the same as the hash of the file provided, </font><br> <p> I was not aware that TravisCI and friends made that guarantee. It sounds like it would be a difficult promise to keep.<br> </div> Fri, 12 Apr 2019 04:20:13 +0000 Sandboxing https://lwn.net/Articles/785764/ https://lwn.net/Articles/785764/ david.a.wheeler <div class="FormattedComment"> <font class="QuotedText">&gt; &gt; If the sandboxed build environment can inject vulnerabilities (malicious code) into the build result, then you need to release a new version.</font><br> <p> <font class="QuotedText">&gt; No go. RubyGems has to protect itself against hostile projects. You cannot push this back onto those projects, because they are untrusted.</font><br> <p> RubyGems currently completely and totally trusts all projects that send data to it. If a project says, "here is my package xyz version 1.2.3" then if the login is correct RubyGems says "sure" and redistributes it to everyone. That's obviously easy to implement, but it means there's no verification that the package actually *is* a compiled version as claimed.<br> <p> The alternative mooted here is that RubyGems tells some service "please rebuild package xyz version 1.2.3 and send me its cryptographic hash". That external service would be something like CircleCI or TravisCI (something already designed to run externally-provided programs and produce results). If the returned hash is the same as the hash of the file provided, all is well, otherwise there's a problem that needs to be fixed. RubyGems could even provide the rebuilt file to help debug it.<br> <p> It could be third parties instead of RubyGems itself, but that might create a big window of time where the correspondence was not checked.<br> </div> Thu, 11 Apr 2019 23:36:23 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785762/ https://lwn.net/Articles/785762/ david.a.wheeler <div class="FormattedComment"> <font class="QuotedText">&gt; Reproducible builds enable checking that the released package (gem, etc.) was indeed generated from the tagged version in GitHub/GitLab/etc. As far as I understand, in this backdooring case only the released package was modified, not the source, so an automated check on the site hosting the packages could have caught this issue before anyone downloaded the backdoored package.</font><br> <p> Exactly right. In this case, requiring a reproducible build would have completely prevented the problem, since the attacker appears to have not had rights to the corresponding GitHub account.<br> <p> But even if the attacker *had* control over the GitHub account, this check would have prevented *hidden* changes not visible in the official source repo. Instead, the exact changes would have to be directly and publicly visible (if the repo is public). While that doesn't *prevent* an attack, it does make the attack immediately visible.<br> <p> <font class="QuotedText">&gt; If I use dependency X in my project (be it libfoo, or gembar, or whatever), any deployment needs to get X from somewhere: either grab the source and build it yourself, or get a pre-built package (say from rubygems.org).</font><br> <p> <font class="QuotedText">&gt; If X has bugs that I want fixed, but X’s upstream is slow to incorporate these (or totally MIA), I can fork off X′. But I can neither force it into the source repository of X nor replace X on rubygems.org with my X′. I can of course upload X′ to rubygems as a different package.</font><br> <p> That's true, but not the point.<br> <p> The problem is that it's easy to put a package on distribution site (like RubyGems) that is *supposed* to correspond to some source code, but doesn't actually correspond. Most people would assume that Rubygems gem xyzzy version 1.2.3.4 was generated from xyzzy's official source repo (wherever that is), but no mechanism today actually ensures that. It's all honor system. Which works until there's an attacker.<br> <p> Reproducible builds simply let you confirm that a given compiled package of some package P corresponds to its putative source code. They don't guarantee there is no malicious code... but they do guarantee that if there's malicious code, it comes from either the source or the underlying system used to build it. (If you're worried about the latter point, my Diverse Double-Compiling approach will counter that, but let's get reproducible builds first.)<br> <p> You can still use X' if you want. If you have your own source, you can just build it yourself. However, very few people rebuild *EVERY* package. Most people use a lot of precompiled packages. Reproducible builds simply let you confirm that the precompiled packages you use correspond to their source code (if the build tools are not malicious). And that's a significant improvement.<br> </div> Thu, 11 Apr 2019 23:27:14 +0000 Who is "them"? https://lwn.net/Articles/785761/ https://lwn.net/Articles/785761/ david.a.wheeler <div class="FormattedComment"> I have no idea what you're talking about.<br> <p> I didn't find anything like that on Google.<br> <p> The front page of <a href="https://reproducible-builds.org/">https://reproducible-builds.org/</a> instead says: "Reproducible builds are a set of software development practices that create an independently-verifiable path from source to binary code." No notaries, no requirements that require you to change the universe to release a new patch.<br> <p> Again: citation needed. I think you have a misunderstanding of what the reproducible builds folks are trying to do. That's no crime, but I suggest checking it out further.<br> </div> Thu, 11 Apr 2019 23:13:15 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785734/ https://lwn.net/Articles/785734/ hmh <div class="FormattedComment"> Where did you find this? Who are "them"?<br> <p> Because that sort of definition really reeks of enterprise-grade supply chain hardening, gone subtly wrong. Or not so subtly.<br> <p> </div> Thu, 11 Apr 2019 21:11:32 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785726/ https://lwn.net/Articles/785726/ mathstuf <div class="FormattedComment"> <font class="QuotedText">&gt; The "integration" for a distribution service is really just downloading from the repo (e.g., "git clone") when it receives a new module to distribute</font><br> <p> An improvement would be to fetch it from one of the wonderful software archives we've had articles about here (Software Heritage among others). If it isn't in there, submit it and then build from that.<br> </div> Thu, 11 Apr 2019 20:28:55 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785722/ https://lwn.net/Articles/785722/ NAR <div class="FormattedComment"> Reproducible builds enable checking that the released package (gem, etc.) was indeed generated from the tagged version in GitHub/GitLab/etc. As far as I understand, in this backdooring case only the released package was modified, not the source, so an automated check on the site hosting the packages could have caught this issue before anyone downloaded the backdoored package.<br> </div> Thu, 11 Apr 2019 20:11:55 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785693/ https://lwn.net/Articles/785693/ Cyberax <div class="FormattedComment"> <font class="QuotedText">&gt; You've visibly not encountered the latest advancements in reproducibility (lucky you).</font><br> I have. <br> <p> <font class="QuotedText">&gt; They define reproducible as "source code hash, patches included, match the hash computed by a notary robot that attempted to download the code at some unknown point of time".</font><br> Uh, this is incorrect. Debian uses regular packages for reproducible builds. A system I worked on used internal repositories.<br> <p> You simply need a way to recreate the build environment exactly. No notary robots need or anything.<br> </div> Thu, 11 Apr 2019 17:15:32 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785689/ https://lwn.net/Articles/785689/ NYKevin <div class="FormattedComment"> <font class="QuotedText">&gt; If the sandboxed build environment can inject vulnerabilities (malicious code) into the build result, then you need to release a new version.</font><br> <p> No go. RubyGems has to protect itself against hostile projects. You cannot push this back onto those projects, because they are untrusted.<br> </div> Thu, 11 Apr 2019 17:02:33 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785637/ https://lwn.net/Articles/785637/ david.a.wheeler <i>So basically the only way to patch anything is to create a new project, with a new name, at a new URL, ...</i> <p> <a href="https://xkcd.com/285/">[citation needed]</a>. I think you're misunderstanding things. Thu, 11 Apr 2019 14:03:54 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785629/ https://lwn.net/Articles/785629/ david.a.wheeler <div class="FormattedComment"> <font class="QuotedText">&gt; However, applying reproducible builds to a free-for-all package repository like RubyGems, in practice, seems like it would be challenging. At a minimum, you would have to impose these restrictions on projects using reproducible builds ("reproducible projects"):</font><br> <p> <font class="QuotedText">&gt; 1. RubyGems has to integrate with GitHub, and at least a half dozen smaller services-that-are-not-GitHub, or else force all reproducible projects onto GitHub. This may sound trivial, but it's a deal-breaker for the likes of the FSF.</font><br> <p> It'd need to support multiple services, but that's easy. The "integration" for a distribution service is really just downloading from the repo (e.g., "git clone") when it receives a new module to distribute, rerunning the build instructions, and confirming that the results are identical. You don't need to support hooks or anything.<br> <p> <font class="QuotedText">&gt; A standardized build process that every reproducible project uses, with no exceptions allowed, and probably with some restrictions on extensions and modifications to the build process.</font><br> <p> No, you just need a standardized way to invoke whatever build process is provided by the project. If the build process isn't part of the project, then you need to fix that anyway.<br> <p> <font class="QuotedText">&gt; A standardized set of dependencies that reproducible projects' build processes are allowed to use, with no exceptions allowed.</font><br> <p> Not at all. The project just needs to specify its dependencies, and then the build process uses those. The goal is to be able to reproduce a project's build result, not force all projects to use the same thing.<br> <p> <font class="QuotedText">&gt; A standardized sandboxed environment in which the builds may be run without endangering the service as a whole.</font><br> <p> You really only need to allow projects to *specify* the sandboxed environment (and check in that specification into the project). Different projects don't need to use the same one. There's no reason different projects need to use the exact same environment, and different versions of a project's results could use different environments too. It's just that when you're reproducing a *particular* version you need to know which environment.<br> <p> <font class="QuotedText">&gt; That sandbox is kept up-to-date (at least in terms of security vulnerabilities), but we must not alter the output of any builds. So the build's interaction with the sandbox, and with other software running in the sandbox if any, must be very carefully circumscribed to prevent it from behaving differently in response to updates.</font><br> <p> Um, no. The sandbox is what it is. It might be okay to make an exception for the OS kernel (Linux), but otherwise, any "keep up to date" may change the result, so you update the sandbox as part of updating the build process. If the sandboxed build environment can inject vulnerabilities (malicious code) into the build result, then you need to release a new version.<br> <p> Make it easy, not hard, and make it easy to do in stages. Otherwise no one will do it.<br> <p> </div> Thu, 11 Apr 2019 13:59:21 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785628/ https://lwn.net/Articles/785628/ robbe <div class="FormattedComment"> I fail to grasp what reproducible builds will prevent you from doing.<br> <p> If I use dependency X in my project (be it libfoo, or gembar, or whatever), any deployment needs to get X from somewhere: either grab the source and build it yourself, or get a pre-built package (say from rubygems.org).<br> <p> If X has bugs that I want fixed, but X’s upstream is slow to incorporate these (or totally MIA), I can fork off X′. But I can neither force it into the source repository of X nor replace X on rubygems.org with my X′. I can of course upload X′ to rubygems as a different package.<br> <p> Reproducibe builds changes nothing on that front.<br> <p> </div> Thu, 11 Apr 2019 13:31:03 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785609/ https://lwn.net/Articles/785609/ nim-nim <div class="FormattedComment"> You've visibly not encountered the latest advancements in reproducibility (lucky you).<br> <p> The latest iterations of the concept refuse, at the compiler level, to build anything that uses non reproducible third-party sources. Third-party is any code you reuse in your project, it can even be your own bleeding edge code, if it's published as another component, is not totally solid yet, and needs some small short-term adjustments to be reused.<br> <p> They define reproducible as "source code hash, patches included, match the hash computed by a notary robot that attempted to download the code at some unknown point of time".<br> <p> So basically the only way to patch anything is to create a new project, with a new name, at a new URL, upload all your changes here, so the notary robot can vouch you are indeed using the patched code published there. And the notary will happily vouch any code hash is good, as long as it matches its download (so if it downloads at a time the code repository was holed, it will vouch all the holed versions are good).<br> <p> Of course once you've gone to the effort to produce a full-fledged fork, you have zero interest left in merging back anything.<br> </div> Thu, 11 Apr 2019 09:03:56 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785607/ https://lwn.net/Articles/785607/ Cyberax <div class="FormattedComment"> <font class="QuotedText">&gt; You end up with ”reproducible” systems that forbid you to apply any quick fix to third party code while upstream is busy somewhere else (because that would break the notary hash), forcing you to fork and rename everything.</font><br> Uhh... What? You apply fixes just like everywhere else, by making a patch to a fixed version of the package.<br> </div> Thu, 11 Apr 2019 08:26:50 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785604/ https://lwn.net/Articles/785604/ nim-nim <div class="FormattedComment"> All the hype about reproducible builds is perfectly pointless without an upgrade and merge-back strategy.<br> <p> You end up with ”reproducible” systems that forbid you to apply any quick fix to third party code while upstream is busy somewhere else (because that would break the notary hash), forcing you to fork and rename everything.<br> <p> Fast forward a few years no one is using the same fork, not two forks have the same fixes, the only thing the reproducible setup can vouch for is that each build is a one of a kind, that does not share any component with anything else. But, each component has not been modified since its download from fork source (hurrah! the internet notary vouches your backdoored download matches the original badware commit). CVEs to original third party projects may apply (or not), who knows, it's a perfect mess.<br> <p> Code is not something that can be frozen, it needs to evolve (because no code is bug-free and the code environment and security state of the art *will* evolve), none of the reproducibility efforts I know of take this necessary evolution into account. <br> </div> Thu, 11 Apr 2019 08:24:29 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785599/ https://lwn.net/Articles/785599/ roc <div class="FormattedComment"> Developer workstations are incredibly inefficient. For a big project like Firefox you need lots of cores to make the build latency tolerable, but then they're mostly idle.<br> </div> Thu, 11 Apr 2019 07:18:10 +0000 A backdoor in a popular Ruby gem https://lwn.net/Articles/785590/ https://lwn.net/Articles/785590/ nilsmeyer <div class="FormattedComment"> Though it can be said the compute capacity already exists and is paid for on the developers workstation while the funds to pay for it again on the other end have to be organized. <br> </div> Thu, 11 Apr 2019 06:36:41 +0000