From 56ad7bfe51d8e849f133b5590a135d646b168d79 Mon Sep 17 00:00:00 2001 From: mlik-sudo Date: Mon, 15 Dec 2025 10:30:51 -0500 Subject: [PATCH 1/2] docs(security): strengthen review checklist --- security/review.md | 81 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 9 deletions(-) diff --git a/security/review.md b/security/review.md index 46fd0d3..c24543a 100644 --- a/security/review.md +++ b/security/review.md @@ -1,27 +1,34 @@ # 🛡️ Security Review Checklist (Claude-Safety) -Ce document sert de **contresignature** sécurité pour le Proof Pack. -Une PR qui modifie la surface d'attaque, les dépendances, l'I/O, le réseau, la sérialisation, ou l'exécution de code **doit** passer cette checklist. +Ce document sert de **contresignature sécurité** pour le Proof Pack. +Toute PR qui modifie la surface d'attaque, les dépendances, l'I/O, le réseau, la sérialisation, ou l'exécution de code **doit** passer cette checklist. **PR :** **Auteur :** +**Reviewers (sécurité) :** **Scope :** **Risque estimé :** Low / Medium / High +**Date :** --- ## 0) Résumé de la menace - Actifs à protéger : - Menaces principales : -- Hypothèses (trust boundary) : +- Hypothèses / trust boundaries : +- Dépendances externes (services, APIs, OS) : + +**Evidence (obligatoire) :** +- Lien PR + description du changement : +- Lien CI (run) : --- ## 1) Surface d'attaque Coche si applicable. -- [ ] Entrées utilisateur (CLI/API/UI) modifiées -- [ ] Fichiers lus/écrits (paths, permissions) modifiés +- [ ] Entrées utilisateur (CLI/API/UI) ajoutées/modifiées +- [ ] Fichiers lus/écrits (paths, permissions) ajoutés/modifiés - [ ] Réseau (HTTP, sockets) ajouté/modifié - [ ] Sérialisation / parsing (JSON/YAML/XML/pickle/Proto) ajouté/modifié - [ ] Exécution de code / plugins / templates / shell ajouté/modifié @@ -29,9 +36,14 @@ Coche si applicable. - [ ] Intégration OS (Windows/macOS/Linux) ajoutée/modifiée - [ ] Crypto / auth / secrets ajoutés/modifiés -Notes : +**Notes :** +**Evidence (si coché) :** +- Entrées / endpoints / flags impactés : +- Exemple d'inputs (valide + malformé) : +- Chemins/URLs touchés : + --- ## 2) Dépendances & supply chain @@ -42,15 +54,25 @@ Notes : - [ ] Scan dépendances OK (outil + lien/log) : - Outil : - Résultat : +- [ ] Actions GitHub utilisées : versions contrôlées (au minimum major pin, idéalement SHA) + +**Evidence :** +- Diff `requirements*.txt` / `pyproject.toml` / lockfile (si applicable) : +- Lien Dependabot (si applicable) : +- Lien scan (log/rapport) : --- ## 3) Secrets & données sensibles - [ ] Aucun secret commité (clés, tokens, .env, credentials) - [ ] Variables d'environnement documentées (si utilisées) -- [ ] Journaux (logs) ne leak pas de données sensibles +- [ ] Journaux (logs) ne leak pas de données sensibles (redaction obligatoire avant archivage) - [ ] Données perso / PII : collecte ? stockage ? (si oui → documenter + minimiser) +**Evidence :** +- Résultats `detect-secrets` / `gitleaks` (lien CI) : +- Exemple de logs vérifiés (ou justification) : + --- ## 4) Validation d'entrées & erreurs @@ -59,6 +81,10 @@ Notes : - [ ] Messages d'erreur ne révèlent pas d'infos sensibles - [ ] Timeouts / limites (rate limit / taille fichier / mémoire) si nécessaire +**Evidence :** +- Tests ajoutés (cas limites) : +- Stratégie de timeouts/limites (où ? valeur ?) : + --- ## 5) I/O & filesystem @@ -67,6 +93,10 @@ Notes : - [ ] Permissions minimales (principe du moindre privilège) - [ ] Nettoyage fichiers temporaires / permissions correctes +**Evidence :** +- Liste des chemins autorisés (si applicable) : +- Tests/contrôles contre traversal : + --- ## 6) Réseau & intégrations externes (si applicable) @@ -77,6 +107,10 @@ Notes : - [ ] URLs/hosts allowlist si pertinent - [ ] Données envoyées minimisées +**Evidence :** +- Hosts/URLs contactés : +- Timeouts/retries configurés : + --- ## 7) Exécution de commandes (si applicable) @@ -85,16 +119,45 @@ Notes : - [ ] Échappement / validation des paramètres - [ ] Pas de commande construite depuis input non fiable +**Evidence :** +- Appels `subprocess`/shell identifiés : +- Exemple d'input non-fiable neutralisé : + --- -## 8) Tests sécurité (minimum) +## 8) CI / GitHub Actions (si la PR touche `.github/workflows/*` ou scripts CI) +- [ ] Permissions minimales (`permissions:` explicite, pas de `write` par défaut) +- [ ] Pas d'usage de `pull_request_target` (sauf justification + durcissement) +- [ ] Pas d'exécution de code non-fiable sur PRs externes +- [ ] Actions tierces : versions contrôlées + revue + +**Evidence :** +- Lien vers le workflow modifié + justification des permissions : + +--- + +## 9) Agents / LLM (si applicable) +- [ ] Frontières de confiance explicites entre agents (pas de “zero trust” implicite) +- [ ] Protection contre prompt injection (entrées non-fiables, contenu externe) +- [ ] Aucune exfiltration de secrets via logs/artefacts/outputs + +**Evidence :** +- Sources non-fiables identifiées (URLs, issues, PR body, fichiers) : +- Mesures de mitigation : + +--- + +## 10) Tests sécurité (minimum) - [ ] Tests ajoutés pour le comportement sûr (cas limites, erreurs) - [ ] Cas d'abus testé (inputs malformés, grands volumes) - [ ] Reproductibilité : tests passent en CI +**Evidence :** +- Commandes + lien CI : + --- -## 9) Décision (contresignature) +## 11) Décision (contresignature) Verdict : - [ ] ✅ APPROVED (safe to merge) - [ ] 🟡 APPROVED WITH CONDITIONS (voir ci-dessous) From 2e4233296d0e1b435d8b235cbf923db6aa1cdd8c Mon Sep 17 00:00:00 2001 From: mlik-sudo Date: Mon, 15 Dec 2025 10:32:03 -0500 Subject: [PATCH 2/2] chore(ci): tighten permissions and add dependency review --- .github/dependabot.yml | 6 ++++++ .github/workflows/dependency-review.yml | 13 +++++++++++++ .github/workflows/labels.yml | 12 ++++++++++-- .github/workflows/link-check.yml | 4 ++++ .github/workflows/lint-workflows.yml | 3 +++ .github/workflows/nightly-bench.yml | 2 +- .github/workflows/pre-commit.yml | 3 +++ .github/workflows/secret-scan.yml | 2 ++ .github/workflows/tests.yml | 3 +++ SECURITY.md | 16 ++++++++++++++++ 10 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/dependency-review.yml create mode 100644 SECURITY.md diff --git a/.github/dependabot.yml b/.github/dependabot.yml index cbd920f..cf297c2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -4,7 +4,13 @@ updates: directory: "/" schedule: interval: "weekly" + - package-ecosystem: "pip" directory: "/" schedule: interval: "weekly" + + - package-ecosystem: "pip" + directory: "/project-space/benchmarks/harness" + schedule: + interval: "weekly" diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 0000000..eb4ab2a --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,13 @@ +name: dependency-review +on: + pull_request: + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: actions/dependency-review-action@v4 diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml index 8c2ddf0..8d3f6d9 100644 --- a/.github/workflows/labels.yml +++ b/.github/workflows/labels.yml @@ -1,11 +1,14 @@ name: seed-labels on: workflow_dispatch: + +permissions: + issues: write + jobs: run: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 - uses: actions/github-script@v8 with: script: | @@ -13,7 +16,12 @@ jobs: for (const name of wanted) { try { await github.rest.issues.createLabel({ owner: context.repo.owner, repo: context.repo.repo, name }); + core.info(`Created label: ${name}`); } catch (e) { - if (e.status !== 422) core.info(`Label ${name} already exists`); + if (e.status === 422) { + core.info(`Label already exists: ${name}`); + } else { + throw e; + } } } diff --git a/.github/workflows/link-check.yml b/.github/workflows/link-check.yml index f3bde2c..ac0e09f 100644 --- a/.github/workflows/link-check.yml +++ b/.github/workflows/link-check.yml @@ -3,6 +3,10 @@ on: pull_request: push: branches: ["main"] + +permissions: + contents: read + jobs: lychee: runs-on: ubuntu-latest diff --git a/.github/workflows/lint-workflows.yml b/.github/workflows/lint-workflows.yml index c822304..de46768 100644 --- a/.github/workflows/lint-workflows.yml +++ b/.github/workflows/lint-workflows.yml @@ -5,6 +5,9 @@ on: branches: [main] workflow_dispatch: +permissions: + contents: read + jobs: actionlint: runs-on: ubuntu-latest diff --git a/.github/workflows/nightly-bench.yml b/.github/workflows/nightly-bench.yml index 639bacc..d074c05 100644 --- a/.github/workflows/nightly-bench.yml +++ b/.github/workflows/nightly-bench.yml @@ -12,7 +12,7 @@ jobs: run: runs-on: ubuntu-latest permissions: - contents: write + contents: read steps: - uses: actions/checkout@v5 with: diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index eaf9002..eb30b8f 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -7,6 +7,9 @@ on: branches: [main] workflow_dispatch: +permissions: + contents: read + jobs: run: name: Run hooks diff --git a/.github/workflows/secret-scan.yml b/.github/workflows/secret-scan.yml index db04f38..bfcfa85 100644 --- a/.github/workflows/secret-scan.yml +++ b/.github/workflows/secret-scan.yml @@ -12,6 +12,8 @@ jobs: detect-secrets: name: detect-secrets (baseline) runs-on: ubuntu-latest + permissions: + contents: read steps: - uses: actions/checkout@v5 - uses: actions/setup-python@v5 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5257127..9eca151 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -5,6 +5,9 @@ on: pull_request: workflow_dispatch: +permissions: + contents: read + jobs: pytest: runs-on: ubuntu-latest diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..01a4b25 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,16 @@ +# Security Policy + +## Reporting a vulnerability + +Merci de **ne pas** ouvrir d'issue publique pour une vulnérabilité exploitable. + +- Méthode recommandée : utilisez **GitHub Security Advisories** via le bouton "Report a vulnerability" du dépôt. +- Si ce dépôt n'a pas encore les advisories activés : ouvrez une issue avec le label `security` **sans détails exploitables** (POC, secrets, endpoints) et demandez un canal privé. + +## Supported versions + +- Branche supportée : `main`. + +## Scope + +- Ce dépôt contient du protocole/CI/outillage. Toute faiblesse CI (permissions, workflows, supply chain) est considérée "in-scope".