A place to cache linked articles (think custom and personal wayback machine)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.html 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367
  1. <!doctype html><!-- This is a valid HTML5 document. -->
  2. <!-- Screen readers, SEO, extensions and so on. -->
  3. <html lang="en">
  4. <!-- Has to be within the first 1024 bytes, hence before the `title` element
  5. See: https://www.w3.org/TR/2012/CR-html5-20121217/document-metadata.html#charset -->
  6. <meta charset="utf-8">
  7. <!-- Why no `X-UA-Compatible` meta: https://stackoverflow.com/a/6771584 -->
  8. <!-- The viewport meta is quite crowded and we are responsible for that.
  9. See: https://codepen.io/tigt/post/meta-viewport-for-2015 -->
  10. <meta name="viewport" content="width=device-width,initial-scale=1">
  11. <!-- Required to make a valid HTML5 document. -->
  12. <title>ongoing by Tim Bray · OSQI (archive) — David Larlet</title>
  13. <meta name="description" content="Publication mise en cache pour en conserver une trace.">
  14. <!-- That good ol' feed, subscribe :). -->
  15. <link rel="alternate" type="application/atom+xml" title="Feed" href="/david/log/">
  16. <!-- Generated from https://realfavicongenerator.net/ such a mess. -->
  17. <link rel="apple-touch-icon" sizes="180x180" href="/static/david/icons2/apple-touch-icon.png">
  18. <link rel="icon" type="image/png" sizes="32x32" href="/static/david/icons2/favicon-32x32.png">
  19. <link rel="icon" type="image/png" sizes="16x16" href="/static/david/icons2/favicon-16x16.png">
  20. <link rel="manifest" href="/static/david/icons2/site.webmanifest">
  21. <link rel="mask-icon" href="/static/david/icons2/safari-pinned-tab.svg" color="#07486c">
  22. <link rel="shortcut icon" href="/static/david/icons2/favicon.ico">
  23. <meta name="msapplication-TileColor" content="#f7f7f7">
  24. <meta name="msapplication-config" content="/static/david/icons2/browserconfig.xml">
  25. <meta name="theme-color" content="#f7f7f7" media="(prefers-color-scheme: light)">
  26. <meta name="theme-color" content="#272727" media="(prefers-color-scheme: dark)">
  27. <!-- Is that even respected? Retrospectively? What a shAItshow…
  28. https://neil-clarke.com/block-the-bots-that-feed-ai-models-by-scraping-your-website/ -->
  29. <meta name="robots" content="noai, noimageai">
  30. <!-- Documented, feel free to shoot an email. -->
  31. <link rel="stylesheet" href="/static/david/css/style_2021-01-20.css">
  32. <!-- See https://www.zachleat.com/web/comprehensive-webfonts/ for the trade-off. -->
  33. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  34. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  35. <link rel="preload" href="/static/david/css/fonts/triplicate_t4_poly_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: light), (prefers-color-scheme: no-preference)" crossorigin>
  36. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_regular.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  37. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_bold.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  38. <link rel="preload" href="/static/david/css/fonts/triplicate_t3_italic.woff2" as="font" type="font/woff2" media="(prefers-color-scheme: dark)" crossorigin>
  39. <script>
  40. function toggleTheme(themeName) {
  41. document.documentElement.classList.toggle(
  42. 'forced-dark',
  43. themeName === 'dark'
  44. )
  45. document.documentElement.classList.toggle(
  46. 'forced-light',
  47. themeName === 'light'
  48. )
  49. }
  50. const selectedTheme = localStorage.getItem('theme')
  51. if (selectedTheme !== 'undefined') {
  52. toggleTheme(selectedTheme)
  53. }
  54. </script>
  55. <meta name="robots" content="noindex, nofollow">
  56. <meta content="origin-when-cross-origin" name="referrer">
  57. <!-- Canonical URL for SEO purposes -->
  58. <link rel="canonical" href="https://www.tbray.org/ongoing/When/202x/2024/04/01/OSQI">
  59. <body class="remarkdown h1-underline h2-underline h3-underline em-underscore hr-center ul-star pre-tick" data-instant-intensity="viewport-all">
  60. <article>
  61. <header>
  62. <h1>ongoing by Tim Bray · OSQI</h1>
  63. </header>
  64. <nav>
  65. <p class="center">
  66. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  67. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  68. </svg> Accueil</a> •
  69. <a href="https://www.tbray.org/ongoing/When/202x/2024/04/01/OSQI" title="Lien vers le contenu original">Source originale</a>
  70. <br>
  71. Mis en cache le 2024-04-04
  72. </p>
  73. </nav>
  74. <hr>
  75. <p itemprop="description">I propose the formation of one or more “Open Source Quality Institutes”. An OSQI is a public-sector organization that
  76. employs software engineers. Its mission would be to improve the quality, and especially safety, of popular
  77. Open-Source software.</p>
  78. <p id="p-5" class="p1"><span class="h2">Why?</span> ·
  79. The
  80. <a href="https://en.wikipedia.org/wiki/XZ_utils_backdoor">XZ-Utils backdoor</a> (let’s just say <b>#XZ</b>) launched the train
  81. of thought that led me
  82. to this idea. If you read the story, it becomes obvious that the key vulnerability wasn’t technical, it was the fact that a
  83. whole lot of Open-Source software is on the undermaintained-to-neglected axis, because there’s no business case for paying people
  84. to take care of it. Which is a problem, because there is a <em>strong</em> business case for paying people to attack it.</p>
  85. <p>There are other essential human activities that lack a business case, for example tertiary education,
  86. potable water quality, and financial regulation. For these, we create non-capitalist constructs such as Universities and
  87. Institutes and Agencies, because society needs these things done even if nobody can make money doing them.</p>
  88. <p>I think we need to be paying more attention to the quality generally, and safety especially, of the Open-Source software
  89. that has become the underlying platform for, more or less, our civilization. Thus OSQI.</p>
  90. <p id="p-6" class="p1"><span class="h2">They’re out to get us</span> ·
  91. For me, the two big lessons from <b>#XZ</b> were first, the lack of resources supporting crucial Open-Source infrastructure,
  92. but then and especially, the
  93. demonstration that the attackers are numerous, skilled <em>and patient</em>. We already knew about numerous and skilled but this
  94. episode, where
  95. the attacker was already well-embedded in the project
  96. <a href="https://www.mail-archive.com/xz-devel@tukaani.org/msg00562.html">by May 2022</a>, opened a few eyes, including
  97. mine.</p>
  98. <p>The advantage, to various flavors of malefactor, of subverting core pieces of Open-Source infrastructure, is
  99. incalculable. <b>#XZ</b> was the one we caught; how many have we missed?</p>
  100. <p id="p-7" class="p1"><span class="h2">What’s OSQI?</span> ·
  101. It’s an organization created by a national government. Obviously, more nations than one could have an OSQI.</p>
  102. <p>The vast majority of the staff would be relatively-senior
  103. software
  104. engineers, with a small percentage of paranoid nontechnical security people
  105. (see
  106. <a href="OSQI#p-21">below</a>). You could do a lot with as few as 250 people, and
  107. the burdened cost would be trivial for a substantial government.</p>
  108. <p>Since it is a matter of obvious fact that every company in the
  109. world with revenue of a billion or more is existentially dependent on Open Source, it would be reasonable to impose a levy of,
  110. say, 0.1% of revenue on all such companies, to help support this work. The money needn’t be a problem.</p>
  111. <p id="p-8" class="p1"><span class="h2">Structure</span> ·
  112. The selection of software packages that would get OSQI attention would be left to the organization, although there would be
  113. avenues for anyone to request coverage. The engineering organization could be relatively flat, most people giving individual
  114. attention to individual projects, then also ad-hoc teams forming for tool-building or crisis-handling when something like
  115. <b>#XZ</b> blows up.</p>
  116. <p id="p-10" class="p1"><span class="h2">Why would anyone work there?</span> ·
  117. The pay would be OK; less than you’d make at Google or Facebook, but a decent civil-service salary. There would be no
  118. suspicion that your employer is trying to enshittify anything; in fact, you’d start work in the morning confident that you’re
  119. trying to improve the world. The default work mode would be remote, so you could live somewhere a not-quite-Google salary would
  120. support a very comfortable way of life. There would be decent vacations and benefits and
  121. (<em>*gasp*</em>) a pension.</p>
  122. <p>And there is a certain class of person who would find everyday joy in peeking and poking and polishing
  123. Open-Source packages that are depended on by millions of programmers and (indirectly) billions of humans. A couple of decades
  124. ago I would have been one.</p>
  125. <p>I don’t think recruiting would be a problem.</p>
  126. <p>So, what are OSQI’s goals and non-goals?</p>
  127. <p id="p-11" class="p1"><span class="h2">Goal: Safety</span> ·
  128. This has to come first. If all OSQI accomplishes is the foiling of a few <b>#XZ</b>-flavor attacks, and life becoming harder
  129. for people making them, that’s just fine.</p>
  130. <p id="p-12" class="p1"><span class="h2">Goal: Tool-building</span> ·
  131. I think it’s now conventional wisdom that Open Source’s biggest attack surfaces are dependency networks and build
  132. tools. These are big and complex problems, but let’s be bold and set a high bar:</p>
  133. <blockquote><p>Open-Source software should be built deterministically, verifiably, and reproducibly, from signed source-code
  134. snapshots. These snapshots should be free of generated artifacts; every item in
  135. the snapshot should be human-written and human-readable.</p>
  136. </blockquote>
  137. <p>For example: As
  138. <a href="https://mastodon.social/@kornel">Kornel</a> said,
  139. <a href="https://mastodon.social/@kornel/112187783363254917">Seriously, in retrospect, #autotools itself is a massive
  140. supply-chain security risk.</a> No kidding! But then everyone says “What are you gonna do, it’s wired into everything.”</p>
  141. <p>There are alternatives; I know of
  142. <a href="https://cmake.org">CMake</a> and
  143. <a href="https://mesonbuild.com">Meson</a>. Are they good enough? I don’t know. Obviously, GNU AutoHell can’t be swept out of
  144. all of the fœtid crannies where it lurks and festers, but every project from which it is scrubbed will present less
  145. danger to the world.
  146. I believe OSQI would have the scope to make real progress on this front.</p>
  147. <p id="p-13" class="p1"><span class="h2">Non-goal: Features</span> ·
  148. OSQI should never invest engineering resources in adding cool features to Open-Source packages (with the possible exception
  149. of build-and-test tools). The Open-Source community is bursting with new-features energy, most coming from people who either
  150. want to scratch their own itch or are facing a real blockage at work. They are way better positioned to make those improvements
  151. than anyone at OSQI.</p>
  152. <p id="p-23" class="p1"><span class="h2">Goal: Maintenance</span> ·
  153. Way too many deep-infra packages grow increasingly unmaintained as people age and become busy and tired and sick and dead. As I
  154. was writing this, a
  155. <a href="https://github.com/libexpat/libexpat/blob/R_2_6_2/expat/Changes">plea for help</a> came across my radar from Sebastian
  156. Pipping, the excellent but unsupported and unfunded maintainer of
  157. <a href="https://github.com/libexpat/libexpat/tree/R_2_6_2">Expat</a>, the world’s most popular XML parser.</p>
  158. <p>And yeah, he’s part of a trend, one that notably included the now-infamous
  159. <a href="https://en.wikipedia.org/wiki/XZ_Utils">XZ-Utils</a> package.</p>
  160. <p>And so I think one useful task for OSQI would be taking over (ideally partial) maintenance duties for a lot of Open-Source projects
  161. that have a high ratio of adoption to support. In some cases it would have to take a lower-intensity form, let’s call it “life
  162. support”, where OSQI deals with vulnerability reports but flatly refuses to address any requests for features no matter how
  163. trivial, and rejects all PRs unless they come from someone who’s willing to take on part of the maintenance load.</p>
  164. <p>One benefit of having paid professionals doing this is that they will blow off the kind of social-engineering harassment that
  165. the <b>#XZ</b> attacker inflicted on the XZ-Utils maintainer (see
  166. <a href="https://research.swtch.com/xz-timeline">Russ Cox’s excellent timeline</a>) and which is unfortunately too common in the
  167. Open-Source world generally.</p>
  168. <p id="p-14" class="p1"><span class="h2">Goal: Benchmarking</span> ·
  169. Efficiency is an aspect of quality, and I think it would be perfectly reasonable for OSQI to engage in
  170. benchmarking and optimization. There’s a non-obvious reason for this: <b>#XZ</b> was unmasked when a Postgres specialist noticed
  171. performance problems.</p>
  172. <p>I think that in general, if you’re a bad person trying to backdoor an Open-Source package, it’s going to
  173. be hard to do without introducing performance glitches. I’ve
  174. <a href="/ongoing/When/202x/2021/05/15/Testing-in-2021#p-13">long advocated</a> that unit and/or integration tests should
  175. include a benchmark or two, just to avert well-intentioned performance regressions; if they handicap bad guys too, that’s a
  176. bonus.</p>
  177. <p id="p-15" class="p1"><span class="h2">Goal: Education and evangelism</span> ·
  178. OSQI staff will develop a deep shared pool of expertise in making Open-Source software safer and better, and
  179. specifically in detecting and repelling multiple attack flavors. They should share it! Blogs, conferences, whatever. It even
  180. occurred to me that it might make sense to structure OSQI as an educational institution; standalone or as a grad college of
  181. something existing.</p>
  182. <p>But what I’m talking about isn’t refereed JACM papers, but what my Dad, a Professor of Agriculture, called “Extension”:
  183. Bringing the results of research directly to practitioners.</p>
  184. <p id="p-16" class="p1"><span class="h2">Non-goal: Making standards</span> ·
  185. The world has enough standards organizations. I could see individual OSQI employees pitching in, though, at the IETF or IEEE
  186. or W3C or wherever, with work on Infosec standards.</p>
  187. <p>Which brings me to…</p>
  188. <p id="p-17" class="p1"><span class="h2">Non-goal: Litigation</span> ·
  189. Or really any other enforcement-related activity. OSQI exists to fix problems, build tools, and share lessons. This is going
  190. to be easier if nobody (except attackers) sees them as a threat, and if staff don’t have to think about how their work and
  191. findings will play out in court.</p>
  192. <p>And a related non-goal…</p>
  193. <p id="p-18" class="p1"><span class="h2">Non-goal: Licensing</span> ·
  194. The intersection between the class of people who’d make good OSQI engineers and those who care about Open-Source
  195. licenses is, thankfully, very small. I think OSQI should accept the license landscape that exists and work hard to avoid
  196. thinking about its theology.</p>
  197. <p id="p-19" class="p1"><span class="h2">Non-goal: Certification</span> ·
  198. Once OSQI exists, the notion of “OSQI-approved” might arise. But it’d be a mistake;
  199. OSQI should be an <em>engineering</em> organization; the cost (measured by required bureaucracy) to perform certification would
  200. be brutal.</p>
  201. <p id="p-20" class="p1"><span class="h2">Goal: Transparency</span> ·
  202. OSQI can’t afford to have any secrets, with the sole exception of freshly-discovered but still-undisclosed
  203. vulnerabilities. And when those vulnerabilities are disclosed, the story of their discovery and characterization needs to be
  204. shared entirely and completely. This feels like a bare-minimum basis for building the level of trust that will be
  205. required.</p>
  206. <p id="p-21" class="p1"><span class="h2">Necessary paranoia</span> ·
  207. I discussed above why OSQI might be a nice place to work. There will be a downside, though; you’ll lose a certain amount of
  208. privacy. Because if OSQI succeeds, it will become a super-high-value target for our adversaries. In the natural course of
  209. affairs, many employees would become committers on popular packages, increasing their attractiveness as targets for bribes or
  210. blackmail.</p>
  211. <p>I recall once, a very senior security leader at an Internet giant saying to me “We have thousands of engineers, and my job
  212. requires me to believe that at least one of them also has another employer.”</p>
  213. <p>So I think OSQI needs to employ a small number of paranoid traditional-security (not Infosec) experts to keep an eye on their
  214. colleagues, audit their finances, and just be generally suspicious. These people would also
  215. worry about OSQI’s physical and network security. Because attackers gonna attack.</p>
  216. <p id="p-22" class="p1"><span class="h2">Pronunciation</span> ·
  217. Rhymes with “bosky”, of course. Also, people who work there are OSQIans. I’ve grabbed “osqi.org” and will cheerfully donate it
  218. in the long-shot case that this idea gets traction.</p>
  219. <p id="p-24" class="p1"><span class="h2">Are you serious?</span> ·
  220. Yeah. Except for, I no longer speak with the voice of a powerful employer.</p>
  221. <p>Look: For
  222. better or for worse, Open Source won. <i>[Narrator: Obviously, for better.]</i> That means it has become crucial civilizational
  223. infrastucture, which governments should actively support and maintain, just like roads and dams and power grids.</p>
  224. <p>It’s not so much that OSQI, or something
  225. like it, is a good idea; it’s that <em>not</em> trying to achieve these goals, in 2024, is dangerous and insane.</p>
  226. </article>
  227. <hr>
  228. <footer>
  229. <p>
  230. <a href="/david/" title="Aller à l’accueil"><svg class="icon icon-home">
  231. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-home"></use>
  232. </svg> Accueil</a> •
  233. <a href="/david/log/" title="Accès au flux RSS"><svg class="icon icon-rss2">
  234. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-rss2"></use>
  235. </svg> Suivre</a> •
  236. <a href="http://larlet.com" title="Go to my English profile" data-instant><svg class="icon icon-user-tie">
  237. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-user-tie"></use>
  238. </svg> Pro</a> •
  239. <a href="mailto:david%40larlet.fr" title="Envoyer un courriel"><svg class="icon icon-mail">
  240. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-mail"></use>
  241. </svg> Email</a> •
  242. <abbr class="nowrap" title="Hébergeur : Alwaysdata, 62 rue Tiquetonne 75002 Paris, +33184162340"><svg class="icon icon-hammer2">
  243. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-hammer2"></use>
  244. </svg> Légal</abbr>
  245. </p>
  246. <template id="theme-selector">
  247. <form>
  248. <fieldset>
  249. <legend><svg class="icon icon-brightness-contrast">
  250. <use xlink:href="/static/david/icons2/symbol-defs-2021-12.svg#icon-brightness-contrast"></use>
  251. </svg> Thème</legend>
  252. <label>
  253. <input type="radio" value="auto" name="chosen-color-scheme" checked> Auto
  254. </label>
  255. <label>
  256. <input type="radio" value="dark" name="chosen-color-scheme"> Foncé
  257. </label>
  258. <label>
  259. <input type="radio" value="light" name="chosen-color-scheme"> Clair
  260. </label>
  261. </fieldset>
  262. </form>
  263. </template>
  264. </footer>
  265. <script src="/static/david/js/instantpage-5.1.0.min.js" type="module"></script>
  266. <script>
  267. function loadThemeForm(templateName) {
  268. const themeSelectorTemplate = document.querySelector(templateName)
  269. const form = themeSelectorTemplate.content.firstElementChild
  270. themeSelectorTemplate.replaceWith(form)
  271. form.addEventListener('change', (e) => {
  272. const chosenColorScheme = e.target.value
  273. localStorage.setItem('theme', chosenColorScheme)
  274. toggleTheme(chosenColorScheme)
  275. })
  276. const selectedTheme = localStorage.getItem('theme')
  277. if (selectedTheme && selectedTheme !== 'undefined') {
  278. form.querySelector(`[value="${selectedTheme}"]`).checked = true
  279. }
  280. }
  281. const prefersColorSchemeDark = '(prefers-color-scheme: dark)'
  282. window.addEventListener('load', () => {
  283. let hasDarkRules = false
  284. for (const styleSheet of Array.from(document.styleSheets)) {
  285. let mediaRules = []
  286. for (const cssRule of styleSheet.cssRules) {
  287. if (cssRule.type !== CSSRule.MEDIA_RULE) {
  288. continue
  289. }
  290. // WARNING: Safari does not have/supports `conditionText`.
  291. if (cssRule.conditionText) {
  292. if (cssRule.conditionText !== prefersColorSchemeDark) {
  293. continue
  294. }
  295. } else {
  296. if (cssRule.cssText.startsWith(prefersColorSchemeDark)) {
  297. continue
  298. }
  299. }
  300. mediaRules = mediaRules.concat(Array.from(cssRule.cssRules))
  301. }
  302. // WARNING: do not try to insert a Rule to a styleSheet you are
  303. // currently iterating on, otherwise the browser will be stuck
  304. // in a infinite loop…
  305. for (const mediaRule of mediaRules) {
  306. styleSheet.insertRule(mediaRule.cssText)
  307. hasDarkRules = true
  308. }
  309. }
  310. if (hasDarkRules) {
  311. loadThemeForm('#theme-selector')
  312. }
  313. })
  314. </script>
  315. </body>
  316. </html>