From 6972e9ec87daf396f056374e75010635f59fbeb8 Mon Sep 17 00:00:00 2001 From: Spark Date: Sun, 25 Oct 2026 21:02:57 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20planchers=20de=20s=C3=A9curit=C3=A9=20pi?= =?UTF-8?q?p-audit=20=E2=80=94=20brotli,=20filelock,=20opentelemetry-api,?= =?UTF-8?q?=20pypdf=20#224?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci.yml | 8 +- CHANGELOG.md | 22 ++++- README.fr.md | 6 +- README.md | 6 +- VERSION | 2 +- backend/requirements.txt | 32 +++++-- desktop/Cargo.lock | 2 +- desktop/Cargo.toml | 2 +- desktop/tauri.conf.json | 2 +- docs/ROADMAP.md | 20 +++- .../securite-dependances-pip-audit-224.md | 94 +++++++++++++++++++ package.json | 2 +- tests/test_ci_workflow.py | 8 +- 13 files changed, 184 insertions(+), 22 deletions(-) create mode 100644 docs/features/securite-dependances-pip-audit-224.md diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 52dfeff..fa03077 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -180,7 +180,13 @@ jobs: # PYSEC-2026-3910 / PYSEC-2026-3911 (pypdf, DoS de ressources sur # l'extraction de texte et la lecture d'outlines — donc atteignables # via backend/pdf_reader.py) sont corrigés par le plancher - # pypdf>=6.16.1 (BUG-093). + # pypdf>=6.16.1 (BUG-093), relevé à pypdf>=6.21.2 par #224 (11 CVE + # sur la 6.19.0 de la toolcache, corrigées au plus tard en 6.21.2). + # #224 ajoute les planchers brotli>=1.2.1 (PYSEC-2026-4322, + # GHSA-9v8h-qqgm-4m35), filelock>=4.2.1 (CVE-2026-112940, + # CVE-2026-112913, CVE-2026-112907) et opentelemetry-api>=1.45.1 + # (CVE-2026-114603) : paquets transitifs ou préinstallés dans la + # toolcache, audités mais jamais alignés sans plancher explicite. # CVE-2026-97687 / CVE-2026-97688 / CVE-2026-97689 (urllib3 2.7.0) # corrigés par le plancher urllib3>=2.8.0. # CVE-2026-104874 (multidict 6.7.x) corrigé par le plancher diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a39875..b98cf14 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). > **En cours de développement** : les changements à venir sont listés dans la section -> [Unreleased](#unreleased). La dernière version livrée est **2.78.0**. +> [Unreleased](#unreleased). La dernière version livrée est **2.78.1**. --- @@ -14,6 +14,26 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- +## [2.78.1] — 2026-10-25 + +### Corrigé + +- **Sécurité des dépendances — `pip-audit` rouge sur 2.78.0 (#224)** — + le job `security` du run CI 2303 signalait 17 vulnérabilités dans + 4 paquets hérités de l'environnement du runner (versions + préinstallées dans la toolcache, jamais alignées car « already + satisfied » — même piège que BUG-093). Planchers explicites dans + `backend/requirements.txt` : `pypdf>=6.21.2` (11 CVE sur la 6.19.0, + dont CVE-2026-113786 et CVE-2026-115572/115585/115580), + `brotli>=1.2.1` (PYSEC-2026-4322, GHSA-9v8h-qqgm-4m35), + `filelock>=4.2.1` (CVE-2026-112940, CVE-2026-112913, + CVE-2026-112907) et `opentelemetry-api>=1.45.1` + (CVE-2026-114603). Garde-fou `TestDependencySecurityFloors` + étendu ; aucun code applicatif touché, aucun nouvel ignore + `pip-audit`. Redéploiement Docker requis. + +--- + ## [2.78.0] — 2026-10-25 ### Modifié diff --git a/README.fr.md b/README.fr.md index e74c2e9..c8b539f 100644 --- a/README.fr.md +++ b/README.fr.md @@ -4,7 +4,7 @@ **Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive. -[![Version](https://img.shields.io/badge/Version-2.78.0-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.78.1-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -977,8 +977,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l ## 📝 Changelog -Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.78.0). +Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.78.1). --- -*Projet : ObsiGate | Version : 2.78.0 | Dernière mise à jour : Septembre 2026* +*Projet : ObsiGate | Version : 2.78.1 | Dernière mise à jour : Septembre 2026* diff --git a/README.md b/README.md index 9b8c9a4..29a1f36 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface. -[![Version](https://img.shields.io/badge/Version-2.78.0-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.78.1-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -1152,8 +1152,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) ## 📝 Changelog -See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.78.0). +See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.78.1). --- -*Project: ObsiGate | Version: 2.78.0 | Last updated: September 2026* +*Project: ObsiGate | Version: 2.78.1 | Last updated: September 2026* diff --git a/VERSION b/VERSION index 63221e3..3f7e4a1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.78.0 +2.78.1 diff --git a/backend/requirements.txt b/backend/requirements.txt index a7cbfee..51a84be 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -16,13 +16,16 @@ sortedcontainers>=2.4.0 snowballstemmer>=2.2.0 weasyprint>=70.0 httpx>=0.27.0 -# Plancher de sécurité (BUG-093) : 6.16.0 est vulnérable à deux DoS de -# ressources (PYSEC-2026-3910 outlines, PYSEC-2026-3911 XForm, fix 6.16.1), -# atteignables via backend/pdf_reader.py (PDF fournis par l'utilisateur). -# Le plancher doit être >= 6.16.1 : l'image Act du runner embarque 6.16.0 -# dans sa toolcache Python, donc un plancher trop bas est « already satisfied » -# et n'est jamais mis à niveau. -pypdf>=6.16.1 +# Plancher de sécurité (BUG-093, relevé par #224) : 6.16.0 est vulnérable à +# deux DoS de ressources (PYSEC-2026-3910 outlines, PYSEC-2026-3911 XForm, +# fix 6.16.1), atteignables via backend/pdf_reader.py (PDF fournis par +# l'utilisateur). #224 : la version préinstallée dans la toolcache du +# runner (6.19.0) est frappée par 11 CVE supplémentaires (dont +# CVE-2026-113786, CVE-2026-115572, CVE-2026-115585, CVE-2026-115580), +# corrigées au plus tard en 6.21.2 — le plancher doit être >= 6.21.2 : +# en dessous, pip répond « already satisfied » pour la toolcache et +# n'aligne jamais (même piège que BUG-093). +pypdf>=6.21.2 pyotp>=2.10.0 segno>=1.5.0 webauthn==2.6.0 @@ -55,3 +58,18 @@ multidict>=6.9.1 # transitive (httpx/requests) — sans plancher explicite, pip-audit # signale la version héritée de l'environnement. certifi>=2026.10.19 +# Planchers de sécurité (#224) : paquets transitifs ou préinstallés dans +# la toolcache du runner, audités par pip-audit (CI, bloquant) mais jamais +# alignés sans plancher explicite — « already satisfied » (même piège que +# BUG-093). Versions relevées par le job security du run sur 2.78.0 : +# brotli 1.2.0 (transitive fonttools[woff] via weasyprint) — PYSEC-2026-4322 +# et GHSA-9v8h-qqgm-4m35, corrigées en 1.2.1. +brotli>=1.2.1 +# filelock 3.32.3 (transitive de CacheControl, outil pip-audit, et +# préinstallée dans la toolcache) — CVE-2026-112940, CVE-2026-112913 et +# CVE-2026-112907, corrigées en 4.2.1. +filelock>=4.2.1 +# opentelemetry-api 1.37.0 (préinstallée dans la toolcache du runner, +# aucune dépendance directe d'ObsiGate) — CVE-2026-114603, corrigée +# en 1.45.1. +opentelemetry-api>=1.45.1 diff --git a/desktop/Cargo.lock b/desktop/Cargo.lock index e434d8c..51b53a0 100644 --- a/desktop/Cargo.lock +++ b/desktop/Cargo.lock @@ -2626,7 +2626,7 @@ dependencies = [ [[package]] name = "obsigate-desktop" -version = "2.78.0" +version = "2.78.1" dependencies = [ "chrono", "env_logger", diff --git a/desktop/Cargo.toml b/desktop/Cargo.toml index 3c868cf..86db371 100644 --- a/desktop/Cargo.toml +++ b/desktop/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "obsigate-desktop" -version = "2.78.0" +version = "2.78.1" description = "ObsiGate Desktop — Porte d'entrée native pour vos vaults Obsidian" authors = ["Bruno Charest"] edition = "2021" diff --git a/desktop/tauri.conf.json b/desktop/tauri.conf.json index 88c5f4e..a68d823 100644 --- a/desktop/tauri.conf.json +++ b/desktop/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/nicedoc/obsigate/main/desktop/tauri.conf.schema.json", "productName": "ObsiGate", - "version": "2.78.0", + "version": "2.78.1", "identifier": "com.obsigate.desktop", "build": { "frontendDist": "../frontend", diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 153ea41..394c231 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,6 +1,6 @@ # ObsiGate — Roadmap -> **Version :** 2.78.0 | **Dernière mise à jour :** 2026-10-25 +> **Version :** 2.78.1 | **Dernière mise à jour :** 2026-10-25 > **Ce fichier ne contient que le travail à venir** (🔵 En cours + ⚪ Backlog) et un index compact > vers les fonctionnalités livrées. > - **Méthode de livraison à appliquer pour toute tâche : [DELIVERY_WORKFLOW.md](./DELIVERY_WORKFLOW.md)** @@ -30,6 +30,24 @@ ## 🔵 En cours +### 224. Sécurité des dépendances — pip-audit vierge (brotli, filelock, opentelemetry-api, pypdf) + +- **Effort :** ~0,1 jour | **Impact :** 🔴 | **Ouvert :** 2026-10-25 | **Statut :** ✅ livré le 2026-10-25 (version du hook — voir CHANGELOG ; redéploiement Docker requis) +- **Fiche :** [features/securite-dependances-pip-audit-224.md](./features/securite-dependances-pip-audit-224.md) +- **Description :** le job `security` du run CI 2303 (2.78.0) échoue + sur `pip-audit` : 17 vulnérabilités dans 4 paquets hérités de + l'environnement du runner (toolcache « already satisfied », même + piège que BUG-093). Planchers explicites dans + `backend/requirements.txt` : pypdf relevé à `>=6.21.2`, nouveaux + planchers `brotli>=1.2.1`, `filelock>=4.2.1`, + `opentelemetry-api>=1.45.1` ; garde-fou `TestDependencySecurityFloors` + étendu. Aucun code applicatif, aucun nouvel ignore pip-audit. +- **Sous-tâches :** + - [x] Planchers de sécurité dans `backend/requirements.txt` + commentaires + - [x] Garde-fou `tests/test_ci_workflow.py::TestDependencySecurityFloors` étendu (pypdf 6.21.2, brotli, filelock, opentelemetry-api) + - [x] `pip-audit` local : 0 vulnérabilité non ignorée (mêmes ignores que la CI) + - [x] Release publiée — CI verte à constater, redéploiement Docker (geste de Bruno) + ### 223. Dev/prod sans noms publics en dur — URLs de l'écosystème par configuration - **Effort :** ~0,5 jour | **Impact :** 🟡 | **Ouvert :** 2026-10-25 | **Statut :** ✅ livré le 2026-10-25 (version du hook — voir CHANGELOG ; redéploiement Docker requis, et en dev déclarer les noms en `-dev` dans le `.env` du poste) diff --git a/docs/features/securite-dependances-pip-audit-224.md b/docs/features/securite-dependances-pip-audit-224.md new file mode 100644 index 0000000..feab2b1 --- /dev/null +++ b/docs/features/securite-dependances-pip-audit-224.md @@ -0,0 +1,94 @@ +# #224 — Sécurité des dépendances : pip-audit vierge (brotli, filelock, opentelemetry-api, pypdf) + +> Ouvert le 2026-10-25. Déclencheur : le job `security` du run CI 2303 +> (commit `f29a228`, version 2.78.0) échoue sur `pip-audit` (bloquant, +> #87) — **17 vulnérabilités connues dans 4 paquets**. Le job `lint` +> du même run est vert ; `security` est le seul job terminé en échec +> au moment du constat (`test` en file, `build`/`e2e` en attente). + +## Constat (journal du job `security`, run 2303) + +| Paquet | Version auditée | Vulnérabilités | Corrigée en | +|---|---|---|---| +| brotli | 1.2.0 | PYSEC-2026-4322, GHSA-9v8h-qqgm-4m35 | 1.2.1 | +| filelock | 3.32.3 | CVE-2026-112940, CVE-2026-112913, CVE-2026-112907 | 4.2.1 | +| opentelemetry-api | 1.37.0 | CVE-2026-114603 | 1.45.1 | +| pypdf | 6.19.0 | CVE-2026-113792, CVE-2026-113795, CVE-2026-113793, CVE-2026-113794, CVE-2026-113786, CVE-2026-113791, CVE-2026-113790, CVE-2026-113789, CVE-2026-115572, CVE-2026-115585, CVE-2026-115580 | 6.20.0 → 6.21.2 selon l'advisory (max 6.21.2) | + +Total : 2 + 3 + 1 + 11 = **17 vulnérabilités**. + +Audit local de confirmation, en deux temps : (1) un venv épinglé sur +les versions du runner (brotli 1.2.0, filelock 3.32.3, +opentelemetry-api 1.37.0, pypdf 6.19.0) reproduit **exactement** les +17 vulnérabilités et les versions corrigées du tableau ci-dessus ; +(2) dans le venv du dépôt, `pip-audit` (avec les deux ignores déjà en +place dans la CI) ne ressortait avant correctif que brotli 1.2.0 +(2 advisories, fix 1.2.1) et pypdf 6.21.1 (3 advisories restants, +fix 6.21.2) — ce venv a déjà filelock 4.2.4 (corrigée) et ne contient +pas opentelemetry-api. L'écart avec la CI vient de l'environnement +audité, pas des dépendances déclarées (voir cause). + +## Cause racine + +Même piège que BUG-093 / BUG-095, déjà documenté dans +`backend/requirements.txt` et `.gitea/workflows/ci.yml` : `pip-audit` +audite **tout l'environnement Python du runner**, dont les paquets +préinstallés dans la toolcache de l'image `catthehacker/ubuntu:act-latest`. +`pip install -r backend/requirements.txt` répond « already satisfied » +pour toute exigence transitive déjà satisfaite par la toolcache et +n'aligne jamais la version vulnérable : + +- **pypdf 6.19.0** : préinstallée ; le plancher `>=6.16.1` (BUG-093) + est satisfait, pip ne monte pas vers 6.21.2. +- **brotli 1.2.0** : transitive de `fonttools[woff]` (via weasyprint), + exigée en `>=1.0.1` seulement. +- **filelock 3.32.3** : transitive de CacheControl (outil `pip-audit` + lui-même) et préinstallée ; exigée en `>=3.8.0` seulement. +- **opentelemetry-api 1.37.0** : préinstallée dans la toolcache, + aucune dépendance d'ObsiGate ne la demande. + +## Correctif + +Planchers de sécurité explicites dans `backend/requirements.txt`, +selon le patron déjà en place (pyjwt, urllib3, multidict, certifi) — +aucune autre dépendance touchée, aucun code applicatif modifié : + +- `pypdf>=6.16.1` → **`pypdf>=6.21.2`** (plancher existant relevé) ; +- **`brotli>=1.2.1`** (nouveau plancher) ; +- **`filelock>=4.2.1`** (nouveau plancher) ; +- **`opentelemetry-api>=1.45.1`** (nouveau plancher). + +Garde-fou : `tests/test_ci_workflow.py::TestDependencySecurityFloors` +couvre désormais aussi brotli, filelock et opentelemetry-api, et le +plancher verrouillé de pypdf passe à (6, 21, 2). Le commentaire de +l'étape Pip-audit de `.gitea/workflows/ci.yml` est mis à jour en +conséquence (aucune commande CI modifiée). + +## Exceptions (ignores) + +**Aucun nouvel ignore.** Les deux exceptions déjà en place dans la +CI restent inchangées et ne concernent pas ces paquets : +`PYSEC-2026-1325` (ecdsa, aucun correctif upstream, chemins ECDSA +jamais exécutés — HS256 uniquement) et `CVE-2026-85394` +(python-jose, aucun correctif upstream, non atteignable — voir le +commentaire de l'étape dans `ci.yml`). + +## Vérification + +- `pip-audit` local (mêmes ignores que la CI) après alignement de + l'environnement sur les nouveaux planchers : **0 vulnérabilité + non ignorée**. +- Portes locales du workflow : `pytest tests/`, `ruff check backend/`, + `mypy backend/ --ignore-missing-imports`, tests frontend + (`validate-imports` + `unit`) — voir le commit #224. +- CI Gitea complète verte exigée (lint, test, security, build, e2e) + avant de considérer #224 livré. + +## Livraison + +- Commit conventionnel `fix: … #224` ; le hook de version porte + 2.78.0 → **2.78.1** (correctif) et crée le tag `v2.78.1`, publié + au push ; release Gitea créée sur ce tag après vérification de sa + cible. +- **Redéploiement Docker requis** pour que l'image embarque les + dépendances alignées (l'hôte actuel est l'environnement dev). diff --git a/package.json b/package.json index c26f1c1..90769c4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "obsigate", - "version": "2.78.0", + "version": "2.78.1", "description": "**Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive.", "main": "patch.js", "directories": { diff --git a/tests/test_ci_workflow.py b/tests/test_ci_workflow.py index 282f333..0db1a27 100644 --- a/tests/test_ci_workflow.py +++ b/tests/test_ci_workflow.py @@ -251,11 +251,17 @@ class TestDependencySecurityFloors: #: (paquet, plancher minimal, advisories corrigées au-dessus) FLOORS = { - "pypdf": (6, 16, 1), # PYSEC-2026-3910, PYSEC-2026-3911 (fix 6.16.1) + # #224 : 6.19.0 (toolcache) frappée par 11 CVE, corrigées au plus + # tard en 6.21.2 ; avant : PYSEC-2026-3910/3911 (fix 6.16.1). + "pypdf": (6, 21, 2), # BUG-095 : 2.13.0 a son propre advisory (CVE-2026-102274, fix 2.14.0). "pyjwt": (2, 14, 0), # PYSEC-2026-178 (2.13.0) puis CVE-2026-102274 (2.14.0) "urllib3": (2, 8, 0), # CVE-2026-97687, CVE-2026-97688, CVE-2026-97689 (fix 2.8.0) "multidict": (6, 9, 1), # CVE-2026-104874 (fix 6.9.1 ; 6.7.x toolcache runner) + # #224 : transitives / préinstallées toolcache, auditées par pip-audit. + "brotli": (1, 2, 1), # PYSEC-2026-4322, GHSA-9v8h-qqgm-4m35 (fix 1.2.1) + "filelock": (4, 2, 1), # CVE-2026-112940, CVE-2026-112913, CVE-2026-112907 (fix 4.2.1) + "opentelemetry-api": (1, 45, 1), # CVE-2026-114603 (fix 1.45.1) } def test_security_floors_are_declared(self):