Skip to content

πŸ›‘οΈ Sentinel: [HIGH] Fix TOCTOU vulnerability in config permissions#297

Open
acebytes wants to merge 1 commit into
mainfrom
sentinel/fix-chmod-toctou-11320394093202304501
Open

πŸ›‘οΈ Sentinel: [HIGH] Fix TOCTOU vulnerability in config permissions#297
acebytes wants to merge 1 commit into
mainfrom
sentinel/fix-chmod-toctou-11320394093202304501

Conversation

@acebytes
Copy link
Copy Markdown
Contributor

🚨 Severity: HIGH
πŸ’‘ Vulnerability: A Time-of-Check to Time-of-Use (TOCTOU) vulnerability where chmod was used to enforce permissions, potentially following symlinks to alter external files.
🎯 Impact: An attacker could place a symlink at the config path, causing the daemon to inadvertently change permissions of sensitive system files to 0600.
πŸ”§ Fix: Replaced chmod with a secure sequence: opening the file descriptor with O_NOFOLLOW and O_CLOEXEC, then calling fchmod on the descriptor.
βœ… Verification: Tests run successfully, verified open and fchmod usage in DaemonMode.swift.


PR created automatically by Jules for task 11320394093202304501 started by @acebytes

🚨 Severity: HIGH
πŸ’‘ Vulnerability: A Time-of-Check to Time-of-Use (TOCTOU) vulnerability where `chmod` was used to enforce permissions, potentially following symlinks to alter external files.
🎯 Impact: An attacker could place a symlink at the config path, causing the daemon to inadvertently change permissions of sensitive system files to 0600.
πŸ”§ Fix: Replaced `chmod` with a secure sequence: opening the file descriptor with `O_NOFOLLOW` and `O_CLOEXEC`, then calling `fchmod` on the descriptor.
βœ… Verification: Tests run successfully, verified `open` and `fchmod` usage in `DaemonMode.swift`.

Co-authored-by: acebytes <2820910+acebytes@users.noreply.github.com>
@google-labs-jules
Copy link
Copy Markdown
Contributor

πŸ‘‹ Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a πŸ‘€ emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

πŸ’‘ Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2bed2ac334

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with πŸ‘.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

// Enforce 0600 permissions safely to avoid TOCTOU symlink vulnerabilities
URL(fileURLWithPath: path).withUnsafeFileSystemRepresentation { ptr in
guard let ptr = ptr else { return }
let fd = open(ptr, O_RDONLY | O_NOFOLLOW | O_CLOEXEC)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Open config without read bit before applying fchmod

Opening the config with O_RDONLY before calling fchmod introduces a regression: if the file exists but is owner-write-only (for example mode 0200), open fails with EACCES, so permissions are never corrected to 0600 and the subsequent read path fails. The previous chmod(path, 0o600) flow could repair such files first, then read them. This can break reloads for mis-permissioned but otherwise valid config files.

Useful? React with πŸ‘Β / πŸ‘Ž.

Comment on lines +973 to +977
if fd >= 0 {
fchmod(fd, 0o600)
close(fd)
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Fail closed when secure open with O_NOFOLLOW fails

If open(..., O_NOFOLLOW, ...) fails (for example because path is a symlink), the code silently skips permission enforcement and still proceeds to contents(atPath:), which follows the path and reads data anyway. That means the hardening step can be bypassed entirely in exactly the symlink case this change is trying to secure, and config loading continues without ever enforcing 0600 on the file actually consumed.

Useful? React with πŸ‘Β / πŸ‘Ž.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant