Skip to content

Commit c933473

Browse files
authored
Add support for new flags in PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY (winsiderss#671)
1 parent aa7a044 commit c933473

File tree

3 files changed

+66
-7
lines changed

3 files changed

+66
-7
lines changed

ProcessHacker/include/procmtgn.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ typedef struct _PH_PROCESS_MITIGATION_POLICY_ALL_INFORMATION
1919
PROCESS_MITIGATION_PAYLOAD_RESTRICTION_POLICY PayloadRestrictionPolicy; // ProcessPayloadRestrictionPolicy
2020
PROCESS_MITIGATION_CHILD_PROCESS_POLICY ChildProcessPolicy; // ProcessChildProcessPolicy
2121
PROCESS_MITIGATION_SIDE_CHANNEL_ISOLATION_POLICY SideChannelIsolationPolicy; // ProcessSideChannelIsolationPolicy
22-
PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY UserShadowStackPolicy; // ProcessUserShadowStackPolicy
22+
PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY_INT UserShadowStackPolicy; // ProcessUserShadowStackPolicy
2323
} PH_PROCESS_MITIGATION_POLICY_ALL_INFORMATION, *PPH_PROCESS_MITIGATION_POLICY_ALL_INFORMATION;
2424

2525
NTSTATUS PhGetProcessMitigationPolicy(

ProcessHacker/procmtgn.c

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ NTSTATUS PhGetProcessMitigationPolicy(
120120
COPY_PROCESS_MITIGATION_POLICY(PayloadRestriction, PROCESS_MITIGATION_PAYLOAD_RESTRICTION_POLICY);
121121
COPY_PROCESS_MITIGATION_POLICY(ChildProcess, PROCESS_MITIGATION_CHILD_PROCESS_POLICY);
122122
COPY_PROCESS_MITIGATION_POLICY(SideChannelIsolation, PROCESS_MITIGATION_SIDE_CHANNEL_ISOLATION_POLICY); // 19H1
123-
COPY_PROCESS_MITIGATION_POLICY(UserShadowStack, PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY); // 20H1
123+
COPY_PROCESS_MITIGATION_POLICY(UserShadowStack, PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY_INT); // 20H1
124124

125125
return status;
126126
}
@@ -531,15 +531,54 @@ BOOLEAN PhDescribeProcessMitigationPolicy(
531531
break;
532532
case ProcessUserShadowStackPolicy:
533533
{
534-
PPROCESS_MITIGATION_USER_SHADOW_STACK_POLICY data = Data;
534+
PPROCESS_MITIGATION_USER_SHADOW_STACK_POLICY_INT data = Data;
535535

536-
if (data->EnableUserShadowStack)
536+
if (data->EnableUserShadowStack || data->AuditUserShadowStack)
537537
{
538538
if (ShortDescription)
539-
*ShortDescription = PhCreateString(L"Stack protection is enabled");
539+
{
540+
PhInitializeStringBuilder(&sb, 50);
541+
542+
if (data->AuditUserShadowStack)
543+
PhAppendStringBuilder2(&sb, L"Audit ");
544+
545+
if (data->EnableUserShadowStackStrictMode)
546+
PhAppendStringBuilder2(&sb, L"Strict ");
547+
548+
PhAppendStringBuilder2(&sb, L"Stack protection");
549+
550+
*ShortDescription = PhFinalStringBuilderString(&sb);
551+
}
540552

541553
if (LongDescription)
542-
*LongDescription = PhCreateString(L"The CPU verifies function return addresses at runtime by employing a hardware-enforced shadow stack.\r\n");
554+
{
555+
PhInitializeStringBuilder(&sb, 100);
556+
557+
PhAppendStringBuilder2(&sb, L"The CPU verifies function return addresses at runtime by employing a hardware-enforced shadow stack.\r\n");
558+
559+
if (data->AuditUserShadowStack)
560+
PhAppendStringBuilder2(&sb, L"Audit Stack protection : log ROP failures to event log.\r\n");
561+
562+
if (data->EnableUserShadowStackStrictMode)
563+
PhAppendStringBuilder2(&sb, L"Strict Stack protection : any detected ROP will cause the process to terminate.\r\n");
564+
565+
if (data->AuditSetContextIpValidation)
566+
PhAppendStringBuilder2(&sb, L"Audit Set Context IP validation : log modifications of context IP to event log.\r\n");
567+
568+
if (data->SetContextIpValidation)
569+
PhAppendStringBuilder2(&sb, L"Set Context IP validation : any detected modification of context IP will cause the process to terminate.\r\n");
570+
571+
if (data->AuditBlockNonCetBinaries)
572+
PhAppendStringBuilder2(&sb, L"Audit Block non CET binaries : log attempts to load binaries without CET support.\r\n");
573+
574+
if (data->BlockNonCetBinaries)
575+
PhAppendStringBuilder2(&sb, L"Block binaries without CET support\r\n");
576+
577+
if (data->BlockNonCetBinariesNonEhcont)
578+
PhAppendStringBuilder2(&sb, L"Block binaries without CET support or without EH continuation metadata.\r\n");
579+
580+
*LongDescription = PhFinalStringBuilderString(&sb);
581+
}
543582

544583
result = TRUE;
545584
}

phnt/include/ntpsapi.h

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,6 +650,26 @@ typedef struct _PROCESS_HANDLE_SNAPSHOT_INFORMATION
650650

651651
#if (PHNT_MODE != PHNT_MODE_KERNEL)
652652

653+
// TODO: remove after switch to 21H1 SDK
654+
typedef struct _PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY_INT {
655+
union {
656+
DWORD Flags;
657+
struct {
658+
DWORD EnableUserShadowStack : 1;
659+
DWORD AuditUserShadowStack : 1;
660+
DWORD SetContextIpValidation : 1;
661+
DWORD AuditSetContextIpValidation : 1;
662+
DWORD EnableUserShadowStackStrictMode : 1;
663+
DWORD BlockNonCetBinaries : 1;
664+
DWORD BlockNonCetBinariesNonEhcont : 1;
665+
DWORD AuditBlockNonCetBinaries : 1;
666+
DWORD CetDynamicApisOutOfProcOnly : 1;
667+
DWORD ReservedFlags : 23;
668+
669+
} DUMMYSTRUCTNAME;
670+
} DUMMYUNIONNAME;
671+
} PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY_INT, * PPROCESS_MITIGATION_USER_SHADOW_STACK_POLICY_INT;
672+
653673
// private
654674
typedef struct _PROCESS_MITIGATION_POLICY_INFORMATION
655675
{
@@ -669,7 +689,7 @@ typedef struct _PROCESS_MITIGATION_POLICY_INFORMATION
669689
PROCESS_MITIGATION_PAYLOAD_RESTRICTION_POLICY PayloadRestrictionPolicy;
670690
PROCESS_MITIGATION_CHILD_PROCESS_POLICY ChildProcessPolicy;
671691
PROCESS_MITIGATION_SIDE_CHANNEL_ISOLATION_POLICY SideChannelIsolationPolicy;
672-
PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY UserShadowStackPolicy;
692+
PROCESS_MITIGATION_USER_SHADOW_STACK_POLICY_INT UserShadowStackPolicy;
673693
};
674694
} PROCESS_MITIGATION_POLICY_INFORMATION, *PPROCESS_MITIGATION_POLICY_INFORMATION;
675695

0 commit comments

Comments
 (0)