CI dependency audit: gunicorn and psycopg, which only the image installs, are never audited #583
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#583
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found on 2026-09-29 in a read-only review of postulo at
95348908d, comparing the audited export of the lock file with the extras the image installs.Checked again on 2026-10-01 against
mainat0a5cad587: still present. The code is now at.forgejo/workflows/ci.yml:303-308: the step gained--ignore-vuln CVE-2026-49265(#323), and the export is unchanged.tests/test_security_audit.py, added with #323, already reads this step and could hold the test below.The
securityjob exports the lock withuv export --no-emit-project --all-groups, without--all-extras, so optional dependencies are left out of whatpip-auditreads. The image installs--extra server --extra postgres, so gunicorn, the HTTP server in every container, andpsycopg/psycopg-binaryare never audited, althoughSECURITY.mdpromises that "every locked dependency" is audited on every push and every Monday..forgejo/workflows/ci.yml:295-299(the export and thepip-auditcall);docker/Dockerfile:89and:94(--extra server --extra postgres);SECURITY.md:36-38and:45-48;docs/THREAT-MODEL.md:102.gunicorn==26.2.0,psycopg==3.3.5andpsycopg-binary==3.3.5. When an advisory is published for one of them, the weekly audit stays green. The image scan would see the package, but it runs only when an image is built (a push tomainor a release) and stops only on fixable HIGH or CRITICAL findings, so in a quiet week, or for a MEDIUM advisory, nobody is told and the disclosure process inSECURITY.mdnever starts.--all-extrasto the export inci.yml(or name--extra server --extra postgres --extra chromium), so the audit covers what the image and the optional renderer install.Done when
tests/test_image_build.pyreads the audit step in.forgejo/workflows/ci.ymland asserts that itsuv exportnames--all-extras, or every extra the Dockerfile'suv syncnames; it fails today.