Data/Checks/TP.INT.0017.psd1

@{
    Id         = 'TP.INT.0017'
    Title      = 'App Control for Business policy enforcing (not audit-only)'
    Category   = 'Intune.SettingsCatalog'
    Severity   = 'High'
    Effort     = 'Medium'
    Impact     = 'High'
    Data       = @{
        Expansions = @('settingPresenceIndex')
        Gates      = @('Intune')
    }
    Rule       = @{
        Type     = 'Function'
        Function = 'Test-PulseAppControlPolicyEnforcing'
    }
    Consulting = @{
        WhatItMeans  = 'App Control for Business (formerly WDAC) restricts which applications and drivers are allowed to run. This check reads Part A''s setting-presence index and Passes only when at least one App Control policy is in Enforce mode (audit mode disabled) AND has an active control - built-in controls selected, or a custom XML upload whose payload is non-empty. Evaluated as a SAME-POLICY AND, not a tenant-wide union: a tenant that audits on policy A and uploads empty XML on policy B still Fails, because neither policy actually blocks untrusted executables. Settings Catalog assignments are still deferred in this slice, so this check matches Maester and treats policy existence as enough - it does not require a confirmed assignment.'
        WhyItMatters = 'Application allowlisting is one of the strongest single controls against unknown/novel malware, but only when enforced. An audit-only policy logs untrusted executables and does not block them. An upload-mode policy with an empty XML payload is the same class of silent failure - the tenant looks like it has App Control and does not. Because this check reads the settings-expansion index rather than a template-family-filtered Graph fetch, it also sees App Control settings that landed through the Endpoint Security Application Control template surface (visibility:"template" in the live setting-definitions capture - unpublished in Microsoft''s Graph schema docs, live-confirmed in-repo).'
        Remediation  = @(
            'Intune admin center > Endpoint security > App Control for Business > Create Policy - set Policy creation type to Built-in controls (or XML upload with a real code-integrity policy), set Audit mode to Disabled (Enforce), and assign the policy.'
            'If this finding names a policy as XML-upload with no payload, edit that policy and upload a non-empty App Control XML - an empty upload is not an active control.'
            'A Warn status means at least one candidate policy has a redacted enforce-mode or active-control value - review the policy directly in the Intune admin center to confirm its actual state.'
            'Start newly-enabled App Control policies in Audit mode against a representative device population before moving to Enforce, per Microsoft''s own App Control rollout guidance, then flip Audit mode off once false positives are cleared.'
        )
        PortalLinks  = @('https://intune.microsoft.com/#view/Microsoft_Intune_Workflows/SecurityManagementMenu/~/appcontrol')
    }
    References = @{
        Research    = 'docs/research/iha-v2/2026-08-16-phase3-intune-check-entries.md#tpint0017--app-control-for-business-policy-enforcing-not-audit-only'
        Authorities = @(
            'https://learn.microsoft.com/en-us/intune/intune-service/protect/endpoint-security-app-control-policy'
            'https://learn.microsoft.com/en-us/windows/security/application-security/application-control/app-control-for-business/appcontrol'
        )
    }
    Origin     = @{ Project = 'Maester'; Id = 'MT.1179'; License = 'MIT' }
}