Skip to content

[Privacy] Per-usage telemetry anonymizes type names with reversible unsalted 32-bit FNV-1a #55

@gfraiteur

Description

@gfraiteur

Disposition: Privacy / broken de-identification (no external attacker). Analogue of metalama/Metalama#1654.

Affected code

  • Core/PostSharp.Compiler.Settings/User/PerUsageLicensing/TypeHasher.cs:13-26 - FNV-1a, hashSizeInBits = 32, no salt/key
  • Core/PostSharp.Compiler.Settings/User/PerUsageLicensing/TypeHash.cs - stored as int
  • UserInterface/PostSharp.Settings/Ceip/UploadManager.cs:185-216 - PrepareTypeHashesForUpload

Description

Per-usage license telemetry "anonymizes" customer type full-names with an unsalted, unkeyed 32-bit FNV-1a hash, then uploads it (encrypted in transit) to the vendor. Because the hash is non-cryptographic, 32-bit, unsalted, and the preimages are low-entropy guessable CLR type names, the receiving server can reverse it (precompute / brute-force the 2^32 space against a name wordlist), recovering the customer's proprietary type names that the hashing was meant to conceal. Not MITM-exploitable (the payload is encrypted) - the weakness is against the vendor/recipient.

Recommendation

If true de-identification is intended, use a wide cryptographic hash keyed/salted with a per-customer secret the server never receives (HMAC-SHA-256 with a locally-generated, never-uploaded salt); or drop per-type granularity and upload only per-license aggregate counts/LOC. At minimum, document in the privacy notice that per-usage type identifiers are sent in a reversible-hashed form.

Backward compatibility

The .psbin format is internal telemetry plumbing; changing the hash needs a coordinated server-side decoder update but no public API/IL/MSBuild/pipe break.

Resolution

The per-usage (metered) license is no longer supported, so the per-usage telemetry has been removed entirely - PostSharp no longer collects, hashes, or uploads type names. A fix is in progress.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions