src/cap_portal.rs:262-271
🟡 中
std::fs::write 创建文件时使用默认 umask 权限(通常为 0644),导致令牌文件可能被其他用户读取。同时 create_dir_all 创建的目录也未设置限制权限。
std::fs::write
create_dir_all
如果在多用户 Linux 系统上,攻击者读取该令牌后可能绕过用户授权直接恢复屏幕录制会话,构成权限绕过和信息泄露。
使用 OpenOptions 配合 Unix 的 PermissionsExt::mode(0o600) 设置仅当前用户可读写。目录也应设置为 0o700。建议使用原子写入(tmp file + rename)模式:
OpenOptions
PermissionsExt::mode(0o600)
fn save_restore_token(token: &str) { use std::fs::OpenOptions; use std::io::Write; use std::os::unix::fs::{OpenOptionsExt, PermissionsExt}; let path = token_path(); if let Some(parent) = path.parent() { if let Err(e) = std::fs::create_dir_all(parent) { tracing::warn!("Failed to create token dir: {e}"); return; } let _ = std::fs::set_permissions(parent, std::fs::Permissions::from_mode(0o700)); } let tmp_path = path.with_extension("tmp"); let result = (|| -> std::io::Result<()> { let mut f = OpenOptions::new() .write(true) .create(true) .truncate(true) .mode(0o600) .open(&tmp_path)?; f.write_all(token.as_bytes())?; f.sync_all()?; std::fs::rename(&tmp_path, &path)?; Ok(()) })(); match result { Ok(()) => tracing::info!("Saved portal restore token"), Err(e) => { let _ = std::fs::remove_file(&tmp_path); tracing::warn!("Failed to save restore token: {e}"); } } }
已在 commit 9a5b09c 中修复,基于 Oracle 安全审计建议实施。
token_path() — 返回 Option<PathBuf>,移除 /tmp fallback
token_path()
Option<PathBuf>
/tmp
save_restore_token()
create_new(true).mode(0o600)
{pid}.tmp
DirBuilderExt::mode(0o700)
load_restore_token()
token_path_never_uses_tmp
verify_secure_dir_rejects_wrong_permissions
verify_secure_dir_rejects_non_directory
ensure_secure_parent_creates_with_0700
ensure_secure_parent_tightens_existing_dir
save_creates_file_with_0600
load_reads_secure_file
load_rejects_group_readable_file
load_rejects_world_readable_file
load_rejects_symlink
save_then_load_roundtrip
No dependencies set.
The note is not visible to the blocked user.
位置
src/cap_portal.rs:262-271严重性
🟡 中
问题描述
std::fs::write创建文件时使用默认 umask 权限(通常为 0644),导致令牌文件可能被其他用户读取。同时create_dir_all创建的目录也未设置限制权限。如果在多用户 Linux 系统上,攻击者读取该令牌后可能绕过用户授权直接恢复屏幕录制会话,构成权限绕过和信息泄露。
建议修复
使用
OpenOptions配合 Unix 的PermissionsExt::mode(0o600)设置仅当前用户可读写。目录也应设置为 0o700。建议使用原子写入(tmp file + rename)模式:修复完成
已在 commit 9a5b09c 中修复,基于 Oracle 安全审计建议实施。
改动摘要
token_path()— 返回Option<PathBuf>,移除/tmpfallbacksave_restore_token()create_new(true).mode(0o600)独占创建,防止符号链接攻击{pid}.tmp不可预测临时文件名DirBuilderExt::mode(0o700)创建目录绕过 umaskload_restore_token()新增测试(11 个)
token_path_never_uses_tmpverify_secure_dir_rejects_wrong_permissionsverify_secure_dir_rejects_non_directoryensure_secure_parent_creates_with_0700ensure_secure_parent_tightens_existing_dirsave_creates_file_with_0600load_reads_secure_fileload_rejects_group_readable_fileload_rejects_world_readable_fileload_rejects_symlinksave_then_load_roundtrip