diff options
| author | Linus Färnstrand <linus@mullvad.net> | 2017-09-21 13:45:48 +0200 |
|---|---|---|
| committer | Linus Färnstrand <linus@mullvad.net> | 2017-09-21 13:45:48 +0200 |
| commit | 1854efd1b5494d6371b49bda113fb02781fa6116 (patch) | |
| tree | d73c975c27386587d1d17da25027223c880cfb75 | |
| parent | f617dd08e8aaa5747b6a1c6b884af4c37d00344f (diff) | |
| parent | bfae67bc57392a5710806a90af9261077298f896 (diff) | |
| download | mullvadvpn-1854efd1b5494d6371b49bda113fb02781fa6116.tar.xz mullvadvpn-1854efd1b5494d6371b49bda113fb02781fa6116.zip | |
Merge branch 'check-rpc-file-permissions-in-cli'
| -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 } |
