Skip to content

ENH: Add vulnerability scan workflow with grype#164

Open
matthewfeickert wants to merge 5 commits intoscientific-python:mainfrom
matthewfeickert:feat/add-grype
Open

ENH: Add vulnerability scan workflow with grype#164
matthewfeickert wants to merge 5 commits intoscientific-python:mainfrom
matthewfeickert:feat/add-grype

Conversation

@matthewfeickert
Copy link
Copy Markdown
Member

@matthewfeickert matthewfeickert commented Apr 23, 2026

HT to @wolfv and @pavelzw for the 2026-04-21 prefix.dev blog post Securing the Conda-Forge Supply Chain.

@matthewfeickert matthewfeickert self-assigned this Apr 23, 2026
Comment thread .github/workflows/grype.yml Outdated
locked: true

- name: Scan with grype
run: pixi exec grype .pixi/envs/default
Copy link
Copy Markdown
Member Author

@matthewfeickert matthewfeickert Apr 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is the flag

  -f, --fail-on string         set the return code to 2 if a vulnerability is found with a severity >= the given severity, options=[negligible low medium high critical]

but I decided to not have things fail at the moment as we have some critical ones that I don't think we can do much about yet.

$ pixi exec grype .pixi/envs/default --fail-on high | grep 'High\|Critical'
 ✔ Indexed file system                                                                                                                         .pixi/envs/default 
 ✔ Cataloged contents                                                                            3913d5d0159f235532a38c6542273f76b141335ceeef368779ba833d9fbcb4ac 
   ├── ✔ Packages                        [211 packages]  
   ├── ✔ Executables                     [262 executables]  
   ├── ✔ File metadata                   [11,099 locations]  
   └── ✔ File digests                    [11,099 files]  
 ✘ Scan for vulnerabilities        [58 vulnerability matches]  
   ├── by severity: 2 critical, 22 high, 27 medium, 4 low, 1 negligible (2 unknown)
   └── by status:   50 fixed, 8 not-fixed, 0 ignored 
[0000]  WARN no explicit name and version provided for directory source, deriving artifact ID from the given path (which is not ideal) from=syft
A newer version of grype is available for download: 0.111.1 (installed version is 0.111.0)
[0002] ERROR discovered vulnerabilities at or above the severity threshold
libtiff         4.7.1                                                           conda   CVE-2023-52356       High        0.8% (74th)    0.6    
openssl         3.6.0      3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1                  conda   CVE-2025-15467       High        0.7% (72nd)    0.6    
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    conda   CVE-2025-69420       High        0.3% (53rd)    0.2    
python          3.14.2                                                          conda   CVE-2026-6100        Critical    0.2% (35th)    0.1    
jaraco-context  5.3.0      6.1.0                                                python  GHSA-58pv-8j8x-9vj2  High        < 0.1% (25th)  < 0.1  
libpng          1.6.53     1.6.55                                               conda   CVE-2026-25646       High        < 0.1% (23rd)  < 0.1  
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    conda   CVE-2025-69419       High        < 0.1% (19th)  < 0.1  
openssl         3.6.0      3.6.2                                                conda   CVE-2026-28386       Critical    < 0.1% (15th)  < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  conda   CVE-2026-28389       High        < 0.1% (15th)  < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  conda   CVE-2026-28390       High        < 0.1% (15th)  < 0.1  
libpng          1.6.53     1.6.56                                               conda   CVE-2026-33636       High        < 0.1% (15th)  < 0.1  
libpng          1.6.53     1.6.56                                               conda   CVE-2026-33416       High        < 0.1% (11th)  < 0.1  
openssl         3.6.0      1.0.2zn, 1.1.1ze, 3.0.19, 3.3.6, 3.4.4, *3.6.1, ...  conda   CVE-2025-69421       High        < 0.1% (10th)  < 0.1  
libtiff         4.7.1                                                           conda   CVE-2026-4775        High        < 0.1% (9th)   < 0.1  
urllib3         2.6.2      2.6.3                                                python  GHSA-38jv-5279-wg99  High        < 0.1% (8th)   < 0.1  
libpng          1.6.53     1.6.54                                               conda   CVE-2026-22695       High        < 0.1% (8th)   < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  conda   CVE-2026-28388       High        < 0.1% (7th)   < 0.1  
pillow          12.0.0     12.1.1                                               python  GHSA-cfh3-3jmp-rvhc  High        < 0.1% (5th)   < 0.1  
pillow          12.0.0     12.2.0                                               python  GHSA-whj4-6x5x-4v2j  High        < 0.1% (4th)   < 0.1  
python          3.14.2                                                          conda   CVE-2026-4786        High        < 0.1% (5th)   < 0.1  
libpng          1.6.53     1.6.54                                               conda   CVE-2026-22801       High        < 0.1% (4th)   < 0.1  
openssl         3.6.0      3.0.20, 3.3.7, 3.4.5, 3.5.6, *3.6.2                  conda   CVE-2026-31790       High        < 0.1% (4th)   < 0.1  
openssl         3.6.0      3.5.6, *3.6.2                                        conda   CVE-2026-2673        High        < 0.1% (4th)   < 0.1  
wheel           0.45.1     0.46.2                                               python  GHSA-8rrh-rw8j-w5fx  High        < 0.1% (1st)   < 0.1

Not sure what people think.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When there is a safe version I would fail. Or you're saying we can't do it here??

If we don't fail I am not sure I understand what this action does. People won't really have a look then no?

Copy link
Copy Markdown
Member Author

@matthewfeickert matthewfeickert Apr 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When there is a safe version I would fail.

@tupui so you're saying as there is the flag

      --only-fixed             ignore matches for vulnerabilities that are not fixed

to do

Suggested change
run: pixi exec grype .pixi/envs/default
run: pixi exec grype .pixi/envs/default --only-fixed --fail-on high

?

Copy link
Copy Markdown
Member Author

@matthewfeickert matthewfeickert Apr 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's some information here that we don't want though / should filter out, as

$ pixi exec grype --only-fixed --fail-on high .pixi/envs/default | grep 'High\|Crit'
 ✔ Indexed file system                                                                                                                         .pixi/envs/default 
 ✔ Cataloged contents                                                                            3913d5d0159f235532a38c6542273f76b141335ceeef368779ba833d9fbcb4ac 
   ├── ✔ Packages                        [211 packages]  
   ├── ✔ Executables                     [262 executables]  
   ├── ✔ File metadata                   [11,099 locations]  
   └── ✔ File digests                    [11,099 files]  
 ✘ Scan for vulnerabilities        [50 vulnerability matches]  
   ├── by severity: 2 critical, 23 high, 27 medium, 4 low, 1 negligible (2 unknown)
   └── by status:   50 fixed, 9 not-fixed, 9 ignored 
[0000]  WARN no explicit name and version provided for directory source, deriving artifact ID from the given path (which is not ideal) from=syft
A newer version of grype is available for download: 0.111.1 (installed version is 0.111.0)
[0002] ERROR discovered vulnerabilities at or above the severity threshold
openssl         3.6.0      3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1                  conda   CVE-2025-15467       High        0.7% (72nd)    0.6    
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    conda   CVE-2025-69420       High        0.3% (53rd)    0.2    
jaraco-context  5.3.0      6.1.0                                                python  GHSA-58pv-8j8x-9vj2  High        < 0.1% (25th)  < 0.1  
libpng          1.6.53     1.6.55                                               conda   CVE-2026-25646       High        < 0.1% (23rd)  < 0.1  
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    conda   CVE-2025-69419       High        < 0.1% (19th)  < 0.1  
openssl         3.6.0      3.6.2                                                conda   CVE-2026-28386       Critical    < 0.1% (15th)  < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  conda   CVE-2026-28389       High        < 0.1% (15th)  < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  conda   CVE-2026-28390       High        < 0.1% (15th)  < 0.1  
libpng          1.6.53     1.6.56                                               conda   CVE-2026-33636       High        < 0.1% (15th)  < 0.1  
libpng          1.6.53     1.6.56                                               conda   CVE-2026-33416       High        < 0.1% (11th)  < 0.1  
openssl         3.6.0      1.0.2zn, 1.1.1ze, 3.0.19, 3.3.6, 3.4.4, *3.6.1, ...  conda   CVE-2025-69421       High        < 0.1% (10th)  < 0.1  
urllib3         2.6.2      2.6.3                                                python  GHSA-38jv-5279-wg99  High        < 0.1% (8th)   < 0.1  
libpng          1.6.53     1.6.54                                               conda   CVE-2026-22695       High        < 0.1% (8th)   < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  conda   CVE-2026-28388       High        < 0.1% (7th)   < 0.1  
pillow          12.0.0     12.1.1                                               python  GHSA-cfh3-3jmp-rvhc  High        < 0.1% (5th)   < 0.1  
pillow          12.0.0     12.2.0                                               python  GHSA-whj4-6x5x-4v2j  High        < 0.1% (4th)   < 0.1  
libpng          1.6.53     1.6.54                                               conda   CVE-2026-22801       High        < 0.1% (4th)   < 0.1  
openssl         3.6.0      3.0.20, 3.3.7, 3.4.5, 3.5.6, *3.6.2                  conda   CVE-2026-31790       High        < 0.1% (4th)   < 0.1  
openssl         3.6.0      3.5.6, *3.6.2                                        conda   CVE-2026-2673        High        < 0.1% (4th)   < 0.1  
wheel           0.45.1     0.46.2                                               python  GHSA-8rrh-rw8j-w5fx  High        < 0.1% (1st)   < 0.1

has things like

NAME            INSTALLED  FIXED IN                                            TYPE    VULNERABILITY        SEVERITY    EPSS           RISK
...
jaraco-context  5.3.0      6.1.0                                               python  GHSA-58pv-8j8x-9vj2  High        < 0.1% (25th)  < 0.1  

which is a CVE for Python and not for the conda-forge package. So we want to also be able to ask it only for conda-forge related vulnerabilities that have a release with a fix.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

--only-fixed --fail-on high

Ah yes I would try to do that, or at least on criticals?

--only-fixed

More of an open remark. In general if we get notified that something hit the fan really bad, we could consider having a way to stop the distribution completely.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tupui I now have two checks, where the second is checking for the fixed and unfixed but fails only for critical vulnerabilities.

      - name: Scan with grype (for fixed vulnerabilities)
        run: pixi exec grype .pixi/envs/default --only-fixed --fail-on high

      - name: Scan with grype (for all vulnerabilities)
        run: pixi exec grype .pixi/envs/default --fail-on critical

Copy link
Copy Markdown
Member Author

@matthewfeickert matthewfeickert Apr 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, no, I had to flip them to

      - name: Scan with grype (for all vulnerabilities)
        run: pixi exec grype .pixi/envs/default --fail-on critical

      - name: Scan with grype (for fixed vulnerabilities)
        run: pixi exec grype .pixi/envs/default --only-fixed --fail-on high

or else we would never pick up the unfixed critical vulnerabilities that you were mentioning checking for if there were known fixed vulnerabilities that were at high or critical.

So if we can pass on the most restrictive cut level (Critical) for everything, then we loosen the cut level to High and then check again for ones with fixes.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I guess we can make some arguments for both 😅

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tupui I think if we want to be able to test both and know if there are unfixed VeryBad ™️ vulnerabilities that still persist after the 30 dependency cooldown

# month window to find security issues
exclude-newer = "30d"

then we need to use what is currently there:

  1. --fail-on critical
  2. --only-fixed --fail-on high

@matthewfeickert
Copy link
Copy Markdown
Member Author

@scientific-python/nightly-wheels-developers this is ready for review.

Copy link
Copy Markdown
Member

@tupui tupui left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice! Did not know this one and I see they even support SBOM directly.

Comment thread .github/workflows/grype.yml Outdated
Comment thread .grype.yaml Outdated
Comment on lines +2 to +4
- package:
# only show vulnerabilities from conda-forge conda packages
type: python
Copy link
Copy Markdown

@pavelzw pavelzw Apr 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i don't think this is what you want.
grype doesn't map type conda vulnerabilities (like

jaraco.context    6.1.1    pyhcf101f3_0  15.01 KiB  conda  https://conda.anaconda.org/conda-forge

)

to CVEs (like

jaraco-context  5.3.0      6.1.0                                               python  GHSA-58pv-8j8x-9vj2  High        < 0.1% (25th)  < 0.1

). right now, there is no mapping for this. grype finds the typical site packages structure and infers the corresponding pypi package through this. if you excluded type: python packages, you would miss all python CVEs

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see also https://pixi.prefix.dev/latest/security/#current-gaps-and-practical-recommendation

We are currently working on a PURL-related Conda Enhancement Proposal, conda/ceps#63, that will make it easier to match conda-installed software against CVEs that are tracked in other ecosystems like PyPI. Until that work is standardized and widely implemented, direct scans of the already-installed environment with tools like Syft and Grype remain the most practical workaround.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for explaining this in detail, @pavelzw.

@matthewfeickert
Copy link
Copy Markdown
Member Author

matthewfeickert commented Apr 23, 2026

Note that there's a lot of vulnerabilities coming from openssl

NAME            INSTALLED  FIXED IN                                             TYPE    VULNERABILITY        SEVERITY    EPSS           RISK   
openssl         3.6.0      3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1                  conda   CVE-2025-15467       High        0.7% (72nd)    0.6    
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    conda   CVE-2025-69420       High        0.3% (53rd)    0.2  

but these won't be fixed anytime soon as conda-forge's global pinning are currently pinned to

openssl:
  - '3.5'

given a desire to stay on the LTS release in conda-forge/conda-forge-pinning-feedstock#7862.

edit: That being said, not sure how were getting openssl of v3.6.0 then at all, given that the 3.5 pin has been there for 5 months and I assume Python has been built again since then.

@stefanv
Copy link
Copy Markdown
Member

stefanv commented Apr 23, 2026

Is the overarching goal of this PR to prevent uploading nightlies built with known-vulnerable build dependencies?

@matthewfeickert
Copy link
Copy Markdown
Member Author

matthewfeickert commented Apr 23, 2026

Is the overarching goal of this PR to prevent uploading nightlies built with known-vulnerable build dependencies?

@stefanv No. This doesn't give us any information on the uploaded packages or their build process — we only get them once they're already wheels. This only checks to see if the tool doing the uploading, anaconda-client, and its dependencies have any known vulnerabilities. That's the only thing that we can say doing security scans on software environments provides us, but, a compromised environment could effectively result in undefined behavior. We could imagine that in a compromised environment the upload process is mutating the packages being uploaded in a malicious manner (we don't have anything like Trusted Publishers or attestations for uploading to anaconda.org). Monitoring the known security vulnerabilities that exist in the environment allows for the possibility of risk assessment of using our provided software environment (by us or others).

@matthewfeickert
Copy link
Copy Markdown
Member Author

@tupui (I'm no longer in European timezones, so I'll be slower to reply this week, but) do you have any other thoughts on this PR?

Copy link
Copy Markdown
Member

@tupui tupui left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 🙌 (I am not the fastest as well these days, no worries 😉)

The one thing we could add somewhere is instructions on what to do if failing. Not everyone will know I suppose.

@matthewfeickert
Copy link
Copy Markdown
Member Author

The one thing we could add somewhere is instructions on what to do if failing. Not everyone will know I suppose.

Good point. Let me add some docs.

@matthewfeickert matthewfeickert requested a review from tupui April 27, 2026 19:20
@stefanv
Copy link
Copy Markdown
Member

stefanv commented Apr 27, 2026

Failing because:

  1. Anaconda token missing in CI/test upload.
  2. Threshold exceeded for vulnerability check:
Details
[0032] ERROR discovered vulnerabilities at or above the severity threshold
NAME            INSTALLED  FIXED IN                                             TYPE    VULNERABILITY        SEVERITY    EPSS           RISK   
libtiff         4.7.1                                                           conda   CVE-2023-6277        Medium      3.8% (88th)    2.2    
openssl         3.6.0      3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1                  binary  CVE-2025-15467       High        0.7% (72nd)    0.6    
openssl         3.6.0      3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1                  conda   CVE-2025-15467       High        0.7% (72nd)    0.6    
libtiff         4.7.1                                                           conda   CVE-2023-52356       High        0.7% (72nd)    0.6    
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    binary  CVE-2025-69420       High        0.3% (53rd)    0.2    
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    conda   CVE-2025-69420       High        0.3% (53rd)    0.2    
python          3.14.2                                                          binary  CVE-2026-6100        Critical    0.2% (35th)    0.1    
python          3.14.2                                                          conda   CVE-2026-6100        Critical    0.2% (35th)    0.1    
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     binary  CVE-2026-0672        Medium      0.2% (36th)    < 0.1  
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     conda   CVE-2026-0672        Medium      0.2% (36th)    < 0.1  
jaraco-context  5.3.0      6.1.0                                                python  GHSA-58pv-8j8x-9vj2  High        < 0.1% (25th)  < 0.1  
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     binary  CVE-2026-0865        Medium      0.1% (32nd)    < 0.1  
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     conda   CVE-2026-0865        Medium      0.1% (32nd)    < 0.1  
libpng          1.6.53     1.6.55                                               conda   CVE-2026-25646       High        < 0.1% (23rd)  < 0.1  
openssl         3.6.0      1.0.2zn, 1.1.1ze, 3.0.19, 3.3.6, 3.4.4, *3.6.1, ...  binary  CVE-2026-22796       Medium      0.1% (30th)    < 0.1  
openssl         3.6.0      1.0.2zn, 1.1.1ze, 3.0.19, 3.3.6, 3.4.4, *3.6.1, ...  conda   CVE-2026-22796       Medium      0.1% (30th)    < 0.1  
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    binary  CVE-2025-69419       High        < 0.1% (19th)  < 0.1  
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    conda   CVE-2025-69419       High        < 0.1% (19th)  < 0.1  
python          3.14.2     3.15.0a6                                             binary  CVE-2025-15366       Medium      < 0.1% (23rd)  < 0.1  
python          3.14.2     3.15.0a6                                             binary  CVE-2025-15367       Medium      < 0.1% (23rd)  < 0.1  
python          3.14.2     3.15.0a6                                             conda   CVE-2025-15366       Medium      < 0.1% (23rd)  < 0.1  
python          3.14.2     3.15.0a6                                             conda   CVE-2025-15367       Medium      < 0.1% (23rd)  < 0.1  
openssl         3.6.0      3.6.2                                                binary  CVE-2026-28386       High        < 0.1% (16th)  < 0.1  
openssl         3.6.0      3.6.2                                                conda   CVE-2026-28386       High        < 0.1% (16th)  < 0.1  
python          3.14.2                                                          binary  CVE-2026-3298        High        < 0.1% (15th)  < 0.1  
python          3.14.2                                                          conda   CVE-2026-3298        High        < 0.1% (15th)  < 0.1  
libpng          1.6.53     1.6.56                                               conda   CVE-2026-33636       High        < 0.1% (15th)  < 0.1  
openssl         3.6.0      3.3.6, 3.4.4, 3.5.5, *3.6.1                          binary  CVE-2025-66199       Medium      < 0.1% (20th)  < 0.1  
openssl         3.6.0      3.3.6, 3.4.4, 3.5.5, *3.6.1                          conda   CVE-2025-66199       Medium      < 0.1% (20th)  < 0.1  
python          3.14.2                                                          binary  CVE-2026-1502        Medium      < 0.1% (18th)  < 0.1  
python          3.14.2                                                          conda   CVE-2026-1502        Medium      < 0.1% (18th)  < 0.1  
libtiff         4.7.1                                                           conda   CVE-2026-4775        High        < 0.1% (11th)  < 0.1  
libpng          1.6.53     1.6.56                                               conda   CVE-2026-33416       High        < 0.1% (10th)  < 0.1  
openssl         3.6.0      1.0.2zn, 1.1.1ze, 3.0.19, 3.3.6, 3.4.4, *3.6.1, ...  binary  CVE-2025-69421       High        < 0.1% (10th)  < 0.1  
openssl         3.6.0      1.0.2zn, 1.1.1ze, 3.0.19, 3.3.6, 3.4.4, *3.6.1, ...  conda   CVE-2025-69421       High        < 0.1% (10th)  < 0.1  
openssl         3.6.0      1.1.1zg, 3.0.20, 3.3.7, 3.4.5, 3.5.6, *3.6.2, ...    binary  CVE-2026-28387       High        < 0.1% (9th)   < 0.1  
openssl         3.6.0      1.1.1zg, 3.0.20, 3.3.7, 3.4.5, 3.5.6, *3.6.2, ...    conda   CVE-2026-28387       High        < 0.1% (9th)   < 0.1  
openssl         3.6.0      3.0.20, 3.3.7, 3.4.5, 3.5.6, *3.6.2                  binary  CVE-2026-31789       Critical    < 0.1% (7th)   < 0.1  
openssl         3.6.0      3.0.20, 3.3.7, 3.4.5, 3.5.6, *3.6.2                  conda   CVE-2026-31789       Critical    < 0.1% (7th)   < 0.1  
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     binary  CVE-2025-15282       Medium      < 0.1% (13th)  < 0.1  
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     binary  CVE-2026-1299        Medium      < 0.1% (13th)  < 0.1  
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     conda   CVE-2025-15282       Medium      < 0.1% (13th)  < 0.1  
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     conda   CVE-2026-1299        Medium      < 0.1% (13th)  < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           binary  CVE-2026-3644        Medium      < 0.1% (12th)  < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           conda   CVE-2026-3644        Medium      < 0.1% (12th)  < 0.1  
urllib3         2.6.2      2.6.3                                                python  GHSA-38jv-5279-wg99  High        < 0.1% (8th)   < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  binary  CVE-2026-28389       High        < 0.1% (8th)   < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  binary  CVE-2026-28390       High        < 0.1% (8th)   < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  conda   CVE-2026-28389       High        < 0.1% (8th)   < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  conda   CVE-2026-28390       High        < 0.1% (8th)   < 0.1  
libpng          1.6.53     1.6.54                                               conda   CVE-2026-22695       High        < 0.1% (8th)   < 0.1  
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     binary  CVE-2025-11468       Medium      < 0.1% (11th)  < 0.1  
python          3.14.2     3.10.20, 3.11.15, 3.12.13, 3.13.12, *3.14.3, ...     conda   CVE-2025-11468       Medium      < 0.1% (11th)  < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           binary  CVE-2026-4224        Medium      < 0.1% (10th)  < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           conda   CVE-2026-4224        Medium      < 0.1% (10th)  < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  binary  CVE-2026-28388       High        < 0.1% (5th)   < 0.1  
openssl         3.6.0      1.0.2zp, 1.1.1zg, 3.0.20, 3.3.7, 3.4.5, *3.6.2, ...  conda   CVE-2026-28388       High        < 0.1% (5th)   < 0.1  
pillow          12.0.0     12.1.1                                               python  GHSA-cfh3-3jmp-rvhc  High        < 0.1% (5th)   < 0.1  
python          3.14.2                                                          binary  CVE-2026-4786        High        < 0.1% (5th)   < 0.1  
python          3.14.2                                                          conda   CVE-2026-4786        High        < 0.1% (5th)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           binary  CVE-2026-3446        Medium      < 0.1% (7th)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           conda   CVE-2026-3446        Medium      < 0.1% (7th)   < 0.1  
libpng          1.6.53     1.6.54                                               conda   CVE-2026-22801       High        < 0.1% (4th)   < 0.1  
openssl         3.6.0      1.0.2zn, 1.1.1ze, 3.0.19, 3.3.6, 3.4.4, *3.6.1, ...  binary  CVE-2025-68160       Medium      < 0.1% (7th)   < 0.1  
openssl         3.6.0      1.0.2zn, 1.1.1ze, 3.0.19, 3.3.6, 3.4.4, *3.6.1, ...  conda   CVE-2025-68160       Medium      < 0.1% (7th)   < 0.1  
pillow          12.0.0     12.2.0                                               python  GHSA-whj4-6x5x-4v2j  High        < 0.1% (3rd)   < 0.1  
openssl         3.6.0      3.5.6, *3.6.2                                        binary  CVE-2026-2673        High        < 0.1% (4th)   < 0.1  
openssl         3.6.0      3.5.6, *3.6.2                                        conda   CVE-2026-2673        High        < 0.1% (4th)   < 0.1  
openssl         3.6.0      3.0.20, 3.3.7, 3.4.5, 3.5.6, *3.6.2                  binary  CVE-2026-31790       High        < 0.1% (3rd)   < 0.1  
openssl         3.6.0      3.0.20, 3.3.7, 3.4.5, 3.5.6, *3.6.2                  conda   CVE-2026-31790       High        < 0.1% (3rd)   < 0.1  
cryptography    46.0.5     46.0.7                                               python  GHSA-p423-j2cm-9vmq  Medium      < 0.1% (5th)   < 0.1  
openssl         3.6.0      3.3.6, 3.4.4, 3.5.5, *3.6.1                          binary  CVE-2025-15468       Medium      < 0.1% (6th)   < 0.1  
openssl         3.6.0      3.3.6, 3.4.4, 3.5.5, *3.6.1                          conda   CVE-2025-15468       Medium      < 0.1% (6th)   < 0.1  
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    binary  CVE-2026-22795       Medium      < 0.1% (5th)   < 0.1  
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    conda   CVE-2026-22795       Medium      < 0.1% (5th)   < 0.1  
python          3.14.2                                                          binary  CVE-2026-6019        Low         < 0.1% (11th)  < 0.1  
python          3.14.2                                                          conda   CVE-2026-6019        Low         < 0.1% (11th)  < 0.1  
python          3.14.2                                                          binary  CVE-2025-12781       Medium      < 0.1% (4th)   < 0.1  
python          3.14.2                                                          conda   CVE-2025-12781       Medium      < 0.1% (4th)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a7                           binary  CVE-2026-2297        Medium      < 0.1% (4th)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a7                           conda   CVE-2026-2297        Medium      < 0.1% (4th)   < 0.1  
wheel           0.45.1     0.46.2                                               python  GHSA-8rrh-rw8j-w5fx  High        < 0.1% (1st)   < 0.1  
python-dotenv   1.2.1      1.2.2                                                python  GHSA-mf9w-mj56-hr94  Medium      < 0.1% (3rd)   < 0.1  
libpng          1.6.53     1.6.57                                               conda   CVE-2026-34757       Medium      < 0.1% (3rd)   < 0.1  
libtiff         4.7.1                                                           conda   CVE-2023-6228        Medium      < 0.1% (3rd)   < 0.1  
openssl         3.6.0      3.4.4, 3.5.5, *3.6.1                                 binary  CVE-2025-11187       Medium      < 0.1% (0th)   < 0.1  
openssl         3.6.0      3.4.4, 3.5.5, *3.6.1                                 conda   CVE-2025-11187       Medium      < 0.1% (0th)   < 0.1  
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    binary  CVE-2025-69418       Medium      < 0.1% (0th)   < 0.1  
openssl         3.6.0      1.1.1ze, 3.0.19, 3.3.6, 3.4.4, 3.5.5, *3.6.1, ...    conda   CVE-2025-69418       Medium      < 0.1% (0th)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           binary  CVE-2025-13462       Low         < 0.1% (2nd)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           conda   CVE-2025-13462       Low         < 0.1% (2nd)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           binary  CVE-2026-4519        Low         < 0.1% (0th)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           conda   CVE-2026-4519        Low         < 0.1% (0th)   < 0.1  
openssl         3.6.0      3.5.5, *3.6.1                                        binary  CVE-2025-15469       Medium      < 0.1% (0th)   < 0.1  
openssl         3.6.0      3.5.5, *3.6.1                                        conda   CVE-2025-15469       Medium      < 0.1% (0th)   < 0.1  
cryptography    46.0.5     46.0.6                                               python  GHSA-m959-cc7f-wv43  Low         < 0.1% (0th)   < 0.1  
requests        2.32.5     2.33.0                                               python  GHSA-gc5v-m9x4-r6x2  Medium      < 0.1% (0th)   < 0.1  
pygments        2.19.2     2.20.0                                               python  GHSA-5239-wwwm-4pmq  Low         < 0.1% (0th)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           binary  CVE-2026-3479        Negligible  < 0.1% (3rd)   < 0.1  
python          3.14.2     3.13.13, *3.14.4, 3.15.0a8                           conda   CVE-2026-3479        Negligible  < 0.1% (3rd)   < 0.1

Copy link
Copy Markdown
Member

@tupui tupui left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice docs thanks 🙏

@matthewfeickert
Copy link
Copy Markdown
Member Author

@stefanv Can I also get a review from you (no rush on this though)?

Copy link
Copy Markdown
Member

@bsipocz bsipocz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overall this looks good to me; but I think we should really aim to get this job in a green passing state otherwise it will be very difficult to spot any new issues.

Getting the job to pass can be done in a follow-up if you prefer, so I'm OK with merging this as is.

@matthewfeickert
Copy link
Copy Markdown
Member Author

I think we should really aim to get this job in a green passing state otherwise it will be very difficult to spot any new issues.

Getting the job to pass can be done in a follow-up if you prefer, so I'm OK with merging this as is.

@bsipocz I fully agree, but I want to be honest that I think that this probably won't happen for a long time unless there's some discussion with conda-forge people.

To avoid having a broken weekly CI test for a long time I could open up some discussion RE: the global pinning and see how this would also affect the conda-forge feedstocks for python and cryptography. Thoughts?

@tupui
Copy link
Copy Markdown
Member

tupui commented Apr 30, 2026

this probably won't happen for a long time unless there's some discussion with conda-forge people.

That's a bit outrageous they would take some sweet time to fix things considering all that is happening now in terms of supply chain hacks 😅

@matthewfeickert
Copy link
Copy Markdown
Member Author

matthewfeickert commented Apr 30, 2026

That's a bit outrageous they would take some sweet time to fix things considering all that is happening now in terms of supply chain hacks 😅

I'm not saying that they would be unhelpful. I'm saying that given the build system #164 (comment) I would probably need to ask on the conda-forge Zulip to have a member of conda-forge/core explain to me if the global pinning to openssl v3.5.x in terms of build requirements has a knock on effect of keeping v3.6.1 from getting isntalled, or if that is just the version that python and cryptography got built against and we need to talk to their maintainer teams to get rebuilds.

edit: Actually, from pixi browse -m python I can see that python's run requirement on openssl isn't constrained here

image

and from pixi browse -m cryptography neither is cryptography's

image

So I'm not sure what is going on.

@matthewfeickert
Copy link
Copy Markdown
Member Author

matthewfeickert commented Apr 30, 2026

So I'm not sure what is going on.

What was going on is me forgetting that if I run

pixi upgrade

and the thing I'm upgrading

anaconda-client = "==1.14.1"

is already at its most recent release it isn't going to resolve the environment all the way down. If I resolve the lock file though after loosening the dependency cooldown (like @henryiii suggested) then we get

$ pixi list openssl
Name     Version  Build           Size  Kind   Source
openssl  3.6.2    h35e630c_0  3.02 MiB  conda  https://conda.anaconda.org/conda-forge

and the only remaining critical vulnerability is in Python

$ pixi run grype
✨ Pixi task (grype): pixi exec grype .pixi/envs/default: (Scan environment for security vulnerabilities with grype)
 ✔ Indexed file system                                                                                                                                             .pixi/envs/default 
 ✔ Cataloged contents                                                                                                3913d5d0159f235532a38c6542273f76b141335ceeef368779ba833d9fbcb4ac 
   ├── ✔ Packages                        [217 packages]  
   ├── ✔ Executables                     [279 executables]  
   ├── ✔ File metadata                   [11,892 locations]  
   └── ✔ File digests                    [11,892 files]  
 ✔ Scanned for vulnerabilities     [22 vulnerability matches]  
   ├── by severity: 2 critical, 6 high, 12 medium, 2 low, 0 negligible
   └── by status:   4 fixed, 18 not-fixed, 0 ignored 
[0000]  WARN no explicit name and version provided for directory source, deriving artifact ID from the given path (which is not ideal) from=syft
NAME     INSTALLED  FIXED IN  TYPE    VULNERABILITY   SEVERITY  EPSS           RISK   
libtiff  4.7.1                conda   CVE-2023-6277   Medium    3.8% (88th)    2.2    
libtiff  4.7.1                conda   CVE-2023-52356  High      0.7% (72nd)    0.6    
python   3.14.4               binary  CVE-2026-6100   Critical  0.2% (35th)    0.1    
python   3.14.4               conda   CVE-2026-6100   Critical  0.2% (35th)    0.1    
python   3.14.4               binary  CVE-2026-3298   High      < 0.1% (20th)  < 0.1  
python   3.14.4               conda   CVE-2026-3298   High      < 0.1% (20th)  < 0.1  
python   3.14.4     3.15.0a6  binary  CVE-2025-15366  Medium    < 0.1% (23rd)  < 0.1  
python   3.14.4     3.15.0a6  binary  CVE-2025-15367  Medium    < 0.1% (23rd)  < 0.1  
python   3.14.4     3.15.0a6  conda   CVE-2025-15366  Medium    < 0.1% (23rd)  < 0.1  
python   3.14.4     3.15.0a6  conda   CVE-2025-15367  Medium    < 0.1% (23rd)  < 0.1  
python   3.14.4               binary  CVE-2026-1502   Medium    < 0.1% (18th)  < 0.1  
python   3.14.4               conda   CVE-2026-1502   Medium    < 0.1% (18th)  < 0.1  
libtiff  4.7.1                conda   CVE-2026-4775   High      < 0.1% (11th)  < 0.1  
python   3.14.4               binary  CVE-2026-3087   Medium    < 0.1% (14th)  < 0.1  
python   3.14.4               conda   CVE-2026-3087   Medium    < 0.1% (14th)  < 0.1  
python   3.14.4               binary  CVE-2026-4786   High      < 0.1% (5th)   < 0.1  
python   3.14.4               conda   CVE-2026-4786   High      < 0.1% (5th)   < 0.1  
python   3.14.4               binary  CVE-2026-6019   Low       < 0.1% (15th)  < 0.1  
python   3.14.4               conda   CVE-2026-6019   Low       < 0.1% (15th)  < 0.1  
python   3.14.4               binary  CVE-2025-12781  Medium    < 0.1% (4th)   < 0.1  
python   3.14.4               conda   CVE-2025-12781  Medium    < 0.1% (4th)   < 0.1  
libtiff  4.7.1                conda   CVE-2023-6228   Medium    < 0.1% (3rd)   < 0.1

and as CVE-2026-6100 doesn't have a fix, we can't do anything about that yet.

Comment thread MAINTAINERS.md Outdated
Comment on lines +15 to +25
If there are updates available try resolving the lock file fresh with

```
pixi reinstall
```

or by

```
rm pixi.lock && pixi lock
```
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Gave instructions to avoid my mistake here now.

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, now finalized. Sorry for the noise.

Comment thread pixi.toml Outdated
* Add GitHub Actions workflow that runs a vulnerability scan with grype
  (https://github.com/anchore/grype) on the conda packages in the Pixi
  environment. Check for vulnerabilities across all installed packages,
  both those with and without fixes, and then check for vulnerabilities
  that do have known fixes as a more restrictive failure setting.
* Add a Pixi task that executes grype but with 'pixi exec' to make it transient
  and to avoid adding grype to the default environment.
@bsipocz
Copy link
Copy Markdown
Member

bsipocz commented Apr 30, 2026

I am mostly thinking along the line of if it's failing all the time, then we diff it to known issues, like all the ones you highlight?

(I just say this as I have a couple of places where failures are expected and are always around, I find it really really difficult to even looking at the logs carefully as I know they are expected to fail. And naturally new stuff if always burried in those logs. Anyway, I'm much better with the ones where it's just an occasional failure).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants