docs: update secure_parent_dir docstring and caller comments for the install-tree exclusion
The docstring and all four caller comments still said the helper refuses only / and top-level directories. Since #93757 it also refuses the entire hermes-agent install tree. Bring the docstring and the comments at the four credential-write call sites in line with the actual behavior so future changes are not misled by a stale safety description. Follow-up to #93757.
This commit is contained in:
+6
-3
@@ -1424,7 +1424,8 @@ def _save_auth_store(auth_store: Dict[str, Any], target_path: Optional[Path] = N
|
|||||||
auth_file.parent.mkdir(parents=True, exist_ok=True)
|
auth_file.parent.mkdir(parents=True, exist_ok=True)
|
||||||
# Tighten parent dir to 0o700 so siblings can't traverse to creds.
|
# Tighten parent dir to 0o700 so siblings can't traverse to creds.
|
||||||
# No-op on Windows (POSIX mode bits not enforced); ignore failures.
|
# No-op on Windows (POSIX mode bits not enforced); ignore failures.
|
||||||
# secure_parent_dir refuses to chmod / or top-level dirs (#25821).
|
# secure_parent_dir refuses to chmod /, top-level dirs, or the
|
||||||
|
# hermes-agent install tree (#25821, #93050).
|
||||||
secure_parent_dir(auth_file)
|
secure_parent_dir(auth_file)
|
||||||
auth_store["version"] = AUTH_STORE_VERSION
|
auth_store["version"] = AUTH_STORE_VERSION
|
||||||
auth_store["updated_at"] = datetime.now(timezone.utc).isoformat()
|
auth_store["updated_at"] = datetime.now(timezone.utc).isoformat()
|
||||||
@@ -2812,7 +2813,8 @@ def _read_qwen_cli_tokens() -> Dict[str, Any]:
|
|||||||
def _save_qwen_cli_tokens(tokens: Dict[str, Any]) -> Path:
|
def _save_qwen_cli_tokens(tokens: Dict[str, Any]) -> Path:
|
||||||
auth_path = _qwen_cli_auth_path()
|
auth_path = _qwen_cli_auth_path()
|
||||||
auth_path.parent.mkdir(parents=True, exist_ok=True)
|
auth_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
# secure_parent_dir refuses to chmod / or top-level dirs (#25821).
|
# secure_parent_dir refuses to chmod /, top-level dirs, or the
|
||||||
|
# hermes-agent install tree (#25821, #93050).
|
||||||
secure_parent_dir(auth_path)
|
secure_parent_dir(auth_path)
|
||||||
# Per-process random temp suffix avoids collisions between concurrent
|
# Per-process random temp suffix avoids collisions between concurrent
|
||||||
# writers and stale leftovers from a crashed prior write.
|
# writers and stale leftovers from a crashed prior write.
|
||||||
@@ -5628,7 +5630,8 @@ def _write_shared_nous_state(state: Dict[str, Any]) -> None:
|
|||||||
with _nous_shared_store_lock():
|
with _nous_shared_store_lock():
|
||||||
path = _nous_shared_store_path()
|
path = _nous_shared_store_path()
|
||||||
path.parent.mkdir(parents=True, exist_ok=True)
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
# secure_parent_dir refuses to chmod / or top-level dirs (#25821).
|
# secure_parent_dir refuses to chmod /, top-level dirs, or the
|
||||||
|
# hermes-agent install tree (#25821, #93050).
|
||||||
secure_parent_dir(path)
|
secure_parent_dir(path)
|
||||||
tmp = path.with_name(f"{path.name}.tmp.{os.getpid()}.{uuid.uuid4().hex}")
|
tmp = path.with_name(f"{path.name}.tmp.{os.getpid()}.{uuid.uuid4().hex}")
|
||||||
# Create with 0o600 atomically via os.open(O_EXCL) — closes the TOCTOU
|
# Create with 0o600 atomically via os.open(O_EXCL) — closes the TOCTOU
|
||||||
|
|||||||
+7
-1
@@ -1022,7 +1022,13 @@ def secure_parent_dir(path: Path) -> None:
|
|||||||
prevent catastrophic host bricking when ``HERMES_HOME`` or other path
|
prevent catastrophic host bricking when ``HERMES_HOME`` or other path
|
||||||
env vars resolve to an unexpected location.
|
env vars resolve to an unexpected location.
|
||||||
|
|
||||||
See https://github.com/NousResearch/hermes-agent/issues/25821.
|
Also refuses to chmod the hermes-agent install tree (the directory this
|
||||||
|
module lives in, and anything below it): restricting the install dir to
|
||||||
|
0700 locks the runtime user out of traversing it when it does not own
|
||||||
|
the dir, as in the Docker image. A warning is logged when this happens.
|
||||||
|
|
||||||
|
See https://github.com/NousResearch/hermes-agent/issues/25821 and
|
||||||
|
https://github.com/NousResearch/hermes-agent/pull/93050.
|
||||||
"""
|
"""
|
||||||
parent = path.parent.resolve()
|
parent = path.parent.resolve()
|
||||||
# Refuse root and its direct children (/usr, /home, /var, /tmp, …).
|
# Refuse root and its direct children (/usr, /home, /var, /tmp, …).
|
||||||
|
|||||||
+2
-1
@@ -424,7 +424,8 @@ def _write_json(path: Path, data: dict) -> None:
|
|||||||
path.parent.mkdir(parents=True, exist_ok=True)
|
path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
# Tighten parent dir to 0o700 so siblings can't traverse to the creds.
|
# Tighten parent dir to 0o700 so siblings can't traverse to the creds.
|
||||||
# No-op on Windows (POSIX mode bits aren't enforced); ignore failures.
|
# No-op on Windows (POSIX mode bits aren't enforced); ignore failures.
|
||||||
# secure_parent_dir refuses to chmod / or top-level dirs (#25821).
|
# secure_parent_dir refuses to chmod /, top-level dirs, or the
|
||||||
|
# hermes-agent install tree (#25821, #93050).
|
||||||
secure_parent_dir(path)
|
secure_parent_dir(path)
|
||||||
# Per-process random suffix avoids collisions between concurrent
|
# Per-process random suffix avoids collisions between concurrent
|
||||||
# writers and stale leftovers from a prior crashed write.
|
# writers and stale leftovers from a prior crashed write.
|
||||||
|
|||||||
Reference in New Issue
Block a user