SAP SuccessFactors SSPM

SaaS / SSPMv1.0.0

Dual-mode SSPM for SAP SuccessFactors: 45 live OData API checks + 49 offline config audit checks across 7 modules

94+
checks
2
modes
7
modules

01Overview

SAP SuccessFactors is one of the world's most widely deployed HR SaaS platforms, holding a company's most sensitive data: employee PII, compensation, org structure, and payroll feeds. Yet its security posture is governed by a sprawl of RBP permission roles, OAuth clients, Integration Center jobs, SAML/MFA settings, and data-retention rules that no single admin screen presents holistically. This project is a purpose-built SaaS Security Posture Management (SSPM) toolkit that audits exactly that surface.

It ships as two complementary, standalone scanners. The Offline Scanner is a modular, zero-dependency (Python stdlib only) tool that ingests exported CSV/JSON configuration data and runs 49 checks across 7 audit modules, producing an interactive HTML dashboard with severity ratings and remediation. The Online Scanner is a single-file tool that connects live to a running instance over the standard SAP SuccessFactors OData v2 REST API using read-only credentials, running 35 posture checks across 8 categories with no agent or plugin to install.

The dual-mode design maps directly to how real assessments happen: use the Offline Scanner for air-gapped reviews, deep RBP/permission analysis from exports, or when you only have data dumps; use the Online Scanner when you hold read-only API credentials and want a real-time posture snapshot of password policy, users, SSO, audit logging, privacy, and integrations. Both are strictly non-destructive, both emit severity-ranked findings with remediation, and both exit non-zero on CRITICAL/HIGH findings so they drop cleanly into CI or assessment pipelines.

It is built for HR-security and GRC teams, SAP administrators, and offensive/defensive security consultants who need SuccessFactors-specific coverage that generic SaaS scanners lack. Findings are grounded in concrete controls (RBP over-privilege, SoD conflicts, terminated-employee access, OAuth scope sprawl, GDPR purge jobs, audit-log gaps) and annotated with CWE identifiers and framework alignment rather than vague scores.

02Key Capabilities

Dual-mode scanning (offline + online)

One toolkit covers both air-gapped config-export review and live OData API scanning, so you can audit whether or not you have instance credentials.

Zero-dependency offline auditor

The offline scanner runs on Python 3.8+ stdlib alone, making it trivial to drop into a locked-down or air-gapped assessment environment.

Agentless live OData v2 scanning

The online scanner queries a running instance read-only over the standard SAP SuccessFactors OData v2 REST API with only the requests library and no plugin to install.

Deep RBP and Segregation-of-Duties analysis

Detects over-privileged roles, admin sprawl, wildcard populations, unused roles, and SoD conflicts such as role-admin combined with user-admin or export combined with PII access.

Terminated and dormant account detection

Flags terminated employees who still hold active accounts, dormant users inactive 90+ days, and service accounts with hygiene issues before they become an attack path.

Integration and OAuth security checks

Surfaces broad-scope OAuth clients, deprecated grant types, unauthenticated or non-TLS Integration Center jobs, and integrations exporting sensitive HR data.

Data privacy and GDPR coverage

Validates field masking of PII, data-retention and purge policies, consent management, and unrestricted bulk export controls.

Interactive HTML dashboards

Both scanners emit a self-contained HTML report with severity breakdown, category charts, and per-finding remediation; the online scanner also outputs coloured console and JSON.

Modular, selectable audit modules

Run all seven offline modules or target specific ones (e.g. rbp api privacy) and filter output by minimum severity for focused assessments.

CWE-annotated, framework-aligned findings

Findings carry CWE identifiers and are aligned to NIST SP 800-63B, GDPR, CIS HR SaaS practices, OWASP, and the SAP SuccessFactors hardening guidance.

Multi-data-center aware

Ships a reference map of SAP SuccessFactors DC API hosts (US, EU, APAC, Canada) so the online scanner points at the right regional endpoint.

CI-friendly exit codes

Both scanners return a non-zero exit code when CRITICAL or HIGH findings exist, enabling gating in security pipelines.

03Architecture

The toolkit is two independent scanners sharing a common finding/severity model. The offline scanner is a thin CLI orchestrator that loads exported CSV/JSON via a DataLoader, then dispatches to seven BaseAuditor subclasses (one per domain) that each emit structured finding dicts, which a ReportGenerator renders into an interactive HTML dashboard. The online scanner is a single-file OData v2 client that authenticates with read-only Basic Auth (username@companyId), pages through nine SuccessFactors entities, and runs eight check groups (including 10 data-driven password-policy rules) that produce Finding objects rendered to console, JSON, and HTML.

1
CLI / orchestration layer
successfactors_offlinescanner.py and successfactors_onlinescanner.py parse args/env vars, select modules and severity thresholds, run checks, and set CI exit codes.
2
Data ingestion layer
Offline: modules/data_loader.py loads exported CSV/JSON from --data-dir. Online: the _api_get OData v2 helper fetches entities with $format=json and $top/$skip pagination, handling 401/403/404 gracefully.
3
Audit engine (offline)
Seven BaseAuditor subclasses (rbp_permissions, auth_provisioning, sso_auth, api_integration, data_privacy, instance_security, audit_logging) implement run_all_checks and emit severity-rated finding dicts.
4
Check engine (online)
SuccessFactorsScanner runs eight _check_* groups over nine OData entities; password policy is driven by a PASSWORD_POLICY_RULES table with typed operators (gte_int, eq_true, non_zero, lte_days, etc.).
5
Finding model
A shared finding structure (offline dict via BaseAuditor.finding, online Finding class) carries id, severity, category, description, remediation, CWE, and affected items.
6
Reporting layer
modules/report_generator.py builds the offline HTML dashboard (severity + category charts); the online scanner renders coloured console, JSON, and self-contained HTML.

04Project Structure

successfactors_offlinescanner.pyOffline scanner CLI entry point; orchestrates DataLoader, the 7 auditor modules, severity filtering, and report generation.
successfactors_onlinescanner.pySingle-file live OData v2 API scanner (~1,599 lines); auth, entity fetch, 8 check groups, and console/JSON/HTML output.
modules/base_auditor.pyBaseAuditor class defining the severity constants and the finding() helper shared by all offline modules.
modules/data_loader.pyLoads exported CSV/JSON configuration files from the data directory; every input file is optional.
modules/rbp_permissions.pyRBP-* checks: over-privileged roles, admin sprawl, SoD conflicts, sensitive-data and wildcard-population access (7 checks).
modules/sso_auth.pySSO-* checks: SAML config weaknesses, MFA enforcement, IP restrictions, session timeout, certificate health, brute-force patterns (9 checks).
modules/api_integration.pyAPI-* checks: OAuth scope/grant/idle, sensitive OData entity exposure, Integration Center auth/TLS, broad API access (8 checks).
modules/data_privacy.pyPRIV-* checks: field masking, data retention/purge, MDF PII classification, picklist and bulk-export controls (8 checks).
modules/report_generator.py748-line HTML dashboard generator with severity/category breakdowns and per-finding remediation.
sample_data/22 demo config files (CSV/JSON) plus a sample_report.html so the offline scanner runs out of the box.
CLAUDE.mdProject instructions documenting both scanners, rule-ID formats, and architecture.
README.mdFull usage, module/check catalogues, data-source reference, and DC host map.

05Security Controls

RBP permissions & SoD
7 checks (RBP-001..007): roles with >50 permissions, excessive admins, manage/full access to comp/PII/payroll, wildcard all-employee populations, SoD conflicts (role-admin+user-admin, export+PII), manage access to critical platform objects, and unused roles.
Authentication & provisioning
7 checks (AUTH-*): missing/weak password policy, dormant accounts (90+ days), users with no roles, SCIM/auto-deprovision gaps, service-account hygiene, and CRITICAL terminated-employees-with-active-accounts.
SSO, MFA & session
9 offline checks (SSO-*): no SAML, unsigned/IDP-initiated assertion weaknesses, missing/unenforced MFA, SMS/bypass allowed, absent or overly permissive IP restrictions, long session timeouts, expiring/expired certificates, and brute-force login patterns.
API & integration security
8 checks (API-*): broad OAuth scopes, deprecated password/implicit grants, OAuth idle 180+ days, sensitive OData write/manage exposure, unauthenticated Integration Center jobs, sensitive-HR-data export, non-TLS jobs, and roles with >30-entity API access.
Data privacy & GDPR
8 checks (PRIV-*): missing field masking, uncovered/explicitly-unmasked PII, no retention/purge policy, excessive retention, unclassified custom MDF PII, unrestricted sensitive picklists, and unrestricted bulk export.
Instance & audit logging
4 instance checks (INST-*: HSTS/CSP/X-Frame-Options, provisioning access, debug/preview-sync risk) plus 6 audit-logging checks (LOG-*: logging disabled, event-coverage gaps, <365-day retention, no SIEM export, no alert rules).
Live password-policy engine (online)
Data-driven PASSWORD_POLICY_RULES (10 rules, SF-PWD-001..010) plus a policy-accessibility check (SF-PWD-000): minimum length, upper/lower/number/symbol complexity, expiry, history, lockout threshold, and temp-password TTL evaluated against the live PasswordPolicy entity; most rules map to CWE-521, with the lockout threshold mapped to CWE-307 and temp-password TTL to CWE-640.
Live user & role posture (online)
SF-USER-001..005 and SF-ROLE-001..002: super-admin count, never-logged-in admins, stale accounts, service accounts, broad-scoped roles, and excessive role count queried live from the User and PermissionRole entities.
Live audit, privacy & integration (online)
SF-LOG/PRIV/INT groups: audit enablement and retention, GDPR PersonalDataPurgeJob and ConsentManagementConfig status, sensitive-field masking, OAuth client sprawl, admin-scope clients, token lifetime, and non-HTTPS integration flows.
CWE-mapped findings
Online findings are tagged with 14 distinct CWEs including CWE-521 (weak password), CWE-269 (improper privilege management), CWE-613 (insufficient session expiration), CWE-778 (insufficient logging), CWE-319 (cleartext transmission), and CWE-287/284/307/308/312/359/640.

06Technology Stack

Language
Python (offline 3.8+, online 3.10+)
Offline dependencies
None — standard library only (argparse, csv, json, pathlib)
Online dependencies
requests (HTTPBasicAuth) — single external package
API
SAP SuccessFactors OData v2 REST API ($format=json, $top/$skip pagination)
Architecture
Offline: modular BaseAuditor classes; Online: single-file ~1,599-line scanner
Reporting
Self-contained HTML dashboards, JSON export, coloured ANSI console
License
MIT

07Quick Start

$ git clone https://github.com/Krishcalin/SAP-SuccessFactors.git && cd SAP-SuccessFactors
$ python successfactors_offlinescanner.py --data-dir ./sample_data --output report.html
$ python successfactors_offlinescanner.py --data-dir ./exports --modules rbp api privacy --severity HIGH
$ pip install requests
$ python successfactors_onlinescanner.py --api-host api4.successfactors.com --company-id MYCOMPANY --username admin.readonly --password secret --json report.json --html report.html
$ SF_API_HOST/SF_COMPANY_ID/SF_USERNAME/SF_PASSWORD env vars can replace CLI flags for the online scanner

08Compliance & Frameworks

NIST SP 800-63B
Password-policy checks (minimum length and complexity) reference NIST digital-identity guidance.
GDPR
Data-privacy checks cover PII masking, data retention/purge jobs, consent management, and export controls.
CIS HR SaaS best practices
Online scanner aligns its posture checks with CIS HR SaaS security guidance.
SAP SuccessFactors Security Hardening Guide
Checks map to SAP's own hardening recommendations for the platform.
OWASP / CWE
Findings are annotated with CWE identifiers (14 distinct in the online scanner) and OWASP alignment.
Segregation of Duties (SoD)
RBP module detects toxic role combinations (role-admin+user-admin, export+PII) relevant to SOX-style access control.

09Integrations & Outputs

Input: exported SuccessFactors CSV/JSON config (22 supported files, e.g. rbp_roles.csv, oauth_clients.json, audit_log_config.json)Live source: SAP SuccessFactors OData v2 entities (PasswordPolicy, User, CompanyInfo, PermissionRole, AuditConfiguration, OAuthClient, PersonalDataPurgeJob, ConsentManagementConfig, IntegrationFlowDesign)Output: interactive HTML dashboard, JSON report, coloured consoleCI: non-zero exit code on CRITICAL/HIGH findings for pipeline gatingMulti-DC: reference host map for US, EU, APAC, and Canada data centers

Explore SAP SuccessFactors SSPM

Full source, documentation, and deployment guides live on GitHub.