Skip to content

Get-TssSecretField: assert decoded value is a string; document JSON null → $null behavior #475

Description

@jagger

Summary

Two robustness gaps around the 0.62.1 ConvertFrom-Json swap in Get-TssSecretField.ps1. Both address error/edge-case behavior downstream of the decode, and belong in one PR.

1. ConvertFrom-Json result is not asserted to be a string

File: src/functions/secrets/Get-TssSecretField.ps1:165-167

if ($apiResponse.Content) {
    $apiResponse.Content = $apiResponse.Content | ConvertFrom-Json
}
. $ProcessResponse $apiResponse

RestSharp.RestResponse.Content is a [string] property. If a future Secret Server version (or a MITM/misconfigured proxy) returns a JSON object or array on this endpoint, ConvertFrom-Json yields a PSCustomObject or array; assigning that to .Content implicitly stringifies (@{foo=bar} etc.) and the downstream ProcessResponse sees garbage. No exploitable path — the endpoint contract is scalar today — but the code silently corrupts output.

Proposed fix:

if ($apiResponse.Content) {
    $decoded = $apiResponse.Content | ConvertFrom-Json
    if ($decoded -isnot [string]) {
        Write-Warning "Unexpected non-string field response for [$Slug] on secret [$secret]"
        return
    }
    $apiResponse.Content = $decoded
}

2. ConvertFrom-Json shares the outer try/catch with HTTP failures; JSON null maps to \$null silently

File: src/functions/secrets/Get-TssSecretField.ps1:157-174

Two side-effects of the 0.62.1 decode swap:

  • Decode-time exceptions (e.g. non-JSON response body) are caught by the outer try/catch and surface the same warning as HTTP failures: Issue getting field [\$Slug] on secret [\$secret]. This loses the distinction between transport and parsing errors.
  • If the API returns the JSON literal null (2 bytes), ConvertFrom-Json produces PowerShell \$null. Assigned back to .Content, ProcessResponse emits \$null. In 0.62.0 the Substring(1, length-2) produced the string 'ul' (which was clearly wrong, but different).

Proposed fix:

  • Wrap the ConvertFrom-Json block in its own try/catch with a distinct warning (Unable to decode field response as JSON: {message}).
  • Add a .NOTES line documenting that a JSON-null response yields \$null (not the string 'null').

Discovery

Consolidated PR review of v0.62.0 → dev (0.62.1 candidate). Related to the #370/#336 fix (PR #470).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions