mirror of
https://github.com/openai/codex.git
synced 2026-09-20 12:47:38 +00:00
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:
@@ -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> {
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
@@ -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)?;
|
||||
|
||||
Reference in New Issue
Block a user