Skip to content

perf(signature): Improve perfomance and correctness - #742

Open
rabbitstack wants to merge 13 commits into
masterfrom
signature-store-perf-and-correctness
Open

rabbitstack wants to merge 13 commits into
masterfrom
signature-store-perf-and-correctness

Conversation

@rabbitstack

Copy link
Copy Markdown
Owner

What is the purpose of this PR / why it is needed?

This PR brings a batch of changes to improve the signature store performance and correctness. For more information, review individual commits.

What type of change does this PR introduce?


Uncomment one or more /kind <> lines:

/kind feature (non-breaking change which adds functionality)

/kind bug-fix (non-breaking change which fixes an issue)

/kind refactor (non-breaking change that restructures the code, while not changing the original functionality)

/kind breaking (fix or feature that would cause existing functionality to not work as expected

/kind cleanup

/kind improvement

/kind design

/kind documentation

/kind other (change that doesn't pertain to any of the above categories)

Any specific area of the project related to this PR?


Uncomment one or more /area <> lines:

/area instrumentation

/area telemetry

/area rule-engine

/area filters

/area yara

/area event

/area captures

/area alertsenders

/area outputs

/area rules

/area filaments

/area config

/area cli

/area tests

/area ci

/area build

/area docs

/area deps

/area evasion

/area other

Special notes for the reviewer


Does this PR introduce a user-facing change?


Open acquires a catalog admin context and opens the file before it can fail.
When the hash is not in any catalog, CryptCatalogAdminEnumCatalogFromHash
returns 0 and CryptCatalogInfoFromContext fails. That is the normal, not
catalog-signed outcome, so Open returns an error and Close is never called.
This can leak:
- admin context
- open file handle
- catalog context
Catalog certificate parsing is uncached and reads whole .cat
files and then pkcs7.Parse on it, for every module.
Cache the parsed cert per catalog file, keyed by path, size
and mtime, and deduplicate concurrent parses.
Store the result inside singleflight callback to fix the race window after Do returns.
Catalog-signed files, which are most of Windows, have no embedded certificate.
Request's hot path re-runs a full PE parse on the caller's thread, on every
request for that module. Introduce a new atomic field, that is set when the
cert parsing is attempted, and will not try to parse the cert again.
Every pointer the native side reads now lives in heap memory.
The structs hang off a field of the heap-allocated WintrustData,
so the compiler must treat them as escaping. The strings are
separate heap buffers. A goroutine stack move can no longer
invalidate them.
The objects stay reachable until after the second WinVerifyTrust call.
Before, they could be collected between VerifyCatalog returning and the
deferred Close.

This branch has not been deployed

No deployments
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