[ 
https://issues.apache.org/jira/browse/HDFS-8312?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16013167#comment-16013167
 ] 

Daryn Sharp commented on HDFS-8312:
-----------------------------------

bq. The patch fixed the rename API by adding the permission check of delete 
when the destination is to the trash directory, this has to be fixed otherwise 
the it exposes the security hole that malicious user would use rename to move 
other people's file/dir to trash and subsequently got deleted.

I lost track of this jira until I saw it being backported.  I'll reiterate, 
bluntly this time, that +this patch is completely worthless from a security 
perspective+.  It's an honor-system based sanity check for the good users.  A 
malicious user is never going to pass the flag to request the permission 
subcheck.  Why even hack fs -rm to remove the flag when you can just use fs -mv?

bq.  Suppose userA has no privilege to delete fileB, directly FS.delete(fileB) 
will fail. However FS.rename(fileB, fileBinTrash) would success because it only 
checks the write access to parent of fileB and write access to ancestor of 
fileBinTrash.

Yes, rename/delete modify a directory which only requires write privs.  That's 
POSIX semantics.  Small corrections, assuming user has write privs to a 
specific dir:
# delete(fileB) does and should succeed regardless of fileB permissions – 
ignoring sticky bit rules for simplicity
# delete(dirB) will fail if dirB is non-empty and the user has no permission.  
the user has to descend the tree (read privs), and remove the children (write 
privs)
# rename always works on a file or subdir regardless of the permission on 
either.

––

Consider a *nix system.  Let's say I foolishly have a single volume for the 
entire system, and I run tmpwatch to delete old stuff in /tmp.  It's the same 
situation.  If I have write privs to a directory, I can move anything in it to 
/tmp and it'll get blown away.

> Trash does not descent into child directories to check for permissions
> ----------------------------------------------------------------------
>
>                 Key: HDFS-8312
>                 URL: https://issues.apache.org/jira/browse/HDFS-8312
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: fs, security
>    Affects Versions: 2.2.0, 2.6.0, 2.7.2
>            Reporter: Eric Yang
>            Assignee: Weiwei Yang
>            Priority: Critical
>             Fix For: 2.9.0, 2.7.4, 3.0.0-alpha1, 2.8.1
>
>         Attachments: HDFS-8312-001.patch, HDFS-8312-002.patch, 
> HDFS-8312-003.patch, HDFS-8312-004.patch, HDFS-8312-005.patch, 
> HDFS-8312-branch-2.7.patch, HDFS-8312-branch-2.8.01.patch, 
> HDFS-8312-testcase.patch
>
>
> HDFS trash does not descent into child directory to check if user has 
> permission to delete files.  For example:
> Run the following command to initialize directory structure as super user:
> {code}
> hadoop fs -mkdir /BSS/level1
> hadoop fs -mkdir /BSS/level1/level2
> hadoop fs -mkdir /BSS/level1/level2/level3
> hadoop fs -put /tmp/appConfig.json /BSS/level1/level2/level3/testfile.txt
> hadoop fs -chown user1:users /BSS/level1/level2/level3/testfile.txt
> hadoop fs -chown -R user1:users /BSS/level1
> hadoop fs -chown -R 750 /BSS/level1
> hadoop fs -chmod -R 640 /BSS/level1/level2/level3/testfile.txt
> hadoop fs -chmod 775 /BSS
> {code}
> Change to a normal user called user2. 
> When trash is enabled:
> {code}
> sudo su user2 -
> hadoop fs -rm -r /BSS/level1
> 15/05/01 16:51:20 INFO fs.TrashPolicyDefault: Namenode trash configuration: 
> Deletion interval = 3600 minutes, Emptier interval = 0 minutes.
> Moved: 'hdfs://bdvs323.svl.ibm.com:9000/BSS/level1' to trash at: 
> hdfs://bdvs323.svl.ibm.com:9000/user/user2/.Trash/Current
> {code}
> When trash is disabled:
> {code}
> /opt/ibm/biginsights/IHC/bin/hadoop fs -Dfs.trash.interval=0 -rm -r 
> /BSS/level1
> 15/05/01 16:58:31 INFO fs.TrashPolicyDefault: Namenode trash configuration: 
> Deletion interval = 0 minutes, Emptier interval = 0 minutes.
> rm: Permission denied: user=user2, access=ALL, 
> inode="/BSS/level1":user1:users:drwxr-x---
> {code}
> There is inconsistency between trash behavior and delete behavior.  When 
> trash is enabled, files owned by user1 is deleted by user2.  It looks like 
> trash does not recursively validate if the child directory files can be 
> removed.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

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

Reply via email to