Skip to content

Detection par la forme : retrait de la deny-list en clair - #1

Merged
Statyx merged 1 commit into
mainfrom
statyx-retrait-deny-list-clients
Aug 3, 2026
Merged

Statyx merged 1 commit into
mainfrom
statyx-retrait-deny-list-clients

Conversation

@Statyx

@Statyx Statyx commented Aug 3, 2026

Copy link
Copy Markdown
Owner

Remplace la deny-list de noms en clair par une detection par la forme.

Pourquoi

Le garde-fou anti-fuite embarquait la liste des noms a proteger, en clair, dans un fichier
suivi par git. Sur un depot public, cela publie exactement ce qu'il devait masquer.

Ce qui change

  • La liste en clair est supprimee. Les noms se lisent depuis la variable d'environnement
    CLIENT_DENYLIST (secret GitHub Actions) ou un fichier .clientdeny gitignore.
  • Secret absent -> avertissement, jamais echec. Un job rouge des le premier jour finit desactive.
  • Le scanner detecte desormais par la forme : GUID hors allowlist, endpoint SQL Fabric,
    chemin utilisateur personnel. Une regle morphologique ne peut pas redevenir une fuite.
  • Le message d'erreur ne reimprime plus la valeur trouvee : les logs d'Action sont publics.
  • .gitattributes fixe eol=lf sur le scanner partage, sinon un checkout Windows
    reecrit le fichier en CRLF et invalide son empreinte publiee.

Verifications

  • Aucun nom client dans le contenu ni dans les messages de commit, sur tous les commits de la branche.
  • Fixtures de test : valeurs inventees uniquement, jamais de donnee reelle.
  • Clone frais + venv vierge : les deux jobs verts.

The workflow carried the full customer roster inline, each name written with
one letter in parentheses. An ERE capturing group matches the same string, so
the scan kept working while a full-text search for the name found nothing --
that fools GitHub's index, not a reader. The guard against leaking a client
name had become the leak, and in a worse shape than a stray mention: the whole
portfolio, concentrated in one file of a public repo.

Detection is now by SHAPE, never by name:

* scripts/check_no_client_leak.py -- copied byte-for-byte from the canonical
  source (Statyx/Fab-Analyze-Data-Agent@6e4a65e7, sha256 33312e7e...28cd3).
  Real GUIDs, real Fabric SQL endpoints and personal paths, over
  `git ls-files` only. Not to be edited here: a local improvement is how two
  repos start converging on each other instead of on the canonical copy.
* scripts/check_client_denylist.py -- name matching is preserved, but the names
  come from the CLIENT_DENYLIST secret (or a gitignored .clientdeny). No
  secret: warning, build stays green. Findings print a file, a line and a hash
  prefix -- never the name, never the line, since public CI logs would
  republish it. Single-character parentheses are stripped before matching, so
  the obfuscation removed here cannot be reintroduced unnoticed.

Colour contexts (shields.io, hex, rgb(), CSS declarations) are dropped
generically, because some client names double as colour words.

The canonical checker only allowlists the nil GUID, so the visibly fake
repeated-digit placeholders in the task flow tripped it. The ids there are
internal to that file, so they become readable slugs; edge integrity was
verified (10 tasks, 11 edges, 0 orphans).

.gitattributes pins LF on both scripts: core.autocrlf=true would rewrite the
canonical copy on checkout and break its hash on Windows.

Co-authored-by: Copilot App <[email protected]>
@Statyx
Statyx merged commit c3def66 into main Aug 3, 2026
4 checks passed
@Statyx
Statyx deleted the statyx-retrait-deny-list-clients branch August 3, 2026 15:17
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.

1 participant