Integrate current dev with intended-reader EVTX verification

This commit is contained in:
Shirofune-Security committed 2026-09-22 14:24:04 +09:00
commit 4598bb36f7
175 files changed
+11391 -70

No files matched your search

@@ -0,0 +1,46 @@
name: Native AppLocker Script probe
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
applocker-script-probe:
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Fixtures in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/AppLockerScriptProbe.Tests.ps1
./tests/AppLockerScriptProbe.Cli.Tests.ps1
- name: Native probe in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/AppLockerScriptProbe.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Fixtures in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/AppLockerScriptProbe.Tests.ps1
./tests/AppLockerScriptProbe.Cli.Tests.ps1
- name: Native probe in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/AppLockerScriptProbe.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Retain bounded native evidence and cleanup receipt
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: applocker-script-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-applocker-script-native-*/**
retention-days: 7
if-no-files-found: warn
+46
View File
@@ -0,0 +1,46 @@
name: Native offline CAPI2 chain probe
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
capi2-probe:
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Portable and public guards in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/Capi2Probe.Tests.ps1
./tests/Capi2Probe.Cli.Tests.ps1
- name: Genuine public CAPI2 probe in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/Capi2Probe.Windows.Tests.ps1 -AllowDisposableChannelWrite
- name: Portable and public guards in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/Capi2Probe.Tests.ps1
./tests/Capi2Probe.Cli.Tests.ps1
- name: Genuine public CAPI2 probe in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/Capi2Probe.Windows.Tests.ps1 -AllowDisposableChannelWrite
- name: Retain native XML, generated public certificates and cleanup evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: capi2-probe-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-capi2-native-*/
retention-days: 7
+41
View File
@@ -0,0 +1,41 @@
name: Reviewed native channel recovery
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
channel-recovery:
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Focused and native public recovery on Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/ChannelRecovery.Tests.ps1
./tests/ChannelRecovery.Cli.Tests.ps1
./tests/ChannelRecovery.Windows.Tests.ps1 -AllowDisposableChannelWrite
- name: Focused and native public recovery on PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/ChannelRecovery.Tests.ps1
./tests/ChannelRecovery.Cli.Tests.ps1
./tests/ChannelRecovery.Windows.Tests.ps1 -AllowDisposableChannelWrite
- name: Retain native original, restoration and cleanup evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: channel-recovery-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-channel-recovery-*/
if-no-files-found: warn
retention-days: 7
+35
View File
@@ -0,0 +1,35 @@
name: Public CLI unknown argument rejection
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
cli-arguments:
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Windows PowerShell 5.1 process and native state checks
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/CliArguments.Tests.ps1
- name: PowerShell 7 process and native state checks
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/CliArguments.Tests.ps1
- name: Retain native before and after observations
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: cli-arguments-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-cli-arguments.json
if-no-files-found: error
retention-days: 7
+47
View File
@@ -0,0 +1,47 @@
name: Guarded event-log size and mode recovery
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
eventlog-recovery:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Fixtures and public guards in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/EventLogRecovery.Tests.ps1
./tests/EventLogRecovery.Cli.Tests.ps1
- name: Native channel restoration in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/EventLogRecovery.Windows.Tests.ps1 -AllowDisposableChannelWrite
- name: Fixtures and public guards in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/EventLogRecovery.Tests.ps1
./tests/EventLogRecovery.Cli.Tests.ps1
- name: Native channel restoration in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/EventLogRecovery.Windows.Tests.ps1 -AllowDisposableChannelWrite
- name: Retain owned fixture evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: eventlog-recovery-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-event-recovery-*/
if-no-files-found: warn
retention-days: 7
+47
View File
@@ -0,0 +1,47 @@
name: Native local failed-logon probe
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
failed-logon-probe:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Fixtures and public guards in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/FailedLogonProbe.Tests.ps1
./tests/FailedLogonProbe.Cli.Tests.ps1
- name: Native local account failure and4625 in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/FailedLogonProbe.Windows.Tests.ps1 -AllowDisposableAuditWrite
- name: Fixtures and public guards in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/FailedLogonProbe.Tests.ps1
./tests/FailedLogonProbe.Cli.Tests.ps1
- name: Native local account failure and4625 in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/FailedLogonProbe.Windows.Tests.ps1 -AllowDisposableAuditWrite
- name: Preserve bounded native evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: failed-logon-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-failed-logon-native-*/**
retention-days: 7
if-no-files-found: warn
+45
View File
@@ -0,0 +1,45 @@
name: Native one-byte file access probe
on:
push:
branches: ['**']
paths:
- 'WELA.ps1'
- 'scripts/FileAccessProbe*'
- 'tests/FileAccessProbe*'
- '.github/workflows/file-access-probe.yml'
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
file-access-probe:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Public CLI and actual file read in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/FileAccessProbe.Tests.ps1
./tests/FileAccessProbe.Cli.Tests.ps1
./tests/FileAccessProbe.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Public CLI and actual file read in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/FileAccessProbe.Tests.ps1
./tests/FileAccessProbe.Cli.Tests.ps1
./tests/FileAccessProbe.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Retain genuine XML, receipts and exact cleanup
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: file-access-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-file-access-*/
if-no-files-found: error
@@ -0,0 +1,43 @@
name: Native public filesystem SACL lifecycle
on:
push:
branches: ['**']
paths:
- 'tests/FileSacl*'
- 'tests/RegistrySaclFixtureNative.cs'
- 'tests/SelectedSaclFixtureProtection.cs'
- 'scripts/SelectedSacl*'
- 'scripts/TargetedSaclPlanning.ps1'
- 'scripts/FileAccessProbe*'
- 'WELA.ps1'
- '.github/workflows/filesystem-sacl-lifecycle.yml'
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
filesystem-sacl-lifecycle:
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Owned public filesystem lifecycle in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/FileSaclLifecycle.Windows.Tests.ps1 -AllowDisposableProfileWrite
- name: Owned public filesystem lifecycle in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/FileSaclLifecycle.Windows.Tests.ps1 -AllowDisposableProfileWrite
- name: Retain public receipts and exact owned-fixture cleanup
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: filesystem-sacl-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-filesystem-lifecycle-*/
if-no-files-found: error
@@ -0,0 +1,53 @@
name: Guarded firewall logging recovery
on:
push:
paths: ['WELA.ps1', 'scripts/FirewallLogging*', 'scripts/Configuration.ps1', 'scripts/AuditRecovery.ps1', 'scripts/WefArrival.ps1', 'scripts/WecUpdate.ps1', 'scripts/ChannelRead*', 'tests/FirewallLoggingRecovery*', '.github/workflows/firewall-logging-recovery.yml']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
firewall-recovery:
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
timeout-minutes: 25
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Focused and public CLI fixtures (powershell)
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/FirewallLoggingRecovery.Tests.ps1
./tests/FirewallLoggingRecovery.Cli.Tests.ps1
- name: Disposable native configuration and recovery (powershell)
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/FirewallLoggingRecovery.Windows.Tests.ps1 -AllowDisposableLoggingWrite
- name: Focused and public CLI fixtures (pwsh)
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/FirewallLoggingRecovery.Tests.ps1
./tests/FirewallLoggingRecovery.Cli.Tests.ps1
- name: Disposable native configuration and recovery (pwsh)
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/FirewallLoggingRecovery.Windows.Tests.ps1 -AllowDisposableLoggingWrite
- name: Retain native configuration and cleanup evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: firewall-recovery-${{ matrix.os }}-${{ matrix.engine }}
path: |
${{ runner.temp }}/wela-firewall-recovery-*/*.json
${{ runner.temp }}/wela-firewall-recovery-*/cli-*.txt
${{ runner.temp }}/wela-firewall-recovery-*/configure-backup/
${{ runner.temp }}/wela-firewall-recovery-*/plan/
${{ runner.temp }}/wela-firewall-recovery-*/restore/
${{ runner.temp }}/wela-firewall-recovery-*/again/
if-no-files-found: warn
retention-days: 7
+45
View File
@@ -0,0 +1,45 @@
name: Native IPsec prerequisite evidence
on:
push:
branches: ['**']
paths:
- 'WELA.ps1'
- 'modules/AuditProfiles.psm1'
- 'scripts/Configuration.ps1'
- 'scripts/IpsecPrerequisites.ps1'
- 'tests/IpsecPrerequisites*'
- '.github/workflows/ipsec-prerequisites.yml'
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
native-ipsec:
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
timeout-minutes: 20
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Native prerequisite and public configure proof in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/IpsecPrerequisites.Tests.ps1
./tests/IpsecPrerequisites.Windows.Tests.ps1 -AllowDisposablePolicyWrite -AllowDisposableIpsecRule
- name: Native prerequisite and public configure proof in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/IpsecPrerequisites.Tests.ps1
./tests/IpsecPrerequisites.Windows.Tests.ps1 -AllowDisposablePolicyWrite -AllowDisposableIpsecRule
- name: Retain native observations and restoration evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: ipsec-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-ipsec-*/
if-no-files-found: error
@@ -0,0 +1,47 @@
name: Native channel configuration acceptance
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
native-channel-configure:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Fixtures and public guards in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/NativeChannelAccess.Tests.ps1
./tests/NativeChannelAccess.Windows.Tests.ps1
- name: Native channel configuration in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/NativeChannelConfigure.Windows.Tests.ps1 -AllowDisposableChannelWrite
- name: Fixtures and public guards in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/NativeChannelAccess.Tests.ps1
./tests/NativeChannelAccess.Windows.Tests.ps1
- name: Native channel configuration in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/NativeChannelConfigure.Windows.Tests.ps1 -AllowDisposableChannelWrite
- name: Retain owned fixture evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: native-channel-configure-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-channel-configure-*/
if-no-files-found: warn
retention-days: 7
@@ -0,0 +1,47 @@
name: Native public audit profile configuration
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
native-profile-configure:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Fixtures and public guards in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/audit-profiles.Tests.ps1
./tests/IntegrationProfileConfiguration.Tests.ps1
- name: Native profile configuration in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/ProfileConfigure.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Fixtures and public guards in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/audit-profiles.Tests.ps1
./tests/IntegrationProfileConfiguration.Tests.ps1
- name: Native profile configuration in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/ProfileConfigure.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Retain owned fixture evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: native-profile-configure-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-profile-configure-*/
if-no-files-found: warn
retention-days: 7
@@ -0,0 +1,43 @@
name: Native provider configuration acceptance
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
native-provider-configure:
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Focused provider regressions in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/NativeProviderPacks.Tests.ps1
- name: Public native provider configuration in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/NativeProviderConfigure.Windows.Tests.ps1 -AllowDisposableProviderWrite
- name: Focused provider regressions in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/NativeProviderPacks.Tests.ps1
- name: Public native provider configuration in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/NativeProviderConfigure.Windows.Tests.ps1 -AllowDisposableProviderWrite
- name: Retain owned fixture evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: native-provider-configure-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-provider-configure-*/
if-no-files-found: warn
retention-days: 7
@@ -0,0 +1,47 @@
name: Native Security warning configuration
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
native-security-warning:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Fixtures and public guards in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/AuditNotifications.Tests.ps1
./tests/AuditNotifications.Windows.Tests.ps1
- name: Native Security warning configuration in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/SecurityWarningConfigure.Windows.Tests.ps1 -AllowDisposableWarningWrite
- name: Fixtures and public guards in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/AuditNotifications.Tests.ps1
./tests/AuditNotifications.Windows.Tests.ps1
- name: Native Security warning configuration in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/SecurityWarningConfigure.Windows.Tests.ps1 -AllowDisposableWarningWrite
- name: Retain owned fixture evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: native-security-warning-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-security-warning-*/
if-no-files-found: warn
retention-days: 7
+47
View File
@@ -0,0 +1,47 @@
name: Native public SMB policy configuration
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
native-smb-policy:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Fixtures and public guards in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/SmbAuditing.Tests.ps1
./tests/SmbAuditing.Windows.Tests.ps1
- name: Native public SMB policy configuration in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/SmbPolicyConfigure.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Fixtures and public guards in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/SmbAuditing.Tests.ps1
./tests/SmbAuditing.Windows.Tests.ps1
- name: Native public SMB policy configuration in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/SmbPolicyConfigure.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Retain owned fixture evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: native-smb-policy-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-smb-policy-*/
if-no-files-found: warn
retention-days: 7
@@ -0,0 +1,44 @@
name: Native public registry SACL lifecycle
on:
push:
branches: ['**']
paths:
- 'tests/RegistrySacl*'
- 'scripts/SelectedSacl*'
- 'scripts/TargetedSaclPlanning.ps1'
- 'WELA.ps1'
- '.github/workflows/registry-sacl-lifecycle.yml'
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
registry-sacl-lifecycle:
timeout-minutes: 25
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Actual public registry lifecycle in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/RegistrySaclLifecycle.Tests.ps1
./tests/RegistrySaclLifecycle.Windows.Tests.ps1 -AllowDisposableHiveWrite
- name: Actual public registry lifecycle in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/RegistrySaclLifecycle.Tests.ps1
./tests/RegistrySaclLifecycle.Windows.Tests.ps1 -AllowDisposableHiveWrite
- name: Retain public receipts, actual XML and exact cleanup
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: registry-sacl-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-registry-sacl-*/
if-no-files-found: error
@@ -0,0 +1,47 @@
name: Native reviewed registry SACL recovery
on:
push:
branches: ['**']
paths:
- 'tests/RegistrySacl*'
- 'scripts/RegistrySaclRecovery*'
- 'scripts/SelectedSacl*'
- 'scripts/TargetedSaclPlanning.ps1'
- 'WELA.ps1'
- '.github/workflows/registry-sacl-recovery.yml'
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
registry-sacl-recovery:
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Actual public registry lifecycle in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/RegistrySaclRecovery.Cli.Tests.ps1
./tests/RegistrySaclRecovery.Tests.ps1
./tests/RegistrySaclRecovery.Windows.Tests.ps1 -AllowDisposableHiveWrite
- name: Actual public registry lifecycle in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/RegistrySaclRecovery.Cli.Tests.ps1
./tests/RegistrySaclRecovery.Tests.ps1
./tests/RegistrySaclRecovery.Windows.Tests.ps1 -AllowDisposableHiveWrite
- name: Retain public receipts, actual XML and exact cleanup
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a
with:
name: registry-sacl-recovery-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-registry-recovery-*/
if-no-files-found: error
+2 -2
View File
@@ -41,7 +41,7 @@ jobs:
Copy-Item -Recurse -Path ./scripts -Destination release-binaries/
Copy-Item -Recurse -Path ./modules -Destination release-binaries/
New-Item -ItemType Directory -Path release-binaries/docs -Force | Out-Null
Copy-Item -Path ./docs/gpo-audit-packages.md, ./docs/gpo-package-deployment.md, ./docs/gpo-creation.md, ./docs/wmi-probe.md -Destination release-binaries/docs/
Copy-Item -Path ./docs/gpo-audit-packages.md, ./docs/gpo-package-deployment.md, ./docs/gpo-creation.md, ./docs/wmi-probe.md, ./docs/firewall-logging.md, ./docs/firewall-logging-recovery.md, ./docs/ipsec-prerequisites.md, ./docs/wec-state.md, ./docs/wec-update.md, ./docs/wec-runtime.md, ./docs/wef-deployment.md, ./docs/native-channel-access.md, ./docs/eventlog-settings.md, ./docs/channel-read.md, ./docs/native-rule-eligibility.md, ./docs/native-validation.md, ./docs/wef-arrival.md, ./docs/smb-runtime-activation.md, ./docs/smb-auditing.md, ./docs/wec-ingress.md, ./docs/capi2-probe.md, ./docs/powershell-transcription.md, ./docs/transcription-recovery.md, ./docs/eventlog-recovery.md, ./docs/failed-logon-probe.md, ./docs/wec-listener.md, ./docs/file-access-probe.md, ./docs/applocker-script-probe.md, ./docs/applocker-probe.md, ./docs/selected-sacl-configuration.md, ./docs/registry-sacl-recovery.md, ./docs/targeted-sacl-planning.md, ./docs/native-registry-sacl-validation.md, ./docs/native-filesystem-sacl-validation.md, ./docs/wec-authorization.md, ./docs/channel-recovery.md, ./docs/outgoing-ntlm.md, ./docs/wec-collector-observation.md, ./docs/native-provider-packs.md, ./docs/native-provider-acceptance.md -Destination release-binaries/docs/
- name: Set Artifact Name
if: contains(matrix.info.os, 'windows') == true
@@ -77,4 +77,4 @@ jobs:
with:
name: wela-documents
path: |
./*.pdf
./*.pdf
@@ -0,0 +1,47 @@
name: Scoped outgoing NTLM auditing
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
scoped-outgoing-ntlm:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Fixtures and public guards in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/OutgoingNtlmAudit.Tests.ps1
./tests/OutgoingNtlmAudit.Cli.Tests.ps1
- name: Scoped outgoing NTLM auditing in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/OutgoingNtlmAudit.Windows.Tests.ps1 -AllowDisposableAuditWrite
- name: Fixtures and public guards in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/OutgoingNtlmAudit.Tests.ps1
./tests/OutgoingNtlmAudit.Cli.Tests.ps1
- name: Scoped outgoing NTLM auditing in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/OutgoingNtlmAudit.Windows.Tests.ps1 -AllowDisposableAuditWrite
- name: Retain owned fixture evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: scoped-outgoing-ntlm-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-outgoing-audit-*/
if-no-files-found: warn
retention-days: 7
@@ -0,0 +1,58 @@
name: SMB runtime audit activation
on:
push:
branches: ['**']
paths:
- 'WELA.ps1'
- 'scripts/SmbRuntimeActivation.ps1'
- 'scripts/SmbAuditing.ps1'
- 'scripts/Configuration.ps1'
- 'scripts/WefArrival.ps1'
- 'tests/SmbRuntimeActivation*'
- '.github/workflows/smb-runtime-activation.yml'
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
native-smb-activation:
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
shell: [powershell, pwsh]
runs-on: ${{ matrix.os }}
timeout-minutes: 15
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Focused regressions in Windows PowerShell 5.1
if: matrix.shell == 'powershell'
shell: powershell
run: |
./tests/SmbRuntimeActivation.Tests.ps1
./tests/SmbRuntimeActivation.Cli.Tests.ps1
- name: Native activation and restoration in Windows PowerShell 5.1
if: matrix.shell == 'powershell'
shell: powershell
env:
WELA_DISPOSABLE_SMB_ACTIVATION: 'true'
run: ./tests/SmbRuntimeActivation.Windows.Tests.ps1
- name: Focused regressions in PowerShell 7
if: matrix.shell == 'pwsh'
shell: pwsh
run: |
./tests/SmbRuntimeActivation.Tests.ps1
./tests/SmbRuntimeActivation.Cli.Tests.ps1
- name: Native activation and restoration in PowerShell 7
if: matrix.shell == 'pwsh'
shell: pwsh
env:
WELA_DISPOSABLE_SMB_ACTIVATION: 'true'
run: ./tests/SmbRuntimeActivation.Windows.Tests.ps1
- name: Retain native evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: smb-runtime-${{ matrix.os }}-${{ matrix.shell }}
path: ${{ runner.temp }}/wela-smb-runtime-*/
if-no-files-found: warn
@@ -0,0 +1,47 @@
name: Native transcription policy recovery
on:
push:
branches: ['**']
paths:
- 'WELA.ps1'
- 'scripts/TranscriptionRecovery.ps1'
- 'scripts/PowerShellTranscription.ps1'
- 'scripts/AuditRecovery.ps1'
- 'tests/TranscriptionRecovery*'
- '.github/workflows/transcription-recovery.yml'
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
transcription-recovery:
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
timeout-minutes: 20
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Focused and native public CLI recovery in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/TranscriptionRecovery.Tests.ps1
./tests/TranscriptionRecovery.Cli.Tests.ps1
./tests/TranscriptionRecovery.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Focused and native public CLI recovery in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/TranscriptionRecovery.Tests.ps1
./tests/TranscriptionRecovery.Cli.Tests.ps1
./tests/TranscriptionRecovery.Windows.Tests.ps1 -AllowDisposablePolicyWrite
- name: Retain native policy and cleanup evidence
if: always()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: transcription-recovery-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-transcription-recovery-*/
if-no-files-found: error
+49
View File
@@ -0,0 +1,49 @@
name: Reviewed WEC source authorization
on:
push:
paths: ['WELA.ps1', 'scripts/WecAuthorization*', 'tests/WecAuthorization*', '.github/workflows/wec-authorization.yml']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
wec-authorization:
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Portable guards in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/WecAuthorization.Tests.ps1
./tests/WecAuthorization.Cli.Tests.ps1
./tests/WecSubscriptionXml.Tests.ps1
- name: Actual owned source authorization updates in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/WecAuthorization.Windows.Tests.ps1 -AllowDisposableSubscription
- name: Portable guards in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/WecAuthorization.Tests.ps1
./tests/WecAuthorization.Cli.Tests.ps1
./tests/WecSubscriptionXml.Tests.ps1
- name: Actual owned source authorization updates in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/WecAuthorization.Windows.Tests.ps1 -AllowDisposableSubscription
- name: Retain native authorization evidence and cleanup receipt
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: wec-authorization-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-wec-authorization-*
if-no-files-found: warn
retention-days: 7
@@ -0,0 +1,59 @@
name: Native collector subscription observation
on:
push:
paths: ['WELA.ps1', 'modules/WefSubscriptions.psm1', 'modules/WecSubscription*', 'scripts/WefDeployment.ps1', 'tests/WecCollectorObservation*', 'tests/WecSubscriptionInventory*', '.github/workflows/wec-collector-observation.yml']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
collector-observation:
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Native observation regressions in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/WecSubscriptionInventory.Tests.ps1
./tests/WecSubscriptionXml.Tests.ps1
./tests/WefDeployment.Tests.ps1
./tests/WefDeployment.Cli.Tests.ps1
- name: Native observation regressions in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/WecSubscriptionInventory.Tests.ps1
./tests/WecSubscriptionXml.Tests.ps1
./tests/WefDeployment.Tests.ps1
./tests/WefDeployment.Cli.Tests.ps1
- name: Existing read-only service preservation in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/WefDeployment.Windows.Tests.ps1
- name: Existing read-only service preservation in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/WefDeployment.Windows.Tests.ps1
- name: Actual public collector observations in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/WecCollectorObservation.Windows.Tests.ps1 -AllowDisposableSubscription
- name: Actual public collector observations in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/WecCollectorObservation.Windows.Tests.ps1 -AllowDisposableSubscription
- name: Retain native observations and exact cleanup evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: collector-observation-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-wec-observation-*
if-no-files-found: warn
retention-days: 7
+49
View File
@@ -0,0 +1,49 @@
name: Reviewed collector firewall ingress
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
wec-ingress:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Fixtures and public guards in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/WefFirewallAddress.Tests.ps1
./tests/WecIngress.Tests.ps1
./tests/WecIngress.Cli.Tests.ps1
- name: Native scoped firewall rule in Windows PowerShell5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/WecIngress.Windows.Tests.ps1 -AllowDisposableFirewallRule
- name: Fixtures and public guards in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/WefFirewallAddress.Tests.ps1
./tests/WecIngress.Tests.ps1
./tests/WecIngress.Cli.Tests.ps1
- name: Native scoped firewall rule in PowerShell7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/WecIngress.Windows.Tests.ps1 -AllowDisposableFirewallRule
- name: Retain owned fixture evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: wec-ingress-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-ingress-*/
if-no-files-found: warn
retention-days: 7
+41
View File
@@ -0,0 +1,41 @@
name: Reviewed exact-IP collector listener
on:
push:
branches: ['**']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
wec-listener:
timeout-minutes: 20
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Actual public listener in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/WecListener.Tests.ps1
./tests/WecListener.Cli.Tests.ps1
./tests/WecListener.Windows.Tests.ps1 -AllowDisposableListenerReplacement
- name: Actual public listener in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/WecListener.Tests.ps1
./tests/WecListener.Cli.Tests.ps1
./tests/WecListener.Windows.Tests.ps1 -AllowDisposableListenerReplacement
- name: Retain native listener and cleanup evidence
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: wec-listener-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-listener-*/
if-no-files-found: warn
retention-days: 7
+48
View File
@@ -0,0 +1,48 @@
name: Reviewed existing WEC subscription state
on:
push:
paths: ['WELA.ps1', 'scripts/WecState*', 'tests/WecState*', '.github/workflows/wec-state.yml']
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
wec-state:
strategy:
fail-fast: false
matrix:
os: [windows-2022, windows-2025]
engine: [powershell, pwsh]
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Portable guards in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: |
./tests/WecState.Tests.ps1
./tests/WecState.Cli.Tests.ps1
./tests/WecSubscriptionXml.Tests.ps1
- name: Actual owned Enabled transitions in Windows PowerShell 5.1
if: matrix.engine == 'powershell'
shell: powershell
run: ./tests/WecState.Windows.Tests.ps1 -AllowDisposableSubscription
- name: Portable guards in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: |
./tests/WecState.Tests.ps1
./tests/WecState.Cli.Tests.ps1
./tests/WecSubscriptionXml.Tests.ps1
- name: Actual owned Enabled transitions in PowerShell 7
if: matrix.engine == 'pwsh'
shell: pwsh
run: ./tests/WecState.Windows.Tests.ps1 -AllowDisposableSubscription
- name: Retain native state evidence and cleanup receipt
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02
with:
name: wec-state-${{ matrix.os }}-${{ matrix.engine }}
path: ${{ runner.temp }}/wela-wec-state-*
if-no-files-found: ignore
retention-days: 7
+6 -2
View File
@@ -15,7 +15,9 @@ jobs:
- name: Safe public command fixtures in Windows PowerShell 5.1
shell: powershell
timeout-minutes: 3
run: ./tests/WefDeployment.Tests.ps1
run: |
./tests/WefFirewallAddress.Tests.ps1
./tests/WefDeployment.Tests.ps1
- name: Public CLI rejection checks in Windows PowerShell 5.1
shell: powershell
timeout-minutes: 3
@@ -23,7 +25,9 @@ jobs:
- name: Safe public command fixtures in PowerShell 7
shell: pwsh
timeout-minutes: 3
run: ./tests/WefDeployment.Tests.ps1
run: |
./tests/WefFirewallAddress.Tests.ps1
./tests/WefDeployment.Tests.ps1
- name: Public CLI rejection checks in PowerShell 7
shell: pwsh
timeout-minutes: 3
+1 -1
View File
@@ -8,7 +8,7 @@ permissions:
contents: read
jobs:
wmi-probe:
timeout-minutes: 15
timeout-minutes: 20
strategy:
fail-fast: false
matrix: