Skip to content

Commit 17520bd

Browse files
committed
デバッグログを追加
1 parent 43631b9 commit 17520bd

2 files changed

Lines changed: 62 additions & 9 deletions

File tree

src/syscall/exec.rs

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use crate::capability::{
2-
parse_kernel_authority_spec, Capability, CapabilitySet, KernelAuthoritySet,
2+
Capability, CapabilitySet, KernelAuthoritySet, parse_kernel_authority_spec,
33
};
44
use crate::policy::{
5-
caller_can_grant_capabilities_on_exec, claim_service_manager_pid, release_service_manager_pid,
6-
resolve_exec_foreground, resolve_exec_priority, resolve_exec_privilege, ManifestRole,
5+
ManifestRole, caller_can_grant_capabilities_on_exec, claim_service_manager_pid,
6+
release_service_manager_pid, resolve_exec_foreground, resolve_exec_priority,
7+
resolve_exec_privilege,
78
};
89
use alloc::string::String;
910
use alloc::string::ToString;
@@ -204,7 +205,9 @@ fn validate_requested_exec_capabilities(
204205
};
205206
let caller_authorities = current_process_kernel_authorities().unwrap_or_default();
206207

207-
if !caps.is_subset_of(&caller_caps) {
208+
let caller_can_manage_capabilities =
209+
caller_caps.contains(crate::capability::Capability::CapabilitiesManage);
210+
if !caller_can_manage_capabilities && !caps.is_subset_of(&caller_caps) {
208211
return Err(EPERM);
209212
}
210213
if !authorities.is_subset_of(&caller_authorities) {
@@ -842,7 +845,10 @@ fn exec_with_data(
842845
_ => {
843846
crate::warn!(
844847
"ELF segment src offset+filesz out of bounds: seg={} src_off={} filesz={} data.len()={}",
845-
i, src_off, filesz, data.len()
848+
i,
849+
src_off,
850+
filesz,
851+
data.len()
846852
);
847853
return crate::syscall::types::EINVAL;
848854
}
@@ -872,8 +878,14 @@ fn exec_with_data(
872878
executable,
873879
) {
874880
crate::warn!("Failed to map segment at {:#x}: {:?}", vaddr, e);
875-
crate::warn!(" new_pt_phys={:#x}, filesz={}, memsz={}, writable={}, executable={}",
876-
new_pt_phys, filesz, memsz, writable, executable);
881+
crate::warn!(
882+
" new_pt_phys={:#x}, filesz={}, memsz={}, writable={}, executable={}",
883+
new_pt_phys,
884+
filesz,
885+
memsz,
886+
writable,
887+
executable
888+
);
877889
return crate::syscall::types::EINVAL;
878890
}
879891
}

src/syscall/mod.rs

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ mod console;
1919
mod types;
2020

2121
use crate::capability::{KernelAuthority, KernelCapability, KernelObjectRef};
22+
use alloc::format;
2223
use alloc::string::String;
24+
use alloc::string::ToString;
2325
use alloc::vec::Vec;
2426
use x86_64::instructions::port::Port;
2527

@@ -93,6 +95,11 @@ fn is_canonical_user_range(addr: u64, len: u64) -> bool {
9395
end_inclusive <= USER_SPACE_END
9496
}
9597

98+
fn current_process_name_for_log() -> Option<String> {
99+
let pid = crate::syscall::security::current_process_id()?;
100+
crate::task::with_process(pid, |p| p.name().to_string())
101+
}
102+
96103
/// ユーザー空間の null 終端文字列を最大長付きで読み取り、カーネル所有の `String` を返す。
97104
pub fn read_user_cstring(ptr: u64, max_len: usize) -> Result<String, u64> {
98105
if ptr == 0 || max_len == 0 {
@@ -345,9 +352,26 @@ pub fn copy_from_user(src_ptr: u64, dst: &mut [u8]) -> Result<(), u64> {
345352
return Err(EFAULT);
346353
}
347354
crate::mem::paging::copy_from_user_in_table(user_pt, src_ptr, dst).map_err(|err| {
355+
let (syscall_num, syscall_args) = last_syscall_snapshot();
356+
let pid = crate::syscall::security::current_process_id()
357+
.map(|pid| pid.as_u64())
358+
.unwrap_or(0);
359+
let process_name = current_process_name_for_log().unwrap_or_else(|| "?".to_string());
348360
crate::audit::log(
349361
crate::audit::AuditEventKind::Usercopy,
350-
"copy_from_user rejected unmapped or unreadable range",
362+
&format!(
363+
"copy_from_user rejected unmapped or unreadable range pid={} process={} src={:#x} len={} last_syscall={} args=[{:#x},{:#x},{:#x},{:#x},{:#x}]",
364+
pid,
365+
process_name,
366+
src_ptr,
367+
dst.len(),
368+
syscall_num,
369+
syscall_args[0],
370+
syscall_args[1],
371+
syscall_args[2],
372+
syscall_args[3],
373+
syscall_args[4]
374+
),
351375
);
352376
match err {
353377
crate::Kernel::Memory(crate::result::Memory::OutOfMemory) => EFAULT,
@@ -371,9 +395,26 @@ pub fn copy_to_user(dst_ptr: u64, src: &[u8]) -> Result<(), u64> {
371395
return Err(EFAULT);
372396
}
373397
crate::mem::paging::copy_to_user_in_table(user_pt, dst_ptr, src).map_err(|err| {
398+
let (syscall_num, syscall_args) = last_syscall_snapshot();
399+
let pid = crate::syscall::security::current_process_id()
400+
.map(|pid| pid.as_u64())
401+
.unwrap_or(0);
402+
let process_name = current_process_name_for_log().unwrap_or_else(|| "?".to_string());
374403
crate::audit::log(
375404
crate::audit::AuditEventKind::Usercopy,
376-
"copy_to_user rejected unmapped or unwritable range",
405+
&format!(
406+
"copy_to_user rejected unmapped or unwritable range pid={} process={} dst={:#x} len={} last_syscall={} args=[{:#x},{:#x},{:#x},{:#x},{:#x}]",
407+
pid,
408+
process_name,
409+
dst_ptr,
410+
src.len(),
411+
syscall_num,
412+
syscall_args[0],
413+
syscall_args[1],
414+
syscall_args[2],
415+
syscall_args[3],
416+
syscall_args[4]
417+
),
377418
);
378419
match err {
379420
crate::Kernel::Memory(crate::result::Memory::OutOfMemory) => EFAULT,

0 commit comments

Comments
 (0)