Skip to content

fix(masker): close audit leak vectors, secure by default#1

Merged
rflavien merged 2 commits into
mainfrom
fix/masking-coverage-hardening
May 29, 2026
Merged

fix(masker): close audit leak vectors, secure by default#1
rflavien merged 2 commits into
mainfrom
fix/masking-coverage-hardening

Conversation

@rflavien

Copy link
Copy Markdown
Contributor

Contexte

Audit de la lib (mission : empêcher une fuite de secret dans les logs). L'outillage et l'archi étaient solides, mais l'audit a révélé des angles morts du périmètre de masquage : ce que la lib ne voit pas peut fuiter malgré 100 % de couverture. Cette PR corrige ces vecteurs, en mode sécurisé par défaut.

Correctifs (par finding d'audit)

  • H1 — Objets non traversés → fuite : le moteur traverse désormais les objets (JsonSerializable, Stringable, propriétés publiques) avec protection anti-cycle (SplObjectStorage).
  • H2 — message jamais masqué : MaskingProcessor masque aussi le message (activé par défaut).
  • M1 — Scalaires non-string ignorés : les entiers sont désormais scannés par le value matcher.
  • M2 — Clés en égalité exacte : SegmentKeyMatcher détecte les clés composées (db_password, userToken, x-api-key) sans faux positifs (tokenizer).
  • M3 — Remplacement de toute la valeur : masquage par sous-chaîne via ValueMatcherInterface::redact() (le texte autour est préservé).
  • M4 — Regex CB trop large : remplacée par CreditCardMatcher validé par Luhn ; ajout de patterns AWS / Google / PEM.

Changements de comportement (assumés, sécurisé par défaut)

  • Plancher PHP 8.1 → 8.2 (requis par l'outillage de property testing).
  • Par défaut : matching de clés par segment, masquage du message, traversée d'objets, masquage par sous-chaîne.
  • Portes de sortie : matchKeysExactly(), maskMessage(false), traverseObjects(false).
  • API : ValueMatcherInterface gagne redact() (impacte les implémentations custom). Voir CHANGELOG.md.

Qualité

make validate entièrement vert :

  • PHPStan niveau max, php-cs-fixer
  • 158 tests unitaires, couverture 100 %
  • Infection MSI 100 % / Covered 100 % (4 mutants équivalents — math de Luhn, array_values sur variadic — neutralisés et commentés dans infection.json.dist)
  • 16 propriétés black-box (~2300 assertions) couvrant les nouveaux invariants (objets, Luhn, clés par segment)

🤖 Generated with Claude Code

rflavien and others added 2 commits May 29, 2026 17:29
Remediates the audit findings on real-world leak paths:

- H1: traverse objects (JsonSerializable / Stringable / public props) with
  cycle protection — secrets carried by objects no longer leak.
- H2: mask the log message (on by default).
- M1: scan integer values, not just strings.
- M2: SegmentKeyMatcher catches compound keys (db_password, userToken,
  x-api-key) while avoiding false positives like "tokenizer".
- M3: sub-string masking via ValueMatcherInterface::redact() — only the
  matched token is masked, surrounding text is preserved.
- M4: CreditCardMatcher with Luhn validation replaces the broad digit-run
  regex; added AWS / Google / PEM patterns.

Behaviour is now secure by default (segment keys, message masking, object
traversal); opt out via matchKeysExactly(), maskMessage(false),
traverseObjects(false). Minimum PHP bumped to 8.2 (required by the
property-test tooling).

Quality gates kept green: PHPStan max, 100% coverage, Infection MSI 100%,
black-box property suite. Docs and CHANGELOG updated.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Point composer support/source to Tiime-Software/MonologMasker and add the
Tiime header to the README.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@rflavien
rflavien merged commit 3cc8a97 into main May 29, 2026
3 checks passed
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