Preserve Windows package identity for sandboxed descendants (#46575)

## Why

Package context propagation was limited to verified `codex-command-runner.exe` processes, preventing other packaged callers from passing their OS-assigned identity to sandboxed children.

## What changed

Use the current process's OS package identity to decide whether to preserve desktop app context in both regular and ConPTY sandbox launches. Remove executable-name and staged-runner verification from this decision.

Reject callers without package identity when `CODEX_WINDOWS_REGISTERED_CORE=1`; otherwise, unpackaged callers continue without preserving app context.

GitOrigin-RevId: 52eb2fe33c8746d898b5d7ebf53bd001a55b5506
This commit is contained in:
zm-oai
2026-09-19 00:41:14 +00:00
committed by copyberry
parent d5afb62bb3
commit fd59b42a09
3 changed files with 10 additions and 21 deletions

View File

@@ -78,25 +78,14 @@ pub(crate) fn query_package_name(
Ok(Some(String::from_utf16(family)?))
}
/// Only an OS-verified packaged runner may propagate package context to sandbox children.
pub(crate) fn current_process_is_registered_core_runner() -> Result<bool> {
let executable = std::env::current_exe().context("resolve current Core runner image")?;
if !executable
.file_name()
.is_some_and(|name| name.eq_ignore_ascii_case("codex-command-runner.exe"))
{
return Ok(false);
}
let process = unsafe { GetCurrentProcess() };
if process_package_name(process)?.is_none() {
ensure!(
!registered_core_requested(),
"registered Core runner has no package identity"
);
return Ok(false);
}
verify_registered_core_runner(process, &executable)?;
Ok(true)
/// Preserve the caller's OS-assigned package identity for sandboxed descendants.
pub(crate) fn current_process_has_package_identity() -> Result<bool> {
let has_identity = current_package_full_name()?.is_some();
ensure!(
has_identity || !registered_core_requested(),
"registered Core process has no package identity"
);
Ok(has_identity)
}
fn staged_package_root(name: &[u16]) -> Result<PathBuf> {

View File

@@ -134,7 +134,7 @@ pub fn spawn_conpty_process_as_user(
job: Some(Arc::clone(&job)),
_desktop: Some(desktop),
};
let preserve_app_context = crate::app_package::current_process_is_registered_core_runner()?;
let preserve_app_context = crate::app_package::current_process_has_package_identity()?;
let mut attrs = ProcThreadAttributeList::new(2 + u32::from(preserve_app_context))?;
attrs.set_pseudoconsole(hpc)?;
attrs.set_job(job.as_raw_handle() as HANDLE)?;

View File

@@ -112,7 +112,7 @@ pub unsafe fn create_process_as_user(
| (None, ConsoleMode::Inherit)
| (None, ConsoleMode::NoWindow) => 0,
};
let preserve_app_context = crate::app_package::current_process_is_registered_core_runner()?;
let preserve_app_context = crate::app_package::current_process_has_package_identity()?;
let attr_count = if stdio.is_some() { 2 } else { 1 } + u32::from(preserve_app_context);
let mut attrs = ProcThreadAttributeList::new(attr_count)?;
attrs.set_job(job.as_raw_handle() as HANDLE)?;