mirror of
https://github.com/Yamato-Security/WELA.git
synced 2026-11-15 09:24:11 +01:00
Fix native collector subscription inventory and Unicode readback
This commit is contained in:
1 parent
03039cb1c6
commit
af88b87e01
16 files changed
+327
-8
No files matched your search
@@ -0,0 +1,34 @@
|
||||
$ErrorActionPreference='Stop';$repo=Split-Path $PSScriptRoot -Parent
|
||||
Import-Module "$repo/modules/WefSubscriptions.psm1" -Force
|
||||
& (Get-Module WefSubscriptions) {Initialize-WelaWecSubscriptionInventory}
|
||||
$count=0
|
||||
function Assert($Value,$Message){if(-not $Value){throw $Message};$script:count++}
|
||||
function Reject([scriptblock]$Action){$failed=$false;try{&$Action|Out-Null}catch{$failed=$true};Assert $failed 'Malformed, duplicate, partial or oversized native inventory must be rejected'}
|
||||
Assert ([Wela.WecInventory.Reader]::SourceSha256 -ceq (Get-FileHash "$repo/modules/WecSubscriptionInventory.cs").Hash.ToLowerInvariant()) 'Loaded inventory binds exact source bytes'
|
||||
Assert ([Wela.WecInventory.Reader]::ValidateNames([string[]]@()).Length -eq 0) 'Completed empty inventory is distinct from an error'
|
||||
$unicode='Name '+[char]0x65e5+[char]0x672c
|
||||
$names=[string[]]@('z',$unicode,'A',' leading ',([string][char]0xfeff))
|
||||
$observed=[Wela.WecInventory.Reader]::ValidateNames($names)
|
||||
Assert ($observed.Length -eq 5 -and $observed -ccontains $unicode -and $observed -ccontains ' leading ' -and $observed -ccontains ([string][char]0xfeff)) 'Actual Unicode and whitespace names are retained, never console-trimmed'
|
||||
Assert ($names[0] -ceq 'z') 'Validation does not mutate caller inventory'
|
||||
Reject {[Wela.WecInventory.Reader]::ValidateNames($null)}
|
||||
Reject {[Wela.WecInventory.Reader]::ValidateNames([string[]]@('same','SAME'))}
|
||||
Reject {[Wela.WecInventory.Reader]::ValidateNames([string[]]@(''))}
|
||||
Reject {[Wela.WecInventory.Reader]::ValidateNames([string[]]@("ab`0cd"))}
|
||||
Reject {[Wela.WecInventory.Reader]::ValidateNames([string[]]@('x'*1024))}
|
||||
Reject {[Wela.WecInventory.Reader]::ValidateNames([string[]]@([string][char]0xd800))}
|
||||
Reject {[Wela.WecInventory.Reader]::ValidateNames([string[]]@(1..4097|ForEach-Object {"id-$_"}))}
|
||||
Reject {[Wela.WecInventory.Reader]::ValidateNames([string[]]@(1..1025|ForEach-Object {$prefix=[string]$_;$prefix+('x'*(1023-$prefix.Length))}))}
|
||||
$buffer=[Runtime.InteropServices.Marshal]::AllocHGlobal(64)
|
||||
try {
|
||||
for($i=0;$i -lt 64;$i++){[Runtime.InteropServices.Marshal]::WriteByte($buffer,$i,0)}
|
||||
$bytes=[Text.Encoding]::Unicode.GetBytes($unicode+[char]0);[Runtime.InteropServices.Marshal]::Copy($bytes,0,$buffer,$bytes.Length)
|
||||
Assert ([Wela.WecInventory.Reader]::DecodeName($buffer,($unicode.Length+1),32) -ceq $unicode) 'Native used length counts UTF16 characters including terminator'
|
||||
foreach($used in @(0,1,33)){Reject {[Wela.WecInventory.Reader]::DecodeName($buffer,$used,32)}}
|
||||
Reject {[Wela.WecInventory.Reader]::DecodeName([IntPtr]::Zero,2,32)}
|
||||
Reject {[Wela.WecInventory.Reader]::DecodeName($buffer,2,1025)}
|
||||
Reject {[Wela.WecInventory.Reader]::DecodeName($buffer,$unicode.Length,32)}
|
||||
[Runtime.InteropServices.Marshal]::WriteInt16($buffer,2,0);Reject {[Wela.WecInventory.Reader]::DecodeName($buffer,($unicode.Length+1),32)}
|
||||
[Runtime.InteropServices.Marshal]::WriteInt16($buffer,0,[int16]-10240);Reject {[Wela.WecInventory.Reader]::DecodeName($buffer,2,32)}
|
||||
}finally{[Runtime.InteropServices.Marshal]::FreeHGlobal($buffer)}
|
||||
Write-Host "PASS: $count native subscription inventory buffer/boundary assertions."
|
||||
Reference in new issue
Block a user