diff options
| author | Tobias Järvelöv <tobias.jarvelov@mullvad.net> | 2025-03-31 17:49:16 +0200 |
|---|---|---|
| committer | Tobias Järvelöv <tobias.jarvelov@mullvad.net> | 2025-05-28 10:33:24 +0200 |
| commit | 3ba998b0faf062160df34734dcda78e51da51fa3 (patch) | |
| tree | ad719922acd303d0b62991fd96b90ac51197de68 | |
| parent | d58de446fc9b5849f2f4ebdea075ed72eaabc19a (diff) | |
| download | mullvadvpn-3ba998b0faf062160df34734dcda78e51da51fa3.tar.xz mullvadvpn-3ba998b0faf062160df34734dcda78e51da51fa3.zip | |
Add logic to verify ownership of socket/named pipe
| -rw-r--r-- | desktop/packages/mullvad-vpn/src/main/daemon-rpc.ts | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/desktop/packages/mullvad-vpn/src/main/daemon-rpc.ts b/desktop/packages/mullvad-vpn/src/main/daemon-rpc.ts index 3a08c2cf4c..03655b905a 100644 --- a/desktop/packages/mullvad-vpn/src/main/daemon-rpc.ts +++ b/desktop/packages/mullvad-vpn/src/main/daemon-rpc.ts @@ -1,4 +1,5 @@ import * as grpc from '@grpc/grpc-js'; +import fs from 'fs'; import { Empty } from 'google-protobuf/google/protobuf/empty_pb.js'; import { BoolValue, StringValue } from 'google-protobuf/google/protobuf/wrappers_pb.js'; import { types as grpcTypes } from 'management-interface'; @@ -95,6 +96,23 @@ export class DaemonRpc extends GrpcClient { super.disconnect(); } + public async verifyDaemonOwnership() { + if (process.platform === 'win32') { + try { + const { pipeIsAdminOwned } = await import('windows-utils'); + pipeIsAdminOwned(DAEMON_RPC_PATH); + } catch { + throw new Error('Failed to verify admin ownership of named pipe'); + } + } else { + const stat = fs.statSync(DAEMON_RPC_PATH); + // We assume the uid/gid for root is 0 + if (stat.uid !== 0 || stat.gid !== 0) { + throw new Error('Failed to verify root ownership of socket'); + } + } + } + public subscribeAppUpgradeEventListener(listener: SubscriptionListener<DaemonAppUpgradeEvent>) { const call = this.isConnected && this.client.appUpgradeEventsListen(new Empty()); if (!call) { |
