summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2017-09-21 13:45:48 +0200
committerLinus Färnstrand <linus@mullvad.net>2017-09-21 13:45:48 +0200
commit1854efd1b5494d6371b49bda113fb02781fa6116 (patch)
treed73c975c27386587d1d17da25027223c880cfb75
parentf617dd08e8aaa5747b6a1c6b884af4c37d00344f (diff)
parentbfae67bc57392a5710806a90af9261077298f896 (diff)
downloadmullvadvpn-1854efd1b5494d6371b49bda113fb02781fa6116.tar.xz
mullvadvpn-1854efd1b5494d6371b49bda113fb02781fa6116.zip
Merge branch 'check-rpc-file-permissions-in-cli'
-rw-r--r--mullvad-cli/src/rpc.rs33
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
}