diff options
| -rw-r--r-- | mullvad-cli/src/rpc.rs | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/mullvad-cli/src/rpc.rs b/mullvad-cli/src/rpc.rs index bd1d6e571b..16a23bda94 100644 --- a/mullvad-cli/src/rpc.rs +++ b/mullvad-cli/src/rpc.rs @@ -1,8 +1,10 @@ use {Result, ResultExt}; use serde; -use std::fs::File; + +use std::fs::{File, Metadata}; use std::io::{self, Read}; use std::path::{Path, PathBuf}; + use talpid_ipc::WsIpcClient; pub fn call<T, O>(method: &str, args: &T) -> Result<O> @@ -44,8 +46,31 @@ fn read_rpc_address() -> io::Result<String> { "Trying to read RPC address at {}", RPC_ADDRESS_FILE_PATH.to_string_lossy() ); - let mut address = String::new(); let mut file = File::open(&*RPC_ADDRESS_FILE_PATH)?; - file.read_to_string(&mut address)?; - Ok(address) + if is_rpc_file_trusted(file.metadata()?) { + let mut address = String::new(); + file.read_to_string(&mut address)?; + Ok(address) + } else { + Err(io::Error::new( + io::ErrorKind::Other, + "RPC file is not trusted", + )) + } +} + +#[cfg(unix)] +fn is_rpc_file_trusted(metadata: Metadata) -> bool { + use std::os::unix::fs::MetadataExt; + + let is_owned_by_root = metadata.uid() == 0; + let is_read_only_by_non_owner = (metadata.mode() & 0o022) == 0; + + is_owned_by_root && is_read_only_by_non_owner +} + +#[cfg(windows)] +fn is_rpc_file_trusted(metadata: Metadata) -> bool { + // TODO: Check permissions correctly + true } |
