fix(rpc,ui): close the last secret residues found by the final-gate review
Two verified medium leaks in the B7 scrub chain: - parseRpcResult parses the body into a local `response` tree and returns a COPY of response["result"] (operator[] yields an lvalue ref, so the by-value return copy-constructs). The local tree — holding its own heap copy of the secret — was then freed without zeroing, so callSecret/callSecretString still left one un-scrubbed copy. Add scrubJsonSecrets() (recursive string zero) and a scrubSource flag; the secret paths opt in, wiping the tree before it frees. The secret export chain is now fully covered: raw body → parse tree → result copy → caller-owned string. - key_export_dialog cleared s_key with plain std::string::clear() on the Close button, the scrim/Esc dismiss path, and the QR cache (s_qr_cached) — leaving the displayed private/spending key in freed heap on the ordinary close paths. Route all three through wallet::secureWipeLiteSecret (zero-then-clear), matching show()/hide(). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -270,8 +270,10 @@ private:
|
||||
// hold curl_mutex_ and have verified impl_->curl.
|
||||
std::string performCall(const std::string& method, const json& params, long& httpCodeOut);
|
||||
// Centralizes the HTTP-code check and JSON error->RpcError extraction, returning
|
||||
// response["result"] on success.
|
||||
static json parseRpcResult(long httpCode, const std::string& body);
|
||||
// response["result"] on success. When scrubSource is true (secret-bearing calls), the intermediate
|
||||
// parse tree's string values are zeroed before it is discarded — parseRpcResult returns a COPY of
|
||||
// the result node, so its own tree would otherwise free the secret un-wiped (B7).
|
||||
static json parseRpcResult(long httpCode, const std::string& body, bool scrubSource = false);
|
||||
|
||||
// Splits a UnifiedCallback into the (Callback, ErrorCallback) pair used by doRPC.
|
||||
static std::pair<Callback, ErrorCallback> splitUnified(UnifiedCallback cb);
|
||||
|
||||
Reference in New Issue
Block a user