<https://daniel.haxx.se/blog/2022/01/17/enforcing-the-pyramid-of-open-source/>
The well-known log4j security vulnerability of December 2021 triggered a lot of
renewed discussions around software supply chain security, and sometimes it has
also been said to be an Open Source related issue.
This was not the first software component to have a serious security flaw, and
it will not be the last.
What can we do about it?
This is the 10,000 dollar question that is really hard to answer. In this post
I hope to help putting some light on to why it is such a hard problem. This
comes from my view as an Open Source author and contributor since almost three
decades now.
In this post I’m going to talk about security as in how we make our products
have less bugs in the code we write and land on purpose. There is also a lot to
be said about infrastructure problems such as consumers not verifying
dependencies so that when malicious actors purposely destroy a component, users
of that don’t notice the problem or supply chain security issues that risk
letting bad actors insert malicious code into components. But those are not
covered in this blog post!
The OSS Pyramid
I think we can view the world of software and open source as a pyramid, and I
made this drawing to illustrate.
The OSS pyramid, click for bigger version.
Inside the pyramid there is a hierarchy where things using software are build
on top of others, in layers. The higher up you go, the more you stand on the
shoulders of open source components below you.
At the very bottom of the pyramid are the foundational components. Operating
systems and libraries. The stuff virtually everything runs or depends upon. The
components you really don’t want to have serious security vulnerabilities.
Going upwards
In the left green arrow, I describe the trend if you look at software when
climbing upwards the pyramid.
Makes more direct money
Shorter lifetimes, faster iterations
Higher level languages
Shrinking share of Open Source
More end user facing
At the top, there are a lot of things that are not Open Source. Proprietary
shiny fronts with Open Source machines in the basement.
Going downwards
In the red arrow on the right, I describe the trend if you look at software
when going downwards in the pyramid.
Maintenance is more important than new fluff
Longer lifetimes
Bugs have larger impact and take longer to get deployed
Lower level languages
At the bottom, almost everything is Open Source. Each component in the bottom
has countless users depending on them.
It is in the bottom of the pyramid each serious bug has a risk of impacting the
world in really vast and earth-shattering ways. That is where tightening things
up may have the most positive outcomes. (Even if avoiding problems is mostly
invisible unsexy work.)
Zoom out to see the greater picture
We can argue about specific details and placements within the pyramid, but I
think largely people can agree with the greater picture.
Skyscrapers using free bricks
A little quote from my friend Stefan Eissing:
As a manufacturer of skyscrapers, we decided to use the free bricks made
available and then maybe something bad happened with them. Where is the problem
in this scenario?
Market economy drives “good enough”
As long as it is possible to earn a lot of money without paying much for the
“communal foundation” you stand on, there is very little incentive to invest in
or pay for maintenance of something – that also incidentally benefits your
competitors. As long as you make (a lot of) money, it is fine if it is “good
enough”.
Good enough software components will continue to have the occasional slip-ups
(= horrible security flaws) and as long as those mistakes don’t truly hurt the
moneymakers in this scenario, this world picture remains hard to change.
However, if those flaws would have a notable negative impact on the mountains
of cash in the vaults, then something could change. It would of course require
something extraordinary for that to happen.
What can bottom-dwellers do
Our job, as makers of bricks in the very bottom of the pyramid, is to remind
the top brass of the importance of a solid foundation.
Our work is to convince a large enough share of software users higher up the
stack that are relying on our functionality, that they are better off and can
sleep better at night if they buy support and let us help them not fall into
any hidden pitfalls going forward. Even if this also in fact indirectly helps
their competitors who might rely on the very same components. Having support
will at least put them in a better position than the ones who don’t have it, if
something bad happens. Perhaps even make them avoid badness completely. Paying
for maintenance of your dependencies help reduce the risk for future alarm
calls far too early on a weekend morning.
This convincing part is often much easier said than done. It is only human to
not anticipate the problem ahead of time and rather react after the fact when
the problem already occurred. “We have used this free product for years without
problems, why would we pay for it now?”
Software projects with sufficient funding to have engineer time spent on the
code should be able to at least make serious software glitches rare. Remember
that even the world’s most valuable company managed to ship the most ridiculous
security flaw. Security is hard.
(How we work to make sure curl is safe.)
Components in higher levels can help
All producers of code should make sure dependencies of theirs are of high
quality. High quality here, does not only mean that the code as of right now is
working, but they should also make sure that the dependencies are run in ways
that are likely to continue to produce good output.
This may require that you help out. Add resources. Provide funding. Run
infrastructure. Whatever those projects may need to improve – if anything.
The smallest are better off with helping hands
I participate in a few small open source projects outside of curl. Small
projects that produce libraries that are used widely. Not as widely as curl
perhaps, but still millions and millions of users. Pyramid-bottom projects
providing infrastructure for free for the moneymakers in the top. (I’m not
naming them here because it doesn’t matter exactly which ones it is. As a
reader I’m sure you know of several of this kind of projects.)
This kind of projects don’t have anyone working on the project full-time and
everyone participates out of personal interest. All-volunteer projects.
Imagine that a company decides they want to help avoiding “the next log4j flaw”
in such a project. How would that be done?
In the slightly larger projects there might be a company involved to pay for
support or an individual working on the project that you can hire or contract
to do work. (In this aspect, curl would for example count as a “slightly
larger” kind.)
In these volunteers-only projects, all the main contributors work somewhere
(else) and there is no established project related entity to throw money at to
fix issues. In these projects, it is not necessarily easy for a contributor to
take on a side project for a month or two – because they are employed to do
something else during the days. Day-jobs have a habit of making it difficult to
take a few weeks or months off for a side project.
Helping hands would, eh… help
Even the smallest projects tend to appreciate a good bug-fix and getting things
from the TODO list worked on and landed. It also doesn’t add too much work load
or requirements on the volunteers involved and it doesn’t introduce any
money-problems (who would receive it, taxation, reporting, etc).
For projects without any existing way setup or available method to pay for
support or contract work, providing man power is for sure a good alternative to
help out. In many cases the very best way.
This of course then also moves the this is difficult part to the company that
wants the improvement done (the user of it), as then they need to find that
engineer with the correct skills and pay them for the allotted time for the job
etc.
The entity providing such helping hands to smaller projects could of course
also be an organization or something dedicated for this, that is
sponsored/funded by several companies.
A general caution though: this creates the weird situation where the people
running and maintaining the projects are still unpaid volunteers but people who
show up contributing are getting paid to do it. It causes unbalances and might
be cause for friction. Be aware. This needs to be done in close cooperating
with the maintainers and existing contributors in these projects.
Not the mythical man month
Someone might object and ask what about this notion that adding manpower to a
late software project makes it later? Sure, that’s often entirely correct for a
project that already is staffed properly and has manpower to do its job. It is
not valid for understaffed projects that most of all lack manpower.
Grants are hard for small projects
Doing grants is a popular (and easy from the giver’s perspective) way for some
companies and organizations who want to help out. But for these all-volunteer
projects, applying for grants and doing occasional short-term jobs is onerous
and complicated. Again, the contributors work full-time somewhere, and landing
and working short term on a project for a grant is then a very complicated
thing to mix into your life. (And many employers actively would forbid
employees to do it.)
Should you be able to take time off your job, applying for grants is hard and
time consuming work and you might not even get the grant. Estimating time and
amount of work to complete the job is super hard. How much do you apply for and
how long will it take?
Some grant-givers even assume that you also will contribute so to speak, so the
amount of money paid by the grant will not even cover your full-time wage. You
are then, in effect, expected to improve the project by paying parts of the job
yourself. I’m not saying this is always bad. If you are young, a student or
early in your career that might still be perfect. If you are a family provider
with a big mortgage, maybe less so.
[...]
_______________________________________________
nexa mailing list
nexa@server-nexa.polito.it
https://server-nexa.polito.it/cgi-bin/mailman/listinfo/nexa