Skip to content

fix(sys): Enforce CGo safety rules in WinTrust API calls#712

Open
rabbitstack wants to merge 1 commit into
masterfrom
wintrust-enforce-safety-rules
Open

fix(sys): Enforce CGo safety rules in WinTrust API calls#712
rabbitstack wants to merge 1 commit into
masterfrom
wintrust-enforce-safety-rules

Conversation

@rabbitstack

Copy link
Copy Markdown
Owner

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

Every single Wintrust struct field is converting a Go pointer to uintptr and storing it. This is the exact pattern the Go spec explicitly calls out as unsafe. The moment the uintptr value is stored, the GC no longer considers the original object reachable through it and is free to collect or move it before WinVerifyTrust reads the field.

The KeepAlive calls must come after verifyTrust() returns, not before. Their purpose is to extend the liveness of each object to that point.

As an additional improvement, handle CryptCatalogAdminCalcHashFromFileHandle error code and resize the hash buffer with the new size if the call fails with ERROR_INSUFFICIENT_BUFFER.

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?


Every single Wintrust struct field is converting a Go pointer to uintptr and storing it. This is the exact pattern the Go spec explicitly calls out as unsafe. The moment the uintptr value is stored, the GC no longer considers the original object reachable through it and is free to collect or move it before WinVerifyTrust reads the field.

The KeepAlive calls must come after verifyTrust() returns, not before. Their purpose is to extend the liveness of each object to that point.

As an additional improvement, handle CryptCatalogAdminCalcHashFromFileHandle error code and
resize the has buffer with the new size if the call fails with
ERROR_INSUFFICIENT_BUFFER.
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