salesforce/cloudsplaining

Cloudsplaining false negatives on multi policy privesc paths

sethsec opened this issue · 1 comments

If i am not mistaken, Cloudsplaining takes a policy-centric approach to evaluating privesc paths. If a policy meets the logic that defines a privesc path, this policy is identified as allowing privesc. Any principal that has that policy applied is highlighted as well, which is great! However, a principal that has two or more policies that each contain part of the privesc conditions, is not highlighted, which causes detection misses for privesc paths.

Example of successful detection:

policy_privesc3: Allows ec2:RunInstances + iam:Passrole 

role_test1: has policy_privesc3 attached

Results:

policy_privesc3 will be detected as a privesc path - CORRECT
role_test1 will be detected as having a privesc path - CORRECT

Example of false negative:

policy_privesc-runInstances: Allows ec2:RunInstances only
policy_privesc-passrole: Allows iam:Passrole only

role_test2: policy_privesc-runInstances & policy_privesc-passrole attached

Results:

Neither policy will be detected as a privesc path - CORRECT
role_test2 will not be detected as having a privesc path -  INCORRECT

I know adding support for this is not a small task. Also, pmapper does a great job at identifying these combo cases. However, I love the Cloudsplaining UI, how straightforward it is to use, all of the supporting documentation, and really just think Cloudsplaining should catch these cases as well.

Also, it might be a good idea to list this limitation in the documentation to make sure poeple know what the tool does a great job of catching, and what the current blind spots are.

This is a great point and would be super valuable. Also, I am glad you like the UI :)

If someone wants to pick this up, here are some implementation suggestions: I would suggest some kind of merge_policies function that would accept any number of PolicyDocument objects (from cloudsplaining.scan.policy_document). Then if a principal has multiple policies attached, run merge_policies, and from that result, determine if there are any new PrivEsc dict keys from PolicyDocument.allows_privilege_escalation compared to the PrivEsc dict keys from the other policies attached. If the keys are different, then it's a finding specific to that principal.