Live data from Hacker News

You don’t need reproducible builds

blog.cmpxchg8b.com

21–30 of 179 posts

Re: You don’t need reproducible builds

#21
I think the author hasn’t accurately described the workflow where reproducible builds are used.

Here’s my attempt.

There are three entities:

1. The vendor, who creates and _distributes_ a product, which may include software, to the end user

2. The end user, who receives the product from the vendor, operates the product, and trusts one or more verifiers to correctly certify the product according to some standard that the user desires

3. Verifiers, who receive proprietary access to the vendor’s product (e.g. source code) and check that the product meets a set of standards and assert that fact to the users

Note that verifiers are NOT in the job of distributing products to users. That’s a hard job and it seems understandable to me if verifiers don’t want that job.

Reproducible builds help link a specific version of source code that a verifier certified to a specific product being operated by a user. Without it, the user trusts the vendor much more than with it.

Yes it adds brittleness and delay (see FIPS 140 certification). These are use case specific trade offs that only users can judge.

In the case where some facts about the source code can be formally verified, reproducible builds support that trust relationship much better. I might go so far as to say that reproducible builds are essential for trusting formal verification.

You can also imagine a software supply chain that includes more steps than a simple vendor -> user relationship. Much of the proprietary software used today include libraries from third party vendors. There are integrators that add their own special sauce. The supply chain looks more like: vendor -> vendor -> ... -> vendor -> end user.

Imagine each vendor has their own set of verifiers responsible for certifying that vendor’s output.

Re: You don’t need reproducible builds

#22
post #21

I think the author hasn’t accurately described the workflow where reproducible builds are used. Here’s my attempt. There are three entities: 1. The vendor, who creates and _distributes_ a product, which may include software, to the end user 2. The end user, who receives the product from the vendor, operates the product, and trusts one or more verifiers to correctly certify the product according to some standard that…

but this just shifts the burden of who to trust to the verifiers. It didn't make the software from the vendor _any more_ trustworthy.

Re: You don’t need reproducible builds

#23
post #20

Here's a hypothetical but a realistic scenario that not having reproducible builds is a major issue: 1. I create an app for a client. 2. Client installs the app on their 10,000 enterprise mobile devices and trains the users. 3. Month passes. I've changed everything in the app. 4. Major security or outage event happens. I need to change a line in the app and those 10,000 devices need to be updated ASAP. 5. If I can't…

You are making the case for source control and having no external dependencies like npm, but you don't need reproducible builds for that.

Re: You don’t need reproducible builds

#24
post #22
post #21

I think the author hasn’t accurately described the workflow where reproducible builds are used. Here’s my attempt. There are three entities: 1. The vendor, who creates and _distributes_ a product, which may include software, to the end user 2. The end user, who receives the product from the vendor, operates the product, and trusts one or more verifiers to correctly certify the product according to some standard that…

but this just shifts the burden of who to trust to the verifiers. It didn't make the software from the vendor _any more_ trustworthy.

> this just shifts the burden of who to trust to the verifiers

Agreed. A colleague once said that trust is like a balloon; if you reduce trust in one area, you tend to expand trust in another area.

I think the typical response to your statement from a user is that it’s easier to trust a set of verifiers than it is to trust a vendor. The act of a verifier blessing an artifact makes that artifact more trustworthy.

Personally I’m skeptical of these claims, but that’s the underlying assumption of the certification process

Re: You don’t need reproducible builds

#25

> Q. If a user has chosen to trust a platform where all binaries must be codesigned by the vendor, but doesn’t trust the vendor, then reproducible builds allow them to verify the vendor isn’t malicious. > I think this is a fantasy threat model. If the user does discover the vendor was malicious, what are they supposed to do? > The malicious vendor can simply refuse to provide them with signed security updates instead…

And vendor malice isn't the only reason why the software might be harmful. What if the vendor's toolchain was compromised without their knowledge? Reproducible builds provide a means for third parties to verify that it wasn't.

Re: You don’t need reproducible builds

#28
post #23
post #20

Here's a hypothetical but a realistic scenario that not having reproducible builds is a major issue: 1. I create an app for a client. 2. Client installs the app on their 10,000 enterprise mobile devices and trains the users. 3. Month passes. I've changed everything in the app. 4. Major security or outage event happens. I need to change a line in the app and those 10,000 devices need to be updated ASAP. 5. If I can't…

You are making the case for source control and having no external dependencies like npm, but you don't need reproducible builds for that.

I've a feeling there's multiple definitions of build reproducibility going on here. I'm guessing you mean that it's not important to be have something byte for byte identical, but more to ensure that exactly the same build steps were run with the same source code?

For most of us, that's what build reproducibility means, but I guess for a subset of users it means producing an identical binary.

Re: You don’t need reproducible builds

#29
post #7

I don't know about the 'formal' description of reproducible builds used in the article from a security perspective, but I do know that having the exact same output locally as is being built by a deployment process makes debugging a lot more straightforward because it removes the subtle and hard-to-discover problem of having slightly different library versions in your application making things perform differently.

Right, and I like the ability to re-build a release from 6 months ago and get something that reproduces the behaviour of the previous build - i'm not concerned if the binary is identical, more that it is functionally identical. A typical way of breaking this would be for build scripts to move forward but not be made backward compatible, or easy for the previous version to be used for an old build (for example, a newer compiler getting used rather than the one originally used).

I've worked on enough stuff where releases get held up for various reasons (and so production software can be 6 months behind head) and there's a desire for a fix to the released version and hence changes made to a branch as well as head to apply the fix. This sort of thing is made much easier if you don't have to spend time trying to work out how to get the branch to still build!

Post reply on HN