在我们的环境中,我们使用 Injection Hunter 检测易受攻击的代码。另请参阅:PowerShell 脚本的安全审核
出于某种原因,注入猎人检测到
$Object.$Property = $SomethingElse
和 $Object.$Property
等语法存在风险,对于 $Property
和 $Object
,例如: $Property = 5; $Object = [PSCustomObject]@{ Property = 'Something' }
Invoke-ScriptAnalyzer -CustomRulePath $InjectionHunterPath -ScriptDefinition {
$Object = [PSCustomObject]@{ Property = 'Something' }
$Property = 'Property'
$Object.$Property = 'SomethingElse'
}.ToString()
RuleName Severity ScriptName Line Message
-------- -------- ---------- ---- -------
InjectionRisk.StaticPropertyInjecti Warning 4 Possible property access injection via dynamic member
on access. Untrusted input can cause arbitrary static
properties to be accessed: $Object.$Property
但是,如果
$Property
是在同一脚本(甚至同一范围)中定义的,我看不出如何利用这一点。这可以被视为误报吗?$Object.[String]$Property
一起使用的方法,但迄今为止我能找到的最好的替代品是相当麻烦的:
$Object.PSObject.Properties.where{$_.Name -eq 'Property'}[0].Value = 'SomethingElse'
换句话说,我如何安全地修改动态对象成员?
该规则显然明确地标记了
.
的使用,成员访问运算符可以使用:
.$Property
、.('Prop' + $index)
、.$(++$i; 'Prop' + $i)
)."$Property"
,但不是逐字字符串,例如.'$Property'
)这可以被视为误报吗?
使用静态、逐字记录值,例如在
相同范围中将
'Property'
分配给$Property
,可以说是的 - 但这是一个非常具体的场景。
一个less麻烦的解决方法是通过内在psobject
属性使用
index表示法:
$Object.psobject.Properties[$Property] = 'SomethingElse'
也就是说,事实上,无论分配给 $Property
的值如何,这都被
not标记,这可以说是漏洞分析方面的一个有问题的疏忽,因为恶意代码可以精确地使用此技术来 绕过警告。
我鼓励您向模块维护者提供反馈。
不幸的是,
InjectionHunter
模块的PowerShell Gallery页面没有提供指向GitHub存储库的链接,因此联系他们的唯一明显方法是通过Contact Owners链接。