Skip to content

Data Model

SFHound maps Salesforce’s identity and permission model as a typed property graph compatible with BloodHound OpenGraph v2. This page is the authoritative reference for every node and edge type.


Node types

NodeLabelDescriptionIconColour
OrganisationSFOrganizationTop-level org container. System permissions are modelled as edges to this node.building#2d3436
UserSFUserA Salesforce user principal (human or service account).user#00b894
ProfileSFProfileThe baseline permission assignment; every user has exactly one.user-gear#0984e3
Permission SetSFPermissionSetAdditive permissions that can be stacked on a user above their Profile.id-badge#7f8c8d
Permission Set GroupSFPermissionSetGroupA named bundle of one or more Permission Sets.users#fdcb6e
RoleSFRoleA position in the role hierarchy, determining record visibility upward.sitemap#6c5ce7
Public GroupSFGroupA named collection of users and/or nested groups used in sharing rules.users#fdcb6e
QueueSFQueueA group-like object that can own records of configured SObject types.inbox#e17055
Connected AppSFConnectedAppAn OAuth application registered in the org.plug#00cec9
SObjectSFSObjectA Salesforce object (standard or custom) with CRUD and sharing metadata.database#636e72
FieldSFFieldA field on an SObject. Field-Level Security edges target these nodes.list-check#e84393

Key node properties

SFUser

{
"Id": "005...",
"name": "JANE DOE",
"Username": "jane.doe@example.com",
"IsActive": true,
"ProfileId": "00e...",
"UserRoleId": "00E..."
}

SFPermissionSet / SFProfile

{
"Id": "0PS...",
"name": "Custom_API_Integration",
"IsOwnedByProfile": false,
"PermissionsModifyAllData": false,
"PermissionsAuthorApex": true
}

SFSObject

{
"name": "SECRETDATA__C",
"Label": "Secret Data",
"IsCustom": true,
"InternalSharingModel": "Private",
"ExternalSharingModel": "Private"
}

Edge types

Assignment edges

EdgeSourceTargetDescription
AssignedProfileSFUserSFProfileUser is assigned to this Profile
AssignedPermissionSetSFUserSFPermissionSetUser has this Permission Set directly assigned
AssignedPermissionSetGroupSFUserSFPermissionSetGroupUser has this Permission Set Group assigned
HasPermissionSetSFProfileSFPermissionSetProfile is backed by its own PermissionSet record (IsOwnedByProfile=true)
IncludesPermissionSetSFPermissionSetGroupSFPermissionSetPermission Set Group includes this Permission Set

Role hierarchy edges

EdgeSourceTargetDescription
HasRoleSFUserSFRoleUser is assigned to this role
InheritsRoleSFRoleSFRoleChild role — users in the parent role can see records owned by users in this child role

Group & queue edges

EdgeSourceTargetDescription
MemberOfGroupSFUser / SFGroupSFGroup / SFQueueDirect or nested group/queue membership
HasMemberSFGroup / SFQueueSFUser / SFGroupInverse of MemberOfGroup
CanOwnObjectSFQueueSFSObjectQueue is configured to own records of this SObject type

Object permission (CRUD) edges

All sourced from SFProfile or SFPermissionSet, all target SFSObject.

EdgeWhat it means
CanCreateCan create new records
CanReadCan read records (subject to sharing)
CanEditCan edit records (subject to sharing)
CanDeleteCan delete records (subject to sharing)
CanViewAllCan view all records — bypasses sharing rules
CanModifyAllCan edit/delete all records — bypasses sharing rules

Field-Level Security (FLS) edges

All sourced from SFProfile or SFPermissionSet, all target SFField.

EdgeWhat it means
IsVisibleField is readable and editable (PermissionsEdit=true)
ReadOnlyField is readable but not editable (PermissionsRead=true, PermissionsEdit=false)

System permission edges

All sourced from SFProfile or SFPermissionSet, all target SFOrganization.

EdgeRisk levelWhat it grants
ModifyAllData🔴 CriticalModify every record in the org — bypasses all sharing
ViewAllData🔴 CriticalRead every record — bypasses all sharing; exfiltration risk
ManageUsers🔴 HighCreate, edit, activate, and deactivate users
AuthorApex🔴 HighCreate and deploy Apex code — arbitrary server-side execution
CustomizeApplication🔴 HighCustomise Salesforce application metadata
ManageProfilesPermissionsets🔴 HighManage profiles and permission sets
ManageSharing🔴 HighManage sharing rules and OWD settings
ManageRoles🟠 MediumCreate and edit the role hierarchy
ManageTranslation🟠 MediumRename fields and labels org-wide
EditTask🟡 LowEdit Task records owned by others (sharing-gated)
EditEvent🟡 LowEdit Event records owned by others (sharing-gated)
ViewSetupℹ️ InfoView setup and configuration
ApiEnabledℹ️ InfoAll programmatic API access (REST, SOAP, Bulk, Metadata, Tooling)

OAuth & provenance edges

EdgeSourceTargetTraversableDescription
CanAuthorizeSFProfile / SFPermissionSetSFConnectedAppYesProfile or PermSet grants OAuth-authorise right for this app
CreatedBySFConnectedAppSFUserNoRecords the admin who created the Connected App (audit/provenance)

Edge context properties

Every named edge type carries the following properties, visible in the BloodHound edge detail panel:

PropertyDescription
GeneralWhat the edge represents and how the permission works
AbuseInfoHow an attacker exploits this edge — escalation paths, blast radius, prerequisites
RemediationInfoActionable steps to restrict or remediate access, with SOQL audit queries
OPSECWhat is and is not logged when this edge is exercised
ReferencesMITRE ATT&CK technique mapping and Salesforce documentation URLs

Design decisions

See the Design Decisions section for the rationale behind key modelling choices:

  • System permissions as edges, not node properties
  • Aggregate PermissionSet placeholder hydration
  • Shared sobject_lookup for queue and CRUD edges