VYPR
Medium severity5.5NVD Advisory· Published Apr 22, 2026· Updated May 4, 2026

CVE-2026-35339

CVE-2026-35339

Description

The recursive mode (-R) of the chmod utility in uutils coreutils incorrectly handles exit codes when processing multiple files. The final return value is determined solely by the success or failure of the last file processed. This allows the command to return an exit code of 0 (success) even if errors were encountered on previous files, such as 'Operation not permitted'. Scripts relying on these exit codes may proceed under a false sense of success while sensitive files remain with restrictive or incorrect permissions.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
coreutilscrates.io
< 0.6.00.6.0

Affected products

2
  • Uutils/Coreutilsreferences2 versions
    (expand)+ 1 more
    • (no CPE)
    • cpe:2.3:a:uutils:coreutils:*:*:*:*:*:rust:*:*range: <0.6.0

Patches

1
abd581f62e97

chmod: fix error handling if multiple files are handled (#9793)

https://github.com/uutils/coreutilscerdelenJan 1, 2026via ghsa
2 files changed · +33 1
  • src/uu/chmod/src/chmod.rs+1 1 modified
    @@ -411,7 +411,7 @@ impl Chmoder {
                     return Err(ChmodError::PreserveRoot("/".into()).into());
                 }
                 if self.recursive {
    -                r = self.walk_dir_with_context(file, true);
    +                r = self.walk_dir_with_context(file, true).and(r);
                 } else {
                     r = self.chmod_file(file).and(r);
                 }
    
  • tests/by-util/test_chmod.rs+32 0 modified
    @@ -375,6 +375,38 @@ fn test_permission_denied() {
             .stderr_is("chmod: cannot access 'd/no-x/y': Permission denied\n");
     }
     
    +#[test]
    +#[allow(clippy::unreadable_literal)]
    +fn test_chmod_recursive_correct_exit_code() {
    +    let (at, mut ucmd) = at_and_ucmd!();
    +
    +    // create 3 folders to test on
    +    at.mkdir("a");
    +    at.mkdir("a/b");
    +    at.mkdir("z");
    +
    +    // remove read permissions for folder a so the chmod command for a/b fails
    +    let mut perms = at.metadata("a").permissions();
    +    perms.set_mode(0o000);
    +    set_permissions(at.plus_as_string("a"), perms).unwrap();
    +
    +    #[cfg(not(target_os = "linux"))]
    +    let err_msg = "chmod: Permission denied\n";
    +    #[cfg(target_os = "linux")]
    +    let err_msg = "chmod: cannot access 'a': Permission denied\n";
    +
    +    // order of command is a, a/b then c
    +    // command is expected to fail and not just take the last exit code
    +    ucmd.arg("-R")
    +        .arg("--verbose")
    +        .arg("a+w")
    +        .arg("a")
    +        .arg("z")
    +        .umask(0)
    +        .fails()
    +        .stderr_is(err_msg);
    +}
    +
     #[test]
     #[allow(clippy::unreadable_literal)]
     fn test_chmod_recursive() {
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

5

News mentions

0

No linked articles in our index yet.