fix(securite): python3 -I partout, runuser sans l'environnement de root #19

Merged
mathieu merged 1 commit from securite-python-runuser into main 2026-10-14 02:22:22 +02:00
Owner

Deux constats d'une revue de sécurité du 2026-10-14, tous deux antérieurs à #18 :

  • Imports Python détournables. publier de code et fix tourne dans le dépôt extrait (working-directory: repo) avec ANTHROPIC_API_KEY et LANE_BOT_TOKEN, et lançait python3 - / python3 -c : le répertoire courant passe en tête de sys.path, un json.py livré par l'agent ou l'auteur de la PR aurait été importé en root. Correctif : python3 -I sur les 39 appels (exemples, lancer/).
  • runuser héritait de l'environnement de root. Un processus lancé sous node avec cet environnement (notamment le kill -KILL -1 du nettoyage) expose le jeton du job dans /proc/<pid>/environ aux processus de node encore en vie. Correctif : env -i PATH=… runuser -u node -- … partout.

Tests : classe Isolement (aucun python3 sans -I, aucun runuser sans env -i préalable, -I exclut le répertoire courant) ; installer.py signale aussi un runuser qui hérite. 49 tests OK ; les nouveaux échouent sur 606be5c. CONTRAT.md décrit les deux règles.

À éprouver sur essai-actions avant fusion. Les tests.yml de fabrique-pdf, mathieu.lecrivain.fr et atelier sont à corriger de même au réépinglage.

Deux constats d'une revue de sécurité du 2026-10-14, tous deux antérieurs à #18 : - **Imports Python détournables.** `publier` de `code` et `fix` tourne dans le dépôt extrait (`working-directory: repo`) avec `ANTHROPIC_API_KEY` et `LANE_BOT_TOKEN`, et lançait `python3 -` / `python3 -c` : le répertoire courant passe en tête de `sys.path`, un `json.py` livré par l'agent ou l'auteur de la PR aurait été importé en root. Correctif : `python3 -I` sur les 39 appels (exemples, `lancer/`). - **`runuser` héritait de l'environnement de root.** Un processus lancé sous `node` avec cet environnement (notamment le `kill -KILL -1` du nettoyage) expose le jeton du job dans `/proc/<pid>/environ` aux processus de `node` encore en vie. Correctif : `env -i PATH=… runuser -u node -- …` partout. Tests : classe `Isolement` (aucun `python3` sans `-I`, aucun `runuser` sans `env -i` préalable, `-I` exclut le répertoire courant) ; `installer.py` signale aussi un `runuser` qui hérite. 49 tests OK ; les nouveaux échouent sur `606be5c`. `CONTRAT.md` décrit les deux règles. À éprouver sur essai-actions avant fusion. Les `tests.yml` de fabrique-pdf, mathieu.lecrivain.fr et atelier sont à corriger de même au réépinglage.
Les étapes de root qui portent un secret lançaient python3 dans le dépôt extrait : le répertoire courant passait en tête des imports, un json.py livré aurait tourné avec ANTHROPIC_API_KEY et LANE_BOT_TOKEN. runuser gardait l'environnement de root, jeton du job compris, lisible dans /proc/<pid>/environ par les processus de node encore en vie (nettoyage de fin d'étape). Tests d'isolement ; installer.py signale aussi un runuser qui hérite.
mathieu deleted branch securite-python-runuser 2026-10-14 02:22:22 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
mathieu/lanes!19
No description provided.