<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vex on DaTosh Blog</title>
    <link>https://blog.kammel.dev/tags/vex/</link>
    <description>Software Engineering, Security, and Cloud Native Technologies</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>DaTosh</managingEditor>
    <webMaster>DaTosh</webMaster>
    <lastBuildDate>Sun, 11 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.kammel.dev/tags/vex/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The unreasonable effectiveness of VEX in NixOS</title>
      <link>https://blog.kammel.dev/post/nixos_vex/</link>
      <pubDate>Sun, 11 Oct 2026 00:00:00 +0000</pubDate>
      <author>DaTosh</author>
      <guid>https://blog.kammel.dev/post/nixos_vex/</guid>
      <description>&lt;p&gt;Triggered by the flood of LLM-assisted vulnerability reports this year, we have heard a lot about the struggles that maintainers of popular (open-source) projects face to cope with them. Most projects have slowed down feature development to focus on vulnerability triage; others are still looking for ways to combat the flood itself.&lt;/p&gt;
&lt;p&gt;While we tend to hear many reports from maintainers, we have heard less about the people on the other side of the process: SysAdmins, SREs and AppSec teams are equally struggling with the same flood. New (potentially unpatched) CVEs are popping up each day. Each CVE needs to be assessed, and affected software needs to be updated or manually patched.&lt;/p&gt;
&lt;p&gt;If you spend any time in this space, it doesn&amp;rsquo;t take long for you to hear about &lt;a href=&#34;https://www.cisa.gov/sites/default/files/publications/VEX_Use_Cases_Document_508c.pdf&#34;&gt;VEX&lt;/a&gt; documents and statements. VEX stands for Vulnerability Exploitability eXchange: a machine-readable security advisory that tells you whether a specific software product is actually exposed to a known vulnerability.&lt;/p&gt;
&lt;p&gt;Sounds great! But can we actually generate these statements in an automated way to support a scalable vulnerability triage process? The answer is, as always: it depends.&lt;/p&gt;
&lt;h2 id=&#34;sbom-based-scanning&#34;&gt;SBOM-Based Scanning&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s take a look at a security process that is used in many projects and organizations today.&lt;/p&gt;
&lt;p&gt;Given a simple Go program:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;golang.org/x/text/width&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#88c0d0&#34;&gt;main&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;()&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	fmt&lt;span style=&#34;color:#eceff4&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#88c0d0&#34;&gt;Println&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;width&lt;span style=&#34;color:#eceff4&#34;&gt;.&lt;/span&gt;Widen&lt;span style=&#34;color:#eceff4&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#88c0d0&#34;&gt;String&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;&lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;hello, world&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using &lt;code&gt;v0.38.0&lt;/code&gt; of the &lt;code&gt;golang.org/x/text&lt;/code&gt; library:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-go.mod&#34; data-lang=&#34;go.mod&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;module maybe&lt;span style=&#34;color:#81a1c1&#34;&gt;-&lt;/span&gt;vulnerable
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;go &lt;span style=&#34;color:#b48ead&#34;&gt;1.26&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#b48ead&#34;&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;require golang&lt;span style=&#34;color:#eceff4&#34;&gt;.&lt;/span&gt;org&lt;span style=&#34;color:#81a1c1&#34;&gt;/&lt;/span&gt;x&lt;span style=&#34;color:#81a1c1&#34;&gt;/&lt;/span&gt;text v0&lt;span style=&#34;color:#eceff4&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#b48ead&#34;&gt;38.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A common approach to scan a program for vulnerabilities is to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Generate a Software Bill of Materials (SBOM)&lt;/li&gt;
&lt;li&gt;Scan the components noted in the SBOM for known vulnerabilities&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Every team using this approach will see the following vulnerabilities (as of 11 Oct 2026):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ syft scan . -o cyclonedx-json &amp;gt; sbom.cdx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ grype sbom:sbom.cdx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME               INSTALLED  FIXED IN  TYPE       VULNERABILITY  SEVERITY  EPSS         RISK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;golang.org/x/text  v0.38.0    0.39.0    go-module  GO-2026-5970   High      0.5% &lt;span style=&#34;color:#81a1c1&#34;&gt;(&lt;/span&gt;39th&lt;span style=&#34;color:#81a1c1&#34;&gt;)&lt;/span&gt;  0.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;golang.org/x/text  v0.38.0    0.41.0    go-module  GO-2026-6629   High      0.3% &lt;span style=&#34;color:#81a1c1&#34;&gt;(&lt;/span&gt;24th&lt;span style=&#34;color:#81a1c1&#34;&gt;)&lt;/span&gt;  0.3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If we do the legwork though, we can see that neither vulnerability actually affects our program.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://osv.dev/vulnerability/GO-2026-5970&#34;&gt;GO-2026-5970&lt;/a&gt; only exists in the &lt;code&gt;golang.org/x/text/unicode/norm&lt;/code&gt; package, and &lt;a href=&#34;https://osv.dev/vulnerability/GO-2026-6629&#34;&gt;GO-2026-6629&lt;/a&gt; only exists in the &lt;code&gt;golang.org/x/text/secure/precis&lt;/code&gt; package. Neither of them is used in our program!&lt;/p&gt;
&lt;p&gt;We could take this information and craft two VEX statements stating &lt;code&gt;vulnerable_code_not_present&lt;/code&gt;, but there are two issues with this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This manual process scales with the size of your codebase and the number of dependencies.&lt;/li&gt;
&lt;li&gt;You have to &lt;strong&gt;repeat the full analysis every time you change your code&lt;/strong&gt;, because you might start to use a vulnerable function.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;reachability-analysis&#34;&gt;Reachability Analysis&lt;/h2&gt;
&lt;p&gt;Luckily for us, programming languages are highly structured, so it is easy (for machines anyway) to reason about them.&lt;/p&gt;
&lt;p&gt;On top of that, the Go team is very diligent in their work and record every affected import path and symbol, using the &lt;a href=&#34;https://ossf.github.io/osv-schema/#affectedecosystem_specific-field&#34;&gt;ecosystem_specific field&lt;/a&gt;, when a new vulnerability is documented.&lt;/p&gt;
&lt;p&gt;This is what powers &lt;a href=&#34;https://go.googlesource.com/vuln&#34;&gt;govulncheck&lt;/a&gt;. It uses static analysis of our source code and the &lt;a href=&#34;https://vuln.go.dev/&#34;&gt;Go vulnerability database&lt;/a&gt; to narrow down reports to only those that could affect the application. Running it on our sample application shows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ govulncheck .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1&#34;&gt;===&lt;/span&gt; Symbol Results &lt;span style=&#34;color:#81a1c1&#34;&gt;===&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;No vulnerabilities found.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Your code is affected by &lt;span style=&#34;color:#b48ead&#34;&gt;0&lt;/span&gt; vulnerabilities.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;This scan also found &lt;span style=&#34;color:#b48ead&#34;&gt;1&lt;/span&gt; vulnerability in packages you import and &lt;span style=&#34;color:#b48ead&#34;&gt;14&lt;/span&gt; vulnerabilities in
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;modules you require, but your code doesn&lt;span style=&#34;color:#bf616a&#34;&gt;&amp;#39;&lt;/span&gt;t appear to call these vulnerabilities.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you have this power, you could conceivably &lt;a href=&#34;https://words.filippo.io/dependabot/&#34;&gt;turn off Dependabot&lt;/a&gt;, and only patch when affected.&lt;/p&gt;
&lt;h2 id=&#34;this-breaks-down-for-operating-systems&#34;&gt;This Breaks Down for Operating Systems&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s see how this would work for an operating system. We use this Dockerfile:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-Dockerfile&#34; data-lang=&#34;Dockerfile&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;FROM&lt;/span&gt;&lt;span style=&#34;color:#a3be8c&#34;&gt; debian:trixie@sha256:913f6706df59a68922d1dd08f78c2476560a8d367897200a6005b00e5f67c2d5&lt;/span&gt;&lt;span style=&#34;color:#bf616a&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#bf616a&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;RUN&lt;/span&gt; apt-get update &lt;span style=&#34;color:#ebcb8b&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebcb8b&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get install -y --no-install-recommends openssh-server &lt;span style=&#34;color:#ebcb8b&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebcb8b&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p /run/sshd &lt;span style=&#34;color:#ebcb8b&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ebcb8b&#34;&gt;&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -rf /var/lib/apt/lists/*&lt;span style=&#34;color:#bf616a&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then scan as before:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ docker build -t opensshpam .
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ syft scan docker:opensshpam -o cyclonedx-json &amp;gt; sbom.cdx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ grype sbom:sbom.cdx
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;✔ Scanned &lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;for&lt;/span&gt; vulnerabilities     &lt;span style=&#34;color:#81a1c1&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#b48ead&#34;&gt;284&lt;/span&gt; vulnerability matches&lt;span style=&#34;color:#81a1c1&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ├── by severity: &lt;span style=&#34;color:#b48ead&#34;&gt;3&lt;/span&gt; critical, &lt;span style=&#34;color:#b48ead&#34;&gt;65&lt;/span&gt; high, &lt;span style=&#34;color:#b48ead&#34;&gt;80&lt;/span&gt; medium, &lt;span style=&#34;color:#b48ead&#34;&gt;39&lt;/span&gt; low, &lt;span style=&#34;color:#b48ead&#34;&gt;97&lt;/span&gt; negligible
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  └── by status:   &lt;span style=&#34;color:#b48ead&#34;&gt;0&lt;/span&gt; fixed, &lt;span style=&#34;color:#b48ead&#34;&gt;284&lt;/span&gt; not-fixed, &lt;span style=&#34;color:#b48ead&#34;&gt;0&lt;/span&gt; ignored
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME             INSTALLED            FIXED_IN   TYPE  VULNERABILITY   SEVERITY    EPSS          RISK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1&#34;&gt;[&lt;/span&gt;...&lt;span style=&#34;color:#81a1c1&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssh-server   1:10.0p1-7+deb13u4              deb   CVE-2007-2768   Negligible  8.6% &lt;span style=&#34;color:#81a1c1&#34;&gt;(&lt;/span&gt;94th&lt;span style=&#34;color:#81a1c1&#34;&gt;)&lt;/span&gt;   0.4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1&#34;&gt;[&lt;/span&gt;...&lt;span style=&#34;color:#81a1c1&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For this demo we will focus on the triage process for a single vulnerability &lt;a href=&#34;https://nvd.nist.gov/vuln/detail/cve-2007-2768&#34;&gt;CVE-2007-2768&lt;/a&gt;, and leave the remaining 283 as an exercise for the reader. 🫠&lt;/p&gt;
&lt;p&gt;The long and short of it is that if sshd uses OPIE one-time passwords through PAM, an attacker can tell from the login prompt whether a username exists. It&amp;rsquo;s been unfixed upstream since 2007.&lt;/p&gt;
&lt;p&gt;Manually checking our sshd configuration, we can see that PAM is enabled, but keyboard-interactive authentication is disabled, and that is the only way sshd hands a login prompt to PAM.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ docker run --rm opensshpam sh -c &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#39;sshd -T | grep -E &amp;#34;^(usepam|kbdinteractiveauthentication) &amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;usepam yes
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kbdinteractiveauthentication no
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Furthermore, we can see that no module named &lt;code&gt;opie&lt;/code&gt; is configured.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ docker run --rm opensshpam grep -E &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#39;^(@include|auth)&amp;#39;&lt;/span&gt; /etc/pam.d/sshd /etc/pam.d/common-auth
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/pam.d/sshd:@include common-auth
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/pam.d/sshd:@include common-account
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/pam.d/sshd:@include common-session
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/pam.d/sshd:@include common-password
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/pam.d/common-auth:auth     &lt;span style=&#34;color:#81a1c1&#34;&gt;[&lt;/span&gt;success&lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#b48ead&#34;&gt;1&lt;/span&gt; default&lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt;ignore&lt;span style=&#34;color:#81a1c1&#34;&gt;]&lt;/span&gt;      pam_unix.so nullok
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/pam.d/common-auth:auth     requisite                       pam_deny.so
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/etc/pam.d/common-auth:auth     required                        pam_permit.so
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ docker run --rm opensshpam sh -c &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#39;find / -xdev -name &amp;#34;pam_opie*&amp;#34; 2&amp;gt;/dev/null; dpkg -l | grep -i opie&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#616e87;font-style:italic&#34;&gt;# nothing is printed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Doing this for 283 more vulnerabilities on every configuration change is not feasible!&lt;/p&gt;
&lt;h2 id=&#34;the-unreasonable-effectiveness-of-nixos&#34;&gt;The Unreasonable Effectiveness of NixOS&lt;/h2&gt;
&lt;p&gt;Now, what makes NixOS different? Let&amp;rsquo;s consider this system, which is very close to the Docker-based OS example we had before:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nix&#34; data-lang=&#34;nix&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  fileSystems&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;&lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    device &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;/dev/sda1&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    fsType &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;ext4&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#eceff4&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  boot&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;loader&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;grub&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;device &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;nodev&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  system&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;stateVersion &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;26.11&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  services&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;openssh&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;enable &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8fbcbb&#34;&gt;true&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  services&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;openssh&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;settings&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;KbdInteractiveAuthentication &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#8fbcbb&#34;&gt;false&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the following flake:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nix&#34; data-lang=&#34;nix&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  inputs&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;nixpkgs&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;url &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;github:NixOS/nixpkgs/nixos-unstable&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  outputs &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt; nixpkgs&lt;span style=&#34;color:#81a1c1&#34;&gt;,&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;...&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;}:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      nixosConfigurations&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;sshd &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; nixpkgs&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;lib&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;nixosSystem &lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        system &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;x86_64-linux&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        modules &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;          &lt;span style=&#34;color:#ebcb8b&#34;&gt;./configuration.nix&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#eceff4&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#eceff4&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#eceff4&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replacing syft with &lt;a href=&#34;https://github.com/tiiuae/sbomnix&#34;&gt;sbomnix&lt;/a&gt;, we can run the same process as before:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sbomnix .#nixosConfigurations.sshd.config.system.build.toplevel
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1&#34;&gt;[&lt;/span&gt;...&lt;span style=&#34;color:#81a1c1&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;INFO     Wrote: sbom.cdx.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ grype sbom:sbom.cdx.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;✔ Scanned &lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;for&lt;/span&gt; vulnerabilities     &lt;span style=&#34;color:#81a1c1&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#b48ead&#34;&gt;272&lt;/span&gt; vulnerability matches&lt;span style=&#34;color:#81a1c1&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ├── by severity: &lt;span style=&#34;color:#b48ead&#34;&gt;14&lt;/span&gt; critical, &lt;span style=&#34;color:#b48ead&#34;&gt;84&lt;/span&gt; high, &lt;span style=&#34;color:#b48ead&#34;&gt;152&lt;/span&gt; medium, &lt;span style=&#34;color:#b48ead&#34;&gt;22&lt;/span&gt; low, &lt;span style=&#34;color:#b48ead&#34;&gt;0&lt;/span&gt; negligible
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  └── by status:   &lt;span style=&#34;color:#b48ead&#34;&gt;147&lt;/span&gt; fixed, &lt;span style=&#34;color:#b48ead&#34;&gt;125&lt;/span&gt; not-fixed, &lt;span style=&#34;color:#b48ead&#34;&gt;0&lt;/span&gt; ignored
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;NAME        INSTALLED    FIXED_IN   TYPE  VULNERABILITY   SEVERITY    EPSS          RISK
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1&#34;&gt;[&lt;/span&gt;...&lt;span style=&#34;color:#81a1c1&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;openssh     10.5p1                  nix   CVE-2007-2768   Medium      8.6% &lt;span style=&#34;color:#81a1c1&#34;&gt;(&lt;/span&gt;94th&lt;span style=&#34;color:#81a1c1&#34;&gt;)&lt;/span&gt;   4.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1&#34;&gt;[&lt;/span&gt;...&lt;span style=&#34;color:#81a1c1&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Finally, we have arrived at the payoff. As we learned before, &lt;code&gt;CVE-2007-2768&lt;/code&gt; only affects our systems when certain conditions hold, and NixOS allows us to codify those!&lt;/p&gt;
&lt;p&gt;Not only that, but we can &lt;strong&gt;conditionally&lt;/strong&gt; generate a VEX feed, keeping the VEX statement only if the conditions still hold:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-nix&#34; data-lang=&#34;nix&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  config&lt;span style=&#34;color:#81a1c1&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  lib&lt;span style=&#34;color:#81a1c1&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  pkgs&lt;span style=&#34;color:#81a1c1&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#81a1c1&#34;&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;}:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;let&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  notAffected &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#81a1c1&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;pkgs &lt;span style=&#34;color:#81a1c1&#34;&gt;?&lt;/span&gt; opie&lt;span style=&#34;color:#eceff4&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#81a1c1&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; config&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;services&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;openssh&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;settings&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;KbdInteractiveAuthentication &lt;span style=&#34;color:#81a1c1&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#8fbcbb&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#81a1c1&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;lib&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;any &lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;rule&lt;span style=&#34;color:#eceff4&#34;&gt;:&lt;/span&gt; rule&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;enable &lt;span style=&#34;color:#81a1c1&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; lib&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;hasInfix &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;opie&amp;#34;&lt;/span&gt; rule&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;modulePath&lt;span style=&#34;color:#eceff4&#34;&gt;)&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      lib&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;attrValues config&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;security&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;pam&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;services&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;sshd&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;rules&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;auth
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#eceff4&#34;&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;in&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  system&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;build&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;vex &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; pkgs&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;writeText &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;vex.json&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#81a1c1&#34;&gt;builtins&lt;/span&gt;&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;toJSON &lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;@context&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;https://openvex.dev/ns/v0.2.0&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;@id&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;https://kammel.dev/vex/sshd&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      author &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;Fabian Kammel&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      timestamp &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;2026-10-11T00:00:00Z&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      version &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#b48ead&#34;&gt;1&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      statements &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; lib&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;optional notAffected &lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        vulnerability&lt;span style=&#34;color:#81a1c1&#34;&gt;.&lt;/span&gt;name &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;CVE-2007-2768&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        products &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;[&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;{&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;@id&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;pkg:nix/openssh&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;}&lt;/span&gt; &lt;span style=&#34;color:#eceff4&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        status &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;not_affected&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        justification &lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a3be8c&#34;&gt;&amp;#34;vulnerable_code_not_present&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#eceff4&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#eceff4&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#eceff4&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#eceff4&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Integrating this into our process:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ VEX&lt;span style=&#34;color:#81a1c1&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;$(&lt;/span&gt;nix build --no-link --print-out-paths .#nixosConfigurations.sshd.config.system.build.vex&lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ grype --vex $VEX sbom:sbom.cdx.json
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; ✔ Scanned &lt;span style=&#34;color:#81a1c1;font-weight:bold&#34;&gt;for&lt;/span&gt; vulnerabilities     &lt;span style=&#34;color:#81a1c1&#34;&gt;[&lt;/span&gt;&lt;span style=&#34;color:#b48ead&#34;&gt;271&lt;/span&gt; vulnerability matches&lt;span style=&#34;color:#81a1c1&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ├── by severity: &lt;span style=&#34;color:#b48ead&#34;&gt;14&lt;/span&gt; critical, &lt;span style=&#34;color:#b48ead&#34;&gt;84&lt;/span&gt; high, &lt;span style=&#34;color:#b48ead&#34;&gt;152&lt;/span&gt; medium, &lt;span style=&#34;color:#b48ead&#34;&gt;22&lt;/span&gt; low, &lt;span style=&#34;color:#b48ead&#34;&gt;0&lt;/span&gt; negligible
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   └── by status:   &lt;span style=&#34;color:#b48ead&#34;&gt;147&lt;/span&gt; fixed, &lt;span style=&#34;color:#b48ead&#34;&gt;125&lt;/span&gt; not-fixed, &lt;span style=&#34;color:#b48ead&#34;&gt;1&lt;/span&gt; ignored
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The triaged CVE is now successfully ignored.&lt;/p&gt;
&lt;h2 id=&#34;nixos-vex&#34;&gt;nixos-vex&lt;/h2&gt;
&lt;p&gt;As you can see, building out these conditions is a lot of work, but the payoff is enormous. Once a CVE has been triaged and codified, the cost to re-check is close to zero (a little bit of CI overhead).&lt;/p&gt;
&lt;p&gt;I have been doing this sort of triaging work for my NixOS machines, and I have open-sourced this as &lt;a href=&#34;https://github.com/datosh/nixos-vex&#34;&gt;nixos-vex&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Check out the demos for a sample &lt;a href=&#34;https://github.com/datosh/nixos-vex/tree/main/demo/desktop&#34;&gt;desktop&lt;/a&gt; and &lt;a href=&#34;https://github.com/datosh/nixos-vex/tree/main/demo/server&#34;&gt;server&lt;/a&gt; profile, as they also highlight some other features built into nixos-vex.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I would not recommend using this as a high-trust data source yet!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;My goal is to share the process, invite feedback, and hopefully contribute this back to the Nix ecosystem at some point.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
