Cyl created MAPREDUCE-7526:
------------------------------

             Summary: Insecure Temporary File Permissions in HadoopArchiveLogs 
Leads to Information Disclosure
                 Key: MAPREDUCE-7526
                 URL: https://issues.apache.org/jira/browse/MAPREDUCE-7526
             Project: Hadoop Map/Reduce
          Issue Type: Bug
    Affects Versions: 3.4.1
            Reporter: Cyl


{*}Description{*}:
h3. Summary

The {{HadoopArchiveLogs}} tool creates temporary shell script files with 
world-readable permissions (0644), allowing any local user to read sensitive 
job information including application IDs, usernames, and internal HDFS paths. 
This enables local information disclosure that could aid further attacks.
h3. Details

In {{{}HadoopArchiveLogs.java{}}}, the {{run()}} method creates a temporary 
script file using {{{}File.createTempFile(){}}}:

 
// 
hadoop-tools/hadoop-archive-logs/src/main/java/org/apache/hadoop/tools/HadoopArchiveLogs.java
// Line 200
File localScript = File.createTempFile("hadoop-archive-logs-", ".sh");
generateScript(localScript);
 

The {{File.createTempFile()}} API inherits system umask settings. On most Linux 
systems with default umask 022, this creates files with permissions 
{{-rw-r--r--}} (0644), making them readable by all users on the system.

The {{generateScript()}} method (lines 497-550) then writes sensitive 
information to this file:

 
void generateScript(File localScript) throws IOException {
    // ...
    fw.write("\\tappId=\\"");
    fw.write(context.getAppId());        // Application ID
    fw.write("\\"\\n\\tuser=\\"");
    fw.write(context.getUser());         // Username
    fw.write("\\"\\n\\tworkingDir=\\"");
    fw.write(context.getWorkingDir().toString());  // Internal HDFS path
    // ...
}
Additionally, the temporary file is never explicitly deleted after use, leaving 
it persistent in {{{}/tmp{}}}.
h3. Impact

This vulnerability enables {*}local information disclosure{*}:
 * {*}Application IDs{*}: Allows enumeration of YARN jobs running on the cluster
 * {*}Usernames{*}: Reveals which users are submitting jobs
 * {*}Internal Paths{*}: Exposes HDFS directory structure and log locations
 * {*}Persistent Exposure{*}: Files remain in {{/tmp}} indefinitely as they are 
never deleted

A local attacker with low-privilege shell access can harvest this information 
for reconnaissance before conducting more targeted attacks against specific 
users or applications.
h3. Occurrences
||Permalink||Description||
|[https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-archive-logs/src/main/java/org/apache/hadoop/tools/HadoopArchiveLogs.java#L200]|Insecure
 {{File.createTempFile()}} call creating world-readable temp file|
|[https://github.com/apache/hadoop/blob/trunk/hadoop-tools/hadoop-archive-logs/src/main/java/org/apache/hadoop/tools/HadoopArchiveLogs.java#L497-L550]|{{generateScript()}}
 method writing sensitive information to the temp file|
h3. Recommended Fix

Replace {{File.createTempFile()}} with {{Files.createTempFile()}} using 
explicit secure permissions:
FileAttribute<Set<PosixFilePermission>> perms =
    
PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwx------"));
Path localScriptPath = Files.createTempFile("hadoop-archive-logs-", ".sh", 
perms);
File localScript = localScriptPath.toFile();
```

Additionally, ensure cleanup in the finally block:
```java
finally {
    if (localScript != null) {
        localScript.delete();
    }
}
```
{{}}

 

 

{{finally {    if (localScript != null) \{
        localScript.delete();
    }
}}}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to