mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-05-07 02:51:50 +00:00
fix(google_oauth): close TOCTOU window when saving credentials
This commit is contained in:
parent
e50809b771
commit
412f2389f1
1 changed files with 15 additions and 2 deletions
|
|
@ -489,16 +489,29 @@ def save_credentials(creds: GoogleCredentials) -> Path:
|
||||||
"""Atomically write creds to disk with 0o600 permissions."""
|
"""Atomically write creds to disk with 0o600 permissions."""
|
||||||
path = _credentials_path()
|
path = _credentials_path()
|
||||||
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 file.
|
||||||
|
# On Windows this is a no-op (POSIX mode bits aren't enforced); ignore failures.
|
||||||
|
try:
|
||||||
|
os.chmod(path.parent, 0o700)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
payload = json.dumps(creds.to_dict(), indent=2, sort_keys=True) + "\n"
|
payload = json.dumps(creds.to_dict(), indent=2, sort_keys=True) + "\n"
|
||||||
|
|
||||||
with _credentials_lock():
|
with _credentials_lock():
|
||||||
tmp_path = path.with_suffix(f".tmp.{os.getpid()}.{secrets.token_hex(4)}")
|
tmp_path = path.with_suffix(f".tmp.{os.getpid()}.{secrets.token_hex(4)}")
|
||||||
try:
|
try:
|
||||||
with open(tmp_path, "w", encoding="utf-8") as fh:
|
# Create with 0o600 atomically to close the TOCTOU window where the
|
||||||
|
# default umask (often 0o644) would briefly expose tokens to other
|
||||||
|
# local users between open() and chmod().
|
||||||
|
fd = os.open(
|
||||||
|
str(tmp_path),
|
||||||
|
os.O_WRONLY | os.O_CREAT | os.O_EXCL,
|
||||||
|
stat.S_IRUSR | stat.S_IWUSR,
|
||||||
|
)
|
||||||
|
with os.fdopen(fd, "w", encoding="utf-8") as fh:
|
||||||
fh.write(payload)
|
fh.write(payload)
|
||||||
fh.flush()
|
fh.flush()
|
||||||
os.fsync(fh.fileno())
|
os.fsync(fh.fileno())
|
||||||
os.chmod(tmp_path, stat.S_IRUSR | stat.S_IWUSR)
|
|
||||||
atomic_replace(tmp_path, path)
|
atomic_replace(tmp_path, path)
|
||||||
finally:
|
finally:
|
||||||
try:
|
try:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue